From 64dcb88ad8dffde252bf774d720b590754ebf02d Mon Sep 17 00:00:00 2001 From: Karin Allarpsdotter Date: Tue, 10 Jun 2025 20:14:43 +0200 Subject: [PATCH] Installed redis. --- wp-content/object-cache.php | 3085 +++++++++++++++++ wp-content/plugins/redis-cache/LICENSE.md | 674 ++++ .../plugins/redis-cache/assets/css/admin.css | 196 ++ .../plugins/redis-cache/assets/js/admin.js | 488 +++ .../redis-cache/assets/js/apexcharts.min.js | 14 + .../colinmollenhour/credis/Client.php | 1625 +++++++++ .../colinmollenhour/credis/Cluster.php | 343 ++ .../colinmollenhour/credis/LICENSE | 23 + .../colinmollenhour/credis/Module.php | 68 + .../colinmollenhour/credis/README.markdown | 214 ++ .../colinmollenhour/credis/Sentinel.php | 424 +++ .../colinmollenhour/credis/composer.json | 27 + .../colinmollenhour/credis/phpunit_local.sh | 26 + .../credis/testenv/docker-compose.yml | 32 + .../credis/testenv/env/php-5.6/Dockerfile | 24 + .../credis/testenv/env/php-7.0/Dockerfile | 25 + .../credis/testenv/env/php-7.1/Dockerfile | 25 + .../credis/testenv/env/php-7.2/Dockerfile | 25 + .../credis/testenv/env/php-7.3/Dockerfile | 25 + .../credis/testenv/env/php-7.4/Dockerfile | 25 + .../dependencies/predis/predis/LICENSE | 22 + .../dependencies/predis/predis/README.md | 473 +++ .../dependencies/predis/predis/autoload.php | 12 + .../predis/predis/bin/create-command-test | 274 ++ .../dependencies/predis/predis/composer.json | 48 + .../predis/predis/src/Autoloader.php | 64 + .../dependencies/predis/predis/src/Client.php | 566 +++ .../predis/src/ClientContextInterface.php | 238 ++ .../predis/predis/src/ClientException.php | 20 + .../predis/predis/src/ClientInterface.php | 289 ++ .../predis/src/Cluster/ClusterStrategy.php | 476 +++ .../Distributor/DistributorInterface.php | 81 + .../Distributor/EmptyRingException.php | 22 + .../src/Cluster/Distributor/HashRing.php | 268 ++ .../src/Cluster/Distributor/KetamaRing.php | 70 + .../predis/predis/src/Cluster/Hash/CRC16.php | 73 + .../Cluster/Hash/HashGeneratorInterface.php | 29 + .../src/Cluster/Hash/PhpiredisCRC16.php | 42 + .../predis/src/Cluster/PredisStrategy.php | 77 + .../predis/src/Cluster/RedisStrategy.php | 55 + .../predis/predis/src/Cluster/SlotMap.php | 208 ++ .../predis/src/Cluster/StrategyInterface.php | 52 + .../Iterator/CursorBasedIterator.php | 196 ++ .../src/Collection/Iterator/HashKey.php | 57 + .../src/Collection/Iterator/Keyspace.php | 42 + .../src/Collection/Iterator/ListKey.php | 183 + .../predis/src/Collection/Iterator/SetKey.php | 46 + .../src/Collection/Iterator/SortedSetKey.php | 57 + .../Command/Argument/ArrayableArgument.php | 26 + .../Argument/Geospatial/AbstractBy.php | 46 + .../src/Command/Argument/Geospatial/ByBox.php | 43 + .../Argument/Geospatial/ByInterface.php | 19 + .../Command/Argument/Geospatial/ByRadius.php | 37 + .../Argument/Geospatial/FromInterface.php | 19 + .../Argument/Geospatial/FromLonLat.php | 42 + .../Argument/Geospatial/FromMember.php | 36 + .../Argument/Server/LimitInterface.php | 19 + .../Argument/Server/LimitOffsetCount.php | 42 + .../predis/src/Command/Argument/Server/To.php | 57 + .../predis/predis/src/Command/Command.php | 126 + .../predis/src/Command/CommandInterface.php | 80 + .../predis/predis/src/Command/Factory.php | 143 + .../predis/src/Command/FactoryInterface.php | 42 + .../Command/PrefixableCommandInterface.php | 26 + .../Command/Processor/KeyPrefixProcessor.php | 467 +++ .../src/Command/Processor/ProcessorChain.php | 137 + .../Command/Processor/ProcessorInterface.php | 28 + .../predis/predis/src/Command/RawCommand.php | 123 + .../predis/predis/src/Command/RawFactory.php | 43 + .../predis/src/Command/Redis/APPEND.php | 29 + .../predis/predis/src/Command/Redis/AUTH.php | 29 + .../Redis/AbstractCommand/BZPOPBase.php | 43 + .../predis/src/Command/Redis/BGREWRITEAOF.php | 37 + .../predis/src/Command/Redis/BGSAVE.php | 37 + .../predis/src/Command/Redis/BITCOUNT.php | 34 + .../predis/src/Command/Redis/BITFIELD.php | 29 + .../predis/predis/src/Command/Redis/BITOP.php | 43 + .../predis/src/Command/Redis/BITPOS.php | 34 + .../predis/src/Command/Redis/BLMOVE.php | 21 + .../predis/src/Command/Redis/BLMPOP.php | 25 + .../predis/predis/src/Command/Redis/BLPOP.php | 42 + .../predis/predis/src/Command/Redis/BRPOP.php | 42 + .../predis/src/Command/Redis/BRPOPLPUSH.php | 29 + .../predis/src/Command/Redis/BZMPOP.php | 30 + .../predis/src/Command/Redis/BZPOPMAX.php | 33 + .../predis/src/Command/Redis/BZPOPMIN.php | 33 + .../predis/src/Command/Redis/CLIENT.php | 75 + .../predis/src/Command/Redis/COMMAND.php | 29 + .../predis/src/Command/Redis/CONFIG.php | 50 + .../predis/predis/src/Command/Redis/COPY.php | 47 + .../Redis/Container/AbstractContainer.php | 42 + .../Redis/Container/ContainerFactory.php | 54 + .../Redis/Container/ContainerInterface.php | 33 + .../Redis/Container/FunctionContainer.php | 27 + .../predis/src/Command/Redis/DBSIZE.php | 29 + .../predis/predis/src/Command/Redis/DECR.php | 29 + .../predis/src/Command/Redis/DECRBY.php | 29 + .../predis/predis/src/Command/Redis/DEL.php | 39 + .../predis/src/Command/Redis/DISCARD.php | 29 + .../predis/predis/src/Command/Redis/DUMP.php | 29 + .../predis/predis/src/Command/Redis/ECHO_.php | 29 + .../predis/src/Command/Redis/EVALSHA.php | 37 + .../predis/src/Command/Redis/EVALSHA_RO.php | 27 + .../predis/predis/src/Command/Redis/EVAL_.php | 39 + .../predis/src/Command/Redis/EVAL_RO.php | 34 + .../predis/predis/src/Command/Redis/EXEC.php | 29 + .../predis/src/Command/Redis/EXISTS.php | 29 + .../predis/src/Command/Redis/EXPIRE.php | 36 + .../predis/src/Command/Redis/EXPIREAT.php | 35 + .../predis/src/Command/Redis/EXPIRETIME.php | 29 + .../predis/src/Command/Redis/FAILOVER.php | 48 + .../predis/predis/src/Command/Redis/FCALL.php | 33 + .../predis/src/Command/Redis/FLUSHALL.php | 29 + .../predis/src/Command/Redis/FLUSHDB.php | 29 + .../predis/src/Command/Redis/FUNCTIONS.php | 50 + .../predis/src/Command/Redis/GEOADD.php | 43 + .../predis/src/Command/Redis/GEODIST.php | 29 + .../predis/src/Command/Redis/GEOHASH.php | 42 + .../predis/src/Command/Redis/GEOPOS.php | 42 + .../predis/src/Command/Redis/GEORADIUS.php | 77 + .../src/Command/Redis/GEORADIUSBYMEMBER.php | 32 + .../predis/src/Command/Redis/GEOSEARCH.php | 122 + .../src/Command/Redis/GEOSEARCHSTORE.php | 71 + .../predis/predis/src/Command/Redis/GET.php | 29 + .../predis/src/Command/Redis/GETBIT.php | 29 + .../predis/src/Command/Redis/GETDEL.php | 23 + .../predis/predis/src/Command/Redis/GETEX.php | 63 + .../predis/src/Command/Redis/GETRANGE.php | 29 + .../predis/src/Command/Redis/GETSET.php | 29 + .../predis/predis/src/Command/Redis/HDEL.php | 39 + .../predis/src/Command/Redis/HEXISTS.php | 29 + .../predis/predis/src/Command/Redis/HGET.php | 29 + .../predis/src/Command/Redis/HGETALL.php | 43 + .../predis/src/Command/Redis/HINCRBY.php | 29 + .../predis/src/Command/Redis/HINCRBYFLOAT.php | 29 + .../predis/predis/src/Command/Redis/HKEYS.php | 29 + .../predis/predis/src/Command/Redis/HLEN.php | 29 + .../predis/predis/src/Command/Redis/HMGET.php | 39 + .../predis/predis/src/Command/Redis/HMSET.php | 49 + .../predis/src/Command/Redis/HRANDFIELD.php | 34 + .../predis/predis/src/Command/Redis/HSCAN.php | 86 + .../predis/predis/src/Command/Redis/HSET.php | 29 + .../predis/src/Command/Redis/HSETNX.php | 29 + .../predis/src/Command/Redis/HSTRLEN.php | 29 + .../predis/predis/src/Command/Redis/HVALS.php | 29 + .../predis/predis/src/Command/Redis/INCR.php | 29 + .../predis/src/Command/Redis/INCRBY.php | 29 + .../predis/src/Command/Redis/INCRBYFLOAT.php | 29 + .../predis/predis/src/Command/Redis/INFO.php | 127 + .../predis/predis/src/Command/Redis/KEYS.php | 29 + .../predis/src/Command/Redis/LASTSAVE.php | 29 + .../predis/predis/src/Command/Redis/LCS.php | 65 + .../predis/src/Command/Redis/LINDEX.php | 29 + .../predis/src/Command/Redis/LINSERT.php | 29 + .../predis/predis/src/Command/Redis/LLEN.php | 29 + .../predis/predis/src/Command/Redis/LMOVE.php | 23 + .../predis/predis/src/Command/Redis/LMPOP.php | 61 + .../predis/predis/src/Command/Redis/LPOP.php | 29 + .../predis/predis/src/Command/Redis/LPUSH.php | 39 + .../predis/src/Command/Redis/LPUSHX.php | 29 + .../predis/src/Command/Redis/LRANGE.php | 29 + .../predis/predis/src/Command/Redis/LREM.php | 29 + .../predis/predis/src/Command/Redis/LSET.php | 29 + .../predis/predis/src/Command/Redis/LTRIM.php | 29 + .../predis/predis/src/Command/Redis/MGET.php | 39 + .../predis/src/Command/Redis/MIGRATE.php | 51 + .../predis/src/Command/Redis/MONITOR.php | 29 + .../predis/predis/src/Command/Redis/MOVE.php | 29 + .../predis/predis/src/Command/Redis/MSET.php | 49 + .../predis/src/Command/Redis/MSETNX.php | 27 + .../predis/predis/src/Command/Redis/MULTI.php | 29 + .../predis/src/Command/Redis/OBJECT_.php | 29 + .../predis/src/Command/Redis/PERSIST.php | 29 + .../predis/src/Command/Redis/PEXPIRE.php | 29 + .../predis/src/Command/Redis/PEXPIREAT.php | 29 + .../predis/src/Command/Redis/PEXPIRETIME.php | 29 + .../predis/predis/src/Command/Redis/PFADD.php | 39 + .../predis/src/Command/Redis/PFCOUNT.php | 39 + .../predis/src/Command/Redis/PFMERGE.php | 39 + .../predis/predis/src/Command/Redis/PING.php | 29 + .../predis/src/Command/Redis/PSETEX.php | 29 + .../predis/src/Command/Redis/PSUBSCRIBE.php | 39 + .../predis/predis/src/Command/Redis/PTTL.php | 29 + .../predis/src/Command/Redis/PUBLISH.php | 29 + .../predis/src/Command/Redis/PUBSUB.php | 62 + .../predis/src/Command/Redis/PUNSUBSCRIBE.php | 39 + .../predis/predis/src/Command/Redis/QUIT.php | 29 + .../predis/src/Command/Redis/RANDOMKEY.php | 37 + .../predis/src/Command/Redis/RENAME.php | 29 + .../predis/src/Command/Redis/RENAMENX.php | 29 + .../predis/src/Command/Redis/RESTORE.php | 29 + .../predis/predis/src/Command/Redis/RPOP.php | 29 + .../predis/src/Command/Redis/RPOPLPUSH.php | 29 + .../predis/predis/src/Command/Redis/RPUSH.php | 39 + .../predis/src/Command/Redis/RPUSHX.php | 29 + .../predis/predis/src/Command/Redis/SADD.php | 39 + .../predis/predis/src/Command/Redis/SAVE.php | 29 + .../predis/predis/src/Command/Redis/SCAN.php | 67 + .../predis/predis/src/Command/Redis/SCARD.php | 29 + .../predis/src/Command/Redis/SCRIPT.php | 29 + .../predis/predis/src/Command/Redis/SDIFF.php | 39 + .../predis/src/Command/Redis/SDIFFSTORE.php | 41 + .../predis/src/Command/Redis/SELECT.php | 29 + .../predis/src/Command/Redis/SENTINEL.php | 70 + .../predis/predis/src/Command/Redis/SET.php | 29 + .../predis/src/Command/Redis/SETBIT.php | 29 + .../predis/predis/src/Command/Redis/SETEX.php | 29 + .../predis/predis/src/Command/Redis/SETNX.php | 29 + .../predis/src/Command/Redis/SETRANGE.php | 29 + .../predis/src/Command/Redis/SHUTDOWN.php | 29 + .../predis/src/Command/Redis/SINTER.php | 39 + .../predis/src/Command/Redis/SINTERCARD.php | 43 + .../predis/src/Command/Redis/SINTERSTORE.php | 41 + .../predis/src/Command/Redis/SISMEMBER.php | 29 + .../predis/src/Command/Redis/SLAVEOF.php | 41 + .../predis/src/Command/Redis/SLOWLOG.php | 52 + .../predis/src/Command/Redis/SMEMBERS.php | 29 + .../predis/src/Command/Redis/SMISMEMBER.php | 28 + .../predis/predis/src/Command/Redis/SMOVE.php | 29 + .../predis/predis/src/Command/Redis/SORT.php | 86 + .../predis/src/Command/Redis/SORT_RO.php | 74 + .../predis/predis/src/Command/Redis/SPOP.php | 29 + .../predis/src/Command/Redis/SRANDMEMBER.php | 29 + .../predis/predis/src/Command/Redis/SREM.php | 39 + .../predis/predis/src/Command/Redis/SSCAN.php | 67 + .../predis/src/Command/Redis/STRLEN.php | 29 + .../predis/src/Command/Redis/SUBSCRIBE.php | 39 + .../predis/src/Command/Redis/SUBSTR.php | 29 + .../predis/src/Command/Redis/SUNION.php | 39 + .../predis/src/Command/Redis/SUNIONSTORE.php | 41 + .../predis/predis/src/Command/Redis/TIME.php | 29 + .../predis/predis/src/Command/Redis/TOUCH.php | 39 + .../predis/predis/src/Command/Redis/TTL.php | 29 + .../predis/predis/src/Command/Redis/TYPE.php | 29 + .../predis/src/Command/Redis/UNSUBSCRIBE.php | 39 + .../predis/src/Command/Redis/UNWATCH.php | 29 + .../predis/predis/src/Command/Redis/WATCH.php | 41 + .../predis/predis/src/Command/Redis/XADD.php | 64 + .../predis/predis/src/Command/Redis/XDEL.php | 39 + .../predis/predis/src/Command/Redis/XLEN.php | 29 + .../predis/src/Command/Redis/XRANGE.php | 62 + .../predis/src/Command/Redis/XREVRANGE.php | 27 + .../predis/predis/src/Command/Redis/XTRIM.php | 54 + .../predis/predis/src/Command/Redis/ZADD.php | 44 + .../predis/predis/src/Command/Redis/ZCARD.php | 29 + .../predis/src/Command/Redis/ZCOUNT.php | 29 + .../predis/predis/src/Command/Redis/ZDIFF.php | 48 + .../predis/src/Command/Redis/ZDIFFSTORE.php | 40 + .../predis/src/Command/Redis/ZINCRBY.php | 29 + .../predis/src/Command/Redis/ZINTER.php | 35 + .../predis/src/Command/Redis/ZINTERCARD.php | 49 + .../predis/src/Command/Redis/ZINTERSTORE.php | 27 + .../predis/src/Command/Redis/ZLEXCOUNT.php | 29 + .../predis/predis/src/Command/Redis/ZMPOP.php | 79 + .../predis/src/Command/Redis/ZMSCORE.php | 34 + .../predis/src/Command/Redis/ZPOPMAX.php | 43 + .../predis/src/Command/Redis/ZPOPMIN.php | 43 + .../predis/src/Command/Redis/ZRANDMEMBER.php | 36 + .../predis/src/Command/Redis/ZRANGE.php | 105 + .../predis/src/Command/Redis/ZRANGEBYLEX.php | 54 + .../src/Command/Redis/ZRANGEBYSCORE.php | 67 + .../predis/src/Command/Redis/ZRANGESTORE.php | 57 + .../predis/predis/src/Command/Redis/ZRANK.php | 29 + .../predis/predis/src/Command/Redis/ZREM.php | 39 + .../src/Command/Redis/ZREMRANGEBYLEX.php | 29 + .../src/Command/Redis/ZREMRANGEBYRANK.php | 29 + .../src/Command/Redis/ZREMRANGEBYSCORE.php | 29 + .../predis/src/Command/Redis/ZREVRANGE.php | 27 + .../src/Command/Redis/ZREVRANGEBYLEX.php | 27 + .../src/Command/Redis/ZREVRANGEBYSCORE.php | 27 + .../predis/src/Command/Redis/ZREVRANK.php | 29 + .../predis/predis/src/Command/Redis/ZSCAN.php | 86 + .../predis/src/Command/Redis/ZSCORE.php | 29 + .../predis/src/Command/Redis/ZUNION.php | 35 + .../predis/src/Command/Redis/ZUNIONSTORE.php | 67 + .../predis/src/Command/RedisFactory.php | 69 + .../predis/src/Command/ScriptCommand.php | 108 + .../Functions/DeleteStrategy.php | 26 + .../Functions/LoadStrategy.php | 41 + .../Strategy/StrategyResolverInterface.php | 25 + .../Strategy/SubcommandStrategyInterface.php | 24 + .../Strategy/SubcommandStrategyResolver.php | 37 + .../predis/src/Command/Traits/Aggregate.php | 66 + .../predis/src/Command/Traits/BitByte.php | 34 + .../src/Command/Traits/By/ByArgument.php | 40 + .../src/Command/Traits/By/ByLexByScore.php | 49 + .../predis/src/Command/Traits/By/GeoBy.php | 49 + .../predis/src/Command/Traits/Count.php | 71 + .../predis/predis/src/Command/Traits/DB.php | 53 + .../Command/Traits/Expire/ExpireOptions.php | 36 + .../src/Command/Traits/From/GeoFrom.php | 49 + .../predis/src/Command/Traits/Get/Get.php | 47 + .../predis/predis/src/Command/Traits/Keys.php | 47 + .../predis/src/Command/Traits/LeftRight.php | 60 + .../predis/src/Command/Traits/Limit/Limit.php | 54 + .../src/Command/Traits/Limit/LimitObject.php | 50 + .../src/Command/Traits/MinMaxModifier.php | 45 + .../predis/src/Command/Traits/Replace.php | 34 + .../predis/predis/src/Command/Traits/Rev.php | 44 + .../predis/src/Command/Traits/Sorting.php | 57 + .../predis/src/Command/Traits/Storedist.php | 49 + .../predis/src/Command/Traits/Timeout.php | 53 + .../predis/src/Command/Traits/To/ServerTo.php | 48 + .../predis/src/Command/Traits/Weights.php | 61 + .../src/Command/Traits/With/WithCoord.php | 49 + .../src/Command/Traits/With/WithDist.php | 45 + .../src/Command/Traits/With/WithHash.php | 45 + .../src/Command/Traits/With/WithScores.php | 66 + .../src/Command/Traits/With/WithValues.php | 34 + .../predis/src/CommunicationException.php | 85 + .../src/Configuration/Option/Aggregate.php | 114 + .../predis/src/Configuration/Option/CRC16.php | 74 + .../src/Configuration/Option/Cluster.php | 99 + .../src/Configuration/Option/Commands.php | 146 + .../src/Configuration/Option/Connections.php | 144 + .../src/Configuration/Option/Exceptions.php | 39 + .../src/Configuration/Option/Prefix.php | 49 + .../src/Configuration/Option/Replication.php | 126 + .../src/Configuration/OptionInterface.php | 39 + .../predis/src/Configuration/Options.php | 116 + .../src/Configuration/OptionsInterface.php | 63 + .../src/Connection/AbstractConnection.php | 202 ++ .../AggregateConnectionInterface.php | 56 + .../Connection/Cluster/ClusterInterface.php | 23 + .../src/Connection/Cluster/PredisCluster.php | 243 ++ .../src/Connection/Cluster/RedisCluster.php | 672 ++++ .../CompositeConnectionInterface.php | 48 + .../Connection/CompositeStreamConnection.php | 125 + .../src/Connection/ConnectionException.php | 22 + .../src/Connection/ConnectionInterface.php | 65 + .../predis/predis/src/Connection/Factory.php | 183 + .../src/Connection/FactoryInterface.php | 43 + .../Connection/NodeConnectionInterface.php | 57 + .../predis/src/Connection/Parameters.php | 199 ++ .../src/Connection/ParametersInterface.php | 68 + .../Connection/PhpiredisSocketConnection.php | 420 +++ .../Connection/PhpiredisStreamConnection.php | 262 ++ .../Replication/MasterSlaveReplication.php | 553 +++ .../Replication/ReplicationInterface.php | 53 + .../Replication/SentinelReplication.php | 774 +++++ .../src/Connection/StreamConnection.php | 369 ++ .../src/Connection/WebdisConnection.php | 366 ++ .../predis/predis/src/Monitor/Consumer.php | 179 + .../predis/src/NotSupportedException.php | 21 + .../predis/predis/src/Pipeline/Atomic.php | 118 + .../src/Pipeline/ConnectionErrorProof.php | 128 + .../predis/src/Pipeline/FireAndForget.php | 36 + .../predis/predis/src/Pipeline/Pipeline.php | 248 ++ .../predis/predis/src/PredisException.php | 22 + .../predis/src/Protocol/ProtocolException.php | 23 + .../Protocol/ProtocolProcessorInterface.php | 40 + .../Protocol/RequestSerializerInterface.php | 30 + .../src/Protocol/ResponseReaderInterface.php | 31 + .../Text/CompositeProtocolProcessor.php | 106 + .../Protocol/Text/Handler/BulkResponse.php | 54 + .../Protocol/Text/Handler/ErrorResponse.php | 33 + .../Protocol/Text/Handler/IntegerResponse.php | 46 + .../Text/Handler/MultiBulkResponse.php | 67 + .../Text/Handler/ResponseHandlerInterface.php | 32 + .../Protocol/Text/Handler/StatusResponse.php | 34 + .../Handler/StreamableMultiBulkResponse.php | 46 + .../src/Protocol/Text/ProtocolProcessor.php | 120 + .../src/Protocol/Text/RequestSerializer.php | 45 + .../src/Protocol/Text/ResponseReader.php | 110 + .../predis/src/PubSub/AbstractConsumer.php | 226 ++ .../predis/predis/src/PubSub/Consumer.php | 157 + .../predis/src/PubSub/DispatcherLoop.php | 171 + .../Replication/MissingMasterException.php | 22 + .../src/Replication/ReplicationStrategy.php | 292 ++ .../predis/src/Replication/RoleException.php | 23 + .../predis/predis/src/Response/Error.php | 58 + .../predis/src/Response/ErrorInterface.php | 34 + .../src/Response/Iterator/MultiBulk.php | 76 + .../Response/Iterator/MultiBulkIterator.php | 112 + .../src/Response/Iterator/MultiBulkTuple.php | 95 + .../predis/src/Response/ResponseInterface.php | 20 + .../predis/src/Response/ServerException.php | 43 + .../predis/predis/src/Response/Status.php | 78 + .../predis/predis/src/Session/Handler.php | 139 + .../Transaction/AbortedMultiExecException.php | 45 + .../predis/src/Transaction/MultiExec.php | 458 +++ .../predis/src/Transaction/MultiExecState.php | 162 + .../vendor/predis/predis/autoload.php | 8 + .../redis-cache/includes/class-autoloader.php | 145 + .../redis-cache/includes/class-metrics.php | 276 ++ .../redis-cache/includes/class-plugin.php | 1628 +++++++++ .../redis-cache/includes/class-predis.php | 237 ++ .../includes/class-qm-collector.php | 141 + .../redis-cache/includes/class-qm-output.php | 122 + .../plugins/redis-cache/includes/class-ui.php | 45 + .../includes/cli/class-commands.php | 183 + .../redis-cache/includes/diagnostics.php | 166 + .../redis-cache/includes/object-cache.php | 3085 +++++++++++++++++ .../redis-cache/includes/ui/class-tab.php | 259 ++ .../redis-cache/includes/ui/query-monitor.php | 133 + .../redis-cache/includes/ui/settings.php | 164 + .../includes/ui/tabs/diagnostics.php | 23 + .../redis-cache/includes/ui/tabs/metrics.php | 39 + .../redis-cache/includes/ui/tabs/overview.php | 300 ++ .../redis-cache/includes/ui/widget.php | 45 + .../redis-cache/languages/redis-cache.pot | 604 ++++ wp-content/plugins/redis-cache/readme.txt | 707 ++++ .../plugins/redis-cache/redis-cache.php | 65 + wp-content/uploads/2025/06/image-2.png | Bin 0 -> 2914197 bytes wp-content/uploads/2025/06/image-3.png | Bin 0 -> 3822702 bytes wp-content/uploads/2025/06/image-4.png | Bin 0 -> 3553305 bytes wp-content/uploads/2025/06/image-5.png | Bin 0 -> 3799792 bytes 407 files changed, 40628 insertions(+) create mode 100644 wp-content/object-cache.php create mode 100644 wp-content/plugins/redis-cache/LICENSE.md create mode 100644 wp-content/plugins/redis-cache/assets/css/admin.css create mode 100644 wp-content/plugins/redis-cache/assets/js/admin.js create mode 100644 wp-content/plugins/redis-cache/assets/js/apexcharts.min.js create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Client.php create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Cluster.php create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/LICENSE create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Module.php create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/README.markdown create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Sentinel.php create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/composer.json create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/phpunit_local.sh create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/docker-compose.yml create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-5.6/Dockerfile create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.0/Dockerfile create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.1/Dockerfile create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.2/Dockerfile create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.3/Dockerfile create mode 100644 wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.4/Dockerfile create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/LICENSE create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/README.md create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/autoload.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/bin/create-command-test create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/composer.json create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Autoloader.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Client.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/ClientContextInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/ClientException.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/ClientInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/ClusterStrategy.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Distributor/DistributorInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Distributor/EmptyRingException.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Distributor/HashRing.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Distributor/KetamaRing.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Hash/CRC16.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Hash/HashGeneratorInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Hash/PhpiredisCRC16.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/PredisStrategy.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/RedisStrategy.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/SlotMap.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/StrategyInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/CursorBasedIterator.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/HashKey.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/Keyspace.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/ListKey.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/SetKey.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/SortedSetKey.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/ArrayableArgument.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/AbstractBy.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/ByBox.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/ByInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/ByRadius.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/FromInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/FromLonLat.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/FromMember.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Server/LimitInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Server/LimitOffsetCount.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Server/To.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Command.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/CommandInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Factory.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/FactoryInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/PrefixableCommandInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Processor/KeyPrefixProcessor.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Processor/ProcessorChain.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Processor/ProcessorInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/RawCommand.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/RawFactory.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/APPEND.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/AUTH.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/AbstractCommand/BZPOPBase.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BGREWRITEAOF.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BGSAVE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BITCOUNT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BITFIELD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BITOP.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BITPOS.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BLMOVE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BLMPOP.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BLPOP.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BRPOP.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BRPOPLPUSH.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BZMPOP.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BZPOPMAX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BZPOPMIN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/CLIENT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/COMMAND.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/CONFIG.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/COPY.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/AbstractContainer.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/ContainerFactory.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/ContainerInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/FunctionContainer.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/DBSIZE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/DECR.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/DECRBY.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/DEL.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/DISCARD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/DUMP.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ECHO_.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EVALSHA.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EVALSHA_RO.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EVAL_.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EVAL_RO.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EXEC.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EXISTS.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EXPIRE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EXPIREAT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EXPIRETIME.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/FAILOVER.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/FCALL.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/FLUSHALL.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/FLUSHDB.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/FUNCTIONS.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEOADD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEODIST.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEOHASH.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEOPOS.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEORADIUS.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEORADIUSBYMEMBER.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEOSEARCH.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEOSEARCHSTORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GET.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GETBIT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GETDEL.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GETEX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GETRANGE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GETSET.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HDEL.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HEXISTS.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HGET.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HGETALL.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HINCRBY.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HINCRBYFLOAT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HKEYS.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HLEN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HMGET.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HMSET.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HRANDFIELD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HSCAN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HSET.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HSETNX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HSTRLEN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HVALS.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/INCR.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/INCRBY.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/INCRBYFLOAT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/INFO.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/KEYS.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LASTSAVE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LCS.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LINDEX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LINSERT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LLEN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LMOVE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LMPOP.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LPOP.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LPUSH.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LPUSHX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LRANGE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LREM.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LSET.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LTRIM.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MGET.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MIGRATE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MONITOR.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MOVE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MSET.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MSETNX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MULTI.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/OBJECT_.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PERSIST.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PEXPIRE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PEXPIREAT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PEXPIRETIME.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PFADD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PFCOUNT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PFMERGE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PING.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PSETEX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PSUBSCRIBE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PTTL.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PUBLISH.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PUBSUB.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PUNSUBSCRIBE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/QUIT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/RANDOMKEY.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/RENAME.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/RENAMENX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/RESTORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/RPOP.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/RPOPLPUSH.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/RPUSH.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/RPUSHX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SADD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SAVE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SCAN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SCARD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SCRIPT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SDIFF.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SDIFFSTORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SELECT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SENTINEL.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SET.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SETBIT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SETEX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SETNX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SETRANGE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SHUTDOWN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SINTER.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SINTERCARD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SINTERSTORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SISMEMBER.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SLAVEOF.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SLOWLOG.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SMEMBERS.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SMISMEMBER.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SMOVE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SORT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SORT_RO.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SPOP.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SRANDMEMBER.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SREM.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SSCAN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/STRLEN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SUBSCRIBE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SUBSTR.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SUNION.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SUNIONSTORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/TIME.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/TOUCH.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/TTL.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/TYPE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/UNSUBSCRIBE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/UNWATCH.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/WATCH.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/XADD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/XDEL.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/XLEN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/XRANGE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/XREVRANGE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/XTRIM.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZADD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZCARD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZCOUNT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZDIFF.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZDIFFSTORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZINCRBY.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZINTER.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZINTERCARD.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZINTERSTORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZLEXCOUNT.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZMPOP.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZMSCORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZPOPMAX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZPOPMIN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANDMEMBER.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANGE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANGEBYLEX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANGEBYSCORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANGESTORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANK.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZREM.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZREMRANGEBYLEX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZREMRANGEBYRANK.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZREMRANGEBYSCORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZREVRANGE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZREVRANGEBYLEX.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZREVRANGEBYSCORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZREVRANK.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZSCAN.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZSCORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZUNION.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZUNIONSTORE.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/RedisFactory.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/ScriptCommand.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Strategy/ContainerCommands/Functions/DeleteStrategy.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Strategy/ContainerCommands/Functions/LoadStrategy.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Strategy/StrategyResolverInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Strategy/SubcommandStrategyInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Strategy/SubcommandStrategyResolver.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Aggregate.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/BitByte.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/ByArgument.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/ByLexByScore.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/GeoBy.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Count.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/DB.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Expire/ExpireOptions.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/From/GeoFrom.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Get/Get.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Keys.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/LeftRight.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Limit/Limit.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Limit/LimitObject.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/MinMaxModifier.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Replace.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Rev.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Sorting.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Storedist.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Timeout.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/To/ServerTo.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Weights.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithCoord.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithDist.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithHash.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithScores.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithValues.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/CommunicationException.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Aggregate.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/CRC16.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Cluster.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Commands.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Connections.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Exceptions.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Prefix.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Replication.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/OptionInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Options.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/OptionsInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/AbstractConnection.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/AggregateConnectionInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Cluster/ClusterInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Cluster/PredisCluster.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Cluster/RedisCluster.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/CompositeConnectionInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/CompositeStreamConnection.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/ConnectionException.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/ConnectionInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Factory.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/FactoryInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/NodeConnectionInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Parameters.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/ParametersInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/PhpiredisSocketConnection.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/PhpiredisStreamConnection.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Replication/MasterSlaveReplication.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Replication/ReplicationInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Replication/SentinelReplication.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/StreamConnection.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/WebdisConnection.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Monitor/Consumer.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/NotSupportedException.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/Atomic.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/ConnectionErrorProof.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/FireAndForget.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/Pipeline.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/PredisException.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/ProtocolException.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/ProtocolProcessorInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/RequestSerializerInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/ResponseReaderInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/CompositeProtocolProcessor.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/BulkResponse.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/ErrorResponse.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/IntegerResponse.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/MultiBulkResponse.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/ResponseHandlerInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/StatusResponse.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/StreamableMultiBulkResponse.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/ProtocolProcessor.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/RequestSerializer.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/ResponseReader.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/AbstractConsumer.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/Consumer.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/DispatcherLoop.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Replication/MissingMasterException.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Replication/ReplicationStrategy.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Replication/RoleException.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Error.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/ErrorInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Iterator/MultiBulk.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Iterator/MultiBulkIterator.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Iterator/MultiBulkTuple.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/ResponseInterface.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/ServerException.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Status.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Session/Handler.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/AbortedMultiExecException.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/MultiExec.php create mode 100644 wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/MultiExecState.php create mode 100644 wp-content/plugins/redis-cache/dependencies/vendor/predis/predis/autoload.php create mode 100644 wp-content/plugins/redis-cache/includes/class-autoloader.php create mode 100644 wp-content/plugins/redis-cache/includes/class-metrics.php create mode 100644 wp-content/plugins/redis-cache/includes/class-plugin.php create mode 100644 wp-content/plugins/redis-cache/includes/class-predis.php create mode 100644 wp-content/plugins/redis-cache/includes/class-qm-collector.php create mode 100644 wp-content/plugins/redis-cache/includes/class-qm-output.php create mode 100644 wp-content/plugins/redis-cache/includes/class-ui.php create mode 100644 wp-content/plugins/redis-cache/includes/cli/class-commands.php create mode 100644 wp-content/plugins/redis-cache/includes/diagnostics.php create mode 100644 wp-content/plugins/redis-cache/includes/object-cache.php create mode 100644 wp-content/plugins/redis-cache/includes/ui/class-tab.php create mode 100644 wp-content/plugins/redis-cache/includes/ui/query-monitor.php create mode 100644 wp-content/plugins/redis-cache/includes/ui/settings.php create mode 100644 wp-content/plugins/redis-cache/includes/ui/tabs/diagnostics.php create mode 100644 wp-content/plugins/redis-cache/includes/ui/tabs/metrics.php create mode 100644 wp-content/plugins/redis-cache/includes/ui/tabs/overview.php create mode 100644 wp-content/plugins/redis-cache/includes/ui/widget.php create mode 100644 wp-content/plugins/redis-cache/languages/redis-cache.pot create mode 100644 wp-content/plugins/redis-cache/readme.txt create mode 100644 wp-content/plugins/redis-cache/redis-cache.php create mode 100644 wp-content/uploads/2025/06/image-2.png create mode 100644 wp-content/uploads/2025/06/image-3.png create mode 100644 wp-content/uploads/2025/06/image-4.png create mode 100644 wp-content/uploads/2025/06/image-5.png diff --git a/wp-content/object-cache.php b/wp-content/object-cache.php new file mode 100644 index 000000000..b2a631d32 --- /dev/null +++ b/wp-content/object-cache.php @@ -0,0 +1,3085 @@ +add( $key, $value, $group, $expiration ); +} + +/** + * Adds multiple values to the cache in one call. + * + * @param array $data Array of keys and values to be set. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if cache key and group already exist. + */ +function wp_cache_add_multiple( array $data, $group = '', $expire = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->add_multiple( $data, $group, $expire ); +} + +/** + * Closes the cache. + * + * This function has ceased to do anything since WordPress 2.5. The + * functionality was removed along with the rest of the persistent cache. This + * does not mean that plugins can't implement this function when they need to + * make sure that the cache is cleaned up after WordPress no longer needs it. + * + * @return bool Always returns True + */ +function wp_cache_close() { + return true; +} + +/** + * Decrement a numeric item's value. + * + * @param string $key The key under which to store the value. + * @param int $offset The amount by which to decrement the item's value. + * @param string $group The group value appended to the $key. + * + * @return int|bool Returns item's new value on success or FALSE on failure. + */ +function wp_cache_decr( $key, $offset = 1, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->decrement( $key, $offset, $group ); +} + +/** + * Remove the item from the cache. + * + * @param string $key The key under which to store the value. + * @param string $group The group value appended to the $key. + * @param int $time The amount of time the server will wait to delete the item in seconds. + * + * @return bool Returns TRUE on success or FALSE on failure. + */ +function wp_cache_delete( $key, $group = '', $time = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->delete( $key, $group, $time ); +} + +/** + * Deletes multiple values from the cache in one call. + * + * @param array $keys Array of keys under which the cache to deleted. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if the contents were not deleted. + */ +function wp_cache_delete_multiple( array $keys, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->delete_multiple( $keys, $group ); +} + +/** + * Invalidate all items in the cache. If `WP_REDIS_SELECTIVE_FLUSH` is `true`, + * only keys prefixed with the `WP_REDIS_PREFIX` are flushed. + * + * @return bool Returns TRUE on success or FALSE on failure. + */ +function wp_cache_flush() { + global $wp_object_cache; + + return $wp_object_cache->flush(); +} + +/** + * Removes all cache items in a group. + * + * @param string $group Name of group to remove from cache. + * @return true Returns TRUE on success or FALSE on failure. + */ +function wp_cache_flush_group( $group ) +{ + global $wp_object_cache; + + return $wp_object_cache->flush_group( $group ); +} + +/** + * Removes all cache items from the in-memory runtime cache. + * + * @return bool True on success, false on failure. + */ +function wp_cache_flush_runtime() { + global $wp_object_cache; + + return $wp_object_cache->flush_runtime(); +} + +/** + * Retrieve object from cache. + * + * Gets an object from cache based on $key and $group. + * + * @param string $key The key under which to store the value. + * @param string $group The group value appended to the $key. + * @param bool $force Optional. Whether to force an update of the local cache from the persistent + * cache. Default false. + * @param bool $found Optional. Whether the key was found in the cache. Disambiguates a return of false, + * a storable value. Passed by reference. Default null. + * + * @return bool|mixed Cached object value. + */ +function wp_cache_get( $key, $group = '', $force = false, &$found = null ) { + global $wp_object_cache; + + return $wp_object_cache->get( $key, $group, $force, $found ); +} + +/** + * Retrieves multiple values from the cache in one call. + * + * @param array $keys Array of keys under which the cache contents are stored. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param bool $force Optional. Whether to force an update of the local cache + * from the persistent cache. Default false. + * @return array Array of values organized into groups. + */ +function wp_cache_get_multiple( $keys, $group = '', $force = false ) { + global $wp_object_cache; + + return $wp_object_cache->get_multiple( $keys, $group, $force ); +} + +/** + * Increment a numeric item's value. + * + * @param string $key The key under which to store the value. + * @param int $offset The amount by which to increment the item's value. + * @param string $group The group value appended to the $key. + * + * @return int|bool Returns item's new value on success or FALSE on failure. + */ +function wp_cache_incr( $key, $offset = 1, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->increment( $key, $offset, $group ); +} + +/** + * Sets up Object Cache Global and assigns it. + * + * @return void + */ +function wp_cache_init() { + global $wp_object_cache; + + if ( ! defined( 'WP_REDIS_PREFIX' ) && getenv( 'WP_REDIS_PREFIX' ) ) { + define( 'WP_REDIS_PREFIX', getenv( 'WP_REDIS_PREFIX' ) ); + } + + if ( ! defined( 'WP_REDIS_SELECTIVE_FLUSH' ) && getenv( 'WP_REDIS_SELECTIVE_FLUSH' ) ) { + define( 'WP_REDIS_SELECTIVE_FLUSH', (bool) getenv( 'WP_REDIS_SELECTIVE_FLUSH' ) ); + } + + // Backwards compatibility: map `WP_CACHE_KEY_SALT` constant to `WP_REDIS_PREFIX`. + if ( defined( 'WP_CACHE_KEY_SALT' ) && ! defined( 'WP_REDIS_PREFIX' ) ) { + define( 'WP_REDIS_PREFIX', WP_CACHE_KEY_SALT ); + } + + // Set unique prefix for sites hosted on Cloudways + if ( ! defined( 'WP_REDIS_PREFIX' ) && isset( $_SERVER['cw_allowed_ip'] ) ) { + define( 'WP_REDIS_PREFIX', getenv( 'HTTP_X_APP_USER' ) ); + } + + if ( ! ( $wp_object_cache instanceof WP_Object_Cache ) ) { + $fail_gracefully = defined( 'WP_REDIS_GRACEFUL' ) && WP_REDIS_GRACEFUL; + + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited + $wp_object_cache = new WP_Object_Cache( $fail_gracefully ); + } +} + +/** + * Replaces a value in cache. + * + * This method is similar to "add"; however, is does not successfully set a value if + * the object's key is not already set in cache. + * + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * + * @return bool Returns TRUE on success or FALSE on failure. + */ +function wp_cache_replace( $key, $value, $group = '', $expiration = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->replace( $key, $value, $group, $expiration ); +} + +/** + * Sets a value in cache. + * + * The value is set whether or not this key already exists in Redis. + * + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * + * @return bool Returns TRUE on success or FALSE on failure. + */ +function wp_cache_set( $key, $value, $group = '', $expiration = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->set( $key, $value, $group, $expiration ); +} + +/** + * Sets multiple values to the cache in one call. + * + * @param array $data Array of keys and values to be set. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false on failure. + */ +function wp_cache_set_multiple( array $data, $group = '', $expire = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->set_multiple( $data, $group, $expire ); +} + +/** + * Switch the internal blog id. + * + * This changes the blog id used to create keys in blog specific groups. + * + * @param int $_blog_id The blog ID. + * + * @return bool + */ +function wp_cache_switch_to_blog( $_blog_id ) { + global $wp_object_cache; + + return $wp_object_cache->switch_to_blog( $_blog_id ); +} + +/** + * Adds a group or set of groups to the list of Redis groups. + * + * @param string|array $groups A group or an array of groups to add. + * + * @return void + */ +function wp_cache_add_global_groups( $groups ) { + global $wp_object_cache; + + $wp_object_cache->add_global_groups( $groups ); +} + +/** + * Adds a group or set of groups to the list of non-Redis groups. + * + * @param string|array $groups A group or an array of groups to add. + * + * @return void + */ +function wp_cache_add_non_persistent_groups( $groups ) { + global $wp_object_cache; + + $wp_object_cache->add_non_persistent_groups( $groups ); +} + +/** + * Object cache class definition + */ +class WP_Object_Cache { + /** + * The Redis client. + * + * @var mixed + */ + private $redis; + + /** + * The Redis server version. + * + * @var null|string + */ + private $redis_version = null; + + /** + * Track if Redis is available. + * + * @var bool + */ + private $redis_connected = false; + + /** + * Check to fail gracefully or throw an exception. + * + * @var bool + */ + private $fail_gracefully = true; + + /** + * Holds the non-Redis objects. + * + * @var array + */ + public $cache = []; + + /** + * Holds the diagnostics values. + * + * @var array + */ + public $diagnostics = null; + + /** + * Holds the error messages. + * + * @var array + */ + public $errors = []; + + /** + * List of global groups. + * + * @var array + */ + public $global_groups = [ + 'blog-details', + 'blog-id-cache', + 'blog-lookup', + 'global-posts', + 'networks', + 'rss', + 'sites', + 'site-details', + 'site-lookup', + 'site-options', + 'site-transient', + 'users', + 'useremail', + 'userlogins', + 'usermeta', + 'user_meta', + 'userslugs', + ]; + + /** + * List of groups that will not be flushed. + * + * @var array + */ + public $unflushable_groups = []; + + /** + * List of groups not saved to Redis. + * + * @var array + */ + public $ignored_groups = []; + + /** + * List of groups and their types. + * + * @var array + */ + public $group_type = []; + + /** + * Prefix used for global groups. + * + * @var string + */ + public $global_prefix = ''; + + /** + * Prefix used for non-global groups. + * + * @var int + */ + public $blog_prefix = 0; + + /** + * Track how many requests were found in cache. + * + * @var int + */ + public $cache_hits = 0; + + /** + * Track how may requests were not cached. + * + * @var int + */ + public $cache_misses = 0; + + /** + * The amount of Redis commands made. + * + * @var int + */ + public $cache_calls = 0; + + /** + * The amount of microseconds (μs) waited for Redis commands. + * + * @var float + */ + public $cache_time = 0; + + /** + * Instantiate the Redis class. + * + * @param bool $fail_gracefully Handles and logs errors if true throws exceptions otherwise. + */ + public function __construct( $fail_gracefully = false ) { + global $blog_id, $table_prefix; + + $this->fail_gracefully = $fail_gracefully; + + if ( defined( 'WP_REDIS_GLOBAL_GROUPS' ) && is_array( WP_REDIS_GLOBAL_GROUPS ) ) { + $this->global_groups = array_map( [ $this, 'sanitize_key_part' ], WP_REDIS_GLOBAL_GROUPS ); + } + + $this->global_groups[] = 'redis-cache'; + + if ( defined( 'WP_REDIS_IGNORED_GROUPS' ) && is_array( WP_REDIS_IGNORED_GROUPS ) ) { + $this->ignored_groups = array_map( [ $this, 'sanitize_key_part' ], WP_REDIS_IGNORED_GROUPS ); + } + + if ( defined( 'WP_REDIS_UNFLUSHABLE_GROUPS' ) && is_array( WP_REDIS_UNFLUSHABLE_GROUPS ) ) { + $this->unflushable_groups = array_map( [ $this, 'sanitize_key_part' ], WP_REDIS_UNFLUSHABLE_GROUPS ); + } + + $this->cache_group_types(); + + if ( function_exists( '_doing_it_wrong' ) ) { + if ( defined( 'WP_REDIS_TRACE' ) && WP_REDIS_TRACE ) { + _doing_it_wrong( __FUNCTION__ , 'Tracing feature was removed.' , '2.1.2' ); + } + } + + $client = $this->determine_client(); + $parameters = $this->build_parameters(); + + try { + switch ( $client ) { + case 'hhvm': + $this->connect_using_hhvm( $parameters ); + break; + case 'phpredis': + $this->connect_using_phpredis( $parameters ); + break; + case 'relay': + $this->connect_using_relay( $parameters ); + break; + case 'credis': + $this->connect_using_credis( $parameters ); + break; + case 'predis': + default: + $this->connect_using_predis( $parameters ); + break; + } + + if ( defined( 'WP_REDIS_CLUSTER' ) ) { + $connectionId = is_string( WP_REDIS_CLUSTER ) + ? WP_REDIS_CLUSTER + : current( $this->build_cluster_connection_array() ); + + $this->diagnostics[ 'ping' ] = $client === 'predis' + ? $this->redis->getClientBy( 'id', $connectionId )->ping() + : $this->redis->ping( $connectionId ); + } else { + $this->diagnostics[ 'ping' ] = $this->redis->ping(); + } + + $this->fetch_info(); + + $this->redis_connected = true; + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + } + + // Assign global and blog prefixes for use with keys. + if ( function_exists( 'is_multisite' ) ) { + $this->global_prefix = is_multisite() ? '' : $table_prefix; + $this->blog_prefix = is_multisite() ? $blog_id : $table_prefix; + } + } + + /** + * Set group type array + * + * @return void + */ + protected function cache_group_types() { + foreach ( $this->global_groups as $group ) { + $this->group_type[ $group ] = 'global'; + } + + foreach ( $this->unflushable_groups as $group ) { + $this->group_type[ $group ] = 'unflushable'; + } + + foreach ( $this->ignored_groups as $group ) { + $this->group_type[ $group ] = 'ignored'; + } + } + + /** + * Determine the Redis client. + * + * @return string + */ + protected function determine_client() { + $client = 'predis'; + + if ( class_exists( 'Redis' ) ) { + $client = defined( 'HHVM_VERSION' ) ? 'hhvm' : 'phpredis'; + } + + if ( defined( 'WP_REDIS_CLIENT' ) ) { + $client = (string) WP_REDIS_CLIENT; + $client = str_replace( 'pecl', 'phpredis', $client ); + } + + return trim( strtolower( $client ) ); + } + + /** + * Build the connection parameters from config constants. + * + * @return array + */ + protected function build_parameters() { + $parameters = [ + 'scheme' => 'tcp', + 'host' => '127.0.0.1', + 'port' => 6379, + 'database' => 0, + 'timeout' => 1, + 'read_timeout' => 1, + 'retry_interval' => null, + 'persistent' => false, + ]; + + $settings = [ + 'scheme', + 'host', + 'port', + 'path', + 'password', + 'database', + 'timeout', + 'read_timeout', + 'retry_interval', + ]; + + foreach ( $settings as $setting ) { + $constant = sprintf( 'WP_REDIS_%s', strtoupper( $setting ) ); + + if ( defined( $constant ) ) { + $parameters[ $setting ] = constant( $constant ); + } + } + + if ( isset( $parameters[ 'password' ] ) && $parameters[ 'password' ] === '' ) { + unset( $parameters[ 'password' ] ); + } + + $this->diagnostics[ 'timeout' ] = $parameters[ 'timeout' ]; + $this->diagnostics[ 'read_timeout' ] = $parameters[ 'read_timeout' ]; + $this->diagnostics[ 'retry_interval' ] = $parameters[ 'retry_interval' ]; + + return $parameters; + } + + /** + * Connect to Redis using the PhpRedis (PECL) extension. + * + * @param array $parameters Connection parameters built by the `build_parameters` method. + * @return void + */ + protected function connect_using_phpredis( $parameters ) { + $version = phpversion( 'redis' ); + + $this->diagnostics[ 'client' ] = sprintf( 'PhpRedis (v%s)', $version ); + + if ( defined( 'WP_REDIS_SHARDS' ) ) { + $this->redis = new RedisArray( array_values( WP_REDIS_SHARDS ) ); + + $this->diagnostics[ 'shards' ] = WP_REDIS_SHARDS; + } elseif ( defined( 'WP_REDIS_CLUSTER' ) ) { + if ( is_string( WP_REDIS_CLUSTER ) ) { + $this->redis = new RedisCluster( WP_REDIS_CLUSTER ); + } else { + $args = [ + 'cluster' => $this->build_cluster_connection_array(), + 'timeout' => $parameters['timeout'], + 'read_timeout' => $parameters['read_timeout'], + 'persistent' => $parameters['persistent'], + ]; + + if ( isset( $parameters['password'] ) && version_compare( $version, '4.3.0', '>=' ) ) { + $args['password'] = $parameters['password']; + } + + if ( version_compare( $version, '5.3.0', '>=' ) && defined( 'WP_REDIS_SSL_CONTEXT' ) && ! empty( WP_REDIS_SSL_CONTEXT ) ) { + if ( ! array_key_exists( 'password', $args ) ) { + $args['password'] = null; + } + + $args['ssl'] = WP_REDIS_SSL_CONTEXT; + } + + $this->redis = new RedisCluster( null, ...array_values( $args ) ); + $this->diagnostics += $args; + } + } else { + $this->redis = new Redis(); + + $args = [ + 'host' => $parameters['host'], + 'port' => $parameters['port'], + 'timeout' => $parameters['timeout'], + '', + 'retry_interval' => (int) $parameters['retry_interval'], + ]; + + if ( version_compare( $version, '3.1.3', '>=' ) ) { + $args['read_timeout'] = $parameters['read_timeout']; + } + + if ( strcasecmp( 'tls', $parameters['scheme'] ) === 0 ) { + $args['host'] = sprintf( + '%s://%s', + $parameters['scheme'], + str_replace( 'tls://', '', $parameters['host'] ) + ); + + if ( version_compare( $version, '5.3.0', '>=' ) && defined( 'WP_REDIS_SSL_CONTEXT' ) && ! empty( WP_REDIS_SSL_CONTEXT ) ) { + $args['others']['stream'] = WP_REDIS_SSL_CONTEXT; + } + } + + if ( strcasecmp( 'unix', $parameters['scheme'] ) === 0 ) { + $args['host'] = $parameters['path']; + $args['port'] = -1; + } + + call_user_func_array( [ $this->redis, 'connect' ], array_values( $args ) ); + + if ( isset( $parameters['password'] ) ) { + $args['password'] = $parameters['password']; + $this->redis->auth( $parameters['password'] ); + } + + if ( isset( $parameters['database'] ) ) { + if ( ctype_digit( (string) $parameters['database'] ) ) { + $parameters['database'] = (int) $parameters['database']; + } + + $args['database'] = $parameters['database']; + + if ( $parameters['database'] ) { + $this->redis->select( $parameters['database'] ); + } + } + + $this->diagnostics += $args; + } + + if ( defined( 'WP_REDIS_SERIALIZER' ) && ! empty( WP_REDIS_SERIALIZER ) ) { + $this->redis->setOption( Redis::OPT_SERIALIZER, WP_REDIS_SERIALIZER ); + + if ( function_exists( '_doing_it_wrong' ) ) { + _doing_it_wrong( __FUNCTION__ , 'The `WP_REDIS_SERIALIZER` configuration constant has been deprecated, use `WP_REDIS_IGBINARY` instead.', '2.3.1' ); + } + } + } + + /** + * Connect to Redis using the Relay extension. + * + * @param array $parameters Connection parameters built by the `build_parameters` method. + * @return void + */ + protected function connect_using_relay( $parameters ) { + $version = phpversion( 'relay' ); + + $this->diagnostics[ 'client' ] = sprintf( 'Relay (v%s)', $version ); + + if ( defined( 'WP_REDIS_SHARDS' ) ) { + throw new Exception('Relay does not support sharding.'); + } elseif ( defined( 'WP_REDIS_CLUSTER' ) ) { + throw new Exception('Relay does not cluster connections.'); + } else { + $this->redis = new Relay\Relay; + + $args = [ + 'host' => $parameters['host'], + 'port' => $parameters['port'], + 'timeout' => $parameters['timeout'], + '', + 'retry_interval' => (int) $parameters['retry_interval'], + ]; + + $args['read_timeout'] = $parameters['read_timeout']; + + if ( strcasecmp( 'tls', $parameters['scheme'] ) === 0 ) { + $args['host'] = sprintf( + '%s://%s', + $parameters['scheme'], + str_replace( 'tls://', '', $parameters['host'] ) + ); + + if ( defined( 'WP_REDIS_SSL_CONTEXT' ) && ! empty( WP_REDIS_SSL_CONTEXT ) ) { + $args['others']['stream'] = WP_REDIS_SSL_CONTEXT; + } + } + + if ( strcasecmp( 'unix', $parameters['scheme'] ) === 0 ) { + $args['host'] = $parameters['path']; + $args['port'] = -1; + } + + call_user_func_array( [ $this->redis, 'connect' ], array_values( $args ) ); + + if ( isset( $parameters['password'] ) ) { + $args['password'] = $parameters['password']; + $this->redis->auth( $parameters['password'] ); + } + + if ( isset( $parameters['database'] ) ) { + if ( ctype_digit( (string) $parameters['database'] ) ) { + $parameters['database'] = (int) $parameters['database']; + } + + $args['database'] = $parameters['database']; + + if ( $parameters['database'] ) { + $this->redis->select( $parameters['database'] ); + } + } + + $this->diagnostics += $args; + } + + if ( defined( 'WP_REDIS_SERIALIZER' ) && ! empty( WP_REDIS_SERIALIZER ) ) { + $this->redis->setOption( Relay\Relay::OPT_SERIALIZER, WP_REDIS_SERIALIZER ); + + if ( function_exists( '_doing_it_wrong' ) ) { + _doing_it_wrong( __FUNCTION__ , 'The `WP_REDIS_SERIALIZER` configuration constant has been deprecated, use `WP_REDIS_IGBINARY` instead.', '2.3.1' ); + } + } + } + + /** + * Connect to Redis using the Predis library. + * + * @param array $parameters Connection parameters built by the `build_parameters` method. + * @throws \Exception If the Predis library was not found or is unreadable. + * @return void + */ + protected function connect_using_predis( $parameters ) { + $client = 'Predis'; + + // Load bundled Predis library. + if ( ! class_exists( 'Predis\Client' ) ) { + $predis = '/dependencies/predis/predis/autoload.php'; + + $pluginDir = defined( 'WP_PLUGIN_DIR' ) ? WP_PLUGIN_DIR . '/redis-cache' : null; + $contentDir = defined( 'WP_CONTENT_DIR' ) ? WP_CONTENT_DIR . '/plugins/redis-cache' : null; + $pluginPath = defined( 'WP_REDIS_PLUGIN_PATH' ) ? WP_REDIS_PLUGIN_PATH : null; + + if ( $pluginDir && is_readable( $pluginDir . $predis ) ) { + require_once $pluginDir . $predis; + } elseif ( $contentDir && is_readable( $contentDir . $predis ) ) { + require_once $contentDir . $predis; + } elseif ( $pluginPath && is_readable( $pluginPath . $predis ) ) { + require_once $pluginPath . $predis; + } else { + throw new Exception( + 'Predis library not found. Re-install Redis Cache plugin or delete the object-cache.php.' + ); + } + } + + $servers = false; + $options = []; + + if ( defined( 'WP_REDIS_SHARDS' ) ) { + $servers = WP_REDIS_SHARDS; + $parameters['shards'] = $servers; + } elseif ( defined( 'WP_REDIS_SENTINEL' ) ) { + $servers = WP_REDIS_SERVERS; + $parameters['servers'] = $servers; + $options['replication'] = 'sentinel'; + $options['service'] = WP_REDIS_SENTINEL; + } elseif ( defined( 'WP_REDIS_SERVERS' ) ) { + $servers = WP_REDIS_SERVERS; + $parameters['servers'] = $servers; + $options['replication'] = 'predis'; + } elseif ( defined( 'WP_REDIS_CLUSTER' ) ) { + $servers = $this->build_cluster_connection_array(); + $parameters['cluster'] = $servers; + $options['cluster'] = 'redis'; + } + + if ( strcasecmp( 'unix', $parameters['scheme'] ) === 0 ) { + unset($parameters['host'], $parameters['port']); + } + + if ( isset( $parameters['read_timeout'] ) && $parameters['read_timeout'] ) { + $parameters['read_write_timeout'] = $parameters['read_timeout']; + } + + foreach ( [ 'WP_REDIS_SERVERS', 'WP_REDIS_SHARDS', 'WP_REDIS_CLUSTER' ] as $constant ) { + if ( defined( $constant ) ) { + if ( $parameters['database'] ) { + $options['parameters']['database'] = $parameters['database']; + } + + if ( isset( $parameters['password'] ) ) { + if ( is_array( $parameters['password'] ) ) { + $options['parameters']['username'] = WP_REDIS_PASSWORD[0]; + $options['parameters']['password'] = WP_REDIS_PASSWORD[1]; + } else { + $options['parameters']['password'] = WP_REDIS_PASSWORD; + } + } + } + } + + if ( isset( $parameters['password'] ) ) { + if ( is_array( $parameters['password'] ) ) { + $parameters['username'] = array_shift( $parameters['password'] ); + $parameters['password'] = implode( '', $parameters['password'] ); + } + + if ( defined( 'WP_REDIS_USERNAME' ) ) { + $parameters['username'] = WP_REDIS_USERNAME; + } + } + + if ( defined( 'WP_REDIS_SSL_CONTEXT' ) && ! empty( WP_REDIS_SSL_CONTEXT ) ) { + $parameters['ssl'] = WP_REDIS_SSL_CONTEXT; + } + + $this->redis = new Predis\Client( $servers ?: $parameters, $options ); + $this->redis->connect(); + + $this->diagnostics = array_merge( + [ 'client' => sprintf( '%s (v%s)', $client, Predis\Client::VERSION ) ], + $parameters, + $options + ); + } + + /** + * Connect to Redis using the Credis library. + * + * @param array $parameters Connection parameters built by the `build_parameters` method. + * @throws \Exception If the Credis library was not found or is unreadable. + * @throws \Exception If redis sharding should be configured as Credis does not support sharding. + * @throws \Exception If more than one seninel is configured as Credis does not support multiple sentinel servers. + * @return void + */ + protected function connect_using_credis( $parameters ) { + _doing_it_wrong( __FUNCTION__ , 'Credis support will be removed in future versions.' , '2.0.26' ); + + $client = 'Credis'; + + $creds_path = sprintf( + '%s/redis-cache/dependencies/colinmollenhour/credis/', + defined( 'WP_PLUGIN_DIR' ) ? WP_PLUGIN_DIR : WP_CONTENT_DIR . '/plugins' + ); + + $to_load = []; + + if ( ! class_exists( 'Credis_Client' ) ) { + $to_load[] = 'Client.php'; + } + + $has_shards = defined( 'WP_REDIS_SHARDS' ); + $has_sentinel = defined( 'WP_REDIS_SENTINEL' ); + $has_servers = defined( 'WP_REDIS_SERVERS' ); + $has_cluster = defined( 'WP_REDIS_CLUSTER' ); + + if ( ( $has_shards || $has_sentinel || $has_servers || $has_cluster ) && ! class_exists( 'Credis_Cluster' ) ) { + $to_load[] = 'Cluster.php'; + + if ( defined( 'WP_REDIS_SENTINEL' ) && ! class_exists( 'Credis_Sentinel' ) ) { + $to_load[] = 'Sentinel.php'; + } + } + + foreach ( $to_load as $sub_path ) { + $path = $creds_path . $sub_path; + + if ( file_exists( $path ) ) { + require_once $path; + } else { + throw new Exception( + 'Credis library not found. Re-install Redis Cache plugin or delete object-cache.php.' + ); + } + } + + if ( defined( 'WP_REDIS_SHARDS' ) ) { + throw new Exception( + 'Sharding not supported by bundled Credis library. Please review your Redis Cache configuration.' + ); + } + + if ( defined( 'WP_REDIS_SENTINEL' ) ) { + if ( is_array( WP_REDIS_SERVERS ) && count( WP_REDIS_SERVERS ) > 1 ) { + throw new Exception( + 'Multiple sentinel servers are not supported by the bundled Credis library. Please review your Redis Cache configuration.' + ); + } + + $connection_string = array_values( WP_REDIS_SERVERS )[0]; + $sentinel = new Credis_Sentinel( new Credis_Client( $connection_string ) ); + $this->redis = $sentinel->getCluster( WP_REDIS_SENTINEL ); + $args['servers'] = WP_REDIS_SERVERS; + } elseif ( defined( 'WP_REDIS_CLUSTER' ) || defined( 'WP_REDIS_SERVERS' ) ) { + $parameters['db'] = $parameters['database']; + + $is_cluster = defined( 'WP_REDIS_CLUSTER' ); + $clients = $is_cluster ? WP_REDIS_CLUSTER : WP_REDIS_SERVERS; + + foreach ( $clients as $index => $connection_string ) { + // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url + $url_components = parse_url( $connection_string ); + + if ( isset( $url_components['query'] ) ) { + parse_str( $url_components['query'], $add_params ); + } + + if ( ! $is_cluster && isset( $add_params['alias'] ) ) { + $add_params['master'] = 'master' === $add_params['alias']; + } + + $add_params['host'] = $url_components['host']; + $add_params['port'] = $url_components['port']; + + if ( ! isset( $add_params['alias'] ) ) { + $add_params['alias'] = "redis-$index"; + } + + $clients[ $index ] = array_merge( $parameters, $add_params ); + + unset($add_params); + } + + $this->redis = new Credis_Cluster( $clients ); + + foreach ( $clients as $index => $_client ) { + $connection_string = "{$_client['scheme']}://{$_client['host']}:{$_client['port']}"; + unset( $_client['scheme'], $_client['host'], $_client['port'] ); + + $params = array_filter( $_client ); + + if ( $params ) { + $connection_string .= '?' . http_build_query( $params, '', '&' ); + } + + $clients[ $index ] = $connection_string; + } + + $args['servers'] = $clients; + } else { + $args = [ + 'host' => $parameters['scheme'] === 'unix' ? $parameters['path'] : $parameters['host'], + 'port' => $parameters['port'], + 'timeout' => $parameters['timeout'], + 'persistent' => '', + 'database' => $parameters['database'], + 'password' => isset( $parameters['password'] ) ? $parameters['password'] : null, + ]; + + $this->redis = new Credis_Client( ...array_values( $args ) ); + } + + // Don't use PhpRedis if it is available. + $this->redis->forceStandalone(); + + $this->redis->connect(); + + if ( $parameters['read_timeout'] ) { + $args['read_timeout'] = $parameters['read_timeout']; + $this->redis->setReadTimeout( $parameters['read_timeout'] ); + } + + $this->diagnostics = array_merge( + [ 'client' => sprintf( '%s (v%s)', $client, Credis_Client::VERSION ) ], + $args + ); + } + + /** + * Connect to Redis using HHVM's Redis extension. + * + * @param array $parameters Connection parameters built by the `build_parameters` method. + * @return void + */ + protected function connect_using_hhvm( $parameters ) { + _doing_it_wrong( __FUNCTION__ , 'HHVM support will be removed in future versions.' , '2.0.26' ); + + $this->redis = new Redis(); + + // Adjust host and port if the scheme is `unix`. + if ( strcasecmp( 'unix', $parameters['scheme'] ) === 0 ) { + $parameters['host'] = 'unix://' . $parameters['path']; + $parameters['port'] = 0; + } + + $this->redis->connect( + $parameters['host'], + $parameters['port'], + $parameters['timeout'], + null, + $parameters['retry_interval'] + ); + + if ( $parameters['read_timeout'] ) { + $this->redis->setOption( Redis::OPT_READ_TIMEOUT, $parameters['read_timeout'] ); + } + + if ( isset( $parameters['password'] ) ) { + $this->redis->auth( $parameters['password'] ); + } + + if ( isset( $parameters['database'] ) ) { + if ( ctype_digit( (string) $parameters['database'] ) ) { + $parameters['database'] = (int) $parameters['database']; + } + + if ( $parameters['database'] ) { + $this->redis->select( $parameters['database'] ); + } + } + + $this->diagnostics = array_merge( + [ 'client' => sprintf( 'HHVM Extension (v%s)', HHVM_VERSION ) ], + $parameters + ); + } + + /** + * Fetches Redis `INFO` mostly for server version. + * + * @return void + */ + public function fetch_info() { + if ( defined( 'WP_REDIS_CLUSTER' ) ) { + $connectionId = is_string( WP_REDIS_CLUSTER ) + ? 'SERVER' + : current( $this->build_cluster_connection_array() ); + + $info = $this->is_predis() + ? $this->redis->getClientBy( 'id', $connectionId )->info() + : $this->redis->info( $connectionId ); + } else { + if ( $this->is_predis() ) { + $connection = $this->redis->getConnection(); + if ( $connection instanceof Predis\Connection\Replication\ReplicationInterface ) { + $connection->switchToMaster(); + } + } + + $info = $this->redis->info(); + } + + if ( isset( $info['redis_version'] ) ) { + $this->redis_version = $info['redis_version']; + } elseif ( isset( $info['Server']['redis_version'] ) ) { + $this->redis_version = $info['Server']['redis_version']; + } + } + + /** + * Is Redis available? + * + * @return bool + */ + public function redis_status() { + return (bool) $this->redis_connected; + } + + /** + * Returns the Redis instance. + * + * @return mixed + */ + public function redis_instance() { + return $this->redis; + } + + /** + * Returns the Redis server version. + * + * @return null|string + */ + public function redis_version() { + return $this->redis_version; + } + + /** + * Adds a value to cache. + * + * If the specified key already exists, the value is not stored and the function + * returns false. + * + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * @return bool Returns TRUE on success or FALSE on failure. + */ + public function add( $key, $value, $group = 'default', $expiration = 0 ) { + return $this->add_or_replace( true, $key, $value, $group, $expiration ); + } + + /** + * Adds multiple values to the cache in one call. + * + * @param array $data Array of keys and values to be added. + * @param string $group Optional. Where the cache contents are grouped. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if cache key and group already exist. + */ + public function add_multiple( array $data, $group = 'default', $expire = 0 ) { + if ( function_exists( 'wp_suspend_cache_addition' ) && wp_suspend_cache_addition() ) { + return array_combine( array_keys( $data ), array_fill( 0, count( $data ), false ) ); + } + + if ( + $this->redis_status() && + method_exists( $this->redis, 'pipeline' ) && + ! $this->is_ignored_group( $group ) + ) { + return $this->add_multiple_at_once( $data, $group, $expire ); + } + + $values = []; + + foreach ( $data as $key => $value ) { + $values[ $key ] = $this->add( $key, $value, $group, $expire ); + } + + return $values; + } + + /** + * Adds multiple values to the cache in one call. + * + * @param array $data Array of keys and values to be added. + * @param string $group Optional. Where the cache contents are grouped. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if cache key and group already exist. + */ + protected function add_multiple_at_once( array $data, $group = 'default', $expire = 0 ) { + $keys = array_keys( $data ); + + $san_group = $this->sanitize_key_part( $group ); + + $tx = $this->redis->pipeline(); + + $orig_exp = $expire; + $expire = $this->validate_expiration( $expire ); + $derived_keys = []; + + foreach ( $data as $key => $value ) { + /** + * Filters the cache expiration time + * + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param string $key The cache key. + * @param string $group The cache group. + * @param mixed $orig_exp The original expiration value before validation. + */ + $expire = apply_filters( 'redis_cache_expiration', $expire, $key, $group, $orig_exp ); + + $san_key = $this->sanitize_key_part( $key ); + $derived_key = $derived_keys[ $key ] = $this->fast_build_key( $san_key, $san_group ); + + $args = [ $derived_key, $this->maybe_serialize( $value ) ]; + + if ( $this->is_predis() ) { + $args[] = 'nx'; + + if ( $expire ) { + $args[] = 'ex'; + $args[] = $expire; + } + } else { + if ( $expire ) { + $args[] = [ 'nx', 'ex' => $expire ]; + } else { + $args[] = [ 'nx' ]; + } + } + + $tx->set( ...$args ); + } + + try { + $start_time = microtime( true ); + + $method = $this->is_predis() ? 'execute' : 'exec'; + + $results = array_map( function ( $response ) { + return (bool) $this->parse_redis_response( $response ); + }, $tx->{$method}() ?: [] ); + + if ( count( $results ) !== count( $keys ) ) { + $tx->discard(); + + return array_fill_keys( $keys, false ); + } + + $results = array_combine( $keys, $results ); + + foreach ( $results as $key => $result ) { + if ( $result ) { + $this->add_to_internal_cache( $derived_keys[ $key ], $data[ $key ] ); + } + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return array_combine( $keys, array_fill( 0, count( $keys ), false ) ); + } + + return $results; + } + + /** + * Replace a value in the cache. + * + * If the specified key doesn't exist, the value is not stored and the function + * returns false. + * + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * @return bool Returns TRUE on success or FALSE on failure. + */ + public function replace( $key, $value, $group = 'default', $expiration = 0 ) { + return $this->add_or_replace( false, $key, $value, $group, $expiration ); + } + + /** + * Add or replace a value in the cache. + * + * Add does not set the value if the key exists; replace does not replace if the value doesn't exist. + * + * @param bool $add True if should only add if value doesn't exist, false to only add when value already exists. + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * @return bool Returns TRUE on success or FALSE on failure. + */ + protected function add_or_replace( $add, $key, $value, $group = 'default', $expiration = 0 ) { + $cache_addition_suspended = function_exists( 'wp_suspend_cache_addition' ) && wp_suspend_cache_addition(); + + if ( $add && $cache_addition_suspended ) { + return false; + } + + $result = true; + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + // Save if group not excluded and redis is up. + if ( ! $this->is_ignored_group( $san_group ) && $this->redis_status() ) { + try { + $orig_exp = $expiration; + $expiration = $this->validate_expiration( $expiration ); + + /** + * Filters the cache expiration time + * + * @since 1.4.2 + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param string $key The cache key. + * @param string $group The cache group. + * @param mixed $orig_exp The original expiration value before validation. + */ + $expiration = apply_filters( 'redis_cache_expiration', $expiration, $key, $group, $orig_exp ); + $start_time = microtime( true ); + + if ( $add ) { + $args = [ $derived_key, $this->maybe_serialize( $value ) ]; + + if ( $this->is_predis() ) { + $args[] = 'nx'; + + if ( $expiration ) { + $args[] = 'ex'; + $args[] = $expiration; + } + } else { + if ( $expiration ) { + $args[] = [ + 'nx', + 'ex' => $expiration, + ]; + } else { + $args[] = [ 'nx' ]; + } + } + + $result = $this->parse_redis_response( + $this->redis->set( ...$args ) + ); + + if ( ! $result ) { + return false; + } + } elseif ( $expiration ) { + $result = $this->parse_redis_response( $this->redis->setex( $derived_key, $expiration, $this->maybe_serialize( $value ) ) ); + } else { + $result = $this->parse_redis_response( $this->redis->set( $derived_key, $this->maybe_serialize( $value ) ) ); + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + } + + $exists = array_key_exists( $derived_key, $this->cache ); + + if ( (bool) $add === $exists ) { + return false; + } + + if ( $result ) { + $this->add_to_internal_cache( $derived_key, $value ); + } + + return $result; + } + + /** + * Remove the item from the cache. + * + * @param string $key The key under which to store the value. + * @param string $group The group value appended to the $key. + * @return bool Returns TRUE on success or FALSE on failure. + */ + public function delete( $key, $group = 'default', $deprecated = false ) { + $result = false; + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + if ( array_key_exists( $derived_key, $this->cache ) ) { + unset( $this->cache[ $derived_key ] ); + $result = true; + } + + $start_time = microtime( true ); + + if ( $this->redis_status() && ! $this->is_ignored_group( $san_group ) ) { + try { + $result = $this->parse_redis_response( $this->redis->del( $derived_key ) ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + + if ( function_exists( 'do_action' ) ) { + /** + * Fires on every cache key deletion + * + * @since 1.3.3 + * @param string $key The cache key. + * @param string $group The group value appended to the $key. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_delete', $key, $group, $execute_time ); + } + + return (bool) $result; + } + + /** + * Deletes multiple values from the cache in one call. + * + * @param array $keys Array of keys to be deleted. + * @param string $group Optional. Where the cache contents are grouped. + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if the contents were not deleted. + */ + public function delete_multiple( array $keys, $group = 'default' ) { + if ( + $this->redis_status() && + method_exists( $this->redis, 'pipeline' ) && + ! $this->is_ignored_group( $group ) + ) { + return $this->delete_multiple_at_once( $keys, $group ); + } + + $values = []; + + foreach ( $keys as $key ) { + $values[ $key ] = $this->delete( $key, $group ); + } + + return $values; + } + + /** + * Deletes multiple values from the cache in one call. + * + * @param array $keys Array of keys to be deleted. + * @param string $group Optional. Where the cache contents are grouped. + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if the contents were not deleted. + */ + protected function delete_multiple_at_once( array $keys, $group = 'default' ) { + $start_time = microtime( true ); + + try { + $tx = $this->redis->pipeline(); + + foreach ( $keys as $key ) { + $derived_key = $this->build_key( (string) $key, $group ); + + $tx->del( $derived_key ); + + unset( $this->cache[ $derived_key ] ); + } + + $method = $this->is_predis() ? 'execute' : 'exec'; + + $results = array_map( function ( $response ) { + return (bool) $this->parse_redis_response( $response ); + }, $tx->{$method}() ?: [] ); + + if ( count( $results ) !== count( $keys ) ) { + $tx->discard(); + + return array_fill_keys( $keys, false ); + } + + $execute_time = microtime( true ) - $start_time; + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return array_combine( $keys, array_fill( 0, count( $keys ), false ) ); + } + + if ( function_exists( 'do_action' ) ) { + foreach ( $keys as $key ) { + /** + * Fires on every cache key deletion + * + * @since 1.3.3 + * @param string $key The cache key. + * @param string $group The group value appended to the $key. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_delete', $key, $group, $execute_time ); + } + } + + return array_combine( $keys, $results ); + } + + /** + * Removes all cache items from the in-memory runtime cache. + * + * @return bool True on success, false on failure. + */ + public function flush_runtime() { + $this->cache = []; + + return true; + } + + /** + * Executes Lua flush script. + * + * @return array|false Returns array on success, false on failure + */ + protected function execute_lua_script( $script ) { + $results = []; + + if ( defined( 'WP_REDIS_CLUSTER' ) ) { + return $this->execute_lua_script_on_cluster( $script ); + } + + $flushTimeout = defined( 'WP_REDIS_FLUSH_TIMEOUT' ) ? WP_REDIS_FLUSH_TIMEOUT : 5; + + if ( $this->is_predis() ) { + $connection = $this->redis->getConnection(); + + if ($connection instanceof Predis\Connection\Replication\ReplicationInterface) { + $connection = $connection->getMaster(); + } + + $timeout = $connection->getParameters()->read_write_timeout ?? ini_get( 'default_socket_timeout' ); + stream_set_timeout( $connection->getResource(), $flushTimeout ); + } else { + $timeout = $this->redis->getOption( Redis::OPT_READ_TIMEOUT ); + $this->redis->setOption( Redis::OPT_READ_TIMEOUT, $flushTimeout ); + } + + try { + $results[] = $this->parse_redis_response( $script() ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + $results = false; + } + + if ( $this->is_predis() ) { + stream_set_timeout( $connection->getResource(), $timeout ); // @phpstan-ignore variable.undefined + } else { + $this->redis->setOption( Redis::OPT_READ_TIMEOUT, $timeout ); + } + + return $results; + } + + /** + * Executes Lua flush script on Redis cluster. + * + * @return array|false Returns array on success, false on failure + */ + protected function execute_lua_script_on_cluster( $script ) { + $results = []; + $redis = $this->redis; + $flushTimeout = defined( 'WP_REDIS_FLUSH_TIMEOUT' ) ? WP_REDIS_FLUSH_TIMEOUT : 5; + + if ( $this->is_predis() ) { + foreach ( $this->redis->getIterator() as $master ) { + $timeout = $master->getConnection()->getParameters()->read_write_timeout ?? ini_get( 'default_socket_timeout' ); + stream_set_timeout( $master->getConnection()->getResource(), $flushTimeout ); + + $this->redis = $master; + $results[] = $this->parse_redis_response( $script() ); + + stream_set_timeout($master->getConnection()->getResource(), $timeout); + } + } else { + try { + foreach ( $this->redis->_masters() as $master ) { + $this->redis = new Redis(); + $this->redis->connect( $master[0], $master[1], 0, null, 0, $flushTimeout ); + + $results[] = $this->parse_redis_response( $script() ); + } + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + $this->redis = $redis; + + return false; + } + } + + $this->redis = $redis; + + return $results; + } + + /** + * Invalidate all items in the cache. If `WP_REDIS_SELECTIVE_FLUSH` is `true`, + * only keys prefixed with the `WP_REDIS_PREFIX` are flushed. + * + * @return bool True on success, false on failure. + */ + public function flush() { + $results = []; + $this->cache = []; + + if ( $this->redis_status() ) { + $salt = defined( 'WP_REDIS_PREFIX' ) ? trim( WP_REDIS_PREFIX ) : null; + $selective = defined( 'WP_REDIS_SELECTIVE_FLUSH' ) ? WP_REDIS_SELECTIVE_FLUSH : null; + + $start_time = microtime( true ); + + if ( $salt && $selective ) { + $script = $this->get_flush_closure( $salt ); + $results = $this->execute_lua_script( $script ); + + if ( empty( $results ) ) { + return false; + } + } else { + if ( defined( 'WP_REDIS_CLUSTER' ) ) { + try { + if ( $this->is_predis() ) { + foreach ( $this->redis->getIterator() as $master ) { + $results[] = $this->parse_redis_response( $master->flushdb() ); + } + } else { + foreach ( $this->redis->_masters() as $master ) { + $results[] = $this->parse_redis_response( $this->redis->flushdb( $master ) ); + } + } + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + } else { + try { + $results[] = $this->parse_redis_response( $this->redis->flushdb() ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + } + } + + if ( function_exists( 'do_action' ) ) { + $execute_time = microtime( true ) - $start_time; + + /** + * Fires on every cache flush + * + * @since 1.3.5 + * @param null|array $results Array of flush results. + * @param int $deprecated Unused. Default 0. + * @param bool $seletive Whether a selective flush took place. + * @param string $salt The defined key prefix. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_flush', $results, 0, $selective, $salt, $execute_time ); + } + } + + if ( empty( $results ) ) { + return false; + } + + foreach ( $results as $result ) { + if ( ! $result ) { + return false; + } + } + + return true; + } + + /** + * Removes all cache items in a group. + * + * @param string $group Name of group to remove from cache. + * @return bool Returns TRUE on success or FALSE on failure. + */ + public function flush_group( $group ) { + if ( defined( 'WP_REDIS_DISABLE_GROUP_FLUSH' ) && WP_REDIS_DISABLE_GROUP_FLUSH ) { + return $this->flush(); + } + + $san_group = $this->sanitize_key_part( $group ); + + if ( is_multisite() && ! $this->is_global_group( $san_group ) ) { + $salt = str_replace( "{$this->blog_prefix}:{$san_group}", "*:{$san_group}", $this->fast_build_key( '*', $san_group ) ); + } else { + $salt = $this->fast_build_key( '*', $san_group ); + } + + foreach ( $this->cache as $key => $value ) { + if ( strpos( $key, "{$san_group}:" ) === 0 || strpos( $key, ":{$san_group}:" ) !== false ) { + unset( $this->cache[ $key ] ); + } + } + + if ( in_array( $san_group, $this->unflushable_groups ) ) { + return false; + } + + if ( ! $this->redis_status() ) { + return false; + } + + $start_time = microtime( true ); + $script = $this->lua_flush_closure( $salt, false ); + $results = $this->execute_lua_script( $script ); + + if ( empty( $results ) ) { + return false; + } + + if ( function_exists( 'do_action' ) ) { + $execute_time = microtime( true ) - $start_time; + + /** + * Fires on every group cache flush + * + * @param null|array $results Array of flush results. + * @param string $salt The defined key prefix. + * @param float $execute_time Execution time for the request in seconds. + * @since 2.2.3 + */ + do_action( 'redis_object_cache_flush_group', $results, $salt, $execute_time ); + } + + foreach ( $results as $result ) { + if ( ! $result ) { + return false; + } + } + + return true; + } + + /** + * Returns a closure to flush selectively. + * + * @param string $salt The salt to be used to differentiate. + * @return callable Generated callable executing the lua script. + */ + protected function get_flush_closure( $salt ) { + if ( $this->unflushable_groups ) { + return $this->lua_flush_extended_closure( $salt ); + } else { + return $this->lua_flush_closure( $salt ); + } + } + + /** + * Quotes a string for usage in the `glob` function + * + * @param string $string The string to quote. + * @return string + */ + protected function glob_quote( $string ) { + $characters = [ '*', '+', '?', '!', '{', '}', '[', ']', '(', ')', '|', '@' ]; + + return str_replace( + $characters, + array_map( + function ( $character ) { + return "[{$character}]"; + }, + $characters + ), + $string + ); + } + + /** + * Returns a closure ready to be called to flush selectively ignoring unflushable groups. + * + * @param string $salt The salt to be used to differentiate. + * @param bool $escape ... + * @return callable Generated callable executing the lua script. + */ + protected function lua_flush_closure( $salt, $escape = true ) { + $salt = $escape ? $this->glob_quote( $salt ) : $salt; + + return function () use ( $salt ) { + $script = <<redis_version) && version_compare( $this->redis_version, '5', '<' ) && version_compare( $this->redis_version, '3.2', '>=' ) ) { + $script = 'redis.replicate_commands()' . "\n" . $script; + } + + $args = $this->is_predis() ? [ $script, 0 ] : [ $script ]; + + return call_user_func_array( [ $this->redis, 'eval' ], $args ); + }; + } + + /** + * Returns a closure ready to be called to flush selectively. + * + * @param string $salt The salt to be used to differentiate. + * @return callable Generated callable executing the lua script. + */ + protected function lua_flush_extended_closure( $salt ) { + $salt = $this->glob_quote( $salt ); + + return function () use ( $salt ) { + $salt_length = strlen( $salt ); + + $unflushable = array_map( + function ( $group ) { + return ":{$group}:"; + }, + $this->unflushable_groups + ); + + $script = <<redis_version) && version_compare( $this->redis_version, '5', '<' ) && version_compare( $this->redis_version, '3.2', '>=' ) ) { + $script = 'redis.replicate_commands()' . "\n" . $script; + } + + $args = $this->is_predis() + ? array_merge( [ $script, count( $unflushable ) ], $unflushable ) + : [ $script, $unflushable, count( $unflushable ) ]; + + return call_user_func_array( [ $this->redis, 'eval' ], $args ); + }; + } + + /** + * Retrieve object from cache. + * + * Gets an object from cache based on $key and $group. + * + * @param string $key The key under which to store the value. + * @param string $group The group value appended to the $key. + * @param bool $force Optional. Whether to force a refetch rather than relying on the local + * cache. Default false. + * @param bool $found Optional. Whether the key was found in the cache. Disambiguates a return of + * false, a storable value. Passed by reference. Default null. + * @return bool|mixed Cached object value. + */ + public function get( $key, $group = 'default', $force = false, &$found = null ) { + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + if ( array_key_exists( $derived_key, $this->cache ) && ! $force ) { + $found = true; + $this->cache_hits++; + $value = $this->get_from_internal_cache( $derived_key ); + + return $value; + } elseif ( $this->is_ignored_group( $group ) || ! $this->redis_status() ) { + $found = false; + $this->cache_misses++; + + return false; + } + + $start_time = microtime( true ); + + try { + $result = $this->redis->get( $derived_key ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + + if ( $result === null || $result === false ) { + $found = false; + $this->cache_misses++; + + return false; + } else { + $found = true; + $this->cache_hits++; + $value = $this->maybe_unserialize( $result ); + } + + $this->add_to_internal_cache( $derived_key, $value ); + + if ( function_exists( 'do_action' ) ) { + /** + * Fires on every cache get request + * + * @since 1.2.2 + * @param mixed $value Value of the cache entry. + * @param string $key The cache key. + * @param string $group The group value appended to the $key. + * @param bool $force Whether a forced refetch has taken place rather than relying on the local cache. + * @param bool $found Whether the key was found in the cache. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_get', $key, $value, $group, $force, $found, $execute_time ); + } + + if ( function_exists( 'apply_filters' ) && function_exists( 'has_filter' ) ) { + if ( has_filter( 'redis_object_cache_get_value' ) ) { + /** + * Filters the return value + * + * @since 1.4.2 + * @param mixed $value Value of the cache entry. + * @param string $key The cache key. + * @param string $group The group value appended to the $key. + * @param bool $force Whether a forced refetch has taken place rather than relying on the local cache. + * @param bool $found Whether the key was found in the cache. + */ + return apply_filters( 'redis_object_cache_get_value', $value, $key, $group, $force, $found ); + } + } + + return $value; + } + + /** + * Retrieves multiple values from the cache in one call. + * + * @param array $keys Array of keys under which the cache contents are stored. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param bool $force Optional. Whether to force an update of the local cache + * from the persistent cache. Default false. + * @return array|false Array of values organized into groups. + */ + public function get_multiple( $keys, $group = 'default', $force = false ) { + if ( ! is_array( $keys ) ) { + return false; + } + + $cache = []; + $derived_keys = []; + $start_time = microtime( true ); + + $san_group = $this->sanitize_key_part( $group ); + + foreach ( $keys as $key ) { + $san_key = $this->sanitize_key_part( $key ); + $derived_keys[ $key ] = $this->fast_build_key( $san_key, $san_group ); + } + + if ( $this->is_ignored_group( $group ) || ! $this->redis_status() ) { + foreach ( $keys as $key ) { + $value = $this->get_from_internal_cache( $derived_keys[ $key ] ); + $cache[ $key ] = $value; + + if ($value === false) { + $this->cache_misses++; + } else { + $this->cache_hits++; + } + } + + return $cache; + } + + if ( ! $force ) { + foreach ( $keys as $key ) { + $value = $this->get_from_internal_cache( $derived_keys[ $key ] ); + + if ( $value === false ) { + $this->cache_misses++; + + } else { + $cache[ $key ] = $value; + $this->cache_hits++; + } + } + } + + $remaining_keys = array_filter( + $keys, + function ( $key ) use ( $cache ) { + return ! array_key_exists( $key, $cache ); + } + ); + + if ( empty( $remaining_keys ) ) { + return $cache; + } + + $start_time = microtime( true ); + $results = []; + + $remaining_ids = array_map( + function ( $key ) use ( $derived_keys ) { + return $derived_keys[ $key ]; + }, + $remaining_keys + ); + + try { + $results = array_combine( + $remaining_keys, + $this->redis->mget( $remaining_ids ) + ?: array_fill( 0, count( $remaining_ids ), false ) + ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + $results = array_combine( + $remaining_keys, + array_fill( 0, count( $remaining_ids ), false ) + ); + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + + foreach ( $results as $key => $value ) { + if ( $value === null || $value === false ) { + $cache[ $key ] = false; + $this->cache_misses++; + } else { + $cache[ $key ] = $this->maybe_unserialize( $value ); + $this->add_to_internal_cache( $derived_keys[ $key ], $cache[ $key ] ); + $this->cache_hits++; + } + } + + if ( function_exists( 'do_action' ) ) { + /** + * Fires on every cache get multiple request + * + * @since 2.0.6 + * @param array $keys Array of keys under which the cache contents are stored. + * @param array $cache Cache items. + * @param string $group The group value appended to the $key. + * @param bool $force Whether a forced refetch has taken place rather than relying on the local cache. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_get_multiple', $keys, $cache, $group, $force, $execute_time ); + } + + if ( function_exists( 'apply_filters' ) && function_exists( 'has_filter' ) ) { + if ( has_filter( 'redis_object_cache_get_value' ) ) { + foreach ( $cache as $key => $value ) { + /** + * Filters the return value + * + * @since 1.4.2 + * @param mixed $value Value of the cache entry. + * @param string $key The cache key. + * @param string $group The group value appended to the $key. + * @param bool $force Whether a forced refetch has taken place rather than relying on the local cache. + */ + $cache[ $key ] = apply_filters( 'redis_object_cache_get_value', $value, $key, $group, $force ); + } + } + } + + return $cache; + } + + /** + * Sets a value in cache. + * + * The value is set whether or not this key already exists in Redis. + * + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * @return bool Returns TRUE on success or FALSE on failure. + */ + public function set( $key, $value, $group = 'default', $expiration = 0 ) { + $result = true; + $start_time = microtime( true ); + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + // Save if group not excluded from redis and redis is up. + if ( ! $this->is_ignored_group( $group ) && $this->redis_status() ) { + $orig_exp = $expiration; + $expiration = $this->validate_expiration( $expiration ); + + /** + * Filters the cache expiration time + * + * @since 1.4.2 + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param string $key The cache key. + * @param string $group The cache group. + * @param mixed $orig_exp The original expiration value before validation. + */ + $expiration = apply_filters( 'redis_cache_expiration', $expiration, $key, $group, $orig_exp ); + + try { + if ( $expiration ) { + $result = $this->parse_redis_response( $this->redis->setex( $derived_key, $expiration, $this->maybe_serialize( $value ) ) ); + } else { + $result = $this->parse_redis_response( $this->redis->set( $derived_key, $this->maybe_serialize( $value ) ) ); + } + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + + $execute_time = microtime( true ) - $start_time; + $this->cache_calls++; + $this->cache_time += $execute_time; + } + + // If the set was successful, or we didn't go to redis. + if ( $result ) { + $this->add_to_internal_cache( $derived_key, $value ); + } + + if ( function_exists( 'do_action' ) ) { + $execute_time = microtime( true ) - $start_time; + + /** + * Fires on every cache set + * + * @since 1.2.2 + * @param string $key The cache key. + * @param mixed $value Value of the cache entry. + * @param string $group The group value appended to the $key. + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_set', $key, $value, $group, $expiration, $execute_time ); + } + + return $result; + } + + /** + * Sets multiple values to the cache in one call. + * + * @param array $data Array of key and value to be set. + * @param string $group Optional. Where the cache contents are grouped. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is always true. + */ + public function set_multiple( array $data, $group = 'default', $expire = 0 ) { + if ( + $this->redis_status() && + method_exists( $this->redis, 'pipeline' ) && + ! $this->is_ignored_group( $group ) + ) { + return $this->set_multiple_at_once( $data, $group, $expire ); + } + + $values = []; + + foreach ( $data as $key => $value ) { + $values[ $key ] = $this->set( $key, $value, $group, $expire ); + } + + return $values; + } + + /** + * Sets multiple values to the cache in one call. + * + * @param array $data Array of key and value to be set. + * @param string $group Optional. Where the cache contents are grouped. + * @param int $expiration Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is always true. + */ + protected function set_multiple_at_once( array $data, $group = 'default', $expiration = 0 ) { + $start_time = microtime( true ); + + $san_group = $this->sanitize_key_part( $group ); + $derived_keys = []; + + $orig_exp = $expiration; + $expiration = $this->validate_expiration( $expiration ); + $expirations = []; + + $tx = $this->redis->pipeline(); + $keys = array_keys( $data ); + + foreach ( $data as $key => $value ) { + $san_key = $this->sanitize_key_part( $key ); + $derived_key = $derived_keys[ $key ] = $this->fast_build_key( $san_key, $san_group ); + + /** + * Filters the cache expiration time + * + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param string $key The cache key. + * @param string $group The cache group. + * @param mixed $orig_exp The original expiration value before validation. + */ + $expiration = $expirations[ $key ] = apply_filters( 'redis_cache_expiration', $expiration, $key, $group, $orig_exp ); + + if ( $expiration ) { + $tx->setex( $derived_key, $expiration, $this->maybe_serialize( $value ) ); + } else { + $tx->set( $derived_key, $this->maybe_serialize( $value ) ); + } + } + + try { + $method = $this->is_predis() ? 'execute' : 'exec'; + + $results = array_map( function ( $response ) { + return (bool) $this->parse_redis_response( $response ); + }, $tx->{$method}() ?: [] ); + + if ( count( $results ) !== count( $keys ) ) { + $tx->discard(); + + return array_fill_keys( $keys, false ); + } + + $results = array_combine( $keys, $results ); + + foreach ( $results as $key => $result ) { + if ( $result ) { + $this->add_to_internal_cache( $derived_keys[ $key ], $data[ $key ] ); + } + } + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return array_combine( $keys, array_fill( 0, count( $keys ), false ) ); + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + + if ( function_exists( 'do_action' ) ) { + foreach ( $data as $key => $value ) { + /** + * Fires on every cache set + * + * @param string $key The cache key. + * @param mixed $value Value of the cache entry. + * @param string $group The group value appended to the $key. + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_set', $key, $value, $group, $expirations[ $key ], $execute_time ); + } + } + + return $results; + } + + /** + * Increment a Redis counter by the amount specified + * + * @param string $key The key name. + * @param int $offset Optional. The increment. Defaults to 1. + * @param string $group Optional. The key group. Default is 'default'. + * @return int|bool + */ + public function increment( $key, $offset = 1, $group = 'default' ) { + $offset = (int) $offset; + $start_time = microtime( true ); + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + // If group is a non-Redis group, save to internal cache, not Redis. + if ( $this->is_ignored_group( $group ) || ! $this->redis_status() ) { + $value = $this->get_from_internal_cache( $derived_key ); + $value += $offset; + $this->add_to_internal_cache( $derived_key, $value ); + + return $value; + } + + try { + $result = $this->parse_redis_response( $this->redis->incrBy( $derived_key, $offset ) ); + + $this->add_to_internal_cache( $derived_key, (int) $this->redis->get( $derived_key ) ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls += 2; + $this->cache_time += $execute_time; + + return $result; + } + + /** + * Alias of `increment()`. + * + * @see self::increment() + * @param string $key The key name. + * @param int $offset Optional. The increment. Defaults to 1. + * @param string $group Optional. The key group. Default is 'default'. + * @return int|bool + */ + public function incr( $key, $offset = 1, $group = 'default' ) { + return $this->increment( $key, $offset, $group ); + } + + /** + * Decrement a Redis counter by the amount specified + * + * @param string $key The key name. + * @param int $offset Optional. The decrement. Defaults to 1. + * @param string $group Optional. The key group. Default is 'default'. + * @return int|bool + */ + public function decrement( $key, $offset = 1, $group = 'default' ) { + $offset = (int) $offset; + $start_time = microtime( true ); + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + // If group is a non-Redis group, save to internal cache, not Redis. + if ( $this->is_ignored_group( $group ) || ! $this->redis_status() ) { + $value = $this->get_from_internal_cache( $derived_key ); + $value -= $offset; + $this->add_to_internal_cache( $derived_key, $value ); + + return $value; + } + + try { + $result = $this->parse_redis_response( $this->redis->decrBy( $derived_key, $offset ) ); + + $this->add_to_internal_cache( $derived_key, (int) $this->redis->get( $derived_key ) ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls += 2; + $this->cache_time += $execute_time; + + return $result; + } + + /** + * Alias of `decrement()`. + * + * @see self::decrement() + * @param string $key The key name. + * @param int $offset Optional. The decrement. Defaults to 1. + * @param string $group Optional. The key group. Default is 'default'. + * @return int|bool + */ + public function decr( $key, $offset = 1, $group = 'default' ) { + return $this->decrement( $key, $offset, $group ); + } + + /** + * Render data about current cache requests + * Used by the Debug bar plugin + * + * @return void + */ + public function stats() { + ?> +

+ Redis Status: + redis_status() ? 'Connected' : 'Not connected'; ?> +
+ Redis Client: + diagnostics['client'] ?: 'Unknown'; ?> +
+ Cache Hits: + cache_hits; ?> +
+ Cache Misses: + cache_misses; ?> +
+ Cache Size: + cache ) ) / 1024, 2 ); ?> KB +

+ cache_hits + $this->cache_misses; + + $bytes = array_map( + function ( $keys ) { + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize + return strlen( serialize( $keys ) ); + }, + $this->cache + ); + + return (object) [ + 'hits' => $this->cache_hits, + 'misses' => $this->cache_misses, + 'ratio' => $total > 0 ? round( $this->cache_hits / ( $total / 100 ), 1 ) : 100, + 'bytes' => array_sum( $bytes ), + 'time' => $this->cache_time, + 'calls' => $this->cache_calls, + 'groups' => (object) [ + 'global' => $this->global_groups, + 'non_persistent' => $this->ignored_groups, + 'unflushable' => $this->unflushable_groups, + ], + 'errors' => empty( $this->errors ) ? null : $this->errors, + 'meta' => [ + 'Client' => $this->diagnostics['client'] ?? 'Unknown', + 'Redis Version' => $this->redis_version, + ], + ]; + } + + /** + * Builds a key for the cached object using the prefix, group and key. + * + * @param string $key The key under which to store the value, pre-sanitized. + * @param string $group The group value appended to the $key, pre-sanitized. + * + * @return string + */ + public function build_key( $key, $group = 'default' ) { + if ( empty( $group ) ) { + $group = 'default'; + } + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + return $this->fast_build_key($san_key, $san_group); + } + + /** + * Builds a key for the cached object using the prefix, group and key. + * + * @param string $key The key under which to store the value, pre-sanitized. + * @param string $group The group value appended to the $key, pre-sanitized. + * + * @return string + */ + public function fast_build_key( $key, $group = 'default' ) { + if ( empty( $group ) ) { + $group = 'default'; + } + + $salt = defined( 'WP_REDIS_PREFIX' ) ? trim( WP_REDIS_PREFIX ) : ''; + + $prefix = $this->is_global_group( $group ) ? $this->global_prefix : $this->blog_prefix; + $prefix = trim( $prefix, '_-:$' ); + + return "{$salt}{$prefix}:{$group}:{$key}"; + } + + /** + * Replaces the set group separator by another one + * + * @param string $part The string to sanitize. + * @return string Sanitized string. + */ + protected function sanitize_key_part( $part ) { + return is_string( $part ) ? str_replace( ':', '-', $part ) : $part; + } + + /** + * Checks if the given group is part the ignored group array + * + * @param string $group Name of the group to check, pre-sanitized. + * @return bool + */ + protected function is_ignored_group( $group ) { + return $this->is_group_of_type( $group, 'ignored' ); + } + + /** + * Checks if the given group is part the global group array + * + * @param string $group Name of the group to check, pre-sanitized. + * @return bool + */ + protected function is_global_group( $group ) { + return $this->is_group_of_type( $group, 'global' ); + } + + /** + * Checks if the given group is part the unflushable group array + * + * @param string $group Name of the group to check, pre-sanitized. + * @return bool + */ + protected function is_unflushable_group( $group ) { + return $this->is_group_of_type( $group, 'unflushable' ); + } + + /** + * Checks the type of the given group + * + * @param string $group Name of the group to check, pre-sanitized. + * @param string $type Type of the group to check. + * @return bool + */ + private function is_group_of_type( $group, $type ) { + return isset( $this->group_type[ $group ] ) + && $this->group_type[ $group ] == $type; + } + + /** + * Convert Redis responses into something meaningful + * + * @param mixed $response Response sent from the redis instance. + * @return mixed + */ + protected function parse_redis_response( $response ) { + if ( is_bool( $response ) ) { + return $response; + } + + if ( is_numeric( $response ) ) { + return $response; + } + + if ( is_object( $response ) && method_exists( $response, 'getPayload' ) ) { + return $response->getPayload() === 'OK'; + } + + return false; + } + + /** + * Simple wrapper for saving object to the internal cache. + * + * @param string $derived_key Key to save value under. + * @param mixed $value Object value. + */ + public function add_to_internal_cache( $derived_key, $value ) { + if ( is_object( $value ) ) { + $value = clone $value; + } + + $this->cache[ $derived_key ] = $value; + } + + /** + * Get a value specifically from the internal, run-time cache, not Redis. + * + * @param int|string $derived_key Key value. + * + * @return bool|mixed Value on success; false on failure. + */ + public function get_from_internal_cache( $derived_key ) { + if ( ! array_key_exists( $derived_key, $this->cache ) ) { + return false; + } + + if ( is_object( $this->cache[ $derived_key ] ) ) { + return clone $this->cache[ $derived_key ]; + } + + return $this->cache[ $derived_key ]; + } + + /** + * In multisite, switch blog prefix when switching blogs + * + * @param int $_blog_id Blog ID. + * @return bool + */ + public function switch_to_blog( $_blog_id ) { + if ( ! function_exists( 'is_multisite' ) || ! is_multisite() ) { + return false; + } + + $this->blog_prefix = (int) $_blog_id; + + return true; + } + + /** + * Sets the list of global groups. + * + * @param array $groups List of groups that are global. + */ + public function add_global_groups( $groups ) { + $groups = (array) $groups; + + if ( $this->redis_status() ) { + $this->global_groups = array_unique( array_merge( $this->global_groups, $groups ) ); + } else { + $this->ignored_groups = array_unique( array_merge( $this->ignored_groups, $groups ) ); + } + + $this->cache_group_types(); + } + + /** + * Sets the list of groups not to be cached by Redis. + * + * @param array $groups List of groups that are to be ignored. + */ + public function add_non_persistent_groups( $groups ) { + /** + * Filters list of groups to be added to {@see self::$ignored_groups} + * + * @since 2.1.7 + * @param string[] $groups List of groups to be ignored. + */ + $groups = apply_filters( 'redis_cache_add_non_persistent_groups', (array) $groups ); + + $this->ignored_groups = array_unique( array_merge( $this->ignored_groups, $groups ) ); + $this->cache_group_types(); + } + + /** + * Sets the list of groups not to flushed cached. + * + * @param array $groups List of groups that are unflushable. + */ + public function add_unflushable_groups( $groups ) { + $groups = (array) $groups; + + $this->unflushable_groups = array_unique( array_merge( $this->unflushable_groups, $groups ) ); + $this->cache_group_types(); + } + + /** + * Wrapper to validate the cache keys expiration value + * + * @param mixed $expiration Incoming expiration value (whatever it is). + */ + protected function validate_expiration( $expiration ) { + $expiration = is_int( $expiration ) || ctype_digit( (string) $expiration ) ? (int) $expiration : 0; + + if ( defined( 'WP_REDIS_MAXTTL' ) ) { + $max = (int) WP_REDIS_MAXTTL; + + if ( $expiration === 0 || $expiration > $max ) { + $expiration = $max; + } + } + + return $expiration; + } + + /** + * Unserialize value only if it was serialized. + * + * @param string $original Maybe unserialized original, if is needed. + * @return mixed Unserialized data can be any type. + */ + protected function maybe_unserialize( $original ) { + if ( defined( 'WP_REDIS_SERIALIZER' ) && ! empty( WP_REDIS_SERIALIZER ) ) { + return $original; + } + + if ( defined( 'WP_REDIS_IGBINARY' ) && WP_REDIS_IGBINARY && function_exists( 'igbinary_unserialize' ) ) { + return igbinary_unserialize( $original ); + } + + // Don't attempt to unserialize data that wasn't serialized going in. + if ( $this->is_serialized( $original ) ) { + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.PHP.DiscouragedPHPFunctions.serialize_unserialize + $value = @unserialize( $original ); + + return is_object( $value ) ? clone $value : $value; + } + + return $original; + } + + /** + * Serialize data, if needed. + * + * @param mixed $data Data that might be serialized. + * @return mixed A scalar data + */ + protected function maybe_serialize( $data ) { + if ( is_object( $data ) ) { + $data = clone $data; + } + + if ( defined( 'WP_REDIS_SERIALIZER' ) && ! empty( WP_REDIS_SERIALIZER ) ) { + return $data; + } + + if ( defined( 'WP_REDIS_IGBINARY' ) && WP_REDIS_IGBINARY && function_exists( 'igbinary_serialize' ) ) { + return igbinary_serialize( $data ); + } + + if ( is_array( $data ) || is_object( $data ) ) { + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize + return serialize( $data ); + } + + if ( $this->is_serialized( $data, false ) ) { + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize + return serialize( $data ); + } + + return $data; + } + + /** + * Check value to find if it was serialized. + * + * If $data is not an string, then returned value will always be false. + * Serialized data is always a string. + * + * @param string $data Value to check to see if was serialized. + * @param bool $strict Optional. Whether to be strict about the end of the string. Default true. + * @return bool False if not serialized and true if it was. + */ + protected function is_serialized( $data, $strict = true ) { + // if it isn't a string, it isn't serialized. + if ( ! is_string( $data ) ) { + return false; + } + + $data = trim( $data ); + + if ( 'N;' === $data ) { + return true; + } + + if ( strlen( $data ) < 4 ) { + return false; + } + + if ( ':' !== $data[1] ) { + return false; + } + + if ( $strict ) { + $lastc = substr( $data, -1 ); + + if ( ';' !== $lastc && '}' !== $lastc ) { + return false; + } + } else { + $semicolon = strpos( $data, ';' ); + $brace = strpos( $data, '}' ); + + // Either ; or } must exist. + if ( false === $semicolon && false === $brace ) { + return false; + } + + // But neither must be in the first X characters. + if ( false !== $semicolon && $semicolon < 3 ) { + return false; + } + + if ( false !== $brace && $brace < 4 ) { + return false; + } + } + $token = $data[0]; + + switch ( $token ) { + case 's': + if ( $strict ) { + if ( '"' !== substr( $data, -2, 1 ) ) { + return false; + } + } elseif ( false === strpos( $data, '"' ) ) { + return false; + } + // Or else fall through. + // No break! + case 'a': + case 'O': + return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data ); + case 'b': + case 'i': + case 'd': + $end = $strict ? '$' : ''; + + return (bool) preg_match( "/^{$token}:[0-9.E-]+;$end/", $data ); + } + + return false; + } + + /** + * Handle the redis failure gracefully or throw an exception. + * + * @param \Exception $exception Exception thrown. + * @throws \Exception If `fail_gracefully` flag is set to a falsy value. + * @return void + */ + protected function handle_exception( $exception ) { + $this->redis_connected = false; + + // When Redis is unavailable, fall back to the internal cache by forcing all groups to be "no redis" groups. + $this->ignored_groups = array_unique( array_merge( $this->ignored_groups, $this->global_groups ) ); + + error_log( $exception ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + + if ( function_exists( 'do_action' ) ) { + /** + * Fires when an object cache related error occurs. + * + * @since 1.5.0 + * @param \Exception $exception The exception. + * @param string $message The exception message. + */ + do_action( 'redis_object_cache_error', $exception, $exception->getMessage() ); + } + + if ( ! $this->fail_gracefully ) { + $this->show_error_and_die( $exception ); + } + + $this->errors[] = $exception->getMessage(); + } + + /** + * Show Redis connection error screen, or load custom `/redis-error.php`. + * + * @return void + */ + protected function show_error_and_die( Exception $exception ) { + wp_load_translations_early(); + + $domain = 'redis-cache'; + $locale = defined( 'WPLANG' ) ? WPLANG : 'en_US'; + $mofile = WP_LANG_DIR . "/plugins/{$domain}-{$locale}.mo"; + + if ( load_textdomain( $domain, $mofile, $locale ) === false ) { + add_filter( 'pre_determine_locale', function () { + return defined( 'WPLANG' ) ? WPLANG : 'en_US'; + } ); + + add_filter( 'pre_get_language_files_from_path', '__return_empty_array' ); + } + + // Load custom Redis error template, if present. + if ( file_exists( WP_CONTENT_DIR . '/redis-error.php' ) ) { + require_once WP_CONTENT_DIR . '/redis-error.php'; + die(); + } + + $verbose = wp_installing() + || defined( 'WP_ADMIN' ) + || ( defined( 'WP_DEBUG' ) && WP_DEBUG ); + + $message = '

' . __( 'Error establishing a Redis connection', 'redis-cache' ) . "

\n"; + + if ( $verbose ) { + $message .= "

" . $exception->getMessage() . "

\n"; + + $message .= '

' . sprintf( + // translators: %s = Formatted wp-config.php file name. + __( 'WordPress is unable to establish a connection to Redis. This means that the connection information in your %s file are incorrect, or that the Redis server is not reachable.', 'redis-cache' ), + 'wp-config.php' + ) . "

\n"; + + $message .= "
    \n"; + $message .= '
  • ' . __( 'Is the correct Redis host and port set?', 'redis-cache' ) . "
  • \n"; + $message .= '
  • ' . __( 'Is the Redis server running?', 'redis-cache' ) . "
  • \n"; + $message .= "
\n"; + + $message .= '

' . sprintf( + // translators: %s = Link to installation instructions. + __( 'If you need help, please read the installation instructions.', 'redis-cache' ), + 'https://github.com/rhubarbgroup/redis-cache/blob/develop/INSTALL.md' + ) . "

\n"; + } + + $message .= '

' . sprintf( + // translators: %1$s = Formatted object-cache.php file name, %2$s = Formatted wp-content directory name. + __( 'To disable Redis, delete the %1$s file in the %2$s directory.', 'redis-cache' ), + 'object-cache.php', + '/wp-content/' + ) . "

\n"; + + wp_die( $message ); + } + + /** + * Builds a clean connection array out of redis clusters array. + * + * @return array + */ + protected function build_cluster_connection_array() { + $cluster = array_values( WP_REDIS_CLUSTER ); + + foreach ( $cluster as $key => $server ) { + $components = parse_url( $server ); + + if ( ! empty( $components['scheme'] ) ) { + $scheme = $components['scheme']; + } elseif ( defined( 'WP_REDIS_SCHEME' ) ) { + $scheme = WP_REDIS_SCHEME; + } else { + $scheme = null; + } + + if ( isset( $scheme ) ) { + $cluster[ $key ] = sprintf( + '%s://%s:%d', + $scheme, + $components['host'], + $components['port'] + ); + } else { + $cluster[ $key ] = sprintf( + '%s:%d', + $components['host'], + $components['port'] + ); + } + } + + return $cluster; + } + + /** + * Check whether Predis client is in use. + * + * @return bool + */ + protected function is_predis() { + return $this->redis instanceof Predis\Client; + } + + /** + * Allows access to private properties for backwards compatibility. + * + * @param string $name Name of the property. + * @return mixed + */ + public function __get( $name ) { + return isset( $this->{$name} ) ? $this->{$name} : null; + } +} + +endif; +// phpcs:enable Generic.WhiteSpace.ScopeIndent.IncorrectExact, Generic.WhiteSpace.ScopeIndent.Incorrect diff --git a/wp-content/plugins/redis-cache/LICENSE.md b/wp-content/plugins/redis-cache/LICENSE.md new file mode 100644 index 000000000..9cecc1d46 --- /dev/null +++ b/wp-content/plugins/redis-cache/LICENSE.md @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/wp-content/plugins/redis-cache/assets/css/admin.css b/wp-content/plugins/redis-cache/assets/css/admin.css new file mode 100644 index 000000000..a5088fe81 --- /dev/null +++ b/wp-content/plugins/redis-cache/assets/css/admin.css @@ -0,0 +1,196 @@ +#rediscache .content-column { + margin-bottom: 3em; +} + +#rediscache .sidebar-column h6 { + margin: 5px 0; + padding: 10px 0; + font-size: 13px; + line-height: 19px; + border-bottom: 1px solid #ccc; +} + +#rediscache .tab-pane { + display: none; +} + +#rediscache .tab-pane.active { + display: block; +} + +#rediscache .form-table th, +#rediscache .form-table td { + padding-top: 7px; + padding-bottom: 7px; +} + +#rediscache .form-table .success { + color: #008a20; +} + +#rediscache .form-table .warning { + color: #dba617; +} + +#rediscache .form-table .error { + color: #d63638; +} + +#rediscache .form-table td ul { + margin: 0; +} + +#rediscache .form-table .description.is-notice { + max-width: 25rem; + color: #d54e21; +} + +#rediscache .form-table .description.is-notice a { + color: #d54e21; +} + +#rediscache .card ul { + list-style: circle; + padding-left: 25px; +} + +#rediscache .tab-pane-metrics .card { + min-width: auto; + max-width: 100%; + padding: 0; +} + +#rediscache .nav-tab-wrapper .nav-tab-disabled { + cursor: not-allowed; + background-color: #e5e5e5 !important; +} + +#rediscache .tab-pane-diagnostics p { + margin-top: 20px; +} + +#rediscache #diagnostics-pane .card { + width: 100%; + max-width: 100%; +} + +#rediscache #diagnostics-pane pre { + height: 400px; + overflow: scroll; +} + +#rediscache .compatibility { + display: flex; + max-width: 520px; + margin-bottom: 5px; + color: #666; +} + +#rediscache .compatibility + ul { + margin-top: 0; + padding-left: 50px; + list-style: circle; + max-width: 470px; + color: #666; +} + +#rediscache .compatibility .dashicons { + margin-right: 5px; +} + +@media screen and (min-width: 1200px) { + #rediscache .columns { + display: flex; + } + + #rediscache .content-column { + flex-grow: 1; + } + + #rediscache .sidebar-column { + max-width: 400px; + margin-left: 20px; + } +} + +#dashboard_rediscache .inside { + margin: 0; + padding: 0; +} + +#widget-redis-stats ul { + margin: 11px 11px 0; + display: flex; +} + +#widget-redis-stats ul li { + margin-bottom: 0; +} + +#metrics-pane #widget-redis-stats ul { + display: block; + list-style-type: none; + text-align: center; + font-size: 14px; +} + +#metrics-pane #widget-redis-stats ul li { + display: inline; + list-style-type: none; +} + +#widget-redis-stats ul a { + padding: 0 7px; + text-decoration: none; +} + +#widget-redis-stats ul a:hover { + color: #135e96; +} + +#widget-redis-stats ul a.active { + color: #1d2327; +} + +#redis-stats-chart .apexcharts-annotations { + display: none; + opacity: 0.75; +} + +#redis-stats-chart .apexcharts-tooltip, +#redis-stats-chart .apexcharts-tooltip-title { + font-size: 13px; +} + +#redis-stats-chart .apexcharts-tooltip { + display: flex; + flex-direction: row; + width: 100%; + justify-content: center; + border: none; + box-shadow: none; + background: #fff; + margin-top: 1px; +} + +#redis-stats-chart .apexcharts-tooltip-title { + margin-bottom: 0; + padding: 0 15px; + border-bottom: none; + background-color: transparent; +} + +#redis-stats-chart .apexcharts-tooltip-series-group { + display: flex; + padding-bottom: 0; + padding: 0 15px; +} + +#redis-stats-chart .apexcharts-tooltip-y-group { + padding: 0; +} + +#redis-stats-chart .apexcharts-tooltip-text-value { + margin-left: 0; + font-variant-numeric: tabular-nums; +} diff --git a/wp-content/plugins/redis-cache/assets/js/admin.js b/wp-content/plugins/redis-cache/assets/js/admin.js new file mode 100644 index 000000000..6b0424200 --- /dev/null +++ b/wp-content/plugins/redis-cache/assets/js/admin.js @@ -0,0 +1,488 @@ +( function ( $, root, undefined ) { + root.rediscache = root.rediscache || {}; + var rediscache = root.rediscache; + + $.extend( rediscache, { + metrics: { + computed: null, + }, + chart: null, + chart_defaults: { + noData: { + text: root.rediscache_metrics + ? rediscache.l10n.no_data + : rediscache.l10n.no_cache, + align: 'center', + verticalAlign: 'middle', + offsetY: -25, + style: { + color: '#72777c', + fontSize: '14px', + fontFamily: 'inherit', + } + }, + stroke: { + width: [2, 2], + curve: 'smooth', + dashArray: [0, 8], + }, + colors: [ + '#0096dd', + '#72777c', + ], + annotations: { + texts: [{ + x: '15%', + y: '30%', + fontSize: '20px', + fontWeight: 600, + fontFamily: 'inherit', + foreColor: '#72777c', + }], + }, + chart: { + type: 'line', + height: $( '#metrics-pane #widget-redis-stats' ).length ? '300px' : '100%', + toolbar: { show: false }, + zoom: { enabled: false }, + animations: { enabled: false }, + }, + dataLabels: { + enabled: false, + }, + legend: { + show: false, + }, + fill: { + opacity: [0.25, 1], + }, + xaxis: { + type: 'datetime', + labels: { + format: 'HH:mm', + datetimeUTC: false, + style: { colors: '#72777c', fontSize: '13px', fontFamily: 'inherit' }, + }, + tooltip: { enabled: false }, + }, + yaxis: { + type: 'numeric', + tickAmount: 4, + min: 0, + labels: { + style: { colors: '#72777c', fontSize: '13px', fontFamily: 'inherit' }, + formatter: function ( value ) { + return Math.round( value ); + }, + }, + }, + tooltip: { + fixed: { + enabled: true, + position: 'bottomLeft', + offsetY: 15, + offsetX: 0, + }, + } + }, + templates: { + tooltip_title: _.template( + '
<%- title %>
' + ), + series_group: _.template( + '
' + + ' ' + + '
' + + '
' + + ' <%- name %>:' + + ' <%- value %>' + + '
' + + '
' + + '
' + ), + series_pro: _.template( + '
' + + ' ' + + '
' + + '
' + + ' <%- name %>' + + '
' + + '
' + + '
' + ), + } + } ); + + // Build the charts by deep extending the chart defaults + $.extend( rediscache, { + charts: { + time: $.extend( true, {}, rediscache.chart_defaults, { + yaxis: { + labels: { + formatter: function ( value ) { + return Math.round( value ) + ' ms'; + }, + }, + }, + tooltip: { + custom: function ({ series, seriesIndex, dataPointIndex, w }) { + return [ + rediscache.templates.tooltip_title({ + title: new Date( w.globals.seriesX[ seriesIndex ][ dataPointIndex ] ) + .toTimeString().slice( 0, 5 ), + }), + rediscache.templates.series_group({ + color: rediscache.chart_defaults.colors[0], + name: w.globals.seriesNames[0], + value: series[0][ dataPointIndex ].toFixed(2) + ' ms', + }), + rediscache.templates.series_pro({ + color: rediscache.chart_defaults.colors[1], + name: rediscache.l10n.pro, + }), + ].join(''); + }, + }, + } ), + bytes: $.extend( true, {}, rediscache.chart_defaults, { + yaxis: { + labels: { + formatter: function ( value ) { + var i = value === 0 ? 0 : Math.floor( Math.log( value ) / Math.log( 1024 ) ); + + return parseFloat( (value / Math.pow( 1024, i ) ).toFixed( i ? 2 : 0 ) ) + ' ' + ['B', 'KB', 'MB', 'GB', 'TB'][i]; + }, + }, + }, + tooltip: { + custom: function ({ series, seriesIndex, dataPointIndex, w }) { + var value = series[0][ dataPointIndex ]; + var i = value === 0 ? 0 : Math.floor( Math.log( value ) / Math.log( 1024 ) ); + var bytes = parseFloat( (value / Math.pow( 1024, i ) ).toFixed( i ? 2 : 0 ) ) + ' ' + ['B', 'KB', 'MB', 'GB', 'TB'][i]; + + return [ + rediscache.templates.tooltip_title({ + title: new Date( w.globals.seriesX[ seriesIndex ][ dataPointIndex ] ).toTimeString().slice( 0, 5 ), + }), + rediscache.templates.series_group({ + color: rediscache.chart_defaults.colors[0], + name: w.globals.seriesNames[0], + value: bytes, + }), + rediscache.templates.series_pro({ + color: rediscache.chart_defaults.colors[1], + name: rediscache.l10n.pro, + }), + ].join(''); + }, + }, + } ), + ratio: $.extend( true, {}, rediscache.chart_defaults, { + yaxis: { + max: 100, + labels: { + formatter: function ( value ) { + return Math.round( value ) + '%'; + }, + }, + }, + tooltip: { + custom: function ({ series, seriesIndex, dataPointIndex, w }) { + return [ + rediscache.templates.tooltip_title({ + title: new Date( w.globals.seriesX[ seriesIndex ][ dataPointIndex ] ) + .toTimeString().slice( 0, 5 ), + }), + rediscache.templates.series_group({ + color: rediscache.chart_defaults.colors[0], + name: w.globals.seriesNames[0], + value: Math.round( series[0][ dataPointIndex ] * 100 ) / 100 + '%', + }), + ].join(''); + }, + }, + } ), + calls: $.extend( true, {}, rediscache.chart_defaults, { + tooltip: { + custom: function ({ series, seriesIndex, dataPointIndex, w }) { + return [ + rediscache.templates.tooltip_title({ + title: new Date( w.globals.seriesX[ seriesIndex ][ dataPointIndex ] ) + .toTimeString().slice( 0, 5 ), + }), + rediscache.templates.series_group({ + color: rediscache.chart_defaults.colors[0], + name: w.globals.seriesNames[0], + value: Math.round( series[0][ dataPointIndex ] ), + }), + rediscache.templates.series_pro({ + color: rediscache.chart_defaults.colors[1], + name: rediscache.l10n.pro, + }), + ].join(''); + }, + }, + } ), + }, + } ); + + var compute_metrics = function ( raw_metrics ) { + var metrics = {}; + + // parse raw metrics in blocks of minutes + for ( var entry in raw_metrics ) { + var values = {}; + var timestamp = raw_metrics[ entry ].timestamp; + var minute = ( timestamp - timestamp % 60 ) * 1000; + + for ( var key in raw_metrics[ entry ] ) { + if ( raw_metrics[ entry ].hasOwnProperty( key ) ) { + values[ key ] = Number( raw_metrics[ entry ][ key ] ); + } + } + + if ( ! metrics[ minute ] ) { + metrics[ minute ] = []; + } + + metrics[ minute ].push( values ); + } + + // calculate median value for each block + for ( var entry in metrics ) { + if ( metrics[ entry ].length === 1 ) { + metrics[ entry ] = metrics[ entry ].shift(); + continue; + } + + var medians = {}; + + for ( var key in metrics[ entry ][0] ) { + medians[ key ] = compute_median( + metrics[ entry ].map( + function ( metric ) { + return metric[ key ]; + } + ) + ); + } + + metrics[ entry ] = medians; + } + + var computed = []; + + for ( var timestamp in metrics ) { + var entry = metrics[ timestamp ]; + + entry.date = Number( timestamp ); + entry.time = entry.time * 1000; + + computed.push( entry ); + } + + computed.sort( + function( a, b ) { + return a.date - b.date; + } + ); + + return computed.length < 2 ? [] : computed; + }; + + var compute_median = function ( numbers ) { + var median = 0; + var numsLen = numbers.length; + + numbers.sort(); + + if ( numsLen % 2 === 0 ) { + median = ( numbers[ numsLen / 2 - 1 ] + numbers[ numsLen / 2 ] ) / 2; + } else { + median = numbers[ ( numsLen - 1 ) / 2 ]; + } + + return median; + }; + + var render_chart = function ( id ) { + if ( rediscache.chart ) { + rediscache.chart.updateOptions( rediscache.charts[ id ] ); + return; + } + + var chart = new ApexCharts( + document.querySelector( '#redis-stats-chart' ), + rediscache.charts[ id ] + ); + + chart.render(); + root.rediscache.chart = chart; + }; + + var setup_charts = function () { + var metrics = {}; + + for ( var type in rediscache.charts ) { + if ( ! rediscache.charts.hasOwnProperty( type ) ) { + continue; + } + + metrics[type] = rediscache.metrics.computed.map( + function ( entry ) { + return [ entry.date, entry[type] ]; + } + ); + + rediscache.charts[type].series = [{ + name: rediscache.l10n[type], + type: 'area', + data: metrics[type], + }]; + } + + if ( ! rediscache.disable_pro ) { + var pro_charts = { + time: function ( entry ) { + return [ entry[0], entry[1] * 0.5 ] + }, + bytes: function ( entry ) { + return [ entry[0], entry[1] * 0.3 ] + }, + calls: function ( entry ) { + return [ entry[0], Math.round( entry[1] / 50 ) + 5 ] + }, + }; + + for ( var type in pro_charts ) { + if ( ! rediscache.charts[type] ) { + continue; + } + + rediscache.charts[type].series.push({ + name: rediscache.l10n.pro, + type: 'line', + data: metrics[type].map( pro_charts[type] ), + }); + } + + } + }; + + // executed on page load + $(function () { + var $tabs = $( '#rediscache .nav-tab-wrapper' ); + var $panes = $( '#rediscache .content-column .tab-content' ); + + $tabs.find( 'a' ).on( + 'click.redis-cache', + function ( event ) { + var toggle = $( this ).data( 'toggle' ); + + $( this ).blur(); + + show_tab( toggle ); + + if ( history.pushState ) { + history.pushState( null, null, '#' + toggle ); + } + + return false; + } + ); + + var firstRender = window.location.hash.indexOf('metrics') === -1; + + var show_tab = function ( name ) { + $tabs.find( '.nav-tab-active' ).removeClass( 'nav-tab-active' ); + $panes.find( '.tab-pane.active' ).removeClass( 'active' ); + + $( '#' + name + '-tab' ).addClass( 'nav-tab-active' ); + $( '#' + name + '-pane' ).addClass( 'active' ); + + if (name === 'metrics' && firstRender) { + firstRender = false; + render_chart( 'time' ); + } + }; + + var show_current_tab = function () { + var tabHash = window.location.hash.replace( '#', '' ); + + if ( tabHash !== '' && $( '#' + tabHash + '-tab' ) ) { + show_tab( tabHash ); + } + }; + + show_current_tab(); + + $( window ).on( 'hashchange', show_current_tab ); + + if ( $( '#widget-redis-stats' ).length ) { + rediscache.metrics.computed = compute_metrics( root.rediscache_metrics ); + + setup_charts(); + render_chart( 'time' ); + } + + $( '#widget-redis-stats ul a[data-chart]' ).on( + 'click.redis-cache', + function ( event ) { + event.preventDefault(); + + $( '#widget-redis-stats .active' ).removeClass( 'active' ); + $( this ).blur().addClass( 'active' ); + + render_chart( + $( event.target ).data( 'chart' ) + ); + } + ); + + $( '.notice.is-dismissible[data-dismissible]' ).on( + 'click.roc-dismiss-notice', + '.notice-dismiss', + function ( event ) { + event.preventDefault(); + + var $parent = $( this ).parent(); + + $.post( ajaxurl, { + notice: $parent.data( 'dismissible' ), + action: 'roc_dismiss_notice', + _ajax_nonce: $parent.data( 'nonce' ), + } ); + } + ); + + if ( $( '#redis-cache-copy-button' ).length ) { + if ( typeof ClipboardJS === 'undefined' ) { + $( '#redis-cache-copy-button' ).remove(); + } else { + var successTimeout; + var clipboard = new ClipboardJS( '#redis-cache-copy-button .copy-button' ); + + clipboard.on( 'success', function( e ) { + var triggerElement = $( e.trigger ), + successElement = $( '.success', triggerElement.closest( 'div' ) ); + + e.clearSelection(); + triggerElement.trigger( 'focus' ); + + clearTimeout( successTimeout ); + successElement.removeClass( 'hidden' ); + + successTimeout = setTimeout( function() { + successElement.addClass( 'hidden' ); + + if ( clipboard.clipboardAction.fakeElem && clipboard.clipboardAction.removeFake ) { + clipboard.clipboardAction.removeFake(); + } + }, 3000 ); + + } ); + } + } + }); + +} ( window[ rediscache.jQuery ], window ) ); diff --git a/wp-content/plugins/redis-cache/assets/js/apexcharts.min.js b/wp-content/plugins/redis-cache/assets/js/apexcharts.min.js new file mode 100644 index 000000000..fccb4d92a --- /dev/null +++ b/wp-content/plugins/redis-cache/assets/js/apexcharts.min.js @@ -0,0 +1,14 @@ +/*! + * ApexCharts v3.31.0 + * (c) 2018-2021 ApexCharts + * Released under the MIT License. + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).ApexCharts=e()}(this,(function(){"use strict";function t(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,a)}return i}function e(e){for(var i=1;it.length)&&(e=t.length);for(var i=0,a=new Array(e);i>16,o=i>>8&255,n=255&i;return"#"+(16777216+65536*(Math.round((a-r)*s)+r)+256*(Math.round((a-o)*s)+o)+(Math.round((a-n)*s)+n)).toString(16).slice(1)}},{key:"shadeColor",value:function(e,i){return t.isColorHex(i)?this.shadeHexColor(e,i):this.shadeRGBColor(e,i)}}],[{key:"bind",value:function(t,e){return function(){return t.apply(e,arguments)}}},{key:"isObject",value:function(t){return t&&"object"===i(t)&&!Array.isArray(t)&&null!=t}},{key:"is",value:function(t,e){return Object.prototype.toString.call(e)==="[object "+t+"]"}},{key:"listToArray",value:function(t){var e,i=[];for(e=0;ee.length?t:e}))),t.length>e.length?t:e}),0)}},{key:"hexToRgba",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"#999999",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.6;"#"!==t.substring(0,1)&&(t="#999999");var i=t.replace("#","");i=i.match(new RegExp("(.{"+i.length/3+"})","g"));for(var a=0;a1&&void 0!==arguments[1]?arguments[1]:"x",i=t.toString().slice();return i=i.replace(/[` ~!@#$%^&*()_|+\-=?;:'",.<>{}[\]\\/]/gi,e)}},{key:"negToZero",value:function(t){return t<0?0:t}},{key:"moveIndexInArray",value:function(t,e,i){if(i>=t.length)for(var a=i-t.length+1;a--;)t.push(void 0);return t.splice(i,0,t.splice(e,1)[0]),t}},{key:"extractNumber",value:function(t){return parseFloat(t.replace(/[^\d.]*/g,""))}},{key:"findAncestor",value:function(t,e){for(;(t=t.parentElement)&&!t.classList.contains(e););return t}},{key:"setELstyles",value:function(t,e){for(var i in e)e.hasOwnProperty(i)&&(t.style.key=e[i])}},{key:"isNumber",value:function(t){return!isNaN(t)&&parseFloat(Number(t))===t&&!isNaN(parseInt(t,10))}},{key:"isFloat",value:function(t){return Number(t)===t&&t%1!=0}},{key:"isSafari",value:function(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}},{key:"isFirefox",value:function(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}},{key:"isIE11",value:function(){if(-1!==window.navigator.userAgent.indexOf("MSIE")||window.navigator.appVersion.indexOf("Trident/")>-1)return!0}},{key:"isIE",value:function(){var t=window.navigator.userAgent,e=t.indexOf("MSIE ");if(e>0)return parseInt(t.substring(e+5,t.indexOf(".",e)),10);if(t.indexOf("Trident/")>0){var i=t.indexOf("rv:");return parseInt(t.substring(i+3,t.indexOf(".",i)),10)}var a=t.indexOf("Edge/");return a>0&&parseInt(t.substring(a+5,t.indexOf(".",a)),10)}}]),t}(),f=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.setEasingFunctions()}return r(t,[{key:"setEasingFunctions",value:function(){var t;if(!this.w.globals.easing){switch(this.w.config.chart.animations.easing){case"linear":t="-";break;case"easein":t="<";break;case"easeout":t=">";break;case"easeinout":t="<>";break;case"swing":t=function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1};break;case"bounce":t=function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375};break;case"elastic":t=function(t){return t===!!t?t:Math.pow(2,-10*t)*Math.sin((t-.075)*(2*Math.PI)/.3)+1};break;default:t="<>"}this.w.globals.easing=t}}},{key:"animateLine",value:function(t,e,i,a){t.attr(e).animate(a).attr(i)}},{key:"animateMarker",value:function(t,e,i,a,s,r){e||(e=0),t.attr({r:e,width:e,height:e}).animate(a,s).attr({r:i,width:i.width,height:i.height}).afterAll((function(){r()}))}},{key:"animateCircle",value:function(t,e,i,a,s){t.attr({r:e.r,cx:e.cx,cy:e.cy}).animate(a,s).attr({r:i.r,cx:i.cx,cy:i.cy})}},{key:"animateRect",value:function(t,e,i,a,s){t.attr(e).animate(a).attr(i).afterAll((function(){return s()}))}},{key:"animatePathsGradually",value:function(t){var e=t.el,i=t.realIndex,a=t.j,s=t.fill,r=t.pathFrom,o=t.pathTo,n=t.speed,l=t.delay,h=this.w,c=0;h.config.chart.animations.animateGradually.enabled&&(c=h.config.chart.animations.animateGradually.delay),h.config.chart.animations.dynamicAnimation.enabled&&h.globals.dataChanged&&"bar"!==h.config.chart.type&&(c=0),this.morphSVG(e,i,a,"line"!==h.config.chart.type||h.globals.comboCharts?s:"stroke",r,o,n,l*c)}},{key:"showDelayedElements",value:function(){this.w.globals.delayedElements.forEach((function(t){t.el.classList.remove("apexcharts-element-hidden")}))}},{key:"animationCompleted",value:function(t){var e=this.w;e.globals.animationEnded||(e.globals.animationEnded=!0,this.showDelayedElements(),"function"==typeof e.config.chart.events.animationEnd&&e.config.chart.events.animationEnd(this.ctx,{el:t,w:e}))}},{key:"morphSVG",value:function(t,e,i,a,s,r,o,n){var l=this,h=this.w;s||(s=t.attr("pathFrom")),r||(r=t.attr("pathTo"));var c=function(t){return"radar"===h.config.chart.type&&(o=1),"M 0 ".concat(h.globals.gridHeight)};(!s||s.indexOf("undefined")>-1||s.indexOf("NaN")>-1)&&(s=c()),(!r||r.indexOf("undefined")>-1||r.indexOf("NaN")>-1)&&(r=c()),h.globals.shouldAnimate||(o=1),t.plot(s).animate(1,h.globals.easing,n).plot(s).animate(o,h.globals.easing,n).plot(r).afterAll((function(){p.isNumber(i)?i===h.globals.series[h.globals.maxValsInArrayIndex].length-2&&h.globals.shouldAnimate&&l.animationCompleted(t):"none"!==a&&h.globals.shouldAnimate&&(!h.globals.comboCharts&&e===h.globals.series.length-1||h.globals.comboCharts)&&l.animationCompleted(t),l.showDelayedElements()}))}}]),t}(),x=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"getDefaultFilter",value:function(t,e){var i=this.w;t.unfilter(!0),(new window.SVG.Filter).size("120%","180%","-5%","-40%"),"none"!==i.config.states.normal.filter?this.applyFilter(t,e,i.config.states.normal.filter.type,i.config.states.normal.filter.value):i.config.chart.dropShadow.enabled&&this.dropShadow(t,i.config.chart.dropShadow,e)}},{key:"addNormalFilter",value:function(t,e){var i=this.w;i.config.chart.dropShadow.enabled&&!t.node.classList.contains("apexcharts-marker")&&this.dropShadow(t,i.config.chart.dropShadow,e)}},{key:"addLightenFilter",value:function(t,e,i){var a=this,s=this.w,r=i.intensity;t.unfilter(!0);new window.SVG.Filter;t.filter((function(t){var i=s.config.chart.dropShadow;(i.enabled?a.addShadow(t,e,i):t).componentTransfer({rgb:{type:"linear",slope:1.5,intercept:r}})})),t.filterer.node.setAttribute("filterUnits","userSpaceOnUse"),this._scaleFilterSize(t.filterer.node)}},{key:"addDarkenFilter",value:function(t,e,i){var a=this,s=this.w,r=i.intensity;t.unfilter(!0);new window.SVG.Filter;t.filter((function(t){var i=s.config.chart.dropShadow;(i.enabled?a.addShadow(t,e,i):t).componentTransfer({rgb:{type:"linear",slope:r}})})),t.filterer.node.setAttribute("filterUnits","userSpaceOnUse"),this._scaleFilterSize(t.filterer.node)}},{key:"applyFilter",value:function(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:.5;switch(i){case"none":this.addNormalFilter(t,e);break;case"lighten":this.addLightenFilter(t,e,{intensity:a});break;case"darken":this.addDarkenFilter(t,e,{intensity:a})}}},{key:"addShadow",value:function(t,e,i){var a=i.blur,s=i.top,r=i.left,o=i.color,n=i.opacity,l=t.flood(Array.isArray(o)?o[e]:o,n).composite(t.sourceAlpha,"in").offset(r,s).gaussianBlur(a).merge(t.source);return t.blend(t.source,l)}},{key:"dropShadow",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,a=e.top,s=e.left,r=e.blur,o=e.color,n=e.opacity,l=e.noUserSpaceOnUse,h=this.w;return t.unfilter(!0),p.isIE()&&"radialBar"===h.config.chart.type||(o=Array.isArray(o)?o[i]:o,t.filter((function(t){var e=null;e=p.isSafari()||p.isFirefox()||p.isIE()?t.flood(o,n).composite(t.sourceAlpha,"in").offset(s,a).gaussianBlur(r):t.flood(o,n).composite(t.sourceAlpha,"in").offset(s,a).gaussianBlur(r).merge(t.source),t.blend(t.source,e)})),l||t.filterer.node.setAttribute("filterUnits","userSpaceOnUse"),this._scaleFilterSize(t.filterer.node)),t}},{key:"setSelectionFilter",value:function(t,e,i){var a=this.w;if(void 0!==a.globals.selectedDataPoints[e]&&a.globals.selectedDataPoints[e].indexOf(i)>-1){t.node.setAttribute("selected",!0);var s=a.config.states.active.filter;"none"!==s&&this.applyFilter(t,e,s.type,s.value)}}},{key:"_scaleFilterSize",value:function(t){!function(e){for(var i in e)e.hasOwnProperty(i)&&t.setAttribute(i,e[i])}({width:"200%",height:"200%",x:"-50%",y:"-50%"})}}]),t}(),b=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"drawLine",value:function(t,e,i,a){var s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"#a8a8a8",r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:null,n=arguments.length>7&&void 0!==arguments[7]?arguments[7]:"butt",l=this.w,h=l.globals.dom.Paper.line().attr({x1:t,y1:e,x2:i,y2:a,stroke:s,"stroke-dasharray":r,"stroke-width":o,"stroke-linecap":n});return h}},{key:"drawRect",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"#fefefe",o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:1,n=arguments.length>7&&void 0!==arguments[7]?arguments[7]:null,l=arguments.length>8&&void 0!==arguments[8]?arguments[8]:null,h=arguments.length>9&&void 0!==arguments[9]?arguments[9]:0,c=this.w,d=c.globals.dom.Paper.rect();return d.attr({x:t,y:e,width:i>0?i:0,height:a>0?a:0,rx:s,ry:s,opacity:o,"stroke-width":null!==n?n:0,stroke:null!==l?l:"none","stroke-dasharray":h}),d.node.setAttribute("fill",r),d}},{key:"drawPolygon",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"#e1e1e1",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",s=this.w,r=s.globals.dom.Paper.polygon(t).attr({fill:a,stroke:e,"stroke-width":i});return r}},{key:"drawCircle",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=this.w;t<0&&(t=0);var a=i.globals.dom.Paper.circle(2*t);return null!==e&&a.attr(e),a}},{key:"drawPath",value:function(t){var e=t.d,i=void 0===e?"":e,a=t.stroke,s=void 0===a?"#a8a8a8":a,r=t.strokeWidth,o=void 0===r?1:r,n=t.fill,l=t.fillOpacity,h=void 0===l?1:l,c=t.strokeOpacity,d=void 0===c?1:c,g=t.classes,u=t.strokeLinecap,p=void 0===u?null:u,f=t.strokeDashArray,x=void 0===f?0:f,b=this.w;return null===p&&(p=b.config.stroke.lineCap),(i.indexOf("undefined")>-1||i.indexOf("NaN")>-1)&&(i="M 0 ".concat(b.globals.gridHeight)),b.globals.dom.Paper.path(i).attr({fill:n,"fill-opacity":h,stroke:s,"stroke-opacity":d,"stroke-linecap":p,"stroke-width":o,"stroke-dasharray":x,class:g})}},{key:"group",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=this.w,i=e.globals.dom.Paper.group();return null!==t&&i.attr(t),i}},{key:"move",value:function(t,e){var i=["M",t,e].join(" ");return i}},{key:"line",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=null;return null===i?a=["L",t,e].join(" "):"H"===i?a=["H",t].join(" "):"V"===i&&(a=["V",e].join(" ")),a}},{key:"curve",value:function(t,e,i,a,s,r){var o=["C",t,e,i,a,s,r].join(" ");return o}},{key:"quadraticCurve",value:function(t,e,i,a){return["Q",t,e,i,a].join(" ")}},{key:"arc",value:function(t,e,i,a,s,r,o){var n=arguments.length>7&&void 0!==arguments[7]&&arguments[7],l="A";n&&(l="a");var h=[l,t,e,i,a,s,r,o].join(" ");return h}},{key:"renderPaths",value:function(t){var i,a=t.j,s=t.realIndex,r=t.pathFrom,o=t.pathTo,n=t.stroke,l=t.strokeWidth,h=t.strokeLinecap,c=t.fill,d=t.animationDelay,g=t.initialSpeed,u=t.dataChangeSpeed,p=t.className,b=t.shouldClipToGrid,v=void 0===b||b,m=t.bindEventsOnPaths,y=void 0===m||m,w=t.drawShadow,k=void 0===w||w,A=this.w,S=new x(this.ctx),C=new f(this.ctx),L=this.w.config.chart.animations.enabled,P=L&&this.w.config.chart.animations.dynamicAnimation.enabled,T=!!(L&&!A.globals.resized||P&&A.globals.dataChanged&&A.globals.shouldAnimate);T?i=r:(i=o,A.globals.animationEnded=!0);var M=A.config.stroke.dashArray,I=0;I=Array.isArray(M)?M[s]:A.config.stroke.dashArray;var z=this.drawPath({d:i,stroke:n,strokeWidth:l,fill:c,fillOpacity:1,classes:p,strokeLinecap:h,strokeDashArray:I});if(z.attr("index",s),v&&z.attr({"clip-path":"url(#gridRectMask".concat(A.globals.cuid,")")}),"none"!==A.config.states.normal.filter.type)S.getDefaultFilter(z,s);else if(A.config.chart.dropShadow.enabled&&k&&(!A.config.chart.dropShadow.enabledOnSeries||A.config.chart.dropShadow.enabledOnSeries&&-1!==A.config.chart.dropShadow.enabledOnSeries.indexOf(s))){var X=A.config.chart.dropShadow;S.dropShadow(z,X,s)}y&&(z.node.addEventListener("mouseenter",this.pathMouseEnter.bind(this,z)),z.node.addEventListener("mouseleave",this.pathMouseLeave.bind(this,z)),z.node.addEventListener("mousedown",this.pathMouseDown.bind(this,z))),z.attr({pathTo:o,pathFrom:r});var E={el:z,j:a,realIndex:s,pathFrom:r,pathTo:o,fill:c,strokeWidth:l,delay:d};return!L||A.globals.resized||A.globals.dataChanged?!A.globals.resized&&A.globals.dataChanged||C.showDelayedElements():C.animatePathsGradually(e(e({},E),{},{speed:g})),A.globals.dataChanged&&P&&T&&C.animatePathsGradually(e(e({},E),{},{speed:u})),z}},{key:"drawPattern",value:function(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"#a8a8a8",s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,r=this.w,o=r.globals.dom.Paper.pattern(e,i,(function(r){"horizontalLines"===t?r.line(0,0,i,0).stroke({color:a,width:s+1}):"verticalLines"===t?r.line(0,0,0,e).stroke({color:a,width:s+1}):"slantedLines"===t?r.line(0,0,e,i).stroke({color:a,width:s}):"squares"===t?r.rect(e,i).fill("none").stroke({color:a,width:s}):"circles"===t&&r.circle(e).fill("none").stroke({color:a,width:s})}));return o}},{key:"drawGradient",value:function(t,e,i,a,s){var r,o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,n=arguments.length>6&&void 0!==arguments[6]?arguments[6]:null,l=arguments.length>7&&void 0!==arguments[7]?arguments[7]:null,h=arguments.length>8&&void 0!==arguments[8]?arguments[8]:0,c=this.w;e.length<9&&0===e.indexOf("#")&&(e=p.hexToRgba(e,a)),i.length<9&&0===i.indexOf("#")&&(i=p.hexToRgba(i,s));var d=0,g=1,u=1,f=null;null!==n&&(d=void 0!==n[0]?n[0]/100:0,g=void 0!==n[1]?n[1]/100:1,u=void 0!==n[2]?n[2]/100:1,f=void 0!==n[3]?n[3]/100:null);var x=!("donut"!==c.config.chart.type&&"pie"!==c.config.chart.type&&"polarArea"!==c.config.chart.type&&"bubble"!==c.config.chart.type);if(r=null===l||0===l.length?c.globals.dom.Paper.gradient(x?"radial":"linear",(function(t){t.at(d,e,a),t.at(g,i,s),t.at(u,i,s),null!==f&&t.at(f,e,a)})):c.globals.dom.Paper.gradient(x?"radial":"linear",(function(t){(Array.isArray(l[h])?l[h]:l).forEach((function(e){t.at(e.offset/100,e.color,e.opacity)}))})),x){var b=c.globals.gridWidth/2,v=c.globals.gridHeight/2;"bubble"!==c.config.chart.type?r.attr({gradientUnits:"userSpaceOnUse",cx:b,cy:v,r:o}):r.attr({cx:.5,cy:.5,r:.8,fx:.2,fy:.2})}else"vertical"===t?r.from(0,0).to(0,1):"diagonal"===t?r.from(0,0).to(1,1):"horizontal"===t?r.from(0,1).to(1,1):"diagonal2"===t&&r.from(1,0).to(0,1);return r}},{key:"drawText",value:function(t){var e,i=t.x,a=t.y,s=t.text,r=t.textAnchor,o=t.fontSize,n=t.fontFamily,l=t.fontWeight,h=t.foreColor,c=t.opacity,d=t.cssClass,g=void 0===d?"":d,u=t.isPlainText,p=void 0===u||u,f=this.w;return void 0===s&&(s=""),r||(r="start"),h&&h.length||(h=f.config.chart.foreColor),n=n||f.config.chart.fontFamily,l=l||"regular",(e=Array.isArray(s)?f.globals.dom.Paper.text((function(t){for(var e=0;e-1){var n=i.globals.selectedDataPoints[s].indexOf(r);i.globals.selectedDataPoints[s].splice(n,1)}}else{if(!i.config.states.active.allowMultipleDataPointsSelection&&i.globals.selectedDataPoints.length>0){i.globals.selectedDataPoints=[];var l=i.globals.dom.Paper.select(".apexcharts-series path").members,h=i.globals.dom.Paper.select(".apexcharts-series circle, .apexcharts-series rect").members,c=function(t){Array.prototype.forEach.call(t,(function(t){t.node.setAttribute("selected","false"),a.getDefaultFilter(t,s)}))};c(l),c(h)}t.node.setAttribute("selected","true"),o="true",void 0===i.globals.selectedDataPoints[s]&&(i.globals.selectedDataPoints[s]=[]),i.globals.selectedDataPoints[s].push(r)}if("true"===o){var d=i.config.states.active.filter;"none"!==d&&a.applyFilter(t,s,d.type,d.value)}else"none"!==i.config.states.active.filter.type&&a.getDefaultFilter(t,s);"function"==typeof i.config.chart.events.dataPointSelection&&i.config.chart.events.dataPointSelection(e,this.ctx,{selectedDataPoints:i.globals.selectedDataPoints,seriesIndex:s,dataPointIndex:r,w:i}),e&&this.ctx.events.fireEvent("dataPointSelection",[e,this.ctx,{selectedDataPoints:i.globals.selectedDataPoints,seriesIndex:s,dataPointIndex:r,w:i}])}},{key:"rotateAroundCenter",value:function(t){var e={};return t&&"function"==typeof t.getBBox&&(e=t.getBBox()),{x:e.x+e.width/2,y:e.y+e.height/2}}},{key:"getTextRects",value:function(t,e,i,a){var s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],r=this.w,o=this.drawText({x:-200,y:-200,text:t,textAnchor:"start",fontSize:e,fontFamily:i,foreColor:"#fff",opacity:0});a&&o.attr("transform",a),r.globals.dom.Paper.add(o);var n=o.bbox();return s||(n=o.node.getBoundingClientRect()),o.remove(),{width:n.width,height:n.height}}},{key:"placeTextWithEllipsis",value:function(t,e,i){if("function"==typeof t.getComputedTextLength&&(t.textContent=e,e.length>0&&t.getComputedTextLength()>=i/1.1)){for(var a=e.length-3;a>0;a-=3)if(t.getSubStringLength(0,a)<=i/1.1)return void(t.textContent=e.substring(0,a)+"...");t.textContent="."}}}],[{key:"setAttrs",value:function(t,e){for(var i in e)e.hasOwnProperty(i)&&t.setAttribute(i,e[i])}}]),t}(),v=function(){function t(e){a(this,t),this.w=e.w,this.annoCtx=e}return r(t,[{key:"setOrientations",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=this.w;if("vertical"===t.label.orientation){var a=null!==e?e:0,s=i.globals.dom.baseEl.querySelector(".apexcharts-xaxis-annotations .apexcharts-xaxis-annotation-label[rel='".concat(a,"']"));if(null!==s){var r=s.getBoundingClientRect();s.setAttribute("x",parseFloat(s.getAttribute("x"))-r.height+4),"top"===t.label.position?s.setAttribute("y",parseFloat(s.getAttribute("y"))+r.width):s.setAttribute("y",parseFloat(s.getAttribute("y"))-r.width);var o=this.annoCtx.graphics.rotateAroundCenter(s),n=o.x,l=o.y;s.setAttribute("transform","rotate(-90 ".concat(n," ").concat(l,")"))}}}},{key:"addBackgroundToAnno",value:function(t,e){var i=this.w;if(!t||void 0===e.label.text||void 0!==e.label.text&&!String(e.label.text).trim())return null;var a=i.globals.dom.baseEl.querySelector(".apexcharts-grid").getBoundingClientRect(),s=t.getBoundingClientRect(),r=e.label.style.padding.left,o=e.label.style.padding.right,n=e.label.style.padding.top,l=e.label.style.padding.bottom;"vertical"===e.label.orientation&&(n=e.label.style.padding.left,l=e.label.style.padding.right,r=e.label.style.padding.top,o=e.label.style.padding.bottom);var h=s.left-a.left-r,c=s.top-a.top-n,d=this.annoCtx.graphics.drawRect(h-i.globals.barPadForNumericAxis,c,s.width+r+o,s.height+n+l,e.label.borderRadius,e.label.style.background,1,e.label.borderWidth,e.label.borderColor,0);return e.id&&d.node.classList.add(p.escapeString(e.id)),d}},{key:"annotationsBackground",value:function(){var t=this,e=this.w,i=function(i,a,s){var r=e.globals.dom.baseEl.querySelector(".apexcharts-".concat(s,"-annotations .apexcharts-").concat(s,"-annotation-label[rel='").concat(a,"']"));if(r){var o=r.parentNode,n=t.addBackgroundToAnno(r,i);n&&(o.insertBefore(n.node,r),i.label.mouseEnter&&n.node.addEventListener("mouseenter",i.label.mouseEnter.bind(t,i)),i.label.mouseLeave&&n.node.addEventListener("mouseleave",i.label.mouseLeave.bind(t,i)))}};e.config.annotations.xaxis.map((function(t,e){i(t,e,"xaxis")})),e.config.annotations.yaxis.map((function(t,e){i(t,e,"yaxis")})),e.config.annotations.points.map((function(t,e){i(t,e,"point")}))}},{key:"getStringX",value:function(t){var e=this.w,i=t;e.config.xaxis.convertedCatToNumeric&&e.globals.categoryLabels.length&&(t=e.globals.categoryLabels.indexOf(t)+1);var a=e.globals.labels.indexOf(t),s=e.globals.dom.baseEl.querySelector(".apexcharts-xaxis-texts-g text:nth-child("+(a+1)+")");return s&&(i=parseFloat(s.getAttribute("x"))),i}}]),t}(),m=function(){function t(e){a(this,t),this.w=e.w,this.annoCtx=e,this.invertAxis=this.annoCtx.invertAxis}return r(t,[{key:"addXaxisAnnotation",value:function(t,e,i){var a=this.w,s=this.invertAxis?a.globals.minY:a.globals.minX,r=this.invertAxis?a.globals.maxY:a.globals.maxX,o=this.invertAxis?a.globals.yRange[0]:a.globals.xRange,n=(t.x-s)/(o/a.globals.gridWidth);this.annoCtx.inversedReversedAxis&&(n=(r-t.x)/(o/a.globals.gridWidth));var l=t.label.text;"category"!==a.config.xaxis.type&&!a.config.xaxis.convertedCatToNumeric||this.invertAxis||a.globals.dataFormatXNumeric||(n=this.annoCtx.helpers.getStringX(t.x));var h=t.strokeDashArray;if(p.isNumber(n)){if(null===t.x2||void 0===t.x2){var c=this.annoCtx.graphics.drawLine(n+t.offsetX,0+t.offsetY,n+t.offsetX,a.globals.gridHeight+t.offsetY,t.borderColor,h,t.borderWidth);e.appendChild(c.node),t.id&&c.node.classList.add(t.id)}else{var d=(t.x2-s)/(o/a.globals.gridWidth);if(this.annoCtx.inversedReversedAxis&&(d=(r-t.x2)/(o/a.globals.gridWidth)),"category"!==a.config.xaxis.type&&!a.config.xaxis.convertedCatToNumeric||this.invertAxis||a.globals.dataFormatXNumeric||(d=this.annoCtx.helpers.getStringX(t.x2)),d0&&void 0!==arguments[0]?arguments[0]:null;return null===t?this.w.config.series.reduce((function(t,e){return t+e}),0):this.w.globals.series[t].reduce((function(t,e){return t+e}),0)}},{key:"isSeriesNull",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return 0===(null===t?this.w.config.series.filter((function(t){return null!==t})):this.w.config.series[t].data.filter((function(t){return null!==t}))).length}},{key:"seriesHaveSameValues",value:function(t){return this.w.globals.series[t].every((function(t,e,i){return t===i[0]}))}},{key:"getCategoryLabels",value:function(t){var e=this.w,i=t.slice();return e.config.xaxis.convertedCatToNumeric&&(i=t.map((function(t,i){return e.config.xaxis.labels.formatter(t-e.globals.minX+1)}))),i}},{key:"getLargestSeries",value:function(){var t=this.w;t.globals.maxValsInArrayIndex=t.globals.series.map((function(t){return t.length})).indexOf(Math.max.apply(Math,t.globals.series.map((function(t){return t.length}))))}},{key:"getLargestMarkerSize",value:function(){var t=this.w,e=0;return t.globals.markers.size.forEach((function(t){e=Math.max(e,t)})),t.globals.markers.largestSize=e,e}},{key:"getSeriesTotals",value:function(){var t=this.w;t.globals.seriesTotals=t.globals.series.map((function(t,e){var i=0;if(Array.isArray(t))for(var a=0;at&&i.globals.seriesX[s][o]0&&(e=!0),{comboBarCount:i,comboCharts:e}}},{key:"extendArrayProps",value:function(t,e,i){return e.yaxis&&(e=t.extendYAxis(e,i)),e.annotations&&(e.annotations.yaxis&&(e=t.extendYAxisAnnotations(e)),e.annotations.xaxis&&(e=t.extendXAxisAnnotations(e)),e.annotations.points&&(e=t.extendPointAnnotations(e))),e}}]),t}(),w=function(){function t(e){a(this,t),this.w=e.w,this.annoCtx=e}return r(t,[{key:"addYaxisAnnotation",value:function(t,e,i){var a,s=this.w,r=t.strokeDashArray,o=this._getY1Y2("y1",t),n=t.label.text;if(null===t.y2||void 0===t.y2){var l=this.annoCtx.graphics.drawLine(0+t.offsetX,o+t.offsetY,this._getYAxisAnnotationWidth(t),o+t.offsetY,t.borderColor,r,t.borderWidth);e.appendChild(l.node),t.id&&l.node.classList.add(t.id)}else{if((a=this._getY1Y2("y2",t))>o){var h=o;o=a,a=h}var c=this.annoCtx.graphics.drawRect(0+t.offsetX,a+t.offsetY,this._getYAxisAnnotationWidth(t),o-a,0,t.fillColor,t.opacity,1,t.borderColor,r);c.node.classList.add("apexcharts-annotation-rect"),c.attr("clip-path","url(#gridRectMask".concat(s.globals.cuid,")")),e.appendChild(c.node),t.id&&c.node.classList.add(t.id)}var d="right"===t.label.position?s.globals.gridWidth:0,g=this.annoCtx.graphics.drawText({x:d+t.label.offsetX,y:(null!=a?a:o)+t.label.offsetY-3,text:n,textAnchor:t.label.textAnchor,fontSize:t.label.style.fontSize,fontFamily:t.label.style.fontFamily,fontWeight:t.label.style.fontWeight,foreColor:t.label.style.color,cssClass:"apexcharts-yaxis-annotation-label ".concat(t.label.style.cssClass," ").concat(t.id?t.id:"")});g.attr({rel:i}),e.appendChild(g.node)}},{key:"_getY1Y2",value:function(t,e){var i,a="y1"===t?e.y:e.y2,s=this.w;if(this.annoCtx.invertAxis){var r=s.globals.labels.indexOf(a);s.config.xaxis.convertedCatToNumeric&&(r=s.globals.categoryLabels.indexOf(a));var o=s.globals.dom.baseEl.querySelector(".apexcharts-yaxis-texts-g text:nth-child("+(r+1)+")");o&&(i=parseFloat(o.getAttribute("y")))}else{var n;if(s.config.yaxis[e.yAxisIndex].logarithmic)n=(a=new y(this.annoCtx.ctx).getLogVal(a,e.yAxisIndex))/s.globals.yLogRatio[e.yAxisIndex];else n=(a-s.globals.minYArr[e.yAxisIndex])/(s.globals.yRange[e.yAxisIndex]/s.globals.gridHeight);i=s.globals.gridHeight-n,s.config.yaxis[e.yAxisIndex]&&s.config.yaxis[e.yAxisIndex].reversed&&(i=n)}return i}},{key:"_getYAxisAnnotationWidth",value:function(t){var e=this.w;e.globals.gridWidth;return(t.width.indexOf("%")>-1?e.globals.gridWidth*parseInt(t.width,10)/100:parseInt(t.width,10))+t.offsetX}},{key:"drawYAxisAnnotations",value:function(){var t=this,e=this.w,i=this.annoCtx.graphics.group({class:"apexcharts-yaxis-annotations"});return e.config.annotations.yaxis.map((function(e,a){t.addYaxisAnnotation(e,i.node,a)})),i}}]),t}(),k=function(){function t(e){a(this,t),this.w=e.w,this.annoCtx=e}return r(t,[{key:"addPointAnnotation",value:function(t,e,i){var a=this.w,s=0,r=0,o=0;this.annoCtx.invertAxis&&console.warn("Point annotation is not supported in horizontal bar charts.");var n=parseFloat(t.y);if("string"==typeof t.x||"category"===a.config.xaxis.type||a.config.xaxis.convertedCatToNumeric){var l=a.globals.labels.indexOf(t.x);a.config.xaxis.convertedCatToNumeric&&(l=a.globals.categoryLabels.indexOf(t.x)),s=this.annoCtx.helpers.getStringX(t.x),null===t.y&&(n=a.globals.series[t.seriesIndex][l])}else s=(t.x-a.globals.minX)/(a.globals.xRange/a.globals.gridWidth);for(var h,c=[],d=0,g=0;g<=t.seriesIndex;g++){var u=a.config.yaxis[g].seriesName;if(u)for(var f=g+1;f<=t.seriesIndex;f++)a.config.yaxis[f].seriesName===u&&-1===c.indexOf(u)&&(d++,c.push(u))}if(a.config.yaxis[t.yAxisIndex].logarithmic){h=(n=new y(this.annoCtx.ctx).getLogVal(n,t.yAxisIndex))/a.globals.yLogRatio[t.yAxisIndex]}else{var x=t.yAxisIndex+d;h=(n-a.globals.minYArr[x])/(a.globals.yRange[x]/a.globals.gridHeight)}if(r=a.globals.gridHeight-h-parseFloat(t.label.style.fontSize)-t.marker.size,o=a.globals.gridHeight-h,a.config.yaxis[t.yAxisIndex]&&a.config.yaxis[t.yAxisIndex].reversed&&(r=h+parseFloat(t.label.style.fontSize)+t.marker.size,o=h),p.isNumber(s)){var b={pSize:t.marker.size,pointStrokeWidth:t.marker.strokeWidth,pointFillColor:t.marker.fillColor,pointStrokeColor:t.marker.strokeColor,shape:t.marker.shape,pRadius:t.marker.radius,class:"apexcharts-point-annotation-marker ".concat(t.marker.cssClass," ").concat(t.id?t.id:"")},v=this.annoCtx.graphics.drawMarker(s+t.marker.offsetX,o+t.marker.offsetY,b);e.appendChild(v.node);var m=t.label.text?t.label.text:"",w=this.annoCtx.graphics.drawText({x:s+t.label.offsetX,y:r+t.label.offsetY,text:m,textAnchor:t.label.textAnchor,fontSize:t.label.style.fontSize,fontFamily:t.label.style.fontFamily,fontWeight:t.label.style.fontWeight,foreColor:t.label.style.color,cssClass:"apexcharts-point-annotation-label ".concat(t.label.style.cssClass," ").concat(t.id?t.id:"")});if(w.attr({rel:i}),e.appendChild(w.node),t.customSVG.SVG){var k=this.annoCtx.graphics.group({class:"apexcharts-point-annotations-custom-svg "+t.customSVG.cssClass});k.attr({transform:"translate(".concat(s+t.customSVG.offsetX,", ").concat(r+t.customSVG.offsetY,")")}),k.node.innerHTML=t.customSVG.SVG,e.appendChild(k.node)}if(t.image.path){var A=t.image.width?t.image.width:20,S=t.image.height?t.image.height:20;v=this.annoCtx.addImage({x:s+t.image.offsetX-A/2,y:r+t.image.offsetY-S/2,width:A,height:S,path:t.image.path,appendTo:".apexcharts-point-annotations"})}t.mouseEnter&&v.node.addEventListener("mouseenter",t.mouseEnter.bind(this,t)),t.mouseLeave&&v.node.addEventListener("mouseleave",t.mouseLeave.bind(this,t))}}},{key:"drawPointAnnotations",value:function(){var t=this,e=this.w,i=this.annoCtx.graphics.group({class:"apexcharts-point-annotations"});return e.config.annotations.points.map((function(e,a){t.addPointAnnotation(e,i.node,a)})),i}}]),t}();var A={name:"en",options:{months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],toolbar:{exportToSVG:"Download SVG",exportToPNG:"Download PNG",exportToCSV:"Download CSV",menu:"Menu",selection:"Selection",selectionZoom:"Selection Zoom",zoomIn:"Zoom In",zoomOut:"Zoom Out",pan:"Panning",reset:"Reset Zoom"}}},S=function(){function t(){a(this,t),this.yAxis={show:!0,showAlways:!1,showForNullSeries:!0,seriesName:void 0,opposite:!1,reversed:!1,logarithmic:!1,logBase:10,tickAmount:void 0,forceNiceScale:!1,max:void 0,min:void 0,floating:!1,decimalsInFloat:void 0,labels:{show:!0,minWidth:0,maxWidth:160,offsetX:0,offsetY:0,align:void 0,rotate:0,padding:20,style:{colors:[],fontSize:"11px",fontWeight:400,fontFamily:void 0,cssClass:""},formatter:void 0},axisBorder:{show:!1,color:"#e0e0e0",width:1,offsetX:0,offsetY:0},axisTicks:{show:!1,color:"#e0e0e0",width:6,offsetX:0,offsetY:0},title:{text:void 0,rotate:-90,offsetY:0,offsetX:0,style:{color:void 0,fontSize:"11px",fontWeight:900,fontFamily:void 0,cssClass:""}},tooltip:{enabled:!1,offsetX:0},crosshairs:{show:!0,position:"front",stroke:{color:"#b6b6b6",width:1,dashArray:0}}},this.pointAnnotation={id:void 0,x:0,y:null,yAxisIndex:0,seriesIndex:0,mouseEnter:void 0,mouseLeave:void 0,marker:{size:4,fillColor:"#fff",strokeWidth:2,strokeColor:"#333",shape:"circle",offsetX:0,offsetY:0,radius:2,cssClass:""},label:{borderColor:"#c2c2c2",borderWidth:1,borderRadius:2,text:void 0,textAnchor:"middle",offsetX:0,offsetY:0,mouseEnter:void 0,mouseLeave:void 0,style:{background:"#fff",color:void 0,fontSize:"11px",fontFamily:void 0,fontWeight:400,cssClass:"",padding:{left:5,right:5,top:2,bottom:2}}},customSVG:{SVG:void 0,cssClass:void 0,offsetX:0,offsetY:0},image:{path:void 0,width:20,height:20,offsetX:0,offsetY:0}},this.yAxisAnnotation={id:void 0,y:0,y2:null,strokeDashArray:1,fillColor:"#c2c2c2",borderColor:"#c2c2c2",borderWidth:1,opacity:.3,offsetX:0,offsetY:0,width:"100%",yAxisIndex:0,label:{borderColor:"#c2c2c2",borderWidth:1,borderRadius:2,text:void 0,textAnchor:"end",position:"right",offsetX:0,offsetY:-3,mouseEnter:void 0,mouseLeave:void 0,style:{background:"#fff",color:void 0,fontSize:"11px",fontFamily:void 0,fontWeight:400,cssClass:"",padding:{left:5,right:5,top:2,bottom:2}}}},this.xAxisAnnotation={id:void 0,x:0,x2:null,strokeDashArray:1,fillColor:"#c2c2c2",borderColor:"#c2c2c2",borderWidth:1,opacity:.3,offsetX:0,offsetY:0,label:{borderColor:"#c2c2c2",borderWidth:1,borderRadius:2,text:void 0,textAnchor:"middle",orientation:"vertical",position:"top",offsetX:0,offsetY:0,mouseEnter:void 0,mouseLeave:void 0,style:{background:"#fff",color:void 0,fontSize:"11px",fontFamily:void 0,fontWeight:400,cssClass:"",padding:{left:5,right:5,top:2,bottom:2}}}},this.text={x:0,y:0,text:"",textAnchor:"start",foreColor:void 0,fontSize:"13px",fontFamily:void 0,fontWeight:400,appendTo:".apexcharts-annotations",backgroundColor:"transparent",borderColor:"#c2c2c2",borderRadius:0,borderWidth:0,paddingLeft:4,paddingRight:4,paddingTop:2,paddingBottom:2}}return r(t,[{key:"init",value:function(){return{annotations:{position:"front",yaxis:[this.yAxisAnnotation],xaxis:[this.xAxisAnnotation],points:[this.pointAnnotation],texts:[],images:[],shapes:[]},chart:{animations:{enabled:!0,easing:"easeinout",speed:800,animateGradually:{delay:150,enabled:!0},dynamicAnimation:{enabled:!0,speed:350}},background:"transparent",locales:[A],defaultLocale:"en",dropShadow:{enabled:!1,enabledOnSeries:void 0,top:2,left:2,blur:4,color:"#000",opacity:.35},events:{animationEnd:void 0,beforeMount:void 0,mounted:void 0,updated:void 0,click:void 0,mouseMove:void 0,mouseLeave:void 0,legendClick:void 0,markerClick:void 0,selection:void 0,dataPointSelection:void 0,dataPointMouseEnter:void 0,dataPointMouseLeave:void 0,beforeZoom:void 0,beforeResetZoom:void 0,zoomed:void 0,scrolled:void 0,brushScrolled:void 0},foreColor:"#373d3f",fontFamily:"Helvetica, Arial, sans-serif",height:"auto",parentHeightOffset:15,redrawOnParentResize:!0,redrawOnWindowResize:!0,id:void 0,group:void 0,offsetX:0,offsetY:0,selection:{enabled:!1,type:"x",fill:{color:"#24292e",opacity:.1},stroke:{width:1,color:"#24292e",opacity:.4,dashArray:3},xaxis:{min:void 0,max:void 0},yaxis:{min:void 0,max:void 0}},sparkline:{enabled:!1},brush:{enabled:!1,autoScaleYaxis:!0,target:void 0},stacked:!1,stackType:"normal",toolbar:{show:!0,offsetX:0,offsetY:0,tools:{download:!0,selection:!0,zoom:!0,zoomin:!0,zoomout:!0,pan:!0,reset:!0,customIcons:[]},export:{csv:{filename:void 0,columnDelimiter:",",headerCategory:"category",headerValue:"value",dateFormatter:function(t){return new Date(t).toDateString()}},png:{filename:void 0},svg:{filename:void 0}},autoSelected:"zoom"},type:"line",width:"100%",zoom:{enabled:!0,type:"x",autoScaleYaxis:!1,zoomedArea:{fill:{color:"#90CAF9",opacity:.4},stroke:{color:"#0D47A1",opacity:.4,width:1}}}},plotOptions:{area:{fillTo:"origin"},bar:{horizontal:!1,columnWidth:"70%",barHeight:"70%",distributed:!1,borderRadius:0,rangeBarOverlap:!0,rangeBarGroupRows:!1,colors:{ranges:[],backgroundBarColors:[],backgroundBarOpacity:1,backgroundBarRadius:0},dataLabels:{position:"top",maxItems:100,hideOverflowingLabels:!0,orientation:"horizontal"}},bubble:{minBubbleRadius:void 0,maxBubbleRadius:void 0},candlestick:{colors:{upward:"#00B746",downward:"#EF403C"},wick:{useFillColor:!0}},boxPlot:{colors:{upper:"#00E396",lower:"#008FFB"}},heatmap:{radius:2,enableShades:!0,shadeIntensity:.5,reverseNegativeShade:!1,distributed:!1,useFillColorAsStroke:!1,colorScale:{inverse:!1,ranges:[],min:void 0,max:void 0}},treemap:{enableShades:!0,shadeIntensity:.5,distributed:!1,reverseNegativeShade:!1,useFillColorAsStroke:!1,colorScale:{inverse:!1,ranges:[],min:void 0,max:void 0}},radialBar:{inverseOrder:!1,startAngle:0,endAngle:360,offsetX:0,offsetY:0,hollow:{margin:5,size:"50%",background:"transparent",image:void 0,imageWidth:150,imageHeight:150,imageOffsetX:0,imageOffsetY:0,imageClipped:!0,position:"front",dropShadow:{enabled:!1,top:0,left:0,blur:3,color:"#000",opacity:.5}},track:{show:!0,startAngle:void 0,endAngle:void 0,background:"#f2f2f2",strokeWidth:"97%",opacity:1,margin:5,dropShadow:{enabled:!1,top:0,left:0,blur:3,color:"#000",opacity:.5}},dataLabels:{show:!0,name:{show:!0,fontSize:"16px",fontFamily:void 0,fontWeight:600,color:void 0,offsetY:0,formatter:function(t){return t}},value:{show:!0,fontSize:"14px",fontFamily:void 0,fontWeight:400,color:void 0,offsetY:16,formatter:function(t){return t+"%"}},total:{show:!1,label:"Total",fontSize:"16px",fontWeight:600,fontFamily:void 0,color:void 0,formatter:function(t){return t.globals.seriesTotals.reduce((function(t,e){return t+e}),0)/t.globals.series.length+"%"}}}},pie:{customScale:1,offsetX:0,offsetY:0,startAngle:0,endAngle:360,expandOnClick:!0,dataLabels:{offset:0,minAngleToShowLabel:10},donut:{size:"65%",background:"transparent",labels:{show:!1,name:{show:!0,fontSize:"16px",fontFamily:void 0,fontWeight:600,color:void 0,offsetY:-10,formatter:function(t){return t}},value:{show:!0,fontSize:"20px",fontFamily:void 0,fontWeight:400,color:void 0,offsetY:10,formatter:function(t){return t}},total:{show:!1,showAlways:!1,label:"Total",fontSize:"16px",fontWeight:400,fontFamily:void 0,color:void 0,formatter:function(t){return t.globals.seriesTotals.reduce((function(t,e){return t+e}),0)}}}}},polarArea:{rings:{strokeWidth:1,strokeColor:"#e8e8e8"},spokes:{strokeWidth:1,connectorColors:"#e8e8e8"}},radar:{size:void 0,offsetX:0,offsetY:0,polygons:{strokeWidth:1,strokeColors:"#e8e8e8",connectorColors:"#e8e8e8",fill:{colors:void 0}}}},colors:void 0,dataLabels:{enabled:!0,enabledOnSeries:void 0,formatter:function(t){return null!==t?t:""},textAnchor:"middle",distributed:!1,offsetX:0,offsetY:0,style:{fontSize:"12px",fontFamily:void 0,fontWeight:600,colors:void 0},background:{enabled:!0,foreColor:"#fff",borderRadius:2,padding:4,opacity:.9,borderWidth:1,borderColor:"#fff",dropShadow:{enabled:!1,top:1,left:1,blur:1,color:"#000",opacity:.45}},dropShadow:{enabled:!1,top:1,left:1,blur:1,color:"#000",opacity:.45}},fill:{type:"solid",colors:void 0,opacity:.85,gradient:{shade:"dark",type:"horizontal",shadeIntensity:.5,gradientToColors:void 0,inverseColors:!0,opacityFrom:1,opacityTo:1,stops:[0,50,100],colorStops:[]},image:{src:[],width:void 0,height:void 0},pattern:{style:"squares",width:6,height:6,strokeWidth:2}},forecastDataPoints:{count:0,fillOpacity:.5,strokeWidth:void 0,dashArray:4},grid:{show:!0,borderColor:"#e0e0e0",strokeDashArray:0,position:"back",xaxis:{lines:{show:!1}},yaxis:{lines:{show:!0}},row:{colors:void 0,opacity:.5},column:{colors:void 0,opacity:.5},padding:{top:0,right:10,bottom:0,left:12}},labels:[],legend:{show:!0,showForSingleSeries:!1,showForNullSeries:!0,showForZeroSeries:!0,floating:!1,position:"bottom",horizontalAlign:"center",inverseOrder:!1,fontSize:"12px",fontFamily:void 0,fontWeight:400,width:void 0,height:void 0,formatter:void 0,tooltipHoverFormatter:void 0,offsetX:-20,offsetY:4,customLegendItems:[],labels:{colors:void 0,useSeriesColors:!1},markers:{width:12,height:12,strokeWidth:0,fillColors:void 0,strokeColor:"#fff",radius:12,customHTML:void 0,offsetX:0,offsetY:0,onClick:void 0},itemMargin:{horizontal:5,vertical:2},onItemClick:{toggleDataSeries:!0},onItemHover:{highlightDataSeries:!0}},markers:{discrete:[],size:0,colors:void 0,strokeColors:"#fff",strokeWidth:2,strokeOpacity:.9,strokeDashArray:0,fillOpacity:1,shape:"circle",width:8,height:8,radius:2,offsetX:0,offsetY:0,onClick:void 0,onDblClick:void 0,showNullDataPoints:!0,hover:{size:void 0,sizeOffset:3}},noData:{text:void 0,align:"center",verticalAlign:"middle",offsetX:0,offsetY:0,style:{color:void 0,fontSize:"14px",fontFamily:void 0}},responsive:[],series:void 0,states:{normal:{filter:{type:"none",value:0}},hover:{filter:{type:"lighten",value:.1}},active:{allowMultipleDataPointsSelection:!1,filter:{type:"darken",value:.5}}},title:{text:void 0,align:"left",margin:5,offsetX:0,offsetY:0,floating:!1,style:{fontSize:"14px",fontWeight:900,fontFamily:void 0,color:void 0}},subtitle:{text:void 0,align:"left",margin:5,offsetX:0,offsetY:30,floating:!1,style:{fontSize:"12px",fontWeight:400,fontFamily:void 0,color:void 0}},stroke:{show:!0,curve:"smooth",lineCap:"butt",width:2,colors:void 0,dashArray:0},tooltip:{enabled:!0,enabledOnSeries:void 0,shared:!0,followCursor:!1,intersect:!1,inverseOrder:!1,custom:void 0,fillSeriesColor:!1,theme:"light",style:{fontSize:"12px",fontFamily:void 0},onDatasetHover:{highlightDataSeries:!1},x:{show:!0,format:"dd MMM",formatter:void 0},y:{formatter:void 0,title:{formatter:function(t){return t?t+": ":""}}},z:{formatter:void 0,title:"Size: "},marker:{show:!0,fillColors:void 0},items:{display:"flex"},fixed:{enabled:!1,position:"topRight",offsetX:0,offsetY:0}},xaxis:{type:"category",categories:[],convertedCatToNumeric:!1,offsetX:0,offsetY:0,overwriteCategories:void 0,labels:{show:!0,rotate:-45,rotateAlways:!1,hideOverlappingLabels:!0,trim:!1,minHeight:void 0,maxHeight:120,showDuplicates:!0,style:{colors:[],fontSize:"12px",fontWeight:400,fontFamily:void 0,cssClass:""},offsetX:0,offsetY:0,format:void 0,formatter:void 0,datetimeUTC:!0,datetimeFormatter:{year:"yyyy",month:"MMM 'yy",day:"dd MMM",hour:"HH:mm",minute:"HH:mm:ss",second:"HH:mm:ss"}},axisBorder:{show:!0,color:"#e0e0e0",width:"100%",height:1,offsetX:0,offsetY:0},axisTicks:{show:!0,color:"#e0e0e0",height:6,offsetX:0,offsetY:0},tickAmount:void 0,tickPlacement:"on",min:void 0,max:void 0,range:void 0,floating:!1,decimalsInFloat:void 0,position:"bottom",title:{text:void 0,offsetX:0,offsetY:0,style:{color:void 0,fontSize:"12px",fontWeight:900,fontFamily:void 0,cssClass:""}},crosshairs:{show:!0,width:1,position:"back",opacity:.9,stroke:{color:"#b6b6b6",width:1,dashArray:3},fill:{type:"solid",color:"#B1B9C4",gradient:{colorFrom:"#D8E3F0",colorTo:"#BED1E6",stops:[0,100],opacityFrom:.4,opacityTo:.5}},dropShadow:{enabled:!1,left:0,top:0,blur:1,opacity:.4}},tooltip:{enabled:!0,offsetY:0,formatter:void 0,style:{fontSize:"12px",fontFamily:void 0}}},yaxis:this.yAxis,theme:{mode:"light",palette:"palette1",monochrome:{enabled:!1,color:"#008FFB",shadeTo:"light",shadeIntensity:.65}}}}}]),t}(),C=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.graphics=new b(this.ctx),this.w.globals.isBarHorizontal&&(this.invertAxis=!0),this.helpers=new v(this),this.xAxisAnnotations=new m(this),this.yAxisAnnotations=new w(this),this.pointsAnnotations=new k(this),this.w.globals.isBarHorizontal&&this.w.config.yaxis[0].reversed&&(this.inversedReversedAxis=!0),this.xDivision=this.w.globals.gridWidth/this.w.globals.dataPoints}return r(t,[{key:"drawAxesAnnotations",value:function(){var t=this.w;if(t.globals.axisCharts){for(var e=this.yAxisAnnotations.drawYAxisAnnotations(),i=this.xAxisAnnotations.drawXAxisAnnotations(),a=this.pointsAnnotations.drawPointAnnotations(),s=t.config.chart.animations.enabled,r=[e,i,a],o=[i.node,e.node,a.node],n=0;n<3;n++)t.globals.dom.elGraphical.add(r[n]),!s||t.globals.resized||t.globals.dataChanged||"scatter"!==t.config.chart.type&&"bubble"!==t.config.chart.type&&t.globals.dataPoints>1&&o[n].classList.add("apexcharts-element-hidden"),t.globals.delayedElements.push({el:o[n],index:0});this.helpers.annotationsBackground()}}},{key:"drawImageAnnos",value:function(){var t=this;this.w.config.annotations.images.map((function(e,i){t.addImage(e,i)}))}},{key:"drawTextAnnos",value:function(){var t=this;this.w.config.annotations.texts.map((function(e,i){t.addText(e,i)}))}},{key:"addXaxisAnnotation",value:function(t,e,i){this.xAxisAnnotations.addXaxisAnnotation(t,e,i)}},{key:"addYaxisAnnotation",value:function(t,e,i){this.yAxisAnnotations.addYaxisAnnotation(t,e,i)}},{key:"addPointAnnotation",value:function(t,e,i){this.pointsAnnotations.addPointAnnotation(t,e,i)}},{key:"addText",value:function(t,e){var i=t.x,a=t.y,s=t.text,r=t.textAnchor,o=t.foreColor,n=t.fontSize,l=t.fontFamily,h=t.fontWeight,c=t.cssClass,d=t.backgroundColor,g=t.borderWidth,u=t.strokeDashArray,p=t.borderRadius,f=t.borderColor,x=t.appendTo,b=void 0===x?".apexcharts-annotations":x,v=t.paddingLeft,m=void 0===v?4:v,y=t.paddingRight,w=void 0===y?4:y,k=t.paddingBottom,A=void 0===k?2:k,S=t.paddingTop,C=void 0===S?2:S,L=this.w,P=this.graphics.drawText({x:i,y:a,text:s,textAnchor:r||"start",fontSize:n||"12px",fontWeight:h||"regular",fontFamily:l||L.config.chart.fontFamily,foreColor:o||L.config.chart.foreColor,cssClass:c}),T=L.globals.dom.baseEl.querySelector(b);T&&T.appendChild(P.node);var M=P.bbox();if(s){var I=this.graphics.drawRect(M.x-m,M.y-C,M.width+m+w,M.height+A+C,p,d||"transparent",1,g,f,u);T.insertBefore(I.node,P.node)}}},{key:"addImage",value:function(t,e){var i=this.w,a=t.path,s=t.x,r=void 0===s?0:s,o=t.y,n=void 0===o?0:o,l=t.width,h=void 0===l?20:l,c=t.height,d=void 0===c?20:c,g=t.appendTo,u=void 0===g?".apexcharts-annotations":g,p=i.globals.dom.Paper.image(a);p.size(h,d).move(r,n);var f=i.globals.dom.baseEl.querySelector(u);return f&&f.appendChild(p.node),p}},{key:"addXaxisAnnotationExternal",value:function(t,e,i){return this.addAnnotationExternal({params:t,pushToMemory:e,context:i,type:"xaxis",contextMethod:i.addXaxisAnnotation}),i}},{key:"addYaxisAnnotationExternal",value:function(t,e,i){return this.addAnnotationExternal({params:t,pushToMemory:e,context:i,type:"yaxis",contextMethod:i.addYaxisAnnotation}),i}},{key:"addPointAnnotationExternal",value:function(t,e,i){return void 0===this.invertAxis&&(this.invertAxis=i.w.globals.isBarHorizontal),this.addAnnotationExternal({params:t,pushToMemory:e,context:i,type:"point",contextMethod:i.addPointAnnotation}),i}},{key:"addAnnotationExternal",value:function(t){var e=t.params,i=t.pushToMemory,a=t.context,s=t.type,r=t.contextMethod,o=a,n=o.w,l=n.globals.dom.baseEl.querySelector(".apexcharts-".concat(s,"-annotations")),h=l.childNodes.length+1,c=new S,d=Object.assign({},"xaxis"===s?c.xAxisAnnotation:"yaxis"===s?c.yAxisAnnotation:c.pointAnnotation),g=p.extend(d,e);switch(s){case"xaxis":this.addXaxisAnnotation(g,l,h);break;case"yaxis":this.addYaxisAnnotation(g,l,h);break;case"point":this.addPointAnnotation(g,l,h)}var u=n.globals.dom.baseEl.querySelector(".apexcharts-".concat(s,"-annotations .apexcharts-").concat(s,"-annotation-label[rel='").concat(h,"']")),f=this.helpers.addBackgroundToAnno(u,g);return f&&l.insertBefore(f.node,u),i&&n.globals.memory.methodsToExec.push({context:o,id:g.id?g.id:p.randomId(),method:r,label:"addAnnotation",params:e}),a}},{key:"clearAnnotations",value:function(t){var e=t.w,i=e.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxis-annotations, .apexcharts-xaxis-annotations, .apexcharts-point-annotations");e.globals.memory.methodsToExec.map((function(t,i){"addText"!==t.label&&"addAnnotation"!==t.label||e.globals.memory.methodsToExec.splice(i,1)})),i=p.listToArray(i),Array.prototype.forEach.call(i,(function(t){for(;t.firstChild;)t.removeChild(t.firstChild)}))}},{key:"removeAnnotation",value:function(t,e){var i=t.w,a=i.globals.dom.baseEl.querySelectorAll(".".concat(e));a&&(i.globals.memory.methodsToExec.map((function(t,a){t.id===e&&i.globals.memory.methodsToExec.splice(a,1)})),Array.prototype.forEach.call(a,(function(t){t.parentElement.removeChild(t)})))}}]),t}(),L=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.opts=null,this.seriesIndex=0}return r(t,[{key:"clippedImgArea",value:function(t){var e=this.w,i=e.config,a=parseInt(e.globals.gridWidth,10),s=parseInt(e.globals.gridHeight,10),r=a>s?a:s,o=t.image,n=0,l=0;void 0===t.width&&void 0===t.height?void 0!==i.fill.image.width&&void 0!==i.fill.image.height?(n=i.fill.image.width+1,l=i.fill.image.height):(n=r+1,l=r):(n=t.width,l=t.height);var h=document.createElementNS(e.globals.SVGNS,"pattern");b.setAttrs(h,{id:t.patternID,patternUnits:t.patternUnits?t.patternUnits:"userSpaceOnUse",width:n+"px",height:l+"px"});var c=document.createElementNS(e.globals.SVGNS,"image");h.appendChild(c),c.setAttributeNS(window.SVG.xlink,"href",o),b.setAttrs(c,{x:0,y:0,preserveAspectRatio:"none",width:n+"px",height:l+"px"}),c.style.opacity=t.opacity,e.globals.dom.elDefs.node.appendChild(h)}},{key:"getSeriesIndex",value:function(t){var e=this.w;return("bar"===e.config.chart.type||"rangeBar"===e.config.chart.type)&&e.config.plotOptions.bar.distributed||"heatmap"===e.config.chart.type||"treemap"===e.config.chart.type?this.seriesIndex=t.seriesNumber:this.seriesIndex=t.seriesNumber%e.globals.series.length,this.seriesIndex}},{key:"fillPath",value:function(t){var e=this.w;this.opts=t;var i,a,s,r=this.w.config;this.seriesIndex=this.getSeriesIndex(t);var o=this.getFillColors()[this.seriesIndex];void 0!==e.globals.seriesColors[this.seriesIndex]&&(o=e.globals.seriesColors[this.seriesIndex]),"function"==typeof o&&(o=o({seriesIndex:this.seriesIndex,dataPointIndex:t.dataPointIndex,value:t.value,w:e}));var n=this.getFillType(this.seriesIndex),l=Array.isArray(r.fill.opacity)?r.fill.opacity[this.seriesIndex]:r.fill.opacity;t.color&&(o=t.color);var h=o;if(-1===o.indexOf("rgb")?o.length<9&&(h=p.hexToRgba(o,l)):o.indexOf("rgba")>-1&&(l=p.getOpacityFromRGBA(o)),t.opacity&&(l=t.opacity),"pattern"===n&&(a=this.handlePatternFill(a,o,l,h)),"gradient"===n&&(s=this.handleGradientFill(o,l,this.seriesIndex)),"image"===n){var c=r.fill.image.src,d=t.patternID?t.patternID:"";this.clippedImgArea({opacity:l,image:Array.isArray(c)?t.seriesNumber-1&&(c=p.getOpacityFromRGBA(h));var d=void 0===s.fill.gradient.opacityTo?e:Array.isArray(s.fill.gradient.opacityTo)?s.fill.gradient.opacityTo[i]:s.fill.gradient.opacityTo;if(void 0===s.fill.gradient.gradientToColors||0===s.fill.gradient.gradientToColors.length)a="dark"===s.fill.gradient.shade?n.shadeColor(-1*parseFloat(s.fill.gradient.shadeIntensity),t.indexOf("rgb")>-1?p.rgb2hex(t):t):n.shadeColor(parseFloat(s.fill.gradient.shadeIntensity),t.indexOf("rgb")>-1?p.rgb2hex(t):t);else if(s.fill.gradient.gradientToColors[r.seriesNumber]){var g=s.fill.gradient.gradientToColors[r.seriesNumber];a=g,g.indexOf("rgba")>-1&&(d=p.getOpacityFromRGBA(g))}else a=t;if(s.fill.gradient.inverseColors){var u=h;h=a,a=u}return h.indexOf("rgb")>-1&&(h=p.rgb2hex(h)),a.indexOf("rgb")>-1&&(a=p.rgb2hex(a)),o.drawGradient(l,h,a,c,d,r.size,s.fill.gradient.stops,s.fill.gradient.colorStops,i)}}]),t}(),P=function(){function t(e,i){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"setGlobalMarkerSize",value:function(){var t=this.w;if(t.globals.markers.size=Array.isArray(t.config.markers.size)?t.config.markers.size:[t.config.markers.size],t.globals.markers.size.length>0){if(t.globals.markers.size.length4&&void 0!==arguments[4]&&arguments[4],o=this.w,n=e,l=t,h=null,c=new b(this.ctx);if((o.globals.markers.size[e]>0||r)&&(h=c.group({class:r?"":"apexcharts-series-markers"})).attr("clip-path","url(#gridRectMarkerMask".concat(o.globals.cuid,")")),Array.isArray(l.x))for(var d=0;d0:o.config.markers.size>0;if(f||r){p.isNumber(l.y[d])?u+=" w".concat(p.randomId()):u="apexcharts-nullpoint";var v=this.getMarkerConfig({cssClass:u,seriesIndex:e,dataPointIndex:g});o.config.series[n].data[g]&&(o.config.series[n].data[g].fillColor&&(v.pointFillColor=o.config.series[n].data[g].fillColor),o.config.series[n].data[g].strokeColor&&(v.pointStrokeColor=o.config.series[n].data[g].strokeColor)),a&&(v.pSize=a),(s=c.drawMarker(l.x[d],l.y[d],v)).attr("rel",g),s.attr("j",g),s.attr("index",e),s.node.setAttribute("default-marker-size",v.pSize);var m=new x(this.ctx);m.setSelectionFilter(s,e,g),this.addEvents(s),h&&h.add(s)}else void 0===o.globals.pointsArray[e]&&(o.globals.pointsArray[e]=[]),o.globals.pointsArray[e].push([l.x[d],l.y[d]])}return h}},{key:"getMarkerConfig",value:function(t){var e=t.cssClass,i=t.seriesIndex,a=t.dataPointIndex,s=void 0===a?null:a,r=t.finishRadius,o=void 0===r?null:r,n=this.w,l=this.getMarkerStyle(i),h=n.globals.markers.size[i],c=n.config.markers;return null!==s&&c.discrete.length&&c.discrete.map((function(t){t.seriesIndex===i&&t.dataPointIndex===s&&(l.pointStrokeColor=t.strokeColor,l.pointFillColor=t.fillColor,h=t.size,l.pointShape=t.shape)})),{pSize:null===o?h:o,pRadius:c.radius,width:Array.isArray(c.width)?c.width[i]:c.width,height:Array.isArray(c.height)?c.height[i]:c.height,pointStrokeWidth:Array.isArray(c.strokeWidth)?c.strokeWidth[i]:c.strokeWidth,pointStrokeColor:l.pointStrokeColor,pointFillColor:l.pointFillColor,shape:l.pointShape||(Array.isArray(c.shape)?c.shape[i]:c.shape),class:e,pointStrokeOpacity:Array.isArray(c.strokeOpacity)?c.strokeOpacity[i]:c.strokeOpacity,pointStrokeDashArray:Array.isArray(c.strokeDashArray)?c.strokeDashArray[i]:c.strokeDashArray,pointFillOpacity:Array.isArray(c.fillOpacity)?c.fillOpacity[i]:c.fillOpacity,seriesIndex:i}}},{key:"addEvents",value:function(t){var e=this.w,i=new b(this.ctx);t.node.addEventListener("mouseenter",i.pathMouseEnter.bind(this.ctx,t)),t.node.addEventListener("mouseleave",i.pathMouseLeave.bind(this.ctx,t)),t.node.addEventListener("mousedown",i.pathMouseDown.bind(this.ctx,t)),t.node.addEventListener("click",e.config.markers.onClick),t.node.addEventListener("dblclick",e.config.markers.onDblClick),t.node.addEventListener("touchstart",i.pathMouseDown.bind(this.ctx,t),{passive:!0})}},{key:"getMarkerStyle",value:function(t){var e=this.w,i=e.globals.markers.colors,a=e.config.markers.strokeColor||e.config.markers.strokeColors;return{pointStrokeColor:Array.isArray(a)?a[t]:a,pointFillColor:Array.isArray(i)?i[t]:i}}}]),t}(),T=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.initialAnim=this.w.config.chart.animations.enabled,this.dynamicAnim=this.initialAnim&&this.w.config.chart.animations.dynamicAnimation.enabled}return r(t,[{key:"draw",value:function(t,e,i){var a=this.w,s=new b(this.ctx),r=i.realIndex,o=i.pointsPos,n=i.zRatio,l=i.elParent,h=s.group({class:"apexcharts-series-markers apexcharts-series-".concat(a.config.chart.type)});if(h.attr("clip-path","url(#gridRectMarkerMask".concat(a.globals.cuid,")")),Array.isArray(o.x))for(var c=0;cf.maxBubbleRadius&&(p=f.maxBubbleRadius)}a.config.chart.animations.enabled||(u=p);var x=o.x[c],v=o.y[c];if(u=u||0,null!==v&&void 0!==a.globals.series[r][d]||(g=!1),g){var m=this.drawPoint(x,v,u,p,r,d,e);h.add(m)}l.add(h)}}},{key:"drawPoint",value:function(t,e,i,a,s,r,o){var n=this.w,l=s,h=new f(this.ctx),c=new x(this.ctx),d=new L(this.ctx),g=new P(this.ctx),u=new b(this.ctx),p=g.getMarkerConfig({cssClass:"apexcharts-marker",seriesIndex:l,dataPointIndex:r,finishRadius:"bubble"===n.config.chart.type||n.globals.comboCharts&&n.config.series[s]&&"bubble"===n.config.series[s].type?a:null});a=p.pSize;var v,m=d.fillPath({seriesNumber:s,dataPointIndex:r,color:p.pointFillColor,patternUnits:"objectBoundingBox",value:n.globals.series[s][o]});if("circle"===p.shape?v=u.drawCircle(i):"square"!==p.shape&&"rect"!==p.shape||(v=u.drawRect(0,0,p.width-p.pointStrokeWidth/2,p.height-p.pointStrokeWidth/2,p.pRadius)),n.config.series[l].data[r]&&n.config.series[l].data[r].fillColor&&(m=n.config.series[l].data[r].fillColor),v.attr({x:t-p.width/2-p.pointStrokeWidth/2,y:e-p.height/2-p.pointStrokeWidth/2,cx:t,cy:e,fill:m,"fill-opacity":p.pointFillOpacity,stroke:p.pointStrokeColor,r:a,"stroke-width":p.pointStrokeWidth,"stroke-dasharray":p.pointStrokeDashArray,"stroke-opacity":p.pointStrokeOpacity}),n.config.chart.dropShadow.enabled){var y=n.config.chart.dropShadow;c.dropShadow(v,y,s)}if(!this.initialAnim||n.globals.dataChanged||n.globals.resized)n.globals.animationEnded=!0;else{var w=n.config.chart.animations.speed;h.animateMarker(v,0,"circle"===p.shape?a:{width:p.width,height:p.height},w,n.globals.easing,(function(){window.setTimeout((function(){h.animationCompleted(v)}),100)}))}if(n.globals.dataChanged&&"circle"===p.shape)if(this.dynamicAnim){var k,A,S,C,T=n.config.chart.animations.dynamicAnimation.speed;null!=(C=n.globals.previousPaths[s]&&n.globals.previousPaths[s][o])&&(k=C.x,A=C.y,S=void 0!==C.r?C.r:a);for(var M=0;Mn.globals.gridHeight+d&&(e=n.globals.gridHeight+d/2),void 0===n.globals.dataLabelsRects[a]&&(n.globals.dataLabelsRects[a]=[]),n.globals.dataLabelsRects[a].push({x:t,y:e,width:c,height:d});var g=n.globals.dataLabelsRects[a].length-2,u=void 0!==n.globals.lastDrawnDataLabelsIndexes[a]?n.globals.lastDrawnDataLabelsIndexes[a][n.globals.lastDrawnDataLabelsIndexes[a].length-1]:0;if(void 0!==n.globals.dataLabelsRects[a][g]){var p=n.globals.dataLabelsRects[a][u];(t>p.x+p.width+2||e>p.y+p.height+2||t+c4&&void 0!==arguments[4]?arguments[4]:2,r=this.w,o=new b(this.ctx),n=r.config.dataLabels,l=0,h=0,c=i,d=null;if(!n.enabled||!Array.isArray(t.x))return d;d=o.group({class:"apexcharts-data-labels"});for(var g=0;ge.globals.gridWidth+f.textRects.width+10)&&(n="");var v=e.globals.dataLabels.style.colors[r];(("bar"===e.config.chart.type||"rangeBar"===e.config.chart.type)&&e.config.plotOptions.bar.distributed||e.config.dataLabels.distributed)&&(v=e.globals.dataLabels.style.colors[o]),"function"==typeof v&&(v=v({series:e.globals.series,seriesIndex:r,dataPointIndex:o,w:e})),g&&(v=g);var m=d.offsetX,y=d.offsetY;if("bar"!==e.config.chart.type&&"rangeBar"!==e.config.chart.type||(m=0,y=0),f.drawnextLabel&&void 0!==n&&String(n).trim().length){var w=i.drawText({width:100,height:parseInt(d.style.fontSize,10),x:a+m,y:s+y,foreColor:v,textAnchor:l||d.textAnchor,text:n,fontSize:h||d.style.fontSize,fontFamily:d.style.fontFamily,fontWeight:d.style.fontWeight||"normal"});if(w.attr({class:"apexcharts-datalabel",cx:a,cy:s}),d.dropShadow.enabled){var k=d.dropShadow;new x(this.ctx).dropShadow(w,k)}c.add(w),void 0===e.globals.lastDrawnDataLabelsIndexes[r]&&(e.globals.lastDrawnDataLabelsIndexes[r]=[]),e.globals.lastDrawnDataLabelsIndexes[r].push(o)}}}},{key:"addBackgroundToDataLabel",value:function(t,e){var i=this.w,a=i.config.dataLabels.background,s=a.padding,r=a.padding/2,o=e.width,n=e.height,l=new b(this.ctx).drawRect(e.x-s,e.y-r/2,o+2*s,n+r,a.borderRadius,"transparent"===i.config.chart.background?"#fff":i.config.chart.background,a.opacity,a.borderWidth,a.borderColor);a.dropShadow.enabled&&new x(this.ctx).dropShadow(l,a.dropShadow);return l}},{key:"dataLabelsBackground",value:function(){var t=this.w;if("bubble"!==t.config.chart.type)for(var e=t.globals.dom.baseEl.querySelectorAll(".apexcharts-datalabels text"),i=0;ii.globals.gridHeight&&(c=i.globals.gridHeight-g)),{bcx:o,bcy:r,dataLabelsX:e,dataLabelsY:c}}},{key:"calculateBarsDataLabelsPosition",value:function(t){var e=this.w,i=t.x,a=t.i,s=t.j,r=t.bcy,o=t.barHeight,n=t.barWidth,l=t.textRects,h=t.dataLabelsX,c=t.strokeWidth,d=t.barDataLabelsConfig,g=t.offX,u=t.offY,p=e.globals.gridHeight/e.globals.dataPoints;n=Math.abs(n);var f=r-(this.barCtx.isRangeBar?0:p)+o/2+l.height/2+u-3,x=this.barCtx.series[a][s]<0,b=i;switch(this.barCtx.isReversed&&(b=i+n-(x?2*n:0),i=e.globals.gridWidth-n),d.position){case"center":h=x?b+n/2-g:Math.max(l.width/2,b-n/2)+g;break;case"bottom":h=x?b+n-c-Math.round(l.width/2)-g:b-n+c+Math.round(l.width/2)+g;break;case"top":h=x?b-c+Math.round(l.width/2)-g:b-c-Math.round(l.width/2)+g}return e.config.chart.stacked||(h<0?h=h+l.width+c:h+l.width/2>e.globals.gridWidth&&(h=e.globals.gridWidth-l.width-c)),{bcx:i,bcy:r,dataLabelsX:h,dataLabelsY:f}}},{key:"drawCalculatedDataLabels",value:function(t){var i=t.x,a=t.y,s=t.val,r=t.i,o=t.j,n=t.textRects,l=t.barHeight,h=t.barWidth,c=t.dataLabelsConfig,d=this.w,g="rotate(0)";"vertical"===d.config.plotOptions.bar.dataLabels.orientation&&(g="rotate(-90, ".concat(i,", ").concat(a,")"));var u=new M(this.barCtx.ctx),p=new b(this.barCtx.ctx),f=c.formatter,x=null,v=d.globals.collapsedSeriesIndices.indexOf(r)>-1;if(c.enabled&&!v){x=p.group({class:"apexcharts-data-labels",transform:g});var m="";void 0!==s&&(m=f(s,{seriesIndex:r,dataPointIndex:o,w:d}));var y=d.globals.series[r][o]<0,w=d.config.plotOptions.bar.dataLabels.position;if("vertical"===d.config.plotOptions.bar.dataLabels.orientation&&("top"===w&&(c.textAnchor=y?"end":"start"),"center"===w&&(c.textAnchor="middle"),"bottom"===w&&(c.textAnchor=y?"end":"start")),this.barCtx.isRangeBar&&this.barCtx.barOptions.dataLabels.hideOverflowingLabels)hMath.abs(h)&&(m=""):n.height/1.6>Math.abs(l)&&(m=""));var k=e({},c);this.barCtx.isHorizontal&&s<0&&("start"===c.textAnchor?k.textAnchor="end":"end"===c.textAnchor&&(k.textAnchor="start")),u.plotDataLabelsText({x:i,y:a,text:m,i:r,j:o,parent:x,dataLabelsConfig:k,alwaysDrawDataLabel:!0,offsetCorrection:!0})}return x}}]),t}(),z=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.legendInactiveClass="legend-mouseover-inactive"}return r(t,[{key:"getAllSeriesEls",value:function(){return this.w.globals.dom.baseEl.getElementsByClassName("apexcharts-series")}},{key:"getSeriesByName",value:function(t){return this.w.globals.dom.baseEl.querySelector(".apexcharts-inner .apexcharts-series[seriesName='".concat(p.escapeString(t),"']"))}},{key:"isSeriesHidden",value:function(t){var e=this.getSeriesByName(t),i=parseInt(e.getAttribute("data:realIndex"),10);return{isHidden:e.classList.contains("apexcharts-series-collapsed"),realIndex:i}}},{key:"addCollapsedClassToSeries",value:function(t,e){var i=this.w;function a(i){for(var a=0;a0&&void 0!==arguments[0])||arguments[0],e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],a=this.w,s=p.clone(a.globals.initialSeries);a.globals.previousPaths=[],i?(a.globals.collapsedSeries=[],a.globals.ancillaryCollapsedSeries=[],a.globals.collapsedSeriesIndices=[],a.globals.ancillaryCollapsedSeriesIndices=[]):s=this.emptyCollapsedSeries(s),a.config.series=s,t&&(e&&(a.globals.zoomed=!1,this.ctx.updateHelpers.revertDefaultAxisMinMax()),this.ctx.updateHelpers._updateSeries(s,a.config.chart.animations.dynamicAnimation.enabled))}},{key:"emptyCollapsedSeries",value:function(t){for(var e=this.w,i=0;i-1&&(t[i].data=[]);return t}},{key:"toggleSeriesOnHover",value:function(t,e){var i=this.w;e||(e=t.target);var a=i.globals.dom.baseEl.querySelectorAll(".apexcharts-series, .apexcharts-datalabels");if("mousemove"===t.type){var s=parseInt(e.getAttribute("rel"),10)-1,r=null,o=null;i.globals.axisCharts||"radialBar"===i.config.chart.type?i.globals.axisCharts?(r=i.globals.dom.baseEl.querySelector(".apexcharts-series[data\\:realIndex='".concat(s,"']")),o=i.globals.dom.baseEl.querySelector(".apexcharts-datalabels[data\\:realIndex='".concat(s,"']"))):r=i.globals.dom.baseEl.querySelector(".apexcharts-series[rel='".concat(s+1,"']")):r=i.globals.dom.baseEl.querySelector(".apexcharts-series[rel='".concat(s+1,"'] path"));for(var n=0;n=t.from&&a<=t.to&&s[e].classList.remove(i.legendInactiveClass)}}(a.config.plotOptions.heatmap.colorScale.ranges[o])}else"mouseout"===t.type&&r("remove")}},{key:"getActiveConfigSeriesIndex",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"asc",i=this.w,a=0;if(i.config.series.length>1)for(var s=i.config.series.map((function(e,a){var s=!1;return t&&(s="bar"===i.config.series[a].type||"column"===i.config.series[a].type),e.data&&e.data.length>0&&!s?a:-1})),r="asc"===e?0:s.length-1;"asc"===e?r=0;"asc"===e?r++:r--)if(-1!==s[r]){a=s[r];break}return a}},{key:"getPreviousPaths",value:function(){var t=this.w;function e(e,i,a){for(var s=e[i].childNodes,r={type:a,paths:[],realIndex:e[i].getAttribute("data:realIndex")},o=0;o0)for(var a=function(e){for(var i=t.globals.dom.baseEl.querySelectorAll(".apexcharts-".concat(t.config.chart.type," .apexcharts-series[data\\:realIndex='").concat(e,"'] rect")),a=[],s=function(t){var e=function(e){return i[t].getAttribute(e)},s={x:parseFloat(e("x")),y:parseFloat(e("y")),width:parseFloat(e("width")),height:parseFloat(e("height"))};a.push({rect:s,color:i[t].getAttribute("color")})},r=0;r0)for(var a=0;a0?t:[]}));return t}}]),t}(),X=function(){function t(e){a(this,t),this.w=e.w,this.barCtx=e}return r(t,[{key:"initVariables",value:function(t){var e=this.w;this.barCtx.series=t,this.barCtx.totalItems=0,this.barCtx.seriesLen=0,this.barCtx.visibleI=-1,this.barCtx.visibleItems=1;for(var i=0;i0&&(this.barCtx.seriesLen=this.barCtx.seriesLen+1,this.barCtx.totalItems+=t[i].length),e.globals.isXNumeric)for(var a=0;ae.globals.minX&&e.globals.seriesX[i][a]0&&(a=l.globals.minXDiff/d),(r=a/this.barCtx.seriesLen*parseInt(this.barCtx.barOptions.columnWidth,10)/100)<1&&(r=1)}o=l.globals.gridHeight-this.barCtx.baseLineY[this.barCtx.yaxisIndex]-(this.barCtx.isReversed?l.globals.gridHeight:0)+(this.barCtx.isReversed?2*this.barCtx.baseLineY[this.barCtx.yaxisIndex]:0),t=l.globals.padHorizontal+(a-r*this.barCtx.seriesLen)/2}return{x:t,y:e,yDivision:i,xDivision:a,barHeight:s,barWidth:r,zeroH:o,zeroW:n}}},{key:"getPathFillColor",value:function(t,e,i,a){var s=this.w,r=new L(this.barCtx.ctx),o=null,n=this.barCtx.barOptions.distributed?i:e;this.barCtx.barOptions.colors.ranges.length>0&&this.barCtx.barOptions.colors.ranges.map((function(a){t[e][i]>=a.from&&t[e][i]<=a.to&&(o=a.color)}));return s.config.series[e].data[i]&&s.config.series[e].data[i].fillColor&&(o=s.config.series[e].data[i].fillColor),r.fillPath({seriesNumber:this.barCtx.barOptions.distributed?n:a,dataPointIndex:i,color:o,value:t[e][i]})}},{key:"getStrokeWidth",value:function(t,e,i){var a=0,s=this.w;return void 0===this.barCtx.series[t][e]||null===this.barCtx.series[t][e]?this.barCtx.isNullValue=!0:this.barCtx.isNullValue=!1,s.config.stroke.show&&(this.barCtx.isNullValue||(a=Array.isArray(this.barCtx.strokeWidth)?this.barCtx.strokeWidth[i]:this.barCtx.strokeWidth)),a}},{key:"barBackground",value:function(t){var e=t.j,i=t.i,a=t.x1,s=t.x2,r=t.y1,o=t.y2,n=t.elSeries,l=this.w,h=new b(this.barCtx.ctx),c=new z(this.barCtx.ctx).getActiveConfigSeriesIndex();if(this.barCtx.barOptions.colors.backgroundBarColors.length>0&&c===i){e>=this.barCtx.barOptions.colors.backgroundBarColors.length&&(e-=this.barCtx.barOptions.colors.backgroundBarColors.length);var d=this.barCtx.barOptions.colors.backgroundBarColors[e],g=h.drawRect(void 0!==a?a:0,void 0!==r?r:0,void 0!==s?s:l.globals.gridWidth,void 0!==o?o:l.globals.gridHeight,this.barCtx.barOptions.colors.backgroundBarRadius,d,this.barCtx.barOptions.colors.backgroundBarOpacity);n.add(g),g.node.classList.add("apexcharts-backgroundBar")}}},{key:"getColumnPaths",value:function(t){var e=t.barWidth,i=t.barXPosition,a=t.yRatio,s=t.y1,r=t.y2,o=t.strokeWidth,n=t.series,l=t.realIndex,h=t.i,c=t.j,d=t.w,g=new b(this.barCtx.ctx);(o=Array.isArray(o)?o[l]:o)||(o=0);var u={barWidth:e,strokeWidth:o,yRatio:a,barXPosition:i,y1:s,y2:r},p=this.getRoundedBars(d,u,n,h,c),f=i,x=i+e,v=g.move(f,s),m=g.move(f,s),y=g.line(x-o,s);return d.globals.previousPaths.length>0&&(m=this.barCtx.getPreviousPath(l,c,!1)),v=v+g.line(f,p.y2)+p.pathWithRadius+g.line(x-o,p.y2)+y+y+"z",m=m+g.line(f,s)+y+y+y+y+y+g.line(f,s),d.config.chart.stacked&&(this.barCtx.yArrj.push(p.y2),this.barCtx.yArrjF.push(Math.abs(s-p.y2)),this.barCtx.yArrjVal.push(this.barCtx.series[h][c])),{pathTo:v,pathFrom:m}}},{key:"getBarpaths",value:function(t){var e=t.barYPosition,i=t.barHeight,a=t.x1,s=t.x2,r=t.strokeWidth,o=t.series,n=t.realIndex,l=t.i,h=t.j,c=t.w,d=new b(this.barCtx.ctx);(r=Array.isArray(r)?r[n]:r)||(r=0);var g={barHeight:i,strokeWidth:r,barYPosition:e,x2:s,x1:a},u=this.getRoundedBars(c,g,o,l,h),p=d.move(a,e),f=d.move(a,e);c.globals.previousPaths.length>0&&(f=this.barCtx.getPreviousPath(n,h,!1));var x=e,v=e+i,m=d.line(a,v-r);return p=p+d.line(u.x2,x)+u.pathWithRadius+d.line(u.x2,v-r)+m+m+"z",f=f+d.line(a,x)+m+m+m+m+m+d.line(a,x),c.config.chart.stacked&&(this.barCtx.xArrj.push(u.x2),this.barCtx.xArrjF.push(Math.abs(a-u.x2)),this.barCtx.xArrjVal.push(this.barCtx.series[l][h])),{pathTo:p,pathFrom:f}}},{key:"getRoundedBars",value:function(t,e,i,a,s){var r=new b(this.barCtx.ctx),o=0,n=t.config.plotOptions.bar.borderRadius,l=Array.isArray(n);l?o=n[a>n.length-1?n.length-1:a]:o=n;if(t.config.chart.stacked&&i.length>1&&a!==this.barCtx.radiusOnSeriesNumber&&!l&&(o=0),this.barCtx.isHorizontal){var h="",c=e.x2;if(Math.abs(e.x1-e.x2)0:i[a][s]<0;d&&(o*=-1),c-=o,h=r.quadraticCurve(c+o,e.barYPosition,c+o,e.barYPosition+(d?-1*o:o))+r.line(c+o,e.barYPosition+e.barHeight-e.strokeWidth-(d?-1*o:o))+r.quadraticCurve(c+o,e.barYPosition+e.barHeight-e.strokeWidth,c,e.barYPosition+e.barHeight-e.strokeWidth)}return{pathWithRadius:h,x2:c}}var g="",u=e.y2;if(Math.abs(e.y1-e.y2)=0;o--)this.barCtx.zeroSerieses.indexOf(o)>-1&&o===this.radiusOnSeriesNumber&&(this.barCtx.radiusOnSeriesNumber-=1);for(var n=e.length-1;n>=0;n--)i.globals.collapsedSeriesIndices.indexOf(this.barCtx.radiusOnSeriesNumber)>-1&&(this.barCtx.radiusOnSeriesNumber-=1)}},{key:"getXForValue",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],a=i?e:null;return null!=t&&(a=e+t/this.barCtx.invertedYRatio-2*(this.barCtx.isReversed?t/this.barCtx.invertedYRatio:0)),a}},{key:"getYForValue",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],a=i?e:null;return null!=t&&(a=e-t/this.barCtx.yRatio[this.barCtx.yaxisIndex]+2*(this.barCtx.isReversed?t/this.barCtx.yRatio[this.barCtx.yaxisIndex]:0)),a}},{key:"getGoalValues",value:function(t,e,i,a,s){var r=this,n=this.w,l=[];return n.globals.seriesGoals[a]&&n.globals.seriesGoals[a][s]&&Array.isArray(n.globals.seriesGoals[a][s])&&n.globals.seriesGoals[a][s].forEach((function(a){var s;l.push((o(s={},t,"x"===t?r.getXForValue(a.value,e,!1):r.getYForValue(a.value,i,!1)),o(s,"attrs",a),s))})),l}},{key:"drawGoalLine",value:function(t){var e=t.barXPosition,i=t.barYPosition,a=t.goalX,s=t.goalY,r=t.barWidth,o=t.barHeight,n=new b(this.barCtx.ctx),l=n.group({className:"apexcharts-bar-goals-groups"}),h=null;return this.barCtx.isHorizontal?Array.isArray(a)&&a.forEach((function(t){var e=void 0!==t.attrs.strokeHeight?t.attrs.strokeHeight:o/2,a=i+e+o/2;h=n.drawLine(t.x,a-2*e,t.x,a,t.attrs.strokeColor?t.attrs.strokeColor:void 0,t.attrs.strokeDashArray,t.attrs.strokeWidth?t.attrs.strokeWidth:2,t.attrs.strokeLineCap),l.add(h)})):Array.isArray(s)&&s.forEach((function(t){var i=void 0!==t.attrs.strokeWidth?t.attrs.strokeWidth:r/2,a=e+i+r/2;h=n.drawLine(a-2*i,t.y,a,t.y,t.attrs.strokeColor?t.attrs.strokeColor:void 0,t.attrs.strokeDashArray,t.attrs.strokeHeight?t.attrs.strokeHeight:2,t.attrs.strokeLineCap),l.add(h)})),l}}]),t}(),E=function(){function t(e,i){a(this,t),this.ctx=e,this.w=e.w;var s=this.w;this.barOptions=s.config.plotOptions.bar,this.isHorizontal=this.barOptions.horizontal,this.strokeWidth=s.config.stroke.width,this.isNullValue=!1,this.isRangeBar=s.globals.seriesRangeBar.length&&this.isHorizontal,this.xyRatios=i,null!==this.xyRatios&&(this.xRatio=i.xRatio,this.initialXRatio=i.initialXRatio,this.yRatio=i.yRatio,this.invertedXRatio=i.invertedXRatio,this.invertedYRatio=i.invertedYRatio,this.baseLineY=i.baseLineY,this.baseLineInvertedY=i.baseLineInvertedY),this.yaxisIndex=0,this.seriesLen=0,this.barHelpers=new X(this)}return r(t,[{key:"draw",value:function(t,i){var a=this.w,s=new b(this.ctx),r=new y(this.ctx,a);t=r.getLogSeries(t),this.series=t,this.yRatio=r.getLogYRatios(this.yRatio),this.barHelpers.initVariables(t);var o=s.group({class:"apexcharts-bar-series apexcharts-plot-series"});a.config.dataLabels.enabled&&this.totalItems>this.barOptions.dataLabels.maxItems&&console.warn("WARNING: DataLabels are enabled but there are too many to display. This may cause performance issue when rendering.");for(var n=0,l=0;n0&&(this.visibleI=this.visibleI+1);var k=0,A=0;this.yRatio.length>1&&(this.yaxisIndex=m),this.isReversed=a.config.yaxis[this.yaxisIndex]&&a.config.yaxis[this.yaxisIndex].reversed;var S=this.barHelpers.initialPositions();f=S.y,k=S.barHeight,c=S.yDivision,g=S.zeroW,u=S.x,A=S.barWidth,h=S.xDivision,d=S.zeroH,this.horizontal||v.push(u+A/2);for(var C=s.group({class:"apexcharts-datalabels","data:realIndex":m}),L=s.group({class:"apexcharts-bar-goals-markers",style:"pointer-events: none"}),P=0;P0&&v.push(u+A/2),x.push(f);var X=this.barHelpers.getPathFillColor(t,n,P,m);this.renderSeries({realIndex:m,pathFill:X,j:P,i:n,pathFrom:M.pathFrom,pathTo:M.pathTo,strokeWidth:T,elSeries:w,x:u,y:f,series:t,barHeight:k,barWidth:A,elDataLabelsWrap:C,elGoalsMarkers:L,visibleSeries:this.visibleI,type:"bar"})}a.globals.seriesXvalues[m]=v,a.globals.seriesYvalues[m]=x,o.add(w)}return o}},{key:"renderSeries",value:function(t){var e=t.realIndex,i=t.pathFill,a=t.lineFill,s=t.j,r=t.i,o=t.pathFrom,n=t.pathTo,l=t.strokeWidth,h=t.elSeries,c=t.x,d=t.y,g=t.y1,u=t.y2,p=t.series,f=t.barHeight,v=t.barWidth,m=t.barYPosition,y=t.elDataLabelsWrap,w=t.elGoalsMarkers,k=t.visibleSeries,A=t.type,S=this.w,C=new b(this.ctx);a||(a=this.barOptions.distributed?S.globals.stroke.colors[s]:S.globals.stroke.colors[e]),S.config.series[r].data[s]&&S.config.series[r].data[s].strokeColor&&(a=S.config.series[r].data[s].strokeColor),this.isNullValue&&(i="none");var L=s/S.config.chart.animations.animateGradually.delay*(S.config.chart.animations.speed/S.globals.dataPoints)/2.4,P=C.renderPaths({i:r,j:s,realIndex:e,pathFrom:o,pathTo:n,stroke:a,strokeWidth:l,strokeLineCap:S.config.stroke.lineCap,fill:i,animationDelay:L,initialSpeed:S.config.chart.animations.speed,dataChangeSpeed:S.config.chart.animations.dynamicAnimation.speed,className:"apexcharts-".concat(A,"-area")});P.attr("clip-path","url(#gridRectMask".concat(S.globals.cuid,")"));var T=S.config.forecastDataPoints;T.count>0&&s>=S.globals.dataPoints-T.count&&(P.node.setAttribute("stroke-dasharray",T.dashArray),P.node.setAttribute("stroke-width",T.strokeWidth),P.node.setAttribute("fill-opacity",T.fillOpacity)),void 0!==g&&void 0!==u&&(P.attr("data-range-y1",g),P.attr("data-range-y2",u)),new x(this.ctx).setSelectionFilter(P,e,s),h.add(P);var M=new I(this).handleBarDataLabels({x:c,y:d,y1:g,y2:u,i:r,j:s,series:p,realIndex:e,barHeight:f,barWidth:v,barYPosition:m,renderedPath:P,visibleSeries:k});return null!==M&&y.add(M),h.add(y),w&&h.add(w),h}},{key:"drawBarPaths",value:function(t){var e=t.indexes,i=t.barHeight,a=t.strokeWidth,s=t.zeroW,r=t.x,o=t.y,n=t.yDivision,l=t.elSeries,h=this.w,c=e.i,d=e.j;h.globals.isXNumeric&&(o=(h.globals.seriesX[c][d]-h.globals.minX)/this.invertedXRatio-i);var g=o+i*this.visibleI;r=this.barHelpers.getXForValue(this.series[c][d],s);var u=this.barHelpers.getBarpaths({barYPosition:g,barHeight:i,x1:s,x2:r,strokeWidth:a,series:this.series,realIndex:e.realIndex,i:c,j:d,w:h});return h.globals.isXNumeric||(o+=n),this.barHelpers.barBackground({j:d,i:c,y1:g-i*this.visibleI,y2:i*this.seriesLen,elSeries:l}),{pathTo:u.pathTo,pathFrom:u.pathFrom,x:r,y:o,goalX:this.barHelpers.getGoalValues("x",s,null,c,d),barYPosition:g}}},{key:"drawColumnPaths",value:function(t){var e=t.indexes,i=t.x,a=t.y,s=t.xDivision,r=t.barWidth,o=t.zeroH,n=t.strokeWidth,l=t.elSeries,h=this.w,c=e.realIndex,d=e.i,g=e.j,u=e.bc;if(h.globals.isXNumeric){var p=c;h.globals.seriesX[c].length||(p=h.globals.maxValsInArrayIndex),i=(h.globals.seriesX[p][g]-h.globals.minX)/this.xRatio-r*this.seriesLen/2}var f=i+r*this.visibleI;a=this.barHelpers.getYForValue(this.series[d][g],o);var x=this.barHelpers.getColumnPaths({barXPosition:f,barWidth:r,y1:o,y2:a,strokeWidth:n,series:this.series,realIndex:e.realIndex,i:d,j:g,w:h});return h.globals.isXNumeric||(i+=s),this.barHelpers.barBackground({bc:u,j:g,i:d,x1:f-n/2-r*this.visibleI,x2:r*this.seriesLen+n/2,elSeries:l}),{pathTo:x.pathTo,pathFrom:x.pathFrom,x:i,y:a,goalY:this.barHelpers.getGoalValues("y",null,o,d,g),barXPosition:f}}},{key:"getPreviousPath",value:function(t,e){for(var i,a=this.w,s=0;s0&&parseInt(r.realIndex,10)===parseInt(t,10)&&void 0!==a.globals.previousPaths[s].paths[e]&&(i=a.globals.previousPaths[s].paths[e].d)}return i}}]),t}(),Y=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.months31=[1,3,5,7,8,10,12],this.months30=[2,4,6,9,11],this.daysCntOfYear=[0,31,59,90,120,151,181,212,243,273,304,334]}return r(t,[{key:"isValidDate",value:function(t){return!isNaN(this.parseDate(t))}},{key:"getTimeStamp",value:function(t){return Date.parse(t)?this.w.config.xaxis.labels.datetimeUTC?new Date(new Date(t).toISOString().substr(0,25)).getTime():new Date(t).getTime():t}},{key:"getDate",value:function(t){return this.w.config.xaxis.labels.datetimeUTC?new Date(new Date(t).toUTCString()):new Date(t)}},{key:"parseDate",value:function(t){var e=Date.parse(t);if(!isNaN(e))return this.getTimeStamp(t);var i=Date.parse(t.replace(/-/g,"/").replace(/[a-z]+/gi," "));return i=this.getTimeStamp(i)}},{key:"parseDateWithTimezone",value:function(t){return Date.parse(t.replace(/-/g,"/").replace(/[a-z]+/gi," "))}},{key:"formatDate",value:function(t,e){var i=this.w.globals.locale,a=this.w.config.xaxis.labels.datetimeUTC,s=["\0"].concat(g(i.months)),r=["\x01"].concat(g(i.shortMonths)),o=["\x02"].concat(g(i.days)),n=["\x03"].concat(g(i.shortDays));function l(t,e){var i=t+"";for(e=e||2;i.length12?u-12:0===u?12:u;e=(e=(e=(e=e.replace(/(^|[^\\])HH+/g,"$1"+l(u))).replace(/(^|[^\\])H/g,"$1"+u)).replace(/(^|[^\\])hh+/g,"$1"+l(p))).replace(/(^|[^\\])h/g,"$1"+p);var f=a?t.getUTCMinutes():t.getMinutes();e=(e=e.replace(/(^|[^\\])mm+/g,"$1"+l(f))).replace(/(^|[^\\])m/g,"$1"+f);var x=a?t.getUTCSeconds():t.getSeconds();e=(e=e.replace(/(^|[^\\])ss+/g,"$1"+l(x))).replace(/(^|[^\\])s/g,"$1"+x);var b=a?t.getUTCMilliseconds():t.getMilliseconds();e=e.replace(/(^|[^\\])fff+/g,"$1"+l(b,3)),b=Math.round(b/10),e=e.replace(/(^|[^\\])ff/g,"$1"+l(b)),b=Math.round(b/10);var v=u<12?"AM":"PM";e=(e=(e=e.replace(/(^|[^\\])f/g,"$1"+b)).replace(/(^|[^\\])TT+/g,"$1"+v)).replace(/(^|[^\\])T/g,"$1"+v.charAt(0));var m=v.toLowerCase();e=(e=e.replace(/(^|[^\\])tt+/g,"$1"+m)).replace(/(^|[^\\])t/g,"$1"+m.charAt(0));var y=-t.getTimezoneOffset(),w=a||!y?"Z":y>0?"+":"-";if(!a){var k=(y=Math.abs(y))%60;w+=l(Math.floor(y/60))+":"+l(k)}e=e.replace(/(^|[^\\])K/g,"$1"+w);var A=(a?t.getUTCDay():t.getDay())+1;return e=(e=(e=(e=(e=e.replace(new RegExp(o[0],"g"),o[A])).replace(new RegExp(n[0],"g"),n[A])).replace(new RegExp(s[0],"g"),s[c])).replace(new RegExp(r[0],"g"),r[c])).replace(/\\(.)/g,"$1")}},{key:"getTimeUnitsfromTimestamp",value:function(t,e,i){var a=this.w;void 0!==a.config.xaxis.min&&(t=a.config.xaxis.min),void 0!==a.config.xaxis.max&&(e=a.config.xaxis.max);var s=this.getDate(t),r=this.getDate(e),o=this.formatDate(s,"yyyy MM dd HH mm ss fff").split(" "),n=this.formatDate(r,"yyyy MM dd HH mm ss fff").split(" ");return{minMillisecond:parseInt(o[6],10),maxMillisecond:parseInt(n[6],10),minSecond:parseInt(o[5],10),maxSecond:parseInt(n[5],10),minMinute:parseInt(o[4],10),maxMinute:parseInt(n[4],10),minHour:parseInt(o[3],10),maxHour:parseInt(n[3],10),minDate:parseInt(o[2],10),maxDate:parseInt(n[2],10),minMonth:parseInt(o[1],10)-1,maxMonth:parseInt(n[1],10)-1,minYear:parseInt(o[0],10),maxYear:parseInt(n[0],10)}}},{key:"isLeapYear",value:function(t){return t%4==0&&t%100!=0||t%400==0}},{key:"calculcateLastDaysOfMonth",value:function(t,e,i){return this.determineDaysOfMonths(t,e)-i}},{key:"determineDaysOfYear",value:function(t){var e=365;return this.isLeapYear(t)&&(e=366),e}},{key:"determineRemainingDaysOfYear",value:function(t,e,i){var a=this.daysCntOfYear[e]+i;return e>1&&this.isLeapYear()&&a++,a}},{key:"determineDaysOfMonths",value:function(t,e){var i=30;switch(t=p.monthMod(t),!0){case this.months30.indexOf(t)>-1:2===t&&(i=this.isLeapYear(e)?29:28);break;case this.months31.indexOf(t)>-1:default:i=31}return i}}]),t}(),F=function(t){n(s,t);var i=d(s);function s(){return a(this,s),i.apply(this,arguments)}return r(s,[{key:"draw",value:function(t,i){var a=this.w,s=new b(this.ctx);this.rangeBarOptions=this.w.config.plotOptions.rangeBar,this.series=t,this.seriesRangeStart=a.globals.seriesRangeStart,this.seriesRangeEnd=a.globals.seriesRangeEnd,this.barHelpers.initVariables(t);for(var r=s.group({class:"apexcharts-rangebar-series apexcharts-plot-series"}),o=0;o0&&(this.visibleI=this.visibleI+1);var x=0,v=0;this.yRatio.length>1&&(this.yaxisIndex=u);var m=this.barHelpers.initialPositions();d=m.y,h=m.zeroW,c=m.x,v=m.barWidth,n=m.xDivision,l=m.zeroH;for(var y=s.group({class:"apexcharts-datalabels","data:realIndex":u}),w=s.group({class:"apexcharts-rangebar-goals-markers",style:"pointer-events: none"}),k=0;k0}));return a=l.config.plotOptions.bar.rangeBarGroupRows?s+o*g:s+r*this.visibleI+o*g,u>-1&&!l.config.plotOptions.bar.rangeBarOverlap&&(h=l.globals.seriesRangeBar[e][u].overlaps).indexOf(c)>-1&&(a=(r=n.barHeight/h.length)*this.visibleI+o*(100-parseInt(this.barOptions.barHeight,10))/100/2+r*(this.visibleI+h.indexOf(c))+o*g),{barYPosition:a,barHeight:r}}},{key:"drawRangeColumnPaths",value:function(t){var e=t.indexes,i=t.x;t.strokeWidth;var a=t.xDivision,s=t.barWidth,r=t.zeroH,o=this.w,n=e.i,l=e.j,h=this.yRatio[this.yaxisIndex],c=e.realIndex,d=this.getRangeValue(c,l),g=Math.min(d.start,d.end),u=Math.max(d.start,d.end);o.globals.isXNumeric&&(i=(o.globals.seriesX[n][l]-o.globals.minX)/this.xRatio-s/2);var p=i+s*this.visibleI;void 0===this.series[n][l]||null===this.series[n][l]?g=r:(g=r-g/h,u=r-u/h);var f=Math.abs(u-g),x=this.barHelpers.getColumnPaths({barXPosition:p,barWidth:s,y1:g,y2:u,strokeWidth:this.strokeWidth,series:this.seriesRangeEnd,realIndex:e.realIndex,i:c,j:l,w:o});return o.globals.isXNumeric||(i+=a),{pathTo:x.pathTo,pathFrom:x.pathFrom,barHeight:f,x:i,y:u,goalY:this.barHelpers.getGoalValues("y",null,r,n,l),barXPosition:p}}},{key:"drawRangeBarPaths",value:function(t){var e=t.indexes,i=t.y,a=t.y1,s=t.y2,r=t.yDivision,o=t.barHeight,n=t.barYPosition,l=t.zeroW,h=this.w,c=l+a/this.invertedYRatio,d=l+s/this.invertedYRatio,g=Math.abs(d-c),u=this.barHelpers.getBarpaths({barYPosition:n,barHeight:o,x1:c,x2:d,strokeWidth:this.strokeWidth,series:this.seriesRangeEnd,i:e.realIndex,realIndex:e.realIndex,j:e.j,w:h});return h.globals.isXNumeric||(i+=r),{pathTo:u.pathTo,pathFrom:u.pathFrom,barWidth:g,x:d,goalX:this.barHelpers.getGoalValues("x",l,null,e.realIndex,e.j),y:i}}},{key:"getRangeValue",value:function(t,e){var i=this.w;return{start:i.globals.seriesRangeStart[t][e],end:i.globals.seriesRangeEnd[t][e]}}},{key:"getTooltipValues",value:function(t){var e=t.ctx,i=t.seriesIndex,a=t.dataPointIndex,s=t.y1,r=t.y2,o=t.w,n=o.globals.seriesRangeStart[i][a],l=o.globals.seriesRangeEnd[i][a],h=o.globals.labels[a],c=o.config.series[i].name?o.config.series[i].name:"",d=o.config.tooltip.y.formatter,g=o.config.tooltip.y.title.formatter,u={w:o,seriesIndex:i,dataPointIndex:a,start:n,end:l};"function"==typeof g&&(c=g(c,u)),Number.isFinite(s)&&Number.isFinite(r)&&(n=s,l=r,o.config.series[i].data[a].x&&(h=o.config.series[i].data[a].x+":"),"function"==typeof d&&(h=d(h,u)));var p="",f="",x=o.globals.colors[i];if(void 0===o.config.tooltip.x.formatter)if("datetime"===o.config.xaxis.type){var b=new Y(e);p=b.formatDate(b.getDate(n),o.config.tooltip.x.format),f=b.formatDate(b.getDate(l),o.config.tooltip.x.format)}else p=n,f=l;else p=o.config.tooltip.x.formatter(n),f=o.config.tooltip.x.formatter(l);return{start:n,end:l,startVal:p,endVal:f,ylabel:h,color:x,seriesName:c}}},{key:"buildCustomTooltipHTML",value:function(t){var e=t.color,i=t.seriesName;return'
'+(i||"")+'
'+t.ylabel+' '+t.start+' - '+t.end+"
"}}]),s}(E),R=function(){function t(e){a(this,t),this.opts=e}return r(t,[{key:"line",value:function(){return{chart:{animations:{easing:"swing"}},dataLabels:{enabled:!1},stroke:{width:5,curve:"straight"},markers:{size:0,hover:{sizeOffset:6}},xaxis:{crosshairs:{width:1}}}}},{key:"sparkline",value:function(t){this.opts.yaxis[0].show=!1,this.opts.yaxis[0].title.text="",this.opts.yaxis[0].axisBorder.show=!1,this.opts.yaxis[0].axisTicks.show=!1,this.opts.yaxis[0].floating=!0;return p.extend(t,{grid:{show:!1,padding:{left:0,right:0,top:0,bottom:0}},legend:{show:!1},xaxis:{labels:{show:!1},tooltip:{enabled:!1},axisBorder:{show:!1},axisTicks:{show:!1}},chart:{toolbar:{show:!1},zoom:{enabled:!1}},dataLabels:{enabled:!1}})}},{key:"bar",value:function(){return{chart:{stacked:!1,animations:{easing:"swing"}},plotOptions:{bar:{dataLabels:{position:"center"}}},dataLabels:{style:{colors:["#fff"]},background:{enabled:!1}},stroke:{width:0,lineCap:"round"},fill:{opacity:.85},legend:{markers:{shape:"square",radius:2,size:8}},tooltip:{shared:!1,intersect:!0},xaxis:{tooltip:{enabled:!1},tickPlacement:"between",crosshairs:{width:"barWidth",position:"back",fill:{type:"gradient"},dropShadow:{enabled:!1},stroke:{width:0}}}}}},{key:"candlestick",value:function(){var t=this;return{stroke:{width:1,colors:["#333"]},fill:{opacity:1},dataLabels:{enabled:!1},tooltip:{shared:!0,custom:function(e){var i=e.seriesIndex,a=e.dataPointIndex,s=e.w;return t._getBoxTooltip(s,i,a,["Open","High","","Low","Close"],"candlestick")}},states:{active:{filter:{type:"none"}}},xaxis:{crosshairs:{width:1}}}}},{key:"boxPlot",value:function(){var t=this;return{chart:{animations:{dynamicAnimation:{enabled:!1}}},stroke:{width:1,colors:["#24292e"]},dataLabels:{enabled:!1},tooltip:{shared:!0,custom:function(e){var i=e.seriesIndex,a=e.dataPointIndex,s=e.w;return t._getBoxTooltip(s,i,a,["Minimum","Q1","Median","Q3","Maximum"],"boxPlot")}},markers:{size:5,strokeWidth:1,strokeColors:"#111"},xaxis:{crosshairs:{width:1}}}}},{key:"rangeBar",value:function(){return{stroke:{width:0,lineCap:"square"},plotOptions:{bar:{borderRadius:0,dataLabels:{position:"center"}}},dataLabels:{enabled:!1,formatter:function(t,e){e.ctx;var i=e.seriesIndex,a=e.dataPointIndex,s=e.w,r=s.globals.seriesRangeStart[i][a];return s.globals.seriesRangeEnd[i][a]-r},background:{enabled:!1},style:{colors:["#fff"]}},tooltip:{shared:!1,followCursor:!0,custom:function(t){return t.w.config.plotOptions&&t.w.config.plotOptions.bar&&t.w.config.plotOptions.bar.horizontal?function(t){var e=new F(t.ctx,null),i=e.getTooltipValues(t),a=i.color,s=i.seriesName,r=i.ylabel,o=i.startVal,n=i.endVal;return e.buildCustomTooltipHTML({color:a,seriesName:s,ylabel:r,start:o,end:n})}(t):function(t){var e=new F(t.ctx,null),i=e.getTooltipValues(t),a=i.color,s=i.seriesName,r=i.ylabel,o=i.start,n=i.end;return e.buildCustomTooltipHTML({color:a,seriesName:s,ylabel:r,start:o,end:n})}(t)}},xaxis:{tickPlacement:"between",tooltip:{enabled:!1},crosshairs:{stroke:{width:0}}}}}},{key:"area",value:function(){return{stroke:{width:4},fill:{type:"gradient",gradient:{inverseColors:!1,shade:"light",type:"vertical",opacityFrom:.65,opacityTo:.5,stops:[0,100,100]}},markers:{size:0,hover:{sizeOffset:6}},tooltip:{followCursor:!1}}}},{key:"brush",value:function(t){return p.extend(t,{chart:{toolbar:{autoSelected:"selection",show:!1},zoom:{enabled:!1}},dataLabels:{enabled:!1},stroke:{width:1},tooltip:{enabled:!1},xaxis:{tooltip:{enabled:!1}}})}},{key:"stacked100",value:function(t){t.dataLabels=t.dataLabels||{},t.dataLabels.formatter=t.dataLabels.formatter||void 0;var e=t.dataLabels.formatter;return t.yaxis.forEach((function(e,i){t.yaxis[i].min=0,t.yaxis[i].max=100})),"bar"===t.chart.type&&(t.dataLabels.formatter=e||function(t){return"number"==typeof t&&t?t.toFixed(0)+"%":t}),t}},{key:"convertCatToNumeric",value:function(t){return t.xaxis.convertedCatToNumeric=!0,t}},{key:"convertCatToNumericXaxis",value:function(t,e,i){t.xaxis.type="numeric",t.xaxis.labels=t.xaxis.labels||{},t.xaxis.labels.formatter=t.xaxis.labels.formatter||function(t){return p.isNumber(t)?Math.floor(t):t};var a=t.xaxis.labels.formatter,s=t.xaxis.categories&&t.xaxis.categories.length?t.xaxis.categories:t.labels;return i&&i.length&&(s=i.map((function(t){return Array.isArray(t)?t:String(t)}))),s&&s.length&&(t.xaxis.labels.formatter=function(t){return p.isNumber(t)?a(s[Math.floor(t)-1]):a(t)}),t.xaxis.categories=[],t.labels=[],t.xaxis.tickAmount=t.xaxis.tickAmount||"dataPoints",t}},{key:"bubble",value:function(){return{dataLabels:{style:{colors:["#fff"]}},tooltip:{shared:!1,intersect:!0},xaxis:{crosshairs:{width:0}},fill:{type:"solid",gradient:{shade:"light",inverse:!0,shadeIntensity:.55,opacityFrom:.4,opacityTo:.8}}}}},{key:"scatter",value:function(){return{dataLabels:{enabled:!1},tooltip:{shared:!1,intersect:!0},markers:{size:6,strokeWidth:1,hover:{sizeOffset:2}}}}},{key:"heatmap",value:function(){return{chart:{stacked:!1},fill:{opacity:1},dataLabels:{style:{colors:["#fff"]}},stroke:{colors:["#fff"]},tooltip:{followCursor:!0,marker:{show:!1},x:{show:!1}},legend:{position:"top",markers:{shape:"square",size:10,offsetY:2}},grid:{padding:{right:20}}}}},{key:"treemap",value:function(){return{chart:{zoom:{enabled:!1}},dataLabels:{style:{fontSize:14,fontWeight:600,colors:["#fff"]}},stroke:{show:!0,width:2,colors:["#fff"]},legend:{show:!1},fill:{gradient:{stops:[0,100]}},tooltip:{followCursor:!0,x:{show:!1}},grid:{padding:{left:0,right:0}},xaxis:{crosshairs:{show:!1},tooltip:{enabled:!1}}}}},{key:"pie",value:function(){return{chart:{toolbar:{show:!1}},plotOptions:{pie:{donut:{labels:{show:!1}}}},dataLabels:{formatter:function(t){return t.toFixed(1)+"%"},style:{colors:["#fff"]},background:{enabled:!1},dropShadow:{enabled:!0}},stroke:{colors:["#fff"]},fill:{opacity:1,gradient:{shade:"light",stops:[0,100]}},tooltip:{theme:"dark",fillSeriesColor:!0},legend:{position:"right"}}}},{key:"donut",value:function(){return{chart:{toolbar:{show:!1}},dataLabels:{formatter:function(t){return t.toFixed(1)+"%"},style:{colors:["#fff"]},background:{enabled:!1},dropShadow:{enabled:!0}},stroke:{colors:["#fff"]},fill:{opacity:1,gradient:{shade:"light",shadeIntensity:.35,stops:[80,100],opacityFrom:1,opacityTo:1}},tooltip:{theme:"dark",fillSeriesColor:!0},legend:{position:"right"}}}},{key:"polarArea",value:function(){return this.opts.yaxis[0].tickAmount=this.opts.yaxis[0].tickAmount?this.opts.yaxis[0].tickAmount:6,{chart:{toolbar:{show:!1}},dataLabels:{formatter:function(t){return t.toFixed(1)+"%"},enabled:!1},stroke:{show:!0,width:2},fill:{opacity:.7},tooltip:{theme:"dark",fillSeriesColor:!0},legend:{position:"right"}}}},{key:"radar",value:function(){return this.opts.yaxis[0].labels.offsetY=this.opts.yaxis[0].labels.offsetY?this.opts.yaxis[0].labels.offsetY:6,{dataLabels:{enabled:!1,style:{fontSize:"11px"}},stroke:{width:2},markers:{size:3,strokeWidth:1,strokeOpacity:1},fill:{opacity:.2},tooltip:{shared:!1,intersect:!0,followCursor:!0},grid:{show:!1},xaxis:{labels:{formatter:function(t){return t},style:{colors:["#a8a8a8"],fontSize:"11px"}},tooltip:{enabled:!1},crosshairs:{show:!1}}}}},{key:"radialBar",value:function(){return{chart:{animations:{dynamicAnimation:{enabled:!0,speed:800}},toolbar:{show:!1}},fill:{gradient:{shade:"dark",shadeIntensity:.4,inverseColors:!1,type:"diagonal2",opacityFrom:1,opacityTo:1,stops:[70,98,100]}},legend:{show:!1,position:"right"},tooltip:{enabled:!1,fillSeriesColor:!0}}}},{key:"_getBoxTooltip",value:function(t,e,i,a,s){var r=t.globals.seriesCandleO[e][i],o=t.globals.seriesCandleH[e][i],n=t.globals.seriesCandleM[e][i],l=t.globals.seriesCandleL[e][i],h=t.globals.seriesCandleC[e][i];return t.config.series[e].type&&t.config.series[e].type!==s?'
\n '.concat(t.config.series[e].name?t.config.series[e].name:"series-"+(e+1),": ").concat(t.globals.series[e][i],"\n
"):'
')+"
".concat(a[0],': ')+r+"
"+"
".concat(a[1],': ')+o+"
"+(n?"
".concat(a[2],': ')+n+"
":"")+"
".concat(a[3],': ')+l+"
"+"
".concat(a[4],': ')+h+"
"}}]),t}(),H=function(){function t(e){a(this,t),this.opts=e}return r(t,[{key:"init",value:function(t){var e=t.responsiveOverride,a=this.opts,s=new S,r=new R(a);this.chartType=a.chart.type,"histogram"===this.chartType&&(a.chart.type="bar",a=p.extend({plotOptions:{bar:{columnWidth:"99.99%"}}},a)),a=this.extendYAxis(a),a=this.extendAnnotations(a);var o=s.init(),n={};if(a&&"object"===i(a)){var l={};l=-1!==["line","area","bar","candlestick","boxPlot","rangeBar","histogram","bubble","scatter","heatmap","treemap","pie","polarArea","donut","radar","radialBar"].indexOf(a.chart.type)?r[a.chart.type]():r.line(),a.chart.brush&&a.chart.brush.enabled&&(l=r.brush(l)),a.chart.stacked&&"100%"===a.chart.stackType&&(a=r.stacked100(a)),this.checkForDarkTheme(window.Apex),this.checkForDarkTheme(a),a.xaxis=a.xaxis||window.Apex.xaxis||{},e||(a.xaxis.convertedCatToNumeric=!1),((a=this.checkForCatToNumericXAxis(this.chartType,l,a)).chart.sparkline&&a.chart.sparkline.enabled||window.Apex.chart&&window.Apex.chart.sparkline&&window.Apex.chart.sparkline.enabled)&&(l=r.sparkline(l)),n=p.extend(o,l)}var h=p.extend(n,window.Apex);return o=p.extend(h,a),o=this.handleUserInputErrors(o)}},{key:"checkForCatToNumericXAxis",value:function(t,e,i){var a=new R(i),s=("bar"===t||"boxPlot"===t)&&i.plotOptions&&i.plotOptions.bar&&i.plotOptions.bar.horizontal,r="pie"===t||"polarArea"===t||"donut"===t||"radar"===t||"radialBar"===t||"heatmap"===t,o="datetime"!==i.xaxis.type&&"numeric"!==i.xaxis.type,n=i.xaxis.tickPlacement?i.xaxis.tickPlacement:e.xaxis&&e.xaxis.tickPlacement;return s||r||!o||"between"===n||(i=a.convertCatToNumeric(i)),i}},{key:"extendYAxis",value:function(t,e){var i=new S;(void 0===t.yaxis||!t.yaxis||Array.isArray(t.yaxis)&&0===t.yaxis.length)&&(t.yaxis={}),t.yaxis.constructor!==Array&&window.Apex.yaxis&&window.Apex.yaxis.constructor!==Array&&(t.yaxis=p.extend(t.yaxis,window.Apex.yaxis)),t.yaxis.constructor!==Array?t.yaxis=[p.extend(i.yAxis,t.yaxis)]:t.yaxis=p.extendArray(t.yaxis,i.yAxis);var a=!1;t.yaxis.forEach((function(t){t.logarithmic&&(a=!0)}));var s=t.series;return e&&!s&&(s=e.config.series),a&&s.length!==t.yaxis.length&&s.length&&(t.yaxis=s.map((function(e,a){if(e.name||(s[a].name="series-".concat(a+1)),t.yaxis[a])return t.yaxis[a].seriesName=s[a].name,t.yaxis[a];var r=p.extend(i.yAxis,t.yaxis[0]);return r.show=!1,r}))),a&&s.length>1&&s.length!==t.yaxis.length&&console.warn("A multi-series logarithmic chart should have equal number of series and y-axes. Please make sure to equalize both."),t}},{key:"extendAnnotations",value:function(t){return void 0===t.annotations&&(t.annotations={},t.annotations.yaxis=[],t.annotations.xaxis=[],t.annotations.points=[]),t=this.extendYAxisAnnotations(t),t=this.extendXAxisAnnotations(t),t=this.extendPointAnnotations(t)}},{key:"extendYAxisAnnotations",value:function(t){var e=new S;return t.annotations.yaxis=p.extendArray(void 0!==t.annotations.yaxis?t.annotations.yaxis:[],e.yAxisAnnotation),t}},{key:"extendXAxisAnnotations",value:function(t){var e=new S;return t.annotations.xaxis=p.extendArray(void 0!==t.annotations.xaxis?t.annotations.xaxis:[],e.xAxisAnnotation),t}},{key:"extendPointAnnotations",value:function(t){var e=new S;return t.annotations.points=p.extendArray(void 0!==t.annotations.points?t.annotations.points:[],e.pointAnnotation),t}},{key:"checkForDarkTheme",value:function(t){t.theme&&"dark"===t.theme.mode&&(t.tooltip||(t.tooltip={}),"light"!==t.tooltip.theme&&(t.tooltip.theme="dark"),t.chart.foreColor||(t.chart.foreColor="#f6f7f8"),t.chart.background||(t.chart.background="#424242"),t.theme.palette||(t.theme.palette="palette4"))}},{key:"handleUserInputErrors",value:function(t){var e=t;if(e.tooltip.shared&&e.tooltip.intersect)throw new Error("tooltip.shared cannot be enabled when tooltip.intersect is true. Turn off any other option by setting it to false.");if("bar"===e.chart.type&&e.plotOptions.bar.horizontal){if(e.yaxis.length>1)throw new Error("Multiple Y Axis for bars are not supported. Switch to column chart by setting plotOptions.bar.horizontal=false");e.yaxis[0].reversed&&(e.yaxis[0].opposite=!0),e.xaxis.tooltip.enabled=!1,e.yaxis[0].tooltip.enabled=!1,e.chart.zoom.enabled=!1}return"bar"!==e.chart.type&&"rangeBar"!==e.chart.type||e.tooltip.shared&&"barWidth"===e.xaxis.crosshairs.width&&e.series.length>1&&(e.xaxis.crosshairs.width="tickWidth"),"candlestick"!==e.chart.type&&"boxPlot"!==e.chart.type||e.yaxis[0].reversed&&(console.warn("Reversed y-axis in ".concat(e.chart.type," chart is not supported.")),e.yaxis[0].reversed=!1),Array.isArray(e.stroke.width)&&"line"!==e.chart.type&&"area"!==e.chart.type&&(console.warn("stroke.width option accepts array only for line and area charts. Reverted back to Number"),e.stroke.width=e.stroke.width[0]),e}}]),t}(),D=function(){function t(){a(this,t)}return r(t,[{key:"initGlobalVars",value:function(t){t.series=[],t.seriesCandleO=[],t.seriesCandleH=[],t.seriesCandleM=[],t.seriesCandleL=[],t.seriesCandleC=[],t.seriesRangeStart=[],t.seriesRangeEnd=[],t.seriesRangeBar=[],t.seriesPercent=[],t.seriesGoals=[],t.seriesX=[],t.seriesZ=[],t.seriesNames=[],t.seriesTotals=[],t.seriesLog=[],t.seriesColors=[],t.stackedSeriesTotals=[],t.seriesXvalues=[],t.seriesYvalues=[],t.labels=[],t.categoryLabels=[],t.timescaleLabels=[],t.noLabelsProvided=!1,t.resizeTimer=null,t.selectionResizeTimer=null,t.delayedElements=[],t.pointsArray=[],t.dataLabelsRects=[],t.isXNumeric=!1,t.xaxisLabelsCount=0,t.skipLastTimelinelabel=!1,t.skipFirstTimelinelabel=!1,t.isDataXYZ=!1,t.isMultiLineX=!1,t.isMultipleYAxis=!1,t.maxY=-Number.MAX_VALUE,t.minY=Number.MIN_VALUE,t.minYArr=[],t.maxYArr=[],t.maxX=-Number.MAX_VALUE,t.minX=Number.MAX_VALUE,t.initialMaxX=-Number.MAX_VALUE,t.initialMinX=Number.MAX_VALUE,t.maxDate=0,t.minDate=Number.MAX_VALUE,t.minZ=Number.MAX_VALUE,t.maxZ=-Number.MAX_VALUE,t.minXDiff=Number.MAX_VALUE,t.yAxisScale=[],t.xAxisScale=null,t.xAxisTicksPositions=[],t.yLabelsCoords=[],t.yTitleCoords=[],t.barPadForNumericAxis=0,t.padHorizontal=0,t.xRange=0,t.yRange=[],t.zRange=0,t.dataPoints=0,t.xTickAmount=0}},{key:"globalVars",value:function(t){return{chartID:null,cuid:null,events:{beforeMount:[],mounted:[],updated:[],clicked:[],selection:[],dataPointSelection:[],zoomed:[],scrolled:[]},colors:[],clientX:null,clientY:null,fill:{colors:[]},stroke:{colors:[]},dataLabels:{style:{colors:[]}},radarPolygons:{fill:{colors:[]}},markers:{colors:[],size:t.markers.size,largestSize:0},animationEnded:!1,isTouchDevice:"ontouchstart"in window||navigator.msMaxTouchPoints,isDirty:!1,isExecCalled:!1,initialConfig:null,initialSeries:[],lastXAxis:[],lastYAxis:[],columnSeries:null,labels:[],timescaleLabels:[],noLabelsProvided:!1,allSeriesCollapsed:!1,collapsedSeries:[],collapsedSeriesIndices:[],ancillaryCollapsedSeries:[],ancillaryCollapsedSeriesIndices:[],risingSeries:[],dataFormatXNumeric:!1,capturedSeriesIndex:-1,capturedDataPointIndex:-1,selectedDataPoints:[],goldenPadding:35,invalidLogScale:!1,ignoreYAxisIndexes:[],yAxisSameScaleIndices:[],maxValsInArrayIndex:0,radialSize:0,selection:void 0,zoomEnabled:"zoom"===t.chart.toolbar.autoSelected&&t.chart.toolbar.tools.zoom&&t.chart.zoom.enabled,panEnabled:"pan"===t.chart.toolbar.autoSelected&&t.chart.toolbar.tools.pan,selectionEnabled:"selection"===t.chart.toolbar.autoSelected&&t.chart.toolbar.tools.selection,yaxis:null,mousedown:!1,lastClientPosition:{},visibleXRange:void 0,yValueDecimal:0,total:0,SVGNS:"http://www.w3.org/2000/svg",svgWidth:0,svgHeight:0,noData:!1,locale:{},dom:{},memory:{methodsToExec:[]},shouldAnimate:!0,skipLastTimelinelabel:!1,skipFirstTimelinelabel:!1,delayedElements:[],axisCharts:!0,isDataXYZ:!1,resized:!1,resizeTimer:null,comboCharts:!1,dataChanged:!1,previousPaths:[],allSeriesHasEqualX:!0,pointsArray:[],dataLabelsRects:[],lastDrawnDataLabelsIndexes:[],hasNullValues:!1,easing:null,zoomed:!1,gridWidth:0,gridHeight:0,rotateXLabels:!1,defaultLabels:!1,xLabelFormatter:void 0,yLabelFormatters:[],xaxisTooltipFormatter:void 0,ttKeyFormatter:void 0,ttVal:void 0,ttZFormatter:void 0,LINE_HEIGHT_RATIO:1.618,xAxisLabelsHeight:0,xAxisLabelsWidth:0,yAxisLabelsWidth:0,scaleX:1,scaleY:1,translateX:0,translateY:0,translateYAxisX:[],yAxisWidths:[],translateXAxisY:0,translateXAxisX:0,tooltip:null}}},{key:"init",value:function(t){var e=this.globalVars(t);return this.initGlobalVars(e),e.initialConfig=p.extend({},t),e.initialSeries=p.clone(t.series),e.lastXAxis=p.clone(e.initialConfig.xaxis),e.lastYAxis=p.clone(e.initialConfig.yaxis),e}}]),t}(),N=function(){function t(e){a(this,t),this.opts=e}return r(t,[{key:"init",value:function(){var t=new H(this.opts).init({responsiveOverride:!1});return{config:t,globals:(new D).init(t)}}}]),t}(),O=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.twoDSeries=[],this.threeDSeries=[],this.twoDSeriesX=[],this.seriesGoals=[],this.coreUtils=new y(this.ctx)}return r(t,[{key:"isMultiFormat",value:function(){return this.isFormatXY()||this.isFormat2DArray()}},{key:"isFormatXY",value:function(){var t=this.w.config.series.slice(),e=new z(this.ctx);if(this.activeSeriesIndex=e.getActiveConfigSeriesIndex(),void 0!==t[this.activeSeriesIndex].data&&t[this.activeSeriesIndex].data.length>0&&null!==t[this.activeSeriesIndex].data[0]&&void 0!==t[this.activeSeriesIndex].data[0].x&&null!==t[this.activeSeriesIndex].data[0])return!0}},{key:"isFormat2DArray",value:function(){var t=this.w.config.series.slice(),e=new z(this.ctx);if(this.activeSeriesIndex=e.getActiveConfigSeriesIndex(),void 0!==t[this.activeSeriesIndex].data&&t[this.activeSeriesIndex].data.length>0&&void 0!==t[this.activeSeriesIndex].data[0]&&null!==t[this.activeSeriesIndex].data[0]&&t[this.activeSeriesIndex].data[0].constructor===Array)return!0}},{key:"handleFormat2DArray",value:function(t,e){for(var i=this.w.config,a=this.w.globals,s="boxPlot"===i.chart.type||"boxPlot"===i.series[e].type,r=0;r=5?this.twoDSeries.push(p.parseNumber(t[e].data[r][4])):this.twoDSeries.push(p.parseNumber(t[e].data[r][1])),a.dataFormatXNumeric=!0),"datetime"===i.xaxis.type){var o=new Date(t[e].data[r][0]);o=new Date(o).getTime(),this.twoDSeriesX.push(o)}else this.twoDSeriesX.push(t[e].data[r][0]);for(var n=0;n-1&&(r=this.activeSeriesIndex);for(var o=0;o1&&void 0!==arguments[1]?arguments[1]:this.ctx,a=this.w.config,s=this.w.globals,r=new Y(i),o=a.labels.length>0?a.labels.slice():a.xaxis.categories.slice();s.isRangeBar="rangeBar"===a.chart.type&&s.isBarHorizontal;for(var n=function(){for(var t=0;t0&&(this.twoDSeriesX=o,s.seriesX.push(this.twoDSeriesX))),s.labels.push(this.twoDSeriesX);var h=t[l].data.map((function(t){return p.parseNumber(t)}));s.series.push(h)}s.seriesZ.push(this.threeDSeries),void 0!==t[l].name?s.seriesNames.push(t[l].name):s.seriesNames.push("series-"+parseInt(l+1,10)),void 0!==t[l].color?s.seriesColors.push(t[l].color):s.seriesColors.push(void 0)}return this.w}},{key:"parseDataNonAxisCharts",value:function(t){var e=this.w.globals,i=this.w.config;e.series=t.slice(),e.seriesNames=i.labels.slice();for(var a=0;a0)i.labels=e.xaxis.categories;else if(e.labels.length>0)i.labels=e.labels.slice();else if(this.fallbackToCategory){if(i.labels=i.labels[0],i.seriesRangeBar.length&&(i.seriesRangeBar.map((function(t){t.forEach((function(t){i.labels.indexOf(t.x)<0&&t.x&&i.labels.push(t.x)}))})),i.labels=i.labels.filter((function(t,e,i){return i.indexOf(t)===e}))),e.xaxis.convertedCatToNumeric)new R(e).convertCatToNumericXaxis(e,this.ctx,i.seriesX[0]),this._generateExternalLabels(t)}else this._generateExternalLabels(t)}},{key:"_generateExternalLabels",value:function(t){var e=this.w.globals,i=this.w.config,a=[];if(e.axisCharts){if(e.series.length>0)for(var s=0;s0&&i<100?t.toFixed(1):t.toFixed(0)}if(e.globals.isBarHorizontal)if(e.globals.maxY-e.globals.minYArr<4)return t.toFixed(1);return t.toFixed(0)}return t},"function"==typeof e.config.tooltip.x.formatter?e.globals.ttKeyFormatter=e.config.tooltip.x.formatter:e.globals.ttKeyFormatter=e.globals.xLabelFormatter,"function"==typeof e.config.xaxis.tooltip.formatter&&(e.globals.xaxisTooltipFormatter=e.config.xaxis.tooltip.formatter),(Array.isArray(e.config.tooltip.y)||void 0!==e.config.tooltip.y.formatter)&&(e.globals.ttVal=e.config.tooltip.y),void 0!==e.config.tooltip.z.formatter&&(e.globals.ttZFormatter=e.config.tooltip.z.formatter),void 0!==e.config.legend.formatter&&(e.globals.legendFormatter=e.config.legend.formatter),e.config.yaxis.forEach((function(i,a){void 0!==i.labels.formatter?e.globals.yLabelFormatters[a]=i.labels.formatter:e.globals.yLabelFormatters[a]=function(s){return e.globals.xyCharts?Array.isArray(s)?s.map((function(e){return t.defaultYFormatter(e,i,a)})):t.defaultYFormatter(s,i,a):s}})),e.globals}},{key:"heatmapLabelFormatters",value:function(){var t=this.w;if("heatmap"===t.config.chart.type){t.globals.yAxisScale[0].result=t.globals.seriesNames.slice();var e=t.globals.seriesNames.reduce((function(t,e){return t.length>e.length?t:e}),0);t.globals.yAxisScale[0].niceMax=e,t.globals.yAxisScale[0].niceMin=e}}}]),t}(),B=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"getLabel",value:function(t,e,i,a){var s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"12px",o=this.w,n=void 0===t[a]?"":t[a],l=n,h=o.globals.xLabelFormatter,c=o.config.xaxis.labels.formatter,d=!1,g=new W(this.ctx),u=n;l=g.xLabelFormat(h,n,u,{i:a,dateFormatter:new Y(this.ctx).formatDate,w:o}),void 0!==c&&(l=c(n,t[a],{i:a,dateFormatter:new Y(this.ctx).formatDate,w:o}));var p=function(t){var i=null;return e.forEach((function(t){"month"===t.unit?i="year":"day"===t.unit?i="month":"hour"===t.unit?i="day":"minute"===t.unit&&(i="hour")})),i===t};e.length>0?(d=p(e[a].unit),i=e[a].position,l=e[a].value):"datetime"===o.config.xaxis.type&&void 0===c&&(l=""),void 0===l&&(l=""),l=Array.isArray(l)?l:l.toString();var f=new b(this.ctx),x={};x=o.globals.rotateXLabels?f.getTextRects(l,parseInt(r,10),null,"rotate(".concat(o.config.xaxis.labels.rotate," 0 0)"),!1):f.getTextRects(l,parseInt(r,10));var v=!o.config.xaxis.labels.showDuplicates&&this.ctx.timeScale;return!Array.isArray(l)&&(0===l.indexOf("NaN")||0===l.toLowerCase().indexOf("invalid")||l.toLowerCase().indexOf("infinity")>=0||s.indexOf(l)>=0&&v)&&(l=""),{x:i,text:l,textRect:x,isBold:d}}},{key:"checkLabelBasedOnTickamount",value:function(t,e,i){var a=this.w,s=a.config.xaxis.tickAmount;return"dataPoints"===s&&(s=Math.round(a.globals.gridWidth/120)),s>i||t%Math.round(i/(s+1))==0||(e.text=""),e}},{key:"checkForOverflowingLabels",value:function(t,e,i,a,s){var r=this.w;if(0===t&&r.globals.skipFirstTimelinelabel&&(e.text=""),t===i-1&&r.globals.skipLastTimelinelabel&&(e.text=""),r.config.xaxis.labels.hideOverlappingLabels&&a.length>0){var o=s[s.length-1];e.x0){!0===n.config.yaxis[s].opposite&&(t+=a.width);for(var c=e;c>=0;c--){var d=h+e/10+n.config.yaxis[s].labels.offsetY-1;n.globals.isBarHorizontal&&(d=r*c),"heatmap"===n.config.chart.type&&(d+=r/2);var g=l.drawLine(t+i.offsetX-a.width+a.offsetX,d+a.offsetY,t+i.offsetX+a.offsetX,d+a.offsetY,a.color);o.add(g),h+=r}}}}]),t}(),V=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"scaleSvgNode",value:function(t,e){var i=parseFloat(t.getAttributeNS(null,"width")),a=parseFloat(t.getAttributeNS(null,"height"));t.setAttributeNS(null,"width",i*e),t.setAttributeNS(null,"height",a*e),t.setAttributeNS(null,"viewBox","0 0 "+i+" "+a)}},{key:"fixSvgStringForIe11",value:function(t){if(!p.isIE11())return t.replace(/ /g," ");var e=0,i=t.replace(/xmlns="http:\/\/www.w3.org\/2000\/svg"/g,(function(t){return 2===++e?'xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev"':t}));return i=(i=i.replace(/xmlns:NS\d+=""/g,"")).replace(/NS\d+:(\w+:\w+=")/g,"$1")}},{key:"getSvgString",value:function(t){var e=this.w.globals.dom.Paper.svg();if(1!==t){var i=this.w.globals.dom.Paper.node.cloneNode(!0);this.scaleSvgNode(i,t),e=(new XMLSerializer).serializeToString(i)}return this.fixSvgStringForIe11(e)}},{key:"cleanup",value:function(){var t=this.w,e=t.globals.dom.baseEl.getElementsByClassName("apexcharts-xcrosshairs"),i=t.globals.dom.baseEl.getElementsByClassName("apexcharts-ycrosshairs"),a=t.globals.dom.baseEl.querySelectorAll(".apexcharts-zoom-rect, .apexcharts-selection-rect");Array.prototype.forEach.call(a,(function(t){t.setAttribute("width",0)})),e&&e[0]&&(e[0].setAttribute("x",-500),e[0].setAttribute("x1",-500),e[0].setAttribute("x2",-500)),i&&i[0]&&(i[0].setAttribute("y",-100),i[0].setAttribute("y1",-100),i[0].setAttribute("y2",-100))}},{key:"svgUrl",value:function(){this.cleanup();var t=this.getSvgString(),e=new Blob([t],{type:"image/svg+xml;charset=utf-8"});return URL.createObjectURL(e)}},{key:"dataURI",value:function(t){var e=this;return new Promise((function(i){var a=e.w,s=t?t.scale||t.width/a.globals.svgWidth:1;e.cleanup();var r=document.createElement("canvas");r.width=a.globals.svgWidth*s,r.height=parseInt(a.globals.dom.elWrap.style.height,10)*s;var o="transparent"===a.config.chart.background?"#fff":a.config.chart.background,n=r.getContext("2d");n.fillStyle=o,n.fillRect(0,0,r.width*s,r.height*s);var l=e.getSvgString(s);if(window.canvg&&p.isIE11()){var h=window.canvg.Canvg.fromString(n,l,{ignoreClear:!0,ignoreDimensions:!0});h.start();var c=r.msToBlob();h.stop(),i({blob:c})}else{var d="data:image/svg+xml,"+encodeURIComponent(l),g=new Image;g.crossOrigin="anonymous",g.onload=function(){if(n.drawImage(g,0,0),r.msToBlob){var t=r.msToBlob();i({blob:t})}else{var e=r.toDataURL("image/png");i({imgURI:e})}},g.src=d}}))}},{key:"exportToSVG",value:function(){this.triggerDownload(this.svgUrl(),this.w.config.chart.toolbar.export.svg.filename,".svg")}},{key:"exportToPng",value:function(){var t=this;this.dataURI().then((function(e){var i=e.imgURI,a=e.blob;a?navigator.msSaveOrOpenBlob(a,t.w.globals.chartID+".png"):t.triggerDownload(i,t.w.config.chart.toolbar.export.png.filename,".png")}))}},{key:"exportToCSV",value:function(t){var e=this,i=t.series,a=t.columnDelimiter,s=t.lineDelimiter,r=void 0===s?"\n":s,o=this.w,n=[],l=[],h="",c=new O(this.ctx),d=new B(this.ctx),g=function(t){var i="";if(o.globals.axisCharts){if("category"===o.config.xaxis.type||o.config.xaxis.convertedCatToNumeric)if(o.globals.isBarHorizontal){var s=o.globals.yLabelFormatters[0],r=new z(e.ctx).getActiveConfigSeriesIndex();i=s(o.globals.labels[t],{seriesIndex:r,dataPointIndex:t,w:o})}else i=d.getLabel(o.globals.labels,o.globals.timescaleLabels,0,t).text;"datetime"===o.config.xaxis.type&&(o.config.xaxis.categories.length?i=o.config.xaxis.categories[t]:o.config.labels.length&&(i=o.config.labels[t]))}else i=o.config.labels[t];return Array.isArray(i)&&(i=i.join(" ")),p.isNumber(i)?i:i.split(a).join("")};n.push(o.config.chart.toolbar.export.csv.headerCategory),i.map((function(t,e){var i=t.name?t.name:"series-".concat(e);o.globals.axisCharts&&n.push(i.split(a).join("")?i.split(a).join(""):"series-".concat(e))})),o.globals.axisCharts||(n.push(o.config.chart.toolbar.export.csv.headerValue),l.push(n.join(a))),i.map((function(t,e){o.globals.axisCharts?function(t,e){if(n.length&&0===e&&l.push(n.join(a)),t.data&&t.data.length)for(var s=0;s=10?o.config.chart.toolbar.export.csv.dateFormatter(r):p.isNumber(r)?r:r.split(a).join("")));for(var h=0;h0&&!i.globals.isBarHorizontal&&(this.xaxisLabels=i.globals.timescaleLabels.slice()),i.config.xaxis.overwriteCategories&&(this.xaxisLabels=i.config.xaxis.overwriteCategories),this.drawnLabels=[],this.drawnLabelsRects=[],"top"===i.config.xaxis.position?this.offY=0:this.offY=i.globals.gridHeight+1,this.offY=this.offY+i.config.xaxis.axisBorder.offsetY,this.isCategoryBarHorizontal="bar"===i.config.chart.type&&i.config.plotOptions.bar.horizontal,this.xaxisFontSize=i.config.xaxis.labels.style.fontSize,this.xaxisFontFamily=i.config.xaxis.labels.style.fontFamily,this.xaxisForeColors=i.config.xaxis.labels.style.colors,this.xaxisBorderWidth=i.config.xaxis.axisBorder.width,this.isCategoryBarHorizontal&&(this.xaxisBorderWidth=i.config.yaxis[0].axisBorder.width.toString()),this.xaxisBorderWidth.indexOf("%")>-1?this.xaxisBorderWidth=i.globals.gridWidth*parseInt(this.xaxisBorderWidth,10)/100:this.xaxisBorderWidth=parseInt(this.xaxisBorderWidth,10),this.xaxisBorderHeight=i.config.xaxis.axisBorder.height,this.yaxis=i.config.yaxis[0]}return r(t,[{key:"drawXaxis",value:function(){var t,e=this,i=this.w,a=new b(this.ctx),s=a.group({class:"apexcharts-xaxis",transform:"translate(".concat(i.config.xaxis.offsetX,", ").concat(i.config.xaxis.offsetY,")")}),r=a.group({class:"apexcharts-xaxis-texts-g",transform:"translate(".concat(i.globals.translateXAxisX,", ").concat(i.globals.translateXAxisY,")")});s.add(r);for(var o=i.globals.padHorizontal,n=[],l=0;l1?h-1:h;t=i.globals.gridWidth/c,o=o+t/2+i.config.xaxis.labels.offsetX}else t=i.globals.gridWidth/n.length,o=o+t+i.config.xaxis.labels.offsetX;for(var d=function(s){var l=o-t/2+i.config.xaxis.labels.offsetX;0===s&&1===h&&t/2===o&&1===i.globals.dataPoints&&(l=i.globals.gridWidth/2);var c=e.axesUtils.getLabel(n,i.globals.timescaleLabels,l,s,e.drawnLabels,e.xaxisFontSize),d=28;i.globals.rotateXLabels&&(d=22);if((c=void 0!==i.config.xaxis.tickAmount&&"dataPoints"!==i.config.xaxis.tickAmount&&"datetime"!==i.config.xaxis.type?e.axesUtils.checkLabelBasedOnTickamount(s,c,h):e.axesUtils.checkForOverflowingLabels(s,c,h,e.drawnLabels,e.drawnLabelsRects)).text&&i.globals.xaxisLabelsCount++,i.config.xaxis.labels.show){var g=a.drawText({x:c.x,y:e.offY+i.config.xaxis.labels.offsetY+d-("top"===i.config.xaxis.position?i.globals.xAxisHeight+i.config.xaxis.axisTicks.height-2:0),text:c.text,textAnchor:"middle",fontWeight:c.isBold?600:i.config.xaxis.labels.style.fontWeight,fontSize:e.xaxisFontSize,fontFamily:e.xaxisFontFamily,foreColor:Array.isArray(e.xaxisForeColors)?i.config.xaxis.convertedCatToNumeric?e.xaxisForeColors[i.globals.minX+s-1]:e.xaxisForeColors[s]:e.xaxisForeColors,isPlainText:!1,cssClass:"apexcharts-xaxis-label "+i.config.xaxis.labels.style.cssClass});r.add(g);var u=document.createElementNS(i.globals.SVGNS,"title");u.textContent=Array.isArray(c.text)?c.text.join(" "):c.text,g.node.appendChild(u),""!==c.text&&(e.drawnLabels.push(c.text),e.drawnLabelsRects.push(c))}o+=t},g=0;g<=h-1;g++)d(g);if(void 0!==i.config.xaxis.title.text){var u=a.group({class:"apexcharts-xaxis-title"}),p=a.drawText({x:i.globals.gridWidth/2+i.config.xaxis.title.offsetX,y:this.offY+parseFloat(this.xaxisFontSize)+i.globals.xAxisLabelsHeight+i.config.xaxis.title.offsetY,text:i.config.xaxis.title.text,textAnchor:"middle",fontSize:i.config.xaxis.title.style.fontSize,fontFamily:i.config.xaxis.title.style.fontFamily,fontWeight:i.config.xaxis.title.style.fontWeight,foreColor:i.config.xaxis.title.style.color,cssClass:"apexcharts-xaxis-title-text "+i.config.xaxis.title.style.cssClass});u.add(p),s.add(u)}if(i.config.xaxis.axisBorder.show){var f=i.globals.barPadForNumericAxis,x=a.drawLine(i.globals.padHorizontal+i.config.xaxis.axisBorder.offsetX-f,this.offY,this.xaxisBorderWidth+f,this.offY,i.config.xaxis.axisBorder.color,0,this.xaxisBorderHeight);s.add(x)}return s}},{key:"drawXaxisInversed",value:function(t){var e,i,a=this,s=this.w,r=new b(this.ctx),o=s.config.yaxis[0].opposite?s.globals.translateYAxisX[t]:0,n=r.group({class:"apexcharts-yaxis apexcharts-xaxis-inversed",rel:t}),l=r.group({class:"apexcharts-yaxis-texts-g apexcharts-xaxis-inversed-texts-g",transform:"translate("+o+", 0)"});n.add(l);var h=[];if(s.config.yaxis[t].show)for(var c=0;ci.globals.gridWidth)){var s=this.offY+i.config.xaxis.axisTicks.offsetY,r=s+i.config.xaxis.axisTicks.height;if("top"===i.config.xaxis.position&&(r=s-i.config.xaxis.axisTicks.height),i.config.xaxis.axisTicks.show){var o=new b(this.ctx).drawLine(t+i.config.xaxis.axisTicks.offsetX,s+i.config.xaxis.offsetY,a+i.config.xaxis.axisTicks.offsetX,r+i.config.xaxis.offsetY,i.config.xaxis.axisTicks.color);e.add(o),o.node.classList.add("apexcharts-xaxis-tick")}}}},{key:"getXAxisTicksPositions",value:function(){var t=this.w,e=[],i=this.xaxisLabels.length,a=t.globals.padHorizontal;if(t.globals.timescaleLabels.length>0)for(var s=0;s0){var h=s[s.length-1].getBBox(),c=s[0].getBBox();h.x<-20&&s[s.length-1].parentNode.removeChild(s[s.length-1]),c.x+c.width>t.globals.gridWidth&&!t.globals.isBarHorizontal&&s[0].parentNode.removeChild(s[0]);for(var d=0;d0&&(this.xaxisLabels=i.globals.timescaleLabels.slice())}return r(t,[{key:"drawGridArea",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=this.w,i=new b(this.ctx);null===t&&(t=i.group({class:"apexcharts-grid"}));var a=i.drawLine(e.globals.padHorizontal,1,e.globals.padHorizontal,e.globals.gridHeight,"transparent"),s=i.drawLine(e.globals.padHorizontal,e.globals.gridHeight,e.globals.gridWidth,e.globals.gridHeight,"transparent");return t.add(s),t.add(a),t}},{key:"drawGrid",value:function(){var t=null;return this.w.globals.axisCharts&&(t=this.renderGrid(),this.drawGridArea(t.el)),t}},{key:"createGridMask",value:function(){var t=this.w,e=t.globals,i=new b(this.ctx),a=Array.isArray(t.config.stroke.width)?0:t.config.stroke.width;if(Array.isArray(t.config.stroke.width)){var s=0;t.config.stroke.width.forEach((function(t){s=Math.max(s,t)})),a=s}e.dom.elGridRectMask=document.createElementNS(e.SVGNS,"clipPath"),e.dom.elGridRectMask.setAttribute("id","gridRectMask".concat(e.cuid)),e.dom.elGridRectMarkerMask=document.createElementNS(e.SVGNS,"clipPath"),e.dom.elGridRectMarkerMask.setAttribute("id","gridRectMarkerMask".concat(e.cuid)),e.dom.elForecastMask=document.createElementNS(e.SVGNS,"clipPath"),e.dom.elForecastMask.setAttribute("id","forecastMask".concat(e.cuid)),e.dom.elNonForecastMask=document.createElementNS(e.SVGNS,"clipPath"),e.dom.elNonForecastMask.setAttribute("id","nonForecastMask".concat(e.cuid));var r=t.config.chart.type,o=0,n=0;("bar"===r||"rangeBar"===r||"candlestick"===r||"boxPlot"===r||t.globals.comboBarCount>0)&&t.globals.isXNumeric&&!t.globals.isBarHorizontal&&(o=t.config.grid.padding.left,n=t.config.grid.padding.right,e.barPadForNumericAxis>o&&(o=e.barPadForNumericAxis,n=e.barPadForNumericAxis)),e.dom.elGridRect=i.drawRect(-a/2-o-2,-a/2,e.gridWidth+a+n+o+4,e.gridHeight+a,0,"#fff"),new y(this).getLargestMarkerSize();var l=t.globals.markers.largestSize+1;e.dom.elGridRectMarker=i.drawRect(2*-l,2*-l,e.gridWidth+4*l,e.gridHeight+4*l,0,"#fff"),e.dom.elGridRectMask.appendChild(e.dom.elGridRect.node),e.dom.elGridRectMarkerMask.appendChild(e.dom.elGridRectMarker.node);var h=e.dom.baseEl.querySelector("defs");h.appendChild(e.dom.elGridRectMask),h.appendChild(e.dom.elForecastMask),h.appendChild(e.dom.elNonForecastMask),h.appendChild(e.dom.elGridRectMarkerMask)}},{key:"_drawGridLines",value:function(t){var e=t.i,i=t.x1,a=t.y1,s=t.x2,r=t.y2,o=t.xCount,n=t.parent,l=this.w;0===e&&l.globals.skipFirstTimelinelabel||e===o-1&&l.globals.skipLastTimelinelabel&&!l.config.xaxis.labels.formatter||"radar"===l.config.chart.type||(l.config.grid.xaxis.lines.show&&this._drawGridLine({x1:i,y1:a,x2:s,y2:r,parent:n}),new G(this.ctx).drawXaxisTicks(i,this.elg))}},{key:"_drawGridLine",value:function(t){var e=t.x1,i=t.y1,a=t.x2,s=t.y2,r=t.parent,o=this.w,n=r.node.classList.contains("apexcharts-gridlines-horizontal"),l=o.config.grid.strokeDashArray,h=o.globals.barPadForNumericAxis,c=new b(this).drawLine(e-(n?h:0),i,a+(n?h:0),s,o.config.grid.borderColor,l);c.node.classList.add("apexcharts-gridline"),r.add(c)}},{key:"_drawGridBandRect",value:function(t){var e=t.c,i=t.x1,a=t.y1,s=t.x2,r=t.y2,o=t.type,n=this.w,l=new b(this.ctx),h=n.globals.barPadForNumericAxis;if("column"!==o||"datetime"!==n.config.xaxis.type){var c=n.config.grid[o].colors[e],d=l.drawRect(i-("row"===o?h:0),a,s+("row"===o?2*h:0),r,0,c,n.config.grid[o].opacity);this.elg.add(d),d.attr("clip-path","url(#gridRectMask".concat(n.globals.cuid,")")),d.node.classList.add("apexcharts-grid-".concat(o))}}},{key:"_drawXYLines",value:function(t){var e=this,i=t.xCount,a=t.tickAmount,s=this.w;if(s.config.grid.xaxis.lines.show||s.config.xaxis.axisTicks.show){var r,o=s.globals.padHorizontal,n=s.globals.gridHeight;s.globals.timescaleLabels.length?function(t){for(var a=t.xC,s=t.x1,r=t.y1,o=t.x2,n=t.y2,l=0;l2));s++);return!t.globals.isBarHorizontal||this.isRangeBar?(i=this.xaxisLabels.length,this.isRangeBar&&(a=t.globals.labels.length,t.config.xaxis.tickAmount&&t.config.xaxis.labels.formatter&&(i=t.config.xaxis.tickAmount)),this._drawXYLines({xCount:i,tickAmount:a})):(i=a,a=t.globals.xTickAmount,this._drawInvertedXYLines({xCount:i,tickAmount:a})),this.drawGridBands(i,a),{el:this.elg,xAxisTickWidth:t.globals.gridWidth/i}}},{key:"drawGridBands",value:function(t,e){var i=this.w;if(void 0!==i.config.grid.row.colors&&i.config.grid.row.colors.length>0)for(var a=0,s=i.globals.gridHeight/e,r=i.globals.gridWidth,o=0,n=0;o=i.config.grid.row.colors.length&&(n=0),this._drawGridBandRect({c:n,x1:0,y1:a,x2:r,y2:s,type:"row"}),a+=i.globals.gridHeight/e;if(void 0!==i.config.grid.column.colors&&i.config.grid.column.colors.length>0)for(var l=i.globals.isBarHorizontal||"category"!==i.config.xaxis.type&&!i.config.xaxis.convertedCatToNumeric?t:t-1,h=i.globals.padHorizontal,c=i.globals.padHorizontal+i.globals.gridWidth/l,d=i.globals.gridHeight,g=0,u=0;g=i.config.grid.column.colors.length&&(u=0),this._drawGridBandRect({c:u,x1:h,y1:0,x2:c,y2:d,type:"column"}),h+=i.globals.gridWidth/l}}]),t}(),j=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"niceScale",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:10,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,s=arguments.length>4?arguments[4]:void 0,r=this.w,o=Math.abs(e-t);if("dataPoints"===(i=this._adjustTicksForSmallRange(i,a,o))&&(i=r.globals.dataPoints-1),t===Number.MIN_VALUE&&0===e||!p.isNumber(t)&&!p.isNumber(e)||t===Number.MIN_VALUE&&e===-Number.MAX_VALUE){t=0,e=i;var n=this.linearScale(t,e,i);return n}t>e?(console.warn("axis.min cannot be greater than axis.max"),e=t+.1):t===e&&(t=0===t?0:t-.5,e=0===e?2:e+.5);var l=[];o<1&&s&&("candlestick"===r.config.chart.type||"candlestick"===r.config.series[a].type||"boxPlot"===r.config.chart.type||"boxPlot"===r.config.series[a].type||r.globals.isRangeData)&&(e*=1.01);var h=i+1;h<2?h=2:h>2&&(h-=2);var c=o/h,d=Math.floor(p.log10(c)),g=Math.pow(10,d),u=Math.round(c/g);u<1&&(u=1);var f=u*g,x=f*Math.floor(t/f),b=f*Math.ceil(e/f),v=x;if(s&&o>2){for(;l.push(v),!((v+=f)>b););return{result:l,niceMin:l[0],niceMax:l[l.length-1]}}var m=t;(l=[]).push(m);for(var y=Math.abs(e-t)/i,w=0;w<=i;w++)m+=y,l.push(m);return l[l.length-2]>=e&&l.pop(),{result:l,niceMin:l[0],niceMax:l[l.length-1]}}},{key:"linearScale",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:10,a=arguments.length>3?arguments[3]:void 0,s=Math.abs(e-t);"dataPoints"===(i=this._adjustTicksForSmallRange(i,a,s))&&(i=this.w.globals.dataPoints-1);var r=s/i;i===Number.MAX_VALUE&&(i=10,r=1);for(var o=[],n=t;i>=0;)o.push(n),n+=r,i-=1;return{result:o,niceMin:o[0],niceMax:o[o.length-1]}}},{key:"logarithmicScale",value:function(t,e){for(var i=[],a=Math.ceil(Math.log(t)/Math.log(e))+1,s=0;s5)a.allSeriesCollapsed=!1,a.yAxisScale[t]=this.logarithmicScale(i,r.logBase);else if(i!==-Number.MAX_VALUE&&p.isNumber(i))if(a.allSeriesCollapsed=!1,void 0===r.min&&void 0===r.max||r.forceNiceScale){var n=void 0===s.yaxis[t].max&&void 0===s.yaxis[t].min||s.yaxis[t].forceNiceScale;a.yAxisScale[t]=this.niceScale(e,i,r.tickAmount?r.tickAmount:o<5&&o>1?o+1:5,t,n)}else a.yAxisScale[t]=this.linearScale(e,i,r.tickAmount,t);else a.yAxisScale[t]=this.linearScale(0,5,5)}},{key:"setXScale",value:function(t,e){var i=this.w,a=i.globals,s=i.config.xaxis,r=Math.abs(e-t);return e!==-Number.MAX_VALUE&&p.isNumber(e)?a.xAxisScale=this.linearScale(t,e,s.tickAmount?s.tickAmount:r<5&&r>1?r+1:5,0):a.xAxisScale=this.linearScale(0,5,5),a.xAxisScale}},{key:"setMultipleYScales",value:function(){var t=this,e=this.w.globals,i=this.w.config,a=e.minYArr.concat([]),s=e.maxYArr.concat([]),r=[];i.yaxis.forEach((function(e,o){var n=o;i.series.forEach((function(t,i){t.name===e.seriesName&&(n=i,o!==i?r.push({index:i,similarIndex:o,alreadyExists:!0}):r.push({index:i}))}));var l=a[n],h=s[n];t.setYScaleForIndex(o,l,h)})),this.sameScaleInMultipleAxes(a,s,r)}},{key:"sameScaleInMultipleAxes",value:function(t,e,i){var a=this,s=this.w.config,r=this.w.globals,o=[];i.forEach((function(t){t.alreadyExists&&(void 0===o[t.index]&&(o[t.index]=[]),o[t.index].push(t.index),o[t.index].push(t.similarIndex))})),r.yAxisSameScaleIndices=o,o.forEach((function(t,e){o.forEach((function(i,a){var s,r;e!==a&&(s=t,r=i,s.filter((function(t){return-1!==r.indexOf(t)}))).length>0&&(o[e]=o[e].concat(o[a]))}))}));var n=o.map((function(t){return t.filter((function(e,i){return t.indexOf(e)===i}))})).map((function(t){return t.sort()}));o=o.filter((function(t){return!!t}));var l=n.slice(),h=l.map((function(t){return JSON.stringify(t)}));l=l.filter((function(t,e){return h.indexOf(JSON.stringify(t))===e}));var c=[],d=[];t.forEach((function(t,i){l.forEach((function(a,s){a.indexOf(i)>-1&&(void 0===c[s]&&(c[s]=[],d[s]=[]),c[s].push({key:i,value:t}),d[s].push({key:i,value:e[i]}))}))}));var g=Array.apply(null,Array(l.length)).map(Number.prototype.valueOf,Number.MIN_VALUE),u=Array.apply(null,Array(l.length)).map(Number.prototype.valueOf,-Number.MAX_VALUE);c.forEach((function(t,e){t.forEach((function(t,i){g[e]=Math.min(t.value,g[e])}))})),d.forEach((function(t,e){t.forEach((function(t,i){u[e]=Math.max(t.value,u[e])}))})),t.forEach((function(t,e){d.forEach((function(t,i){var o=g[i],n=u[i];s.chart.stacked&&(n=0,t.forEach((function(t,e){t.value!==-Number.MAX_VALUE&&(n+=t.value),o!==Number.MIN_VALUE&&(o+=c[i][e].value)}))),t.forEach((function(i,l){t[l].key===e&&(void 0!==s.yaxis[e].min&&(o="function"==typeof s.yaxis[e].min?s.yaxis[e].min(r.minY):s.yaxis[e].min),void 0!==s.yaxis[e].max&&(n="function"==typeof s.yaxis[e].max?s.yaxis[e].max(r.maxY):s.yaxis[e].max),a.setYScaleForIndex(e,o,n))}))}))}))}},{key:"autoScaleY",value:function(t,e,i){t||(t=this);var a=t.w;if(a.globals.isMultipleYAxis||a.globals.collapsedSeries.length)return console.warn("autoScaleYaxis is not supported in a multi-yaxis chart."),e;var s=a.globals.seriesX[0],r=a.config.chart.stacked;return e.forEach((function(t,o){for(var n=0,l=0;l=i.xaxis.min){n=l;break}var h,c,d=a.globals.minYArr[o],g=a.globals.maxYArr[o],u=a.globals.stackedSeriesTotals;a.globals.series.forEach((function(o,l){var p=o[n];r?(p=u[n],h=c=p,u.forEach((function(t,e){s[e]<=i.xaxis.max&&s[e]>=i.xaxis.min&&(t>c&&null!==t&&(c=t),o[e]=i.xaxis.min){var r=t,o=t;a.globals.series.forEach((function(i,a){null!==t&&(r=Math.min(i[e],r),o=Math.max(i[e],o))})),o>c&&null!==o&&(c=o),rd&&(h=d),e.length>1?(e[l].min=void 0===t.min?h:t.min,e[l].max=void 0===t.max?c:t.max):(e[0].min=void 0===t.min?h:t.min,e[0].max=void 0===t.max?c:t.max)}))})),e}}]),t}(),U=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.scales=new j(e)}return r(t,[{key:"init",value:function(){this.setYRange(),this.setXRange(),this.setZRange()}},{key:"getMinYMaxY",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:-Number.MAX_VALUE,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,s=this.w.config,r=this.w.globals,o=-Number.MAX_VALUE,n=Number.MIN_VALUE;null===a&&(a=t+1);var l=r.series,h=l,c=l;"candlestick"===s.chart.type?(h=r.seriesCandleL,c=r.seriesCandleH):"boxPlot"===s.chart.type?(h=r.seriesCandleO,c=r.seriesCandleC):r.isRangeData&&(h=r.seriesRangeStart,c=r.seriesRangeEnd);for(var d=t;dh[d][g]&&h[d][g]<0&&(n=h[d][g])):r.hasNullValues=!0}}return"rangeBar"===s.chart.type&&r.seriesRangeStart.length&&r.isBarHorizontal&&(n=e),"bar"===s.chart.type&&(n<0&&o<0&&(o=0),n===Number.MIN_VALUE&&(n=0)),{minY:n,maxY:o,lowestY:e,highestY:i}}},{key:"setYRange",value:function(){var t=this.w.globals,e=this.w.config;t.maxY=-Number.MAX_VALUE,t.minY=Number.MIN_VALUE;var i=Number.MAX_VALUE;if(t.isMultipleYAxis)for(var a=0;a=0&&i<=10||void 0!==e.yaxis[0].min||void 0!==e.yaxis[0].max)&&(o=0),t.minY=i-5*o/100,i>0&&t.minY<0&&(t.minY=0),t.maxY=t.maxY+5*o/100}if(e.yaxis.forEach((function(e,i){void 0!==e.max&&("number"==typeof e.max?t.maxYArr[i]=e.max:"function"==typeof e.max&&(t.maxYArr[i]=e.max(t.isMultipleYAxis?t.maxYArr[i]:t.maxY)),t.maxY=t.maxYArr[i]),void 0!==e.min&&("number"==typeof e.min?t.minYArr[i]=e.min:"function"==typeof e.min&&(t.minYArr[i]=e.min(t.isMultipleYAxis?t.minYArr[i]===Number.MIN_VALUE?0:t.minYArr[i]:t.minY)),t.minY=t.minYArr[i])})),t.isBarHorizontal){["min","max"].forEach((function(i){void 0!==e.xaxis[i]&&"number"==typeof e.xaxis[i]&&("min"===i?t.minY=e.xaxis[i]:t.maxY=e.xaxis[i])}))}return t.isMultipleYAxis?(this.scales.setMultipleYScales(),t.minY=i,t.yAxisScale.forEach((function(e,i){t.minYArr[i]=e.niceMin,t.maxYArr[i]=e.niceMax}))):(this.scales.setYScaleForIndex(0,t.minY,t.maxY),t.minY=t.yAxisScale[0].niceMin,t.maxY=t.yAxisScale[0].niceMax,t.minYArr[0]=t.yAxisScale[0].niceMin,t.maxYArr[0]=t.yAxisScale[0].niceMax),{minY:t.minY,maxY:t.maxY,minYArr:t.minYArr,maxYArr:t.maxYArr,yAxisScale:t.yAxisScale}}},{key:"setXRange",value:function(){var t=this.w.globals,e=this.w.config,i="numeric"===e.xaxis.type||"datetime"===e.xaxis.type||"category"===e.xaxis.type&&!t.noLabelsProvided||t.noLabelsProvided||t.isXNumeric;if(t.isXNumeric&&function(){for(var e=0;et.dataPoints&&0!==t.dataPoints&&(a=t.dataPoints-1)):"dataPoints"===e.xaxis.tickAmount?(t.series.length>1&&(a=t.series[t.maxValsInArrayIndex].length-1),t.isXNumeric&&(a=t.maxX-t.minX-1)):a=e.xaxis.tickAmount,t.xTickAmount=a,void 0!==e.xaxis.max&&"number"==typeof e.xaxis.max&&(t.maxX=e.xaxis.max),void 0!==e.xaxis.min&&"number"==typeof e.xaxis.min&&(t.minX=e.xaxis.min),void 0!==e.xaxis.range&&(t.minX=t.maxX-e.xaxis.range),t.minX!==Number.MAX_VALUE&&t.maxX!==-Number.MAX_VALUE)if(e.xaxis.convertedCatToNumeric&&!t.dataFormatXNumeric){for(var s=[],r=t.minX-1;r0&&(t.xAxisScale=this.scales.linearScale(1,t.labels.length,a-1),t.seriesX=t.labels.slice());i&&(t.labels=t.xAxisScale.result.slice())}return t.isBarHorizontal&&t.labels.length&&(t.xTickAmount=t.labels.length),this._handleSingleDataPoint(),this._getMinXDiff(),{minX:t.minX,maxX:t.maxX}}},{key:"setZRange",value:function(){var t=this.w.globals;if(t.isDataXYZ)for(var e=0;e0){var s=e-a[i-1];s>0&&(t.minXDiff=Math.min(s,t.minXDiff))}})),1===t.dataPoints&&t.minXDiff===Number.MAX_VALUE&&(t.minXDiff=.5)}))}},{key:"_setStackedMinMax",value:function(){var t=this.w.globals,e=[],i=[];if(t.series.length)for(var a=0;a0?s=s+parseFloat(t.series[o][a])+1e-4:r+=parseFloat(t.series[o][a])),o===t.series.length-1&&(e.push(s),i.push(r));for(var n=0;n=0;v--)x(v);if(void 0!==i.config.yaxis[t].title.text){var m=a.group({class:"apexcharts-yaxis-title"}),y=0;i.config.yaxis[t].opposite&&(y=i.globals.translateYAxisX[t]);var w=a.drawText({x:y,y:i.globals.gridHeight/2+i.globals.translateY+i.config.yaxis[t].title.offsetY,text:i.config.yaxis[t].title.text,textAnchor:"end",foreColor:i.config.yaxis[t].title.style.color,fontSize:i.config.yaxis[t].title.style.fontSize,fontWeight:i.config.yaxis[t].title.style.fontWeight,fontFamily:i.config.yaxis[t].title.style.fontFamily,cssClass:"apexcharts-yaxis-title-text "+i.config.yaxis[t].title.style.cssClass});m.add(w),l.add(m)}var k=i.config.yaxis[t].axisBorder,A=31+k.offsetX;if(i.config.yaxis[t].opposite&&(A=-31-k.offsetX),k.show){var S=a.drawLine(A,i.globals.translateY+k.offsetY-2,A,i.globals.gridHeight+i.globals.translateY+k.offsetY+2,k.color,0,k.width);l.add(S)}return i.config.yaxis[t].axisTicks.show&&this.axesUtils.drawYAxisTicks(A,c,k,i.config.yaxis[t].axisTicks,t,d,l),l}},{key:"drawYaxisInversed",value:function(t){var e=this.w,i=new b(this.ctx),a=i.group({class:"apexcharts-xaxis apexcharts-yaxis-inversed"}),s=i.group({class:"apexcharts-xaxis-texts-g",transform:"translate(".concat(e.globals.translateXAxisX,", ").concat(e.globals.translateXAxisY,")")});a.add(s);var r=e.globals.yAxisScale[t].result.length-1,o=e.globals.gridWidth/r+.1,n=o+e.config.xaxis.labels.offsetX,l=e.globals.xLabelFormatter,h=e.globals.yAxisScale[t].result.slice(),c=e.globals.timescaleLabels;c.length>0&&(this.xaxisLabels=c.slice(),r=(h=c.slice()).length),h=this.axesUtils.checkForReversedLabels(t,h);var d=c.length;if(e.config.xaxis.labels.show)for(var g=d?0:r;d?g=0;d?g++:g--){var u=h[g];u=l(u,g,e);var p=e.globals.gridWidth+e.globals.padHorizontal-(n-o+e.config.xaxis.labels.offsetX);if(c.length){var f=this.axesUtils.getLabel(h,c,p,g,this.drawnLabels,this.xaxisFontSize);p=f.x,u=f.text,this.drawnLabels.push(f.text),0===g&&e.globals.skipFirstTimelinelabel&&(u=""),g===h.length-1&&e.globals.skipLastTimelinelabel&&(u="")}var x=i.drawText({x:p,y:this.xAxisoffX+e.config.xaxis.labels.offsetY+30-("top"===e.config.xaxis.position?e.globals.xAxisHeight+e.config.xaxis.axisTicks.height-2:0),text:u,textAnchor:"middle",foreColor:Array.isArray(this.xaxisForeColors)?this.xaxisForeColors[t]:this.xaxisForeColors,fontSize:this.xaxisFontSize,fontFamily:this.xaxisFontFamily,fontWeight:e.config.xaxis.labels.style.fontWeight,isPlainText:!1,cssClass:"apexcharts-xaxis-label "+e.config.xaxis.labels.style.cssClass});s.add(x),x.tspan(u);var v=document.createElementNS(e.globals.SVGNS,"title");v.textContent=u,x.node.appendChild(v),n+=o}return this.inversedYAxisTitleText(a),this.inversedYAxisBorder(a),a}},{key:"inversedYAxisBorder",value:function(t){var e=this.w,i=new b(this.ctx),a=e.config.xaxis.axisBorder;if(a.show){var s=0;"bar"===e.config.chart.type&&e.globals.isXNumeric&&(s-=15);var r=i.drawLine(e.globals.padHorizontal+s+a.offsetX,this.xAxisoffX,e.globals.gridWidth,this.xAxisoffX,a.color,0,a.height);t.add(r)}}},{key:"inversedYAxisTitleText",value:function(t){var e=this.w,i=new b(this.ctx);if(void 0!==e.config.xaxis.title.text){var a=i.group({class:"apexcharts-xaxis-title apexcharts-yaxis-title-inversed"}),s=i.drawText({x:e.globals.gridWidth/2+e.config.xaxis.title.offsetX,y:this.xAxisoffX+parseFloat(this.xaxisFontSize)+parseFloat(e.config.xaxis.title.style.fontSize)+e.config.xaxis.title.offsetY+20,text:e.config.xaxis.title.text,textAnchor:"middle",fontSize:e.config.xaxis.title.style.fontSize,fontFamily:e.config.xaxis.title.style.fontFamily,fontWeight:e.config.xaxis.title.style.fontWeight,foreColor:e.config.xaxis.title.style.color,cssClass:"apexcharts-xaxis-title-text "+e.config.xaxis.title.style.cssClass});a.add(s),t.add(a)}}},{key:"yAxisTitleRotate",value:function(t,e){var i=this.w,a=new b(this.ctx),s={width:0,height:0},r={width:0,height:0},o=i.globals.dom.baseEl.querySelector(" .apexcharts-yaxis[rel='".concat(t,"'] .apexcharts-yaxis-texts-g"));null!==o&&(s=o.getBoundingClientRect());var n=i.globals.dom.baseEl.querySelector(".apexcharts-yaxis[rel='".concat(t,"'] .apexcharts-yaxis-title text"));if(null!==n&&(r=n.getBoundingClientRect()),null!==n){var l=this.xPaddingForYAxisTitle(t,s,r,e);n.setAttribute("x",l.xPos-(e?10:0))}if(null!==n){var h=a.rotateAroundCenter(n);n.setAttribute("transform","rotate(".concat(e?-1*i.config.yaxis[t].title.rotate:i.config.yaxis[t].title.rotate," ").concat(h.x," ").concat(h.y,")"))}}},{key:"xPaddingForYAxisTitle",value:function(t,e,i,a){var s=this.w,r=0,o=0,n=10;return void 0===s.config.yaxis[t].title.text||t<0?{xPos:o,padd:0}:(a?(o=e.width+s.config.yaxis[t].title.offsetX+i.width/2+n/2,0===(r+=1)&&(o-=n/2)):(o=-1*e.width+s.config.yaxis[t].title.offsetX+n/2+i.width/2,s.globals.isBarHorizontal&&(n=25,o=-1*e.width-s.config.yaxis[t].title.offsetX-n)),{xPos:o,padd:n})}},{key:"setYAxisXPosition",value:function(t,e){var i=this.w,a=0,s=0,r=18,o=1;i.config.yaxis.length>1&&(this.multipleYs=!0),i.config.yaxis.map((function(n,l){var h=i.globals.ignoreYAxisIndexes.indexOf(l)>-1||!n.show||n.floating||0===t[l].width,c=t[l].width+e[l].width;n.opposite?i.globals.isBarHorizontal?(s=i.globals.gridWidth+i.globals.translateX-1,i.globals.translateYAxisX[l]=s-n.labels.offsetX):(s=i.globals.gridWidth+i.globals.translateX+o,h||(o=o+c+20),i.globals.translateYAxisX[l]=s-n.labels.offsetX+20):(a=i.globals.translateX-r,h||(r=r+c+20),i.globals.translateYAxisX[l]=a+n.labels.offsetX)}))}},{key:"setYAxisTextAlignments",value:function(){var t=this.w,e=t.globals.dom.baseEl.getElementsByClassName("apexcharts-yaxis");(e=p.listToArray(e)).forEach((function(e,i){var a=t.config.yaxis[i];if(a&&void 0!==a.labels.align){var s=t.globals.dom.baseEl.querySelector(".apexcharts-yaxis[rel='".concat(i,"'] .apexcharts-yaxis-texts-g")),r=t.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxis[rel='".concat(i,"'] .apexcharts-yaxis-label"));r=p.listToArray(r);var o=s.getBoundingClientRect();"left"===a.labels.align?(r.forEach((function(t,e){t.setAttribute("text-anchor","start")})),a.opposite||s.setAttribute("transform","translate(-".concat(o.width,", 0)"))):"center"===a.labels.align?(r.forEach((function(t,e){t.setAttribute("text-anchor","middle")})),s.setAttribute("transform","translate(".concat(o.width/2*(a.opposite?1:-1),", 0)"))):"right"===a.labels.align&&(r.forEach((function(t,e){t.setAttribute("text-anchor","end")})),a.opposite&&s.setAttribute("transform","translate(".concat(o.width,", 0)")))}}))}}]),t}(),Z=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.documentEvent=p.bind(this.documentEvent,this)}return r(t,[{key:"addEventListener",value:function(t,e){var i=this.w;i.globals.events.hasOwnProperty(t)?i.globals.events[t].push(e):i.globals.events[t]=[e]}},{key:"removeEventListener",value:function(t,e){var i=this.w;if(i.globals.events.hasOwnProperty(t)){var a=i.globals.events[t].indexOf(e);-1!==a&&i.globals.events[t].splice(a,1)}}},{key:"fireEvent",value:function(t,e){var i=this.w;if(i.globals.events.hasOwnProperty(t)){e&&e.length||(e=[]);for(var a=i.globals.events[t],s=a.length,r=0;r0&&(e=this.w.config.chart.locales.concat(window.Apex.chart.locales));var i=e.filter((function(e){return e.name===t}))[0];if(!i)throw new Error("Wrong locale name provided. Please make sure you set the correct locale name in options");var a=p.extend(A,i);this.w.globals.locale=a.options}}]),t}(),J=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"drawAxis",value:function(t,e){var i,a,s=this.w.globals,r=this.w.config,o=new G(this.ctx),n=new q(this.ctx);s.axisCharts&&"radar"!==t&&(s.isBarHorizontal?(a=n.drawYaxisInversed(0),i=o.drawXaxisInversed(0),s.dom.elGraphical.add(i),s.dom.elGraphical.add(a)):(i=o.drawXaxis(),s.dom.elGraphical.add(i),r.yaxis.map((function(t,e){-1===s.ignoreYAxisIndexes.indexOf(e)&&(a=n.drawYaxis(e),s.dom.Paper.add(a))}))))}}]),t}(),Q=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"drawXCrosshairs",value:function(){var t=this.w,e=new b(this.ctx),i=new x(this.ctx),a=t.config.xaxis.crosshairs.fill.gradient,s=t.config.xaxis.crosshairs.dropShadow,r=t.config.xaxis.crosshairs.fill.type,o=a.colorFrom,n=a.colorTo,l=a.opacityFrom,h=a.opacityTo,c=a.stops,d=s.enabled,g=s.left,u=s.top,f=s.blur,v=s.color,m=s.opacity,y=t.config.xaxis.crosshairs.fill.color;if(t.config.xaxis.crosshairs.show){"gradient"===r&&(y=e.drawGradient("vertical",o,n,l,h,null,c,null));var w=e.drawRect();1===t.config.xaxis.crosshairs.width&&(w=e.drawLine());var k=t.globals.gridHeight;(!p.isNumber(k)||k<0)&&(k=0);var A=t.config.xaxis.crosshairs.width;(!p.isNumber(A)||A<0)&&(A=0),w.attr({class:"apexcharts-xcrosshairs",x:0,y:0,y2:k,width:A,height:k,fill:y,filter:"none","fill-opacity":t.config.xaxis.crosshairs.opacity,stroke:t.config.xaxis.crosshairs.stroke.color,"stroke-width":t.config.xaxis.crosshairs.stroke.width,"stroke-dasharray":t.config.xaxis.crosshairs.stroke.dashArray}),d&&(w=i.dropShadow(w,{left:g,top:u,blur:f,color:v,opacity:m})),t.globals.dom.elGraphical.add(w)}}},{key:"drawYCrosshairs",value:function(){var t=this.w,e=new b(this.ctx),i=t.config.yaxis[0].crosshairs,a=t.globals.barPadForNumericAxis;if(t.config.yaxis[0].crosshairs.show){var s=e.drawLine(-a,0,t.globals.gridWidth+a,0,i.stroke.color,i.stroke.dashArray,i.stroke.width);s.attr({class:"apexcharts-ycrosshairs"}),t.globals.dom.elGraphical.add(s)}var r=e.drawLine(-a,0,t.globals.gridWidth+a,0,i.stroke.color,0,0);r.attr({class:"apexcharts-ycrosshairs-hidden"}),t.globals.dom.elGraphical.add(r)}}]),t}(),K=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"checkResponsiveConfig",value:function(t){var e=this,i=this.w,a=i.config;if(0!==a.responsive.length){var s=a.responsive.slice();s.sort((function(t,e){return t.breakpoint>e.breakpoint?1:e.breakpoint>t.breakpoint?-1:0})).reverse();var r=new H({}),o=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=s[0].breakpoint,o=window.innerWidth>0?window.innerWidth:screen.width;if(o>a){var n=y.extendArrayProps(r,i.globals.initialConfig,i);t=p.extend(n,t),t=p.extend(i.config,t),e.overrideResponsiveOptions(t)}else for(var l=0;l0&&"function"==typeof e.config.colors[0]&&(e.globals.colors=e.config.series.map((function(i,a){var s=e.config.colors[a];return s||(s=e.config.colors[0]),"function"==typeof s?(t.isColorFn=!0,s({value:e.globals.axisCharts?e.globals.series[a][0]?e.globals.series[a][0]:0:e.globals.series[a],seriesIndex:a,dataPointIndex:a,w:e})):s})))),e.globals.seriesColors.map((function(t,i){t&&(e.globals.colors[i]=t)})),e.config.theme.monochrome.enabled){var a=[],s=e.globals.series.length;(this.isBarDistributed||this.isHeatmapDistributed)&&(s=e.globals.series[0].length*e.globals.series.length);for(var r=e.config.theme.monochrome.color,o=1/(s/e.config.theme.monochrome.shadeIntensity),n=e.config.theme.monochrome.shadeTo,l=0,h=0;h2&&void 0!==arguments[2]?arguments[2]:null,a=this.w,s=e||a.globals.series.length;if(null===i&&(i=this.isBarDistributed||this.isHeatmapDistributed||"heatmap"===a.config.chart.type&&a.config.plotOptions.heatmap.colorScale.inverse),i&&a.globals.series.length&&(s=a.globals.series[a.globals.maxValsInArrayIndex].length*a.globals.series.length),t.lengtht.globals.svgWidth&&(this.dCtx.lgRect.width=t.globals.svgWidth/1.5),this.dCtx.lgRect}},{key:"getLargestStringFromMultiArr",value:function(t,e){var i=t;if(this.w.globals.isMultiLineX){var a=e.map((function(t,e){return Array.isArray(t)?t.length:1})),s=Math.max.apply(Math,g(a));i=e[a.indexOf(s)]}return i}}]),t}(),at=function(){function t(e){a(this,t),this.w=e.w,this.dCtx=e}return r(t,[{key:"getxAxisLabelsCoords",value:function(){var t,e=this.w,i=e.globals.labels.slice();if(e.config.xaxis.convertedCatToNumeric&&0===i.length&&(i=e.globals.categoryLabels),e.globals.timescaleLabels.length>0){var a=this.getxAxisTimeScaleLabelsCoords();t={width:a.width,height:a.height},e.globals.rotateXLabels=!1}else{this.dCtx.lgWidthForSideLegends="left"!==e.config.legend.position&&"right"!==e.config.legend.position||e.config.legend.floating?0:this.dCtx.lgRect.width;var s=e.globals.xLabelFormatter,r=p.getLargestStringFromArr(i),o=this.dCtx.dimHelpers.getLargestStringFromMultiArr(r,i);e.globals.isBarHorizontal&&(o=r=e.globals.yAxisScale[0].result.reduce((function(t,e){return t.length>e.length?t:e}),0));var n=new W(this.dCtx.ctx),l=r;r=n.xLabelFormat(s,r,l,{i:void 0,dateFormatter:new Y(this.dCtx.ctx).formatDate,w:e}),o=n.xLabelFormat(s,o,l,{i:void 0,dateFormatter:new Y(this.dCtx.ctx).formatDate,w:e}),(e.config.xaxis.convertedCatToNumeric&&void 0===r||""===String(r).trim())&&(o=r="1");var h=new b(this.dCtx.ctx),c=h.getTextRects(r,e.config.xaxis.labels.style.fontSize),d=c;if(r!==o&&(d=h.getTextRects(o,e.config.xaxis.labels.style.fontSize)),(t={width:c.width>=d.width?c.width:d.width,height:c.height>=d.height?c.height:d.height}).width*i.length>e.globals.svgWidth-this.dCtx.lgWidthForSideLegends-this.dCtx.yAxisWidth-this.dCtx.gridPad.left-this.dCtx.gridPad.right&&0!==e.config.xaxis.labels.rotate||e.config.xaxis.labels.rotateAlways){if(!e.globals.isBarHorizontal){e.globals.rotateXLabels=!0;var g=function(t){return h.getTextRects(t,e.config.xaxis.labels.style.fontSize,e.config.xaxis.labels.style.fontFamily,"rotate(".concat(e.config.xaxis.labels.rotate," 0 0)"),!1)};c=g(r),r!==o&&(d=g(o)),t.height=(c.height>d.height?c.height:d.height)/1.5,t.width=c.width>d.width?c.width:d.width}}else e.globals.rotateXLabels=!1}return e.config.xaxis.labels.show||(t={width:0,height:0}),{width:t.width,height:t.height}}},{key:"getxAxisTitleCoords",value:function(){var t=this.w,e=0,i=0;if(void 0!==t.config.xaxis.title.text){var a=new b(this.dCtx.ctx).getTextRects(t.config.xaxis.title.text,t.config.xaxis.title.style.fontSize);e=a.width,i=a.height}return{width:e,height:i}}},{key:"getxAxisTimeScaleLabelsCoords",value:function(){var t,e=this.w;this.dCtx.timescaleLabels=e.globals.timescaleLabels.slice();var i=this.dCtx.timescaleLabels.map((function(t){return t.value})),a=i.reduce((function(t,e){return void 0===t?(console.error("You have possibly supplied invalid Date format. Please supply a valid JavaScript Date"),0):t.length>e.length?t:e}),0);return 1.05*(t=new b(this.dCtx.ctx).getTextRects(a,e.config.xaxis.labels.style.fontSize)).width*i.length>e.globals.gridWidth&&0!==e.config.xaxis.labels.rotate&&(e.globals.overlappingXLabels=!0),t}},{key:"additionalPaddingXLabels",value:function(t){var e=this,i=this.w,a=i.globals,s=i.config,r=s.xaxis.type,o=t.width;a.skipLastTimelinelabel=!1,a.skipFirstTimelinelabel=!1;var n=i.config.yaxis[0].opposite&&i.globals.isBarHorizontal,l=function(t,n){(function(t){return-1!==a.collapsedSeriesIndices.indexOf(t)})(n)||function(t){if(e.dCtx.timescaleLabels&&e.dCtx.timescaleLabels.length){var n=e.dCtx.timescaleLabels[0],l=e.dCtx.timescaleLabels[e.dCtx.timescaleLabels.length-1].position+o/1.75-e.dCtx.yAxisWidthRight,h=n.position-o/1.75+e.dCtx.yAxisWidthLeft,c="right"===i.config.legend.position&&e.dCtx.lgRect.width>0?e.dCtx.lgRect.width:0;l>a.svgWidth-a.translateX-c&&(a.skipLastTimelinelabel=!0),h<-(t.show&&!t.floating||"bar"!==s.chart.type&&"candlestick"!==s.chart.type&&"rangeBar"!==s.chart.type&&"boxPlot"!==s.chart.type?10:o/1.75)&&(a.skipFirstTimelinelabel=!0)}else"datetime"===r?e.dCtx.gridPad.rightString(n.niceMax).length?c:n.niceMax,g=h(d,{seriesIndex:o,dataPointIndex:-1,w:e}),u=g;if(void 0!==g&&0!==g.length||(g=d),e.globals.isBarHorizontal){a=0;var f=e.globals.labels.slice();g=h(g=p.getLargestStringFromArr(f),{seriesIndex:o,dataPointIndex:-1,w:e}),u=t.dCtx.dimHelpers.getLargestStringFromMultiArr(g,f)}var x=new b(t.dCtx.ctx),v="rotate(".concat(r.labels.rotate," 0 0)"),m=x.getTextRects(g,r.labels.style.fontSize,r.labels.style.fontFamily,v,!1),y=m;g!==u&&(y=x.getTextRects(u,r.labels.style.fontSize,r.labels.style.fontFamily,v,!1)),i.push({width:(l>y.width||l>m.width?l:y.width>m.width?y.width:m.width)+a,height:y.height>m.height?y.height:m.height})}else i.push({width:0,height:0})})),i}},{key:"getyAxisTitleCoords",value:function(){var t=this,e=this.w,i=[];return e.config.yaxis.map((function(e,a){if(e.show&&void 0!==e.title.text){var s=new b(t.dCtx.ctx),r="rotate(".concat(e.title.rotate," 0 0)"),o=s.getTextRects(e.title.text,e.title.style.fontSize,e.title.style.fontFamily,r,!1);i.push({width:o.width,height:o.height})}else i.push({width:0,height:0})})),i}},{key:"getTotalYAxisWidth",value:function(){var t=this.w,e=0,i=0,a=0,s=t.globals.yAxisScale.length>1?10:0,r=new B(this.dCtx.ctx),o=function(o,n){var l=t.config.yaxis[n].floating,h=0;o.width>0&&!l?(h=o.width+s,function(e){return t.globals.ignoreYAxisIndexes.indexOf(e)>-1}(n)&&(h=h-o.width-s)):h=l||r.isYAxisHidden(n)?0:5,t.config.yaxis[n].opposite?a+=h:i+=h,e+=h};return t.globals.yLabelsCoords.map((function(t,e){o(t,e)})),t.globals.yTitleCoords.map((function(t,e){o(t,e)})),t.globals.isBarHorizontal&&!t.config.yaxis[0].floating&&(e=t.globals.yLabelsCoords[0].width+t.globals.yTitleCoords[0].width+15),this.dCtx.yAxisWidthLeft=i,this.dCtx.yAxisWidthRight=a,e}}]),t}(),rt=function(){function t(e){a(this,t),this.w=e.w,this.dCtx=e}return r(t,[{key:"gridPadForColumnsInNumericAxis",value:function(t){var e=this.w;if(e.globals.noData||e.globals.allSeriesCollapsed)return 0;var i=function(t){return"bar"===t||"rangeBar"===t||"candlestick"===t||"boxPlot"===t},a=e.config.chart.type,s=0,r=i(a)?e.config.series.length:1;if(e.globals.comboBarCount>0&&(r=e.globals.comboBarCount),e.globals.collapsedSeries.forEach((function(t){i(t.type)&&(r-=1)})),e.config.chart.stacked&&(r=1),(i(a)||e.globals.comboBarCount>0)&&e.globals.isXNumeric&&!e.globals.isBarHorizontal&&r>0){var o,n,l=Math.abs(e.globals.initialMaxX-e.globals.initialMinX);l<=3&&(l=e.globals.dataPoints),o=l/t,e.globals.minXDiff&&e.globals.minXDiff/o>0&&(n=e.globals.minXDiff/o),n>t/2&&(n/=2),(s=n/r*parseInt(e.config.plotOptions.bar.columnWidth,10)/100)<1&&(s=1),s=s/(r>1?1:1.5)+5,e.globals.barPadForNumericAxis=s}return s}},{key:"gridPadFortitleSubtitle",value:function(){var t=this,e=this.w,i=e.globals,a=this.dCtx.isSparkline||!e.globals.axisCharts?0:10;["title","subtitle"].forEach((function(i){void 0!==e.config[i].text?a+=e.config[i].margin:a+=t.dCtx.isSparkline||!e.globals.axisCharts?0:5})),!e.config.legend.show||"bottom"!==e.config.legend.position||e.config.legend.floating||e.globals.axisCharts||(a+=10);var s=this.dCtx.dimHelpers.getTitleSubtitleCoords("title"),r=this.dCtx.dimHelpers.getTitleSubtitleCoords("subtitle");i.gridHeight=i.gridHeight-s.height-r.height-a,i.translateY=i.translateY+s.height+r.height+a}},{key:"setGridXPosForDualYAxis",value:function(t,e){var i=this.w,a=new B(this.dCtx.ctx);i.config.yaxis.map((function(s,r){-1!==i.globals.ignoreYAxisIndexes.indexOf(r)||s.floating||a.isYAxisHidden(r)||(s.opposite&&(i.globals.translateX=i.globals.translateX-(e[r].width+t[r].width)-parseInt(i.config.yaxis[r].labels.style.fontSize,10)/1.2-12),i.globals.translateX<2&&(i.globals.translateX=2))}))}}]),t}(),ot=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.lgRect={},this.yAxisWidth=0,this.yAxisWidthLeft=0,this.yAxisWidthRight=0,this.xAxisHeight=0,this.isSparkline=this.w.config.chart.sparkline.enabled,this.dimHelpers=new it(this),this.dimYAxis=new st(this),this.dimXAxis=new at(this),this.dimGrid=new rt(this),this.lgWidthForSideLegends=0,this.gridPad=this.w.config.grid.padding,this.xPadRight=0,this.xPadLeft=0}return r(t,[{key:"plotCoords",value:function(){var t=this.w.globals;this.lgRect=this.dimHelpers.getLegendsRect(),t.axisCharts?this.setDimensionsForAxisCharts():this.setDimensionsForNonAxisCharts(),this.dimGrid.gridPadFortitleSubtitle(),t.gridHeight=t.gridHeight-this.gridPad.top-this.gridPad.bottom,t.gridWidth=t.gridWidth-this.gridPad.left-this.gridPad.right-this.xPadRight-this.xPadLeft;var e=this.dimGrid.gridPadForColumnsInNumericAxis(t.gridWidth);t.gridWidth=t.gridWidth-2*e,t.translateX=t.translateX+this.gridPad.left+this.xPadLeft+(e>0?e+4:0),t.translateY=t.translateY+this.gridPad.top}},{key:"setDimensionsForAxisCharts",value:function(){var t=this,e=this.w,i=e.globals,a=this.dimYAxis.getyAxisLabelsCoords(),s=this.dimYAxis.getyAxisTitleCoords();e.globals.yLabelsCoords=[],e.globals.yTitleCoords=[],e.config.yaxis.map((function(t,i){e.globals.yLabelsCoords.push({width:a[i].width,index:i}),e.globals.yTitleCoords.push({width:s[i].width,index:i})})),this.yAxisWidth=this.dimYAxis.getTotalYAxisWidth();var r=this.dimXAxis.getxAxisLabelsCoords(),o=this.dimXAxis.getxAxisTitleCoords();this.conditionalChecksForAxisCoords(r,o),i.translateXAxisY=e.globals.rotateXLabels?this.xAxisHeight/8:-4,i.translateXAxisX=e.globals.rotateXLabels&&e.globals.isXNumeric&&e.config.xaxis.labels.rotate<=-45?-this.xAxisWidth/4:0,e.globals.isBarHorizontal&&(i.rotateXLabels=!1,i.translateXAxisY=parseInt(e.config.xaxis.labels.style.fontSize,10)/1.5*-1),i.translateXAxisY=i.translateXAxisY+e.config.xaxis.labels.offsetY,i.translateXAxisX=i.translateXAxisX+e.config.xaxis.labels.offsetX;var n=this.yAxisWidth,l=this.xAxisHeight;i.xAxisLabelsHeight=this.xAxisHeight-o.height,i.xAxisLabelsWidth=this.xAxisWidth,i.xAxisHeight=this.xAxisHeight;var h=10;("radar"===e.config.chart.type||this.isSparkline)&&(n=0,l=i.goldenPadding),this.isSparkline&&(this.lgRect={height:0,width:0}),(this.isSparkline||"treemap"===e.config.chart.type)&&(n=0,l=0,h=0),this.isSparkline||this.dimXAxis.additionalPaddingXLabels(r);var c=function(){i.translateX=n,i.gridHeight=i.svgHeight-t.lgRect.height-l-(t.isSparkline||"treemap"===e.config.chart.type?0:e.globals.rotateXLabels?10:15),i.gridWidth=i.svgWidth-n};switch("top"===e.config.xaxis.position&&(h=i.xAxisHeight-e.config.xaxis.axisTicks.height-5),e.config.legend.position){case"bottom":i.translateY=h,c();break;case"top":i.translateY=this.lgRect.height+h,c();break;case"left":i.translateY=h,i.translateX=this.lgRect.width+n,i.gridHeight=i.svgHeight-l-12,i.gridWidth=i.svgWidth-this.lgRect.width-n;break;case"right":i.translateY=h,i.translateX=n,i.gridHeight=i.svgHeight-l-12,i.gridWidth=i.svgWidth-this.lgRect.width-n-5;break;default:throw new Error("Legend position not supported")}this.dimGrid.setGridXPosForDualYAxis(s,a),new q(this.ctx).setYAxisXPosition(a,s)}},{key:"setDimensionsForNonAxisCharts",value:function(){var t=this.w,e=t.globals,i=t.config,a=0;t.config.legend.show&&!t.config.legend.floating&&(a=20);var s="pie"===i.chart.type||"polarArea"===i.chart.type||"donut"===i.chart.type?"pie":"radialBar",r=i.plotOptions[s].offsetY,o=i.plotOptions[s].offsetX;if(!i.legend.show||i.legend.floating)return e.gridHeight=e.svgHeight-i.grid.padding.left+i.grid.padding.right,e.gridWidth=e.gridHeight,e.translateY=r,void(e.translateX=o+(e.svgWidth-e.gridWidth)/2);switch(i.legend.position){case"bottom":e.gridHeight=e.svgHeight-this.lgRect.height-e.goldenPadding,e.gridWidth=e.svgWidth,e.translateY=r-10,e.translateX=o+(e.svgWidth-e.gridWidth)/2;break;case"top":e.gridHeight=e.svgHeight-this.lgRect.height-e.goldenPadding,e.gridWidth=e.svgWidth,e.translateY=this.lgRect.height+r+10,e.translateX=o+(e.svgWidth-e.gridWidth)/2;break;case"left":e.gridWidth=e.svgWidth-this.lgRect.width-a,e.gridHeight="auto"!==i.chart.height?e.svgHeight:e.gridWidth,e.translateY=r,e.translateX=o+this.lgRect.width+a;break;case"right":e.gridWidth=e.svgWidth-this.lgRect.width-a-5,e.gridHeight="auto"!==i.chart.height?e.svgHeight:e.gridWidth,e.translateY=r,e.translateX=o+10;break;default:throw new Error("Legend position not supported")}}},{key:"conditionalChecksForAxisCoords",value:function(t,e){var i=this.w,a=t.height+e.height,s=i.globals.isMultiLineX?1.2:i.globals.LINE_HEIGHT_RATIO,r=i.globals.rotateXLabels?22:10,o=i.globals.rotateXLabels&&"bottom"===i.config.legend.position?10:0;this.xAxisHeight=a*s+r+o,this.xAxisWidth=t.width,this.xAxisHeight-e.height>i.config.xaxis.labels.maxHeight&&(this.xAxisHeight=i.config.xaxis.labels.maxHeight),i.config.xaxis.labels.minHeight&&this.xAxisHeightl&&(this.yAxisWidth=l)}}]),t}(),nt=function(){function t(e){a(this,t),this.w=e.w,this.lgCtx=e}return r(t,[{key:"getLegendStyles",value:function(){var t=document.createElement("style");t.setAttribute("type","text/css");var e=document.createTextNode("\t\n \t\n .apexcharts-legend {\t\n display: flex;\t\n overflow: auto;\t\n padding: 0 10px;\t\n }\t\n .apexcharts-legend.apx-legend-position-bottom, .apexcharts-legend.apx-legend-position-top {\t\n flex-wrap: wrap\t\n }\t\n .apexcharts-legend.apx-legend-position-right, .apexcharts-legend.apx-legend-position-left {\t\n flex-direction: column;\t\n bottom: 0;\t\n }\t\n .apexcharts-legend.apx-legend-position-bottom.apexcharts-align-left, .apexcharts-legend.apx-legend-position-top.apexcharts-align-left, .apexcharts-legend.apx-legend-position-right, .apexcharts-legend.apx-legend-position-left {\t\n justify-content: flex-start;\t\n }\t\n .apexcharts-legend.apx-legend-position-bottom.apexcharts-align-center, .apexcharts-legend.apx-legend-position-top.apexcharts-align-center {\t\n justify-content: center; \t\n }\t\n .apexcharts-legend.apx-legend-position-bottom.apexcharts-align-right, .apexcharts-legend.apx-legend-position-top.apexcharts-align-right {\t\n justify-content: flex-end;\t\n }\t\n .apexcharts-legend-series {\t\n cursor: pointer;\t\n line-height: normal;\t\n }\t\n .apexcharts-legend.apx-legend-position-bottom .apexcharts-legend-series, .apexcharts-legend.apx-legend-position-top .apexcharts-legend-series{\t\n display: flex;\t\n align-items: center;\t\n }\t\n .apexcharts-legend-text {\t\n position: relative;\t\n font-size: 14px;\t\n }\t\n .apexcharts-legend-text *, .apexcharts-legend-marker * {\t\n pointer-events: none;\t\n }\t\n .apexcharts-legend-marker {\t\n position: relative;\t\n display: inline-block;\t\n cursor: pointer;\t\n margin-right: 3px;\t\n border-style: solid;\n }\t\n \t\n .apexcharts-legend.apexcharts-align-right .apexcharts-legend-series, .apexcharts-legend.apexcharts-align-left .apexcharts-legend-series{\t\n display: inline-block;\t\n }\t\n .apexcharts-legend-series.apexcharts-no-click {\t\n cursor: auto;\t\n }\t\n .apexcharts-legend .apexcharts-hidden-zero-series, .apexcharts-legend .apexcharts-hidden-null-series {\t\n display: none !important;\t\n }\t\n .apexcharts-inactive-legend {\t\n opacity: 0.45;\t\n }");return t.appendChild(e),t}},{key:"getLegendBBox",value:function(){var t=this.w.globals.dom.baseEl.querySelector(".apexcharts-legend").getBoundingClientRect(),e=t.width;return{clwh:t.height,clww:e}}},{key:"appendToForeignObject",value:function(){var t=this.w.globals;t.dom.elLegendForeign=document.createElementNS(t.SVGNS,"foreignObject");var e=t.dom.elLegendForeign;e.setAttribute("x",0),e.setAttribute("y",0),e.setAttribute("width",t.svgWidth),e.setAttribute("height",t.svgHeight),t.dom.elLegendWrap.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),e.appendChild(t.dom.elLegendWrap),e.appendChild(this.getLegendStyles()),t.dom.Paper.node.insertBefore(e,t.dom.elGraphical.node)}},{key:"toggleDataSeries",value:function(t,e){var i=this,a=this.w;if(a.globals.axisCharts||"radialBar"===a.config.chart.type){a.globals.resized=!0;var s=null,r=null;if(a.globals.risingSeries=[],a.globals.axisCharts?(s=a.globals.dom.baseEl.querySelector(".apexcharts-series[data\\:realIndex='".concat(t,"']")),r=parseInt(s.getAttribute("data:realIndex"),10)):(s=a.globals.dom.baseEl.querySelector(".apexcharts-series[rel='".concat(t+1,"']")),r=parseInt(s.getAttribute("rel"),10)-1),e)[{cs:a.globals.collapsedSeries,csi:a.globals.collapsedSeriesIndices},{cs:a.globals.ancillaryCollapsedSeries,csi:a.globals.ancillaryCollapsedSeriesIndices}].forEach((function(t){i.riseCollapsedSeries(t.cs,t.csi,r)}));else this.hideSeries({seriesEl:s,realIndex:r})}else{var o=a.globals.dom.Paper.select(" .apexcharts-series[rel='".concat(t+1,"'] path")),n=a.config.chart.type;if("pie"===n||"polarArea"===n||"donut"===n){var l=a.config.plotOptions.pie.donut.labels;new b(this.lgCtx.ctx).pathMouseDown(o.members[0],null),this.lgCtx.ctx.pie.printDataLabelsInner(o.members[0].node,l)}o.fire("click")}}},{key:"hideSeries",value:function(t){var e=t.seriesEl,i=t.realIndex,a=this.w,s=p.clone(a.config.series);if(a.globals.axisCharts){var r=!1;if(a.config.yaxis[i]&&a.config.yaxis[i].show&&a.config.yaxis[i].showAlways&&(r=!0,a.globals.ancillaryCollapsedSeriesIndices.indexOf(i)<0&&(a.globals.ancillaryCollapsedSeries.push({index:i,data:s[i].data.slice(),type:e.parentNode.className.baseVal.split("-")[1]}),a.globals.ancillaryCollapsedSeriesIndices.push(i))),!r){a.globals.collapsedSeries.push({index:i,data:s[i].data.slice(),type:e.parentNode.className.baseVal.split("-")[1]}),a.globals.collapsedSeriesIndices.push(i);var o=a.globals.risingSeries.indexOf(i);a.globals.risingSeries.splice(o,1)}}else a.globals.collapsedSeries.push({index:i,data:s[i]}),a.globals.collapsedSeriesIndices.push(i);for(var n=e.childNodes,l=0;l0){for(var r=0;r-1&&(t[a].data=[])})):t.forEach((function(i,a){e.globals.collapsedSeriesIndices.indexOf(a)>-1&&(t[a]=0)})),t}}]),t}(),lt=function(){function t(e,i){a(this,t),this.ctx=e,this.w=e.w,this.onLegendClick=this.onLegendClick.bind(this),this.onLegendHovered=this.onLegendHovered.bind(this),this.isBarsDistributed="bar"===this.w.config.chart.type&&this.w.config.plotOptions.bar.distributed&&1===this.w.config.series.length,this.legendHelpers=new nt(this)}return r(t,[{key:"init",value:function(){var t=this.w,e=t.globals,i=t.config;if((i.legend.showForSingleSeries&&1===e.series.length||this.isBarsDistributed||e.series.length>1||!e.axisCharts)&&i.legend.show){for(;e.dom.elLegendWrap.firstChild;)e.dom.elLegendWrap.removeChild(e.dom.elLegendWrap.firstChild);this.drawLegends(),p.isIE11()?document.getElementsByTagName("head")[0].appendChild(this.legendHelpers.getLegendStyles()):this.legendHelpers.appendToForeignObject(),"bottom"===i.legend.position||"top"===i.legend.position?this.legendAlignHorizontal():"right"!==i.legend.position&&"left"!==i.legend.position||this.legendAlignVertical()}}},{key:"drawLegends",value:function(){var t=this,e=this.w,i=e.config.legend.fontFamily,a=e.globals.seriesNames,s=e.globals.colors.slice();if("heatmap"===e.config.chart.type){var r=e.config.plotOptions.heatmap.colorScale.ranges;a=r.map((function(t){return t.name?t.name:t.from+" - "+t.to})),s=r.map((function(t){return t.color}))}else this.isBarsDistributed&&(a=e.globals.labels.slice());e.config.legend.customLegendItems.length&&(a=e.config.legend.customLegendItems);for(var o=e.globals.legendFormatter,n=e.config.legend.inverseOrder,l=n?a.length-1:0;n?l>=0:l<=a.length-1;n?l--:l++){var h=o(a[l],{seriesIndex:l,w:e}),c=!1,d=!1;if(e.globals.collapsedSeries.length>0)for(var g=0;g0)for(var u=0;u0?l-10:0)+(h>0?h-10:0)}a.style.position="absolute",r=r+t+i.config.legend.offsetX,o=o+e+i.config.legend.offsetY,a.style.left=r+"px",a.style.top=o+"px","bottom"===i.config.legend.position?(a.style.top="auto",a.style.bottom=5-i.config.legend.offsetY+"px"):"right"===i.config.legend.position&&(a.style.left="auto",a.style.right=25+i.config.legend.offsetX+"px");["width","height"].forEach((function(t){a.style[t]&&(a.style[t]=parseInt(i.config.legend[t],10)+"px")}))}},{key:"legendAlignHorizontal",value:function(){var t=this.w;t.globals.dom.baseEl.querySelector(".apexcharts-legend").style.right=0;var e=this.legendHelpers.getLegendBBox(),i=new ot(this.ctx),a=i.dimHelpers.getTitleSubtitleCoords("title"),s=i.dimHelpers.getTitleSubtitleCoords("subtitle"),r=0;"bottom"===t.config.legend.position?r=-e.clwh/1.8:"top"===t.config.legend.position&&(r=a.height+s.height+t.config.title.margin+t.config.subtitle.margin-10),this.setLegendWrapXY(20,r)}},{key:"legendAlignVertical",value:function(){var t=this.w,e=this.legendHelpers.getLegendBBox(),i=0;"left"===t.config.legend.position&&(i=20),"right"===t.config.legend.position&&(i=t.globals.svgWidth-e.clww-10),this.setLegendWrapXY(i,20)}},{key:"onLegendHovered",value:function(t){var e=this.w,i=t.target.classList.contains("apexcharts-legend-text")||t.target.classList.contains("apexcharts-legend-marker");if("heatmap"===e.config.chart.type||this.isBarsDistributed){if(i){var a=parseInt(t.target.getAttribute("rel"),10)-1;this.ctx.events.fireEvent("legendHover",[this.ctx,a,this.w]),new z(this.ctx).highlightRangeInSeries(t,t.target)}}else!t.target.classList.contains("apexcharts-inactive-legend")&&i&&new z(this.ctx).toggleSeriesOnHover(t,t.target)}},{key:"onLegendClick",value:function(t){var e=this.w;if(!e.config.legend.customLegendItems.length&&(t.target.classList.contains("apexcharts-legend-text")||t.target.classList.contains("apexcharts-legend-marker"))){var i=parseInt(t.target.getAttribute("rel"),10)-1,a="true"===t.target.getAttribute("data:collapsed"),s=this.w.config.chart.events.legendClick;"function"==typeof s&&s(this.ctx,i,this.w),this.ctx.events.fireEvent("legendClick",[this.ctx,i,this.w]);var r=this.w.config.legend.markers.onClick;"function"==typeof r&&t.target.classList.contains("apexcharts-legend-marker")&&(r(this.ctx,i,this.w),this.ctx.events.fireEvent("legendMarkerClick",[this.ctx,i,this.w])),"treemap"!==e.config.chart.type&&"heatmap"!==e.config.chart.type&&!this.isBarsDistributed&&e.config.legend.onItemClick.toggleDataSeries&&this.legendHelpers.toggleDataSeries(i,a)}}}]),t}(),ht=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w;var i=this.w;this.ev=this.w.config.chart.events,this.selectedClass="apexcharts-selected",this.localeValues=this.w.globals.locale.toolbar,this.minX=i.globals.minX,this.maxX=i.globals.maxX}return r(t,[{key:"createToolbar",value:function(){var t=this,e=this.w,i=function(){return document.createElement("div")},a=i();if(a.setAttribute("class","apexcharts-toolbar"),a.style.top=e.config.chart.toolbar.offsetY+"px",a.style.right=3-e.config.chart.toolbar.offsetX+"px",e.globals.dom.elWrap.appendChild(a),this.elZoom=i(),this.elZoomIn=i(),this.elZoomOut=i(),this.elPan=i(),this.elSelection=i(),this.elZoomReset=i(),this.elMenuIcon=i(),this.elMenu=i(),this.elCustomIcons=[],this.t=e.config.chart.toolbar.tools,Array.isArray(this.t.customIcons))for(var s=0;s\n \n \n\n'),o("zoomOut",this.elZoomOut,'\n \n \n\n');var n=function(i){t.t[i]&&e.config.chart[i].enabled&&r.push({el:"zoom"===i?t.elZoom:t.elSelection,icon:"string"==typeof t.t[i]?t.t[i]:"zoom"===i?'\n \n \n \n':'\n \n \n',title:t.localeValues["zoom"===i?"selectionZoom":"selection"],class:e.globals.isTouchDevice?"apexcharts-element-hidden":"apexcharts-".concat(i,"-icon")})};n("zoom"),n("selection"),this.t.pan&&e.config.chart.zoom.enabled&&r.push({el:this.elPan,icon:"string"==typeof this.t.pan?this.t.pan:'\n \n \n \n \n \n \n \n',title:this.localeValues.pan,class:e.globals.isTouchDevice?"apexcharts-element-hidden":"apexcharts-pan-icon"}),o("reset",this.elZoomReset,'\n \n \n'),this.t.download&&r.push({el:this.elMenuIcon,icon:"string"==typeof this.t.download?this.t.download:'',title:this.localeValues.menu,class:"apexcharts-menu-icon"});for(var l=0;l0&&e.height>0&&this.slDraggableRect.selectize({points:"l, r",pointSize:8,pointType:"rect"}).resize({constraint:{minX:0,minY:0,maxX:t.globals.gridWidth,maxY:t.globals.gridHeight}}).on("resizing",this.selectionDragging.bind(this,"resizing"))}}},{key:"preselectedSelection",value:function(){var t=this.w,e=this.xyRatios;if(!t.globals.zoomEnabled)if(void 0!==t.globals.selection&&null!==t.globals.selection)this.drawSelectionRect(t.globals.selection);else if(void 0!==t.config.chart.selection.xaxis.min&&void 0!==t.config.chart.selection.xaxis.max){var i=(t.config.chart.selection.xaxis.min-t.globals.minX)/e.xRatio,a={x:i,y:0,width:t.globals.gridWidth-(t.globals.maxX-t.config.chart.selection.xaxis.max)/e.xRatio-i,height:t.globals.gridHeight,translateX:0,translateY:0,selectionEnabled:!0};this.drawSelectionRect(a),this.makeSelectionRectDraggable(),"function"==typeof t.config.chart.events.selection&&t.config.chart.events.selection(this.ctx,{xaxis:{min:t.config.chart.selection.xaxis.min,max:t.config.chart.selection.xaxis.max},yaxis:{}})}}},{key:"drawSelectionRect",value:function(t){var e=t.x,i=t.y,a=t.width,s=t.height,r=t.translateX,o=void 0===r?0:r,n=t.translateY,l=void 0===n?0:n,h=this.w,c=this.zoomRect,d=this.selectionRect;if(this.dragged||null!==h.globals.selection){var g={transform:"translate("+o+", "+l+")"};h.globals.zoomEnabled&&this.dragged&&(a<0&&(a=1),c.attr({x:e,y:i,width:a,height:s,fill:h.config.chart.zoom.zoomedArea.fill.color,"fill-opacity":h.config.chart.zoom.zoomedArea.fill.opacity,stroke:h.config.chart.zoom.zoomedArea.stroke.color,"stroke-width":h.config.chart.zoom.zoomedArea.stroke.width,"stroke-opacity":h.config.chart.zoom.zoomedArea.stroke.opacity}),b.setAttrs(c.node,g)),h.globals.selectionEnabled&&(d.attr({x:e,y:i,width:a>0?a:0,height:s>0?s:0,fill:h.config.chart.selection.fill.color,"fill-opacity":h.config.chart.selection.fill.opacity,stroke:h.config.chart.selection.stroke.color,"stroke-width":h.config.chart.selection.stroke.width,"stroke-dasharray":h.config.chart.selection.stroke.dashArray,"stroke-opacity":h.config.chart.selection.stroke.opacity}),b.setAttrs(d.node,g))}}},{key:"hideSelectionRect",value:function(t){t&&t.attr({x:0,y:0,width:0,height:0})}},{key:"selectionDrawing",value:function(t){var e=t.context,i=t.zoomtype,a=this.w,s=e,r=this.gridRect.getBoundingClientRect(),o=s.startX-1,n=s.startY,l=!1,h=!1,c=s.clientX-r.left-o,d=s.clientY-r.top-n,g={};return Math.abs(c+o)>a.globals.gridWidth?c=a.globals.gridWidth-o:s.clientX-r.left<0&&(c=o),o>s.clientX-r.left&&(l=!0,c=Math.abs(c)),n>s.clientY-r.top&&(h=!0,d=Math.abs(d)),g="x"===i?{x:l?o-c:o,y:0,width:c,height:a.globals.gridHeight}:"y"===i?{x:0,y:h?n-d:n,width:a.globals.gridWidth,height:d}:{x:l?o-c:o,y:h?n-d:n,width:c,height:d},s.drawSelectionRect(g),s.selectionDragging("resizing"),g}},{key:"selectionDragging",value:function(t,e){var i=this,a=this.w,s=this.xyRatios,r=this.selectionRect,o=0;"resizing"===t&&(o=30);var n=function(t){return parseFloat(r.node.getAttribute(t))},l={x:n("x"),y:n("y"),width:n("width"),height:n("height")};a.globals.selection=l,"function"==typeof a.config.chart.events.selection&&a.globals.selectionEnabled&&(clearTimeout(this.w.globals.selectionResizeTimer),this.w.globals.selectionResizeTimer=window.setTimeout((function(){var t=i.gridRect.getBoundingClientRect(),e=r.node.getBoundingClientRect(),o={xaxis:{min:a.globals.xAxisScale.niceMin+(e.left-t.left)*s.xRatio,max:a.globals.xAxisScale.niceMin+(e.right-t.left)*s.xRatio},yaxis:{min:a.globals.yAxisScale[0].niceMin+(t.bottom-e.bottom)*s.yRatio[0],max:a.globals.yAxisScale[0].niceMax-(e.top-t.top)*s.yRatio[0]}};a.config.chart.events.selection(i.ctx,o),a.config.chart.brush.enabled&&void 0!==a.config.chart.events.brushScrolled&&a.config.chart.events.brushScrolled(i.ctx,o)}),o))}},{key:"selectionDrawn",value:function(t){var e=t.context,i=t.zoomtype,a=this.w,s=e,r=this.xyRatios,o=this.ctx.toolbar;if(s.startX>s.endX){var n=s.startX;s.startX=s.endX,s.endX=n}if(s.startY>s.endY){var l=s.startY;s.startY=s.endY,s.endY=l}var h=void 0,c=void 0;a.globals.isRangeBar?(h=a.globals.yAxisScale[0].niceMin+s.startX*r.invertedYRatio,c=a.globals.yAxisScale[0].niceMin+s.endX*r.invertedYRatio):(h=a.globals.xAxisScale.niceMin+s.startX*r.xRatio,c=a.globals.xAxisScale.niceMin+s.endX*r.xRatio);var d=[],g=[];if(a.config.yaxis.forEach((function(t,e){d.push(a.globals.yAxisScale[e].niceMax-r.yRatio[e]*s.startY),g.push(a.globals.yAxisScale[e].niceMax-r.yRatio[e]*s.endY)})),s.dragged&&(s.dragX>10||s.dragY>10)&&h!==c)if(a.globals.zoomEnabled){var u=p.clone(a.globals.initialConfig.yaxis),f=p.clone(a.globals.initialConfig.xaxis);if(a.globals.zoomed=!0,a.config.xaxis.convertedCatToNumeric&&(h=Math.floor(h),c=Math.floor(c),h<1&&(h=1,c=a.globals.dataPoints),c-h<2&&(c=h+1)),"xy"!==i&&"x"!==i||(f={min:h,max:c}),"xy"!==i&&"y"!==i||u.forEach((function(t,e){u[e].min=g[e],u[e].max=d[e]})),a.config.chart.zoom.autoScaleYaxis){var x=new j(s.ctx);u=x.autoScaleY(s.ctx,u,{xaxis:f})}if(o){var b=o.getBeforeZoomRange(f,u);b&&(f=b.xaxis?b.xaxis:f,u=b.yaxis?b.yaxis:u)}var v={xaxis:f};a.config.chart.group||(v.yaxis=u),s.ctx.updateHelpers._updateOptions(v,!1,s.w.config.chart.animations.dynamicAnimation.enabled),"function"==typeof a.config.chart.events.zoomed&&o.zoomCallback(f,u)}else if(a.globals.selectionEnabled){var m,y=null;m={min:h,max:c},"xy"!==i&&"y"!==i||(y=p.clone(a.config.yaxis)).forEach((function(t,e){y[e].min=g[e],y[e].max=d[e]})),a.globals.selection=s.selection,"function"==typeof a.config.chart.events.selection&&a.config.chart.events.selection(s.ctx,{xaxis:m,yaxis:y})}}},{key:"panDragging",value:function(t){var e=t.context,i=this.w,a=e;if(void 0!==i.globals.lastClientPosition.x){var s=i.globals.lastClientPosition.x-a.clientX,r=i.globals.lastClientPosition.y-a.clientY;Math.abs(s)>Math.abs(r)&&s>0?this.moveDirection="left":Math.abs(s)>Math.abs(r)&&s<0?this.moveDirection="right":Math.abs(r)>Math.abs(s)&&r>0?this.moveDirection="up":Math.abs(r)>Math.abs(s)&&r<0&&(this.moveDirection="down")}i.globals.lastClientPosition={x:a.clientX,y:a.clientY};var o=i.globals.isRangeBar?i.globals.minY:i.globals.minX,n=i.globals.isRangeBar?i.globals.maxY:i.globals.maxX;i.config.xaxis.convertedCatToNumeric||a.panScrolled(o,n)}},{key:"delayedPanScrolled",value:function(){var t=this.w,e=t.globals.minX,i=t.globals.maxX,a=(t.globals.maxX-t.globals.minX)/2;"left"===this.moveDirection?(e=t.globals.minX+a,i=t.globals.maxX+a):"right"===this.moveDirection&&(e=t.globals.minX-a,i=t.globals.maxX-a),e=Math.floor(e),i=Math.floor(i),this.updateScrolledChart({xaxis:{min:e,max:i}},e,i)}},{key:"panScrolled",value:function(t,e){var i=this.w,a=this.xyRatios,s=p.clone(i.globals.initialConfig.yaxis),r=a.xRatio,o=i.globals.minX,n=i.globals.maxX;i.globals.isRangeBar&&(r=a.invertedYRatio,o=i.globals.minY,n=i.globals.maxY),"left"===this.moveDirection?(t=o+i.globals.gridWidth/15*r,e=n+i.globals.gridWidth/15*r):"right"===this.moveDirection&&(t=o-i.globals.gridWidth/15*r,e=n-i.globals.gridWidth/15*r),i.globals.isRangeBar||(ti.globals.initialMaxX)&&(t=o,e=n);var l={min:t,max:e};i.config.chart.zoom.autoScaleYaxis&&(s=new j(this.ctx).autoScaleY(this.ctx,s,{xaxis:l}));var h={xaxis:{min:t,max:e}};i.config.chart.group||(h.yaxis=s),this.updateScrolledChart(h,t,e)}},{key:"updateScrolledChart",value:function(t,e,i){var a=this.w;this.ctx.updateHelpers._updateOptions(t,!1,!1),"function"==typeof a.config.chart.events.scrolled&&a.config.chart.events.scrolled(this.ctx,{xaxis:{min:e,max:i}})}}]),i}(ht),dt=function(){function t(e){a(this,t),this.w=e.w,this.ttCtx=e,this.ctx=e.ctx}return r(t,[{key:"getNearestValues",value:function(t){var e=t.hoverArea,i=t.elGrid,a=t.clientX,s=t.clientY,r=this.w,o=i.getBoundingClientRect(),n=o.width,l=o.height,h=n/(r.globals.dataPoints-1),c=l/r.globals.dataPoints,d=this.hasBars();!r.globals.comboCharts&&!d||r.config.xaxis.convertedCatToNumeric||(h=n/r.globals.dataPoints);var g=a-o.left-r.globals.barPadForNumericAxis,u=s-o.top;g<0||u<0||g>n||u>l?(e.classList.remove("hovering-zoom"),e.classList.remove("hovering-pan")):r.globals.zoomEnabled?(e.classList.remove("hovering-pan"),e.classList.add("hovering-zoom")):r.globals.panEnabled&&(e.classList.remove("hovering-zoom"),e.classList.add("hovering-pan"));var f=Math.round(g/h),x=Math.floor(u/c);d&&!r.config.xaxis.convertedCatToNumeric&&(f=Math.ceil(g/h),f-=1);for(var b,v=null,m=null,y=[],w=0;w1?r=this.getFirstActiveXArray(i):o=0;var l=a[r][0],h=i[r][0],c=Math.abs(t-h),d=Math.abs(e-l),g=d+c;return a.map((function(s,r){s.map((function(s,l){var h=Math.abs(e-a[r][l]),u=Math.abs(t-i[r][l]),p=u+h;p0?e:-1})),a=0;a0)for(var a=0;a0}},{key:"getElBars",value:function(){return this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-bar-series, .apexcharts-candlestick-series, .apexcharts-boxPlot-series, .apexcharts-rangebar-series")}},{key:"hasBars",value:function(){return this.getElBars().length>0}},{key:"getHoverMarkerSize",value:function(t){var e=this.w,i=e.config.markers.hover.size;return void 0===i&&(i=e.globals.markers.size[t]+e.config.markers.hover.sizeOffset),i}},{key:"toggleAllTooltipSeriesGroups",value:function(t){var e=this.w,i=this.ttCtx;0===i.allTooltipSeriesGroups.length&&(i.allTooltipSeriesGroups=e.globals.dom.baseEl.querySelectorAll(".apexcharts-tooltip-series-group"));for(var a=i.allTooltipSeriesGroups,s=0;s ').concat(i.attrs.name,""),e+="
".concat(i.val,"
")})),v.innerHTML=t+"",m.innerHTML=e+""};o?l.globals.seriesGoals[e][i]&&Array.isArray(l.globals.seriesGoals[e][i])?y():(v.innerHTML="",m.innerHTML=""):y()}else v.innerHTML="",m.innerHTML="";null!==p&&(a[e].querySelector(".apexcharts-tooltip-text-z-label").innerHTML=l.config.tooltip.z.title,a[e].querySelector(".apexcharts-tooltip-text-z-value").innerHTML=void 0!==p?p:"");o&&f[0]&&(null==c||l.globals.collapsedSeriesIndices.indexOf(e)>-1?f[0].parentNode.style.display="none":f[0].parentNode.style.display=l.config.tooltip.items.display)}},{key:"toggleActiveInactiveSeries",value:function(t){var e=this.w;if(t)this.tooltipUtil.toggleAllTooltipSeriesGroups("enable");else{this.tooltipUtil.toggleAllTooltipSeriesGroups("disable");var i=e.globals.dom.baseEl.querySelector(".apexcharts-tooltip-series-group");i&&(i.classList.add("apexcharts-active"),i.style.display=e.config.tooltip.items.display)}}},{key:"getValuesToPrint",value:function(t){var e=t.i,i=t.j,a=this.w,s=this.ctx.series.filteredSeriesX(),r="",o="",n=null,l=null,h={series:a.globals.series,seriesIndex:e,dataPointIndex:i,w:a},c=a.globals.ttZFormatter;null===i?l=a.globals.series[e]:a.globals.isXNumeric&&"treemap"!==a.config.chart.type?(r=s[e][i],0===s[e].length&&(r=s[this.tooltipUtil.getFirstActiveXArray(s)][i])):r=void 0!==a.globals.labels[i]?a.globals.labels[i]:"";var d=r;a.globals.isXNumeric&&"datetime"===a.config.xaxis.type?r=new W(this.ctx).xLabelFormat(a.globals.ttKeyFormatter,d,d,{i:void 0,dateFormatter:new Y(this.ctx).formatDate,w:this.w}):r=a.globals.isBarHorizontal?a.globals.yLabelFormatters[0](d,h):a.globals.xLabelFormatter(d,h);return void 0!==a.config.tooltip.x.formatter&&(r=a.globals.ttKeyFormatter(d,h)),a.globals.seriesZ.length>0&&a.globals.seriesZ[e].length>0&&(n=c(a.globals.seriesZ[e][i],a)),o="function"==typeof a.config.xaxis.tooltip.formatter?a.globals.xaxisTooltipFormatter(d,h):r,{val:Array.isArray(l)?l.join(" "):l,xVal:Array.isArray(r)?r.join(" "):r,xAxisTTVal:Array.isArray(o)?o.join(" "):o,zVal:n}}},{key:"handleCustomTooltip",value:function(t){var e=t.i,i=t.j,a=t.y1,s=t.y2,r=t.w,o=this.ttCtx.getElTooltip(),n=r.config.tooltip.custom;Array.isArray(n)&&n[e]&&(n=n[e]),o.innerHTML=n({ctx:this.ctx,series:r.globals.series,seriesIndex:e,dataPointIndex:i,y1:a,y2:s,w:r})}}]),t}(),ut=function(){function t(e){a(this,t),this.ttCtx=e,this.ctx=e.ctx,this.w=e.w}return r(t,[{key:"moveXCrosshairs",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=this.ttCtx,a=this.w,s=i.getElXCrosshairs(),r=t-i.xcrosshairsWidth/2,o=a.globals.labels.slice().length;if(null!==e&&(r=a.globals.gridWidth/o*e),null===s||a.globals.isBarHorizontal||(s.setAttribute("x",r),s.setAttribute("x1",r),s.setAttribute("x2",r),s.setAttribute("y2",a.globals.gridHeight),s.classList.add("apexcharts-active")),r<0&&(r=0),r>a.globals.gridWidth&&(r=a.globals.gridWidth),i.isXAxisTooltipEnabled){var n=r;"tickWidth"!==a.config.xaxis.crosshairs.width&&"barWidth"!==a.config.xaxis.crosshairs.width||(n=r+i.xcrosshairsWidth/2),this.moveXAxisTooltip(n)}}},{key:"moveYCrosshairs",value:function(t){var e=this.ttCtx;null!==e.ycrosshairs&&b.setAttrs(e.ycrosshairs,{y1:t,y2:t}),null!==e.ycrosshairsHidden&&b.setAttrs(e.ycrosshairsHidden,{y1:t,y2:t})}},{key:"moveXAxisTooltip",value:function(t){var e=this.w,i=this.ttCtx;if(null!==i.xaxisTooltip&&0!==i.xcrosshairsWidth){i.xaxisTooltip.classList.add("apexcharts-active");var a=i.xaxisOffY+e.config.xaxis.tooltip.offsetY+e.globals.translateY+1+e.config.xaxis.offsetY;if(t-=i.xaxisTooltip.getBoundingClientRect().width/2,!isNaN(t)){t+=e.globals.translateX;var s;s=new b(this.ctx).getTextRects(i.xaxisTooltipText.innerHTML),i.xaxisTooltipText.style.minWidth=s.width+"px",i.xaxisTooltip.style.left=t+"px",i.xaxisTooltip.style.top=a+"px"}}}},{key:"moveYAxisTooltip",value:function(t){var e=this.w,i=this.ttCtx;null===i.yaxisTTEls&&(i.yaxisTTEls=e.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxistooltip"));var a=parseInt(i.ycrosshairsHidden.getAttribute("y1"),10),s=e.globals.translateY+a,r=i.yaxisTTEls[t].getBoundingClientRect().height,o=e.globals.translateYAxisX[t]-2;e.config.yaxis[t].opposite&&(o-=26),s-=r/2,-1===e.globals.ignoreYAxisIndexes.indexOf(t)?(i.yaxisTTEls[t].classList.add("apexcharts-active"),i.yaxisTTEls[t].style.top=s+"px",i.yaxisTTEls[t].style.left=o+e.config.yaxis[t].tooltip.offsetX+"px"):i.yaxisTTEls[t].classList.remove("apexcharts-active")}},{key:"moveTooltip",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=this.w,s=this.ttCtx,r=s.getElTooltip(),o=s.tooltipRect,n=null!==i?parseFloat(i):1,l=parseFloat(t)+n+5,h=parseFloat(e)+n/2;if(l>a.globals.gridWidth/2&&(l=l-o.ttWidth-n-15),l>a.globals.gridWidth-o.ttWidth-10&&(l=a.globals.gridWidth-o.ttWidth),l<-20&&(l=-20),a.config.tooltip.followCursor){var c=s.getElGrid(),d=c.getBoundingClientRect();h=s.e.clientY+a.globals.translateY-d.top-o.ttHeight/2}else a.globals.isBarHorizontal?h-=o.ttHeight:(o.ttHeight/2+h>a.globals.gridHeight&&(h=a.globals.gridHeight-o.ttHeight+a.globals.translateY),h<0&&(h=0));isNaN(l)||(l+=a.globals.translateX,r.style.left=l+"px",r.style.top=h+"px")}},{key:"moveMarkers",value:function(t,e){var i=this.w,a=this.ttCtx;if(i.globals.markers.size[t]>0)for(var s=i.globals.dom.baseEl.querySelectorAll(" .apexcharts-series[data\\:realIndex='".concat(t,"'] .apexcharts-marker")),r=0;r0&&(h.setAttribute("r",n),h.setAttribute("cx",i),h.setAttribute("cy",a)),this.moveXCrosshairs(i),r.fixedTooltip||this.moveTooltip(i,a,n)}}},{key:"moveDynamicPointsOnHover",value:function(t){var e,i=this.ttCtx,a=i.w,s=0,r=0,o=a.globals.pointsArray;e=new z(this.ctx).getActiveConfigSeriesIndex(!0);var n=i.tooltipUtil.getHoverMarkerSize(e);o[e]&&(s=o[e][t][0],r=o[e][t][1]);var l=i.tooltipUtil.getAllMarkers();if(null!==l)for(var h=0;h0?(l[h]&&l[h].setAttribute("r",n),l[h]&&l[h].setAttribute("cy",d)):l[h]&&l[h].setAttribute("r",0)}}if(this.moveXCrosshairs(s),!i.fixedTooltip){var g=r||a.globals.gridHeight;this.moveTooltip(s,g,n)}}},{key:"moveStickyTooltipOverBars",value:function(t){var e=this.w,i=this.ttCtx,a=e.globals.columnSeries?e.globals.columnSeries.length:e.globals.series.length,s=a>=2&&a%2==0?Math.floor(a/2):Math.floor(a/2)+1;e.globals.isBarHorizontal&&(s=new z(this.ctx).getActiveConfigSeriesIndex(!1,"desc")+1);var r=e.globals.dom.baseEl.querySelector(".apexcharts-bar-series .apexcharts-series[rel='".concat(s,"'] path[j='").concat(t,"'], .apexcharts-candlestick-series .apexcharts-series[rel='").concat(s,"'] path[j='").concat(t,"'], .apexcharts-boxPlot-series .apexcharts-series[rel='").concat(s,"'] path[j='").concat(t,"'], .apexcharts-rangebar-series .apexcharts-series[rel='").concat(s,"'] path[j='").concat(t,"']")),o=r?parseFloat(r.getAttribute("cx")):0,n=r?parseFloat(r.getAttribute("cy")):0,l=r?parseFloat(r.getAttribute("barWidth")):0,h=r?parseFloat(r.getAttribute("barHeight")):0,c=i.getElGrid().getBoundingClientRect(),d=r.classList.contains("apexcharts-candlestick-area")||r.classList.contains("apexcharts-boxPlot-area");if(e.globals.isXNumeric?(r&&!d&&(o-=a%2!=0?l/2:0),r&&d&&e.globals.comboCharts&&(o-=l/2)):e.globals.isBarHorizontal||(o=i.xAxisTicksPositions[t-1]+i.dataPointsDividedWidth/2,isNaN(o)&&(o=i.xAxisTicksPositions[t]-i.dataPointsDividedWidth/2)),e.globals.isBarHorizontal?n+=h/3:n=i.e.clientY-c.top-i.tooltipRect.ttHeight/2,e.globals.isBarHorizontal||this.moveXCrosshairs(o),!i.fixedTooltip){var g=n||e.globals.gridHeight;this.moveTooltip(o,g)}}}]),t}(),pt=function(){function t(e){a(this,t),this.w=e.w,this.ttCtx=e,this.ctx=e.ctx,this.tooltipPosition=new ut(e)}return r(t,[{key:"drawDynamicPoints",value:function(){var t=this.w,e=new b(this.ctx),i=new P(this.ctx),a=t.globals.dom.baseEl.querySelectorAll(".apexcharts-series");a=g(a),t.config.chart.stacked&&a.sort((function(t,e){return parseFloat(t.getAttribute("data:realIndex"))-parseFloat(e.getAttribute("data:realIndex"))}));for(var s=0;s2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,s=this.w;"bubble"!==s.config.chart.type&&this.newPointSize(t,e);var r=e.getAttribute("cx"),o=e.getAttribute("cy");if(null!==i&&null!==a&&(r=i,o=a),this.tooltipPosition.moveXCrosshairs(r),!this.fixedTooltip){if("radar"===s.config.chart.type){var n=this.ttCtx.getElGrid(),l=n.getBoundingClientRect();r=this.ttCtx.e.clientX-l.left}this.tooltipPosition.moveTooltip(r,o,s.config.markers.hover.size)}}},{key:"enlargePoints",value:function(t){for(var e=this.w,i=this,a=this.ttCtx,s=t,r=e.globals.dom.baseEl.querySelectorAll(".apexcharts-series:not(.apexcharts-series-collapsed) .apexcharts-marker"),o=e.config.markers.hover.size,n=0;n=0?t[e].setAttribute("r",i):t[e].setAttribute("r",0)}}}]),t}(),ft=function(){function t(e){a(this,t),this.w=e.w,this.ttCtx=e}return r(t,[{key:"getAttr",value:function(t,e){return parseFloat(t.target.getAttribute(e))}},{key:"handleHeatTreeTooltip",value:function(t){var e=t.e,i=t.opt,a=t.x,s=t.y,r=t.type,o=this.ttCtx,n=this.w;if(e.target.classList.contains("apexcharts-".concat(r,"-rect"))){var l=this.getAttr(e,"i"),h=this.getAttr(e,"j"),c=this.getAttr(e,"cx"),d=this.getAttr(e,"cy"),g=this.getAttr(e,"width"),u=this.getAttr(e,"height");if(o.tooltipLabels.drawSeriesTexts({ttItems:i.ttItems,i:l,j:h,shared:!1,e:e}),n.globals.capturedSeriesIndex=l,n.globals.capturedDataPointIndex=h,a=c+o.tooltipRect.ttWidth/2+g,s=d+o.tooltipRect.ttHeight/2-u/2,o.tooltipPosition.moveXCrosshairs(c+g/2),a>n.globals.gridWidth/2&&(a=c-o.tooltipRect.ttWidth/2+g),o.w.config.tooltip.followCursor){var p=n.globals.dom.elWrap.getBoundingClientRect();a=n.globals.clientX-p.left-o.tooltipRect.ttWidth/2,s=n.globals.clientY-p.top-o.tooltipRect.ttHeight-5}}return{x:a,y:s}}},{key:"handleMarkerTooltip",value:function(t){var e,i,a=t.e,s=t.opt,r=t.x,o=t.y,n=this.w,l=this.ttCtx;if(a.target.classList.contains("apexcharts-marker")){var h=parseInt(s.paths.getAttribute("cx"),10),c=parseInt(s.paths.getAttribute("cy"),10),d=parseFloat(s.paths.getAttribute("val"));if(i=parseInt(s.paths.getAttribute("rel"),10),e=parseInt(s.paths.parentNode.parentNode.parentNode.getAttribute("rel"),10)-1,l.intersect){var g=p.findAncestor(s.paths,"apexcharts-series");g&&(e=parseInt(g.getAttribute("data:realIndex"),10))}if(l.tooltipLabels.drawSeriesTexts({ttItems:s.ttItems,i:e,j:i,shared:!l.showOnIntersect&&n.config.tooltip.shared,e:a}),"mouseup"===a.type&&l.markerClick(a,e,i),n.globals.capturedSeriesIndex=e,n.globals.capturedDataPointIndex=i,r=h,o=c+n.globals.translateY-1.4*l.tooltipRect.ttHeight,l.w.config.tooltip.followCursor){var u=l.getElGrid().getBoundingClientRect();o=l.e.clientY+n.globals.translateY-u.top}d<0&&(o=c),l.marker.enlargeCurrentPoint(i,s.paths,r,o)}return{x:r,y:o}}},{key:"handleBarTooltip",value:function(t){var e,i,a=t.e,s=t.opt,r=this.w,o=this.ttCtx,n=o.getElTooltip(),l=0,h=0,c=0,d=this.getBarTooltipXY({e:a,opt:s});e=d.i;var g=d.barHeight,u=d.j;r.globals.capturedSeriesIndex=e,r.globals.capturedDataPointIndex=u,r.globals.isBarHorizontal&&o.tooltipUtil.hasBars()||!r.config.tooltip.shared?(h=d.x,c=d.y,i=Array.isArray(r.config.stroke.width)?r.config.stroke.width[e]:r.config.stroke.width,l=h):r.globals.comboCharts||r.config.tooltip.shared||(l/=2),isNaN(c)?c=r.globals.svgHeight-o.tooltipRect.ttHeight:c<0&&(c=0);var p=parseInt(s.paths.parentNode.getAttribute("data:realIndex"),10),f=r.globals.isMultipleYAxis?r.config.yaxis[p]&&r.config.yaxis[p].reversed:r.config.yaxis[0].reversed;if(h+o.tooltipRect.ttWidth>r.globals.gridWidth&&!f?h-=o.tooltipRect.ttWidth:h<0&&(h=0),o.w.config.tooltip.followCursor){var x=o.getElGrid().getBoundingClientRect();c=o.e.clientY-x.top}null===o.tooltip&&(o.tooltip=r.globals.dom.baseEl.querySelector(".apexcharts-tooltip")),r.config.tooltip.shared||(r.globals.comboBarCount>0?o.tooltipPosition.moveXCrosshairs(l+i/2):o.tooltipPosition.moveXCrosshairs(l)),!o.fixedTooltip&&(!r.config.tooltip.shared||r.globals.isBarHorizontal&&o.tooltipUtil.hasBars())&&(f&&(h-=o.tooltipRect.ttWidth)<0&&(h=0),n.style.left=h+r.globals.translateX+"px",!f||r.globals.isBarHorizontal&&o.tooltipUtil.hasBars()||(c=c+g-2*(r.globals.series[e][u]<0?g:0)),o.tooltipRect.ttHeight+c>r.globals.gridHeight?(c=r.globals.gridHeight-o.tooltipRect.ttHeight+r.globals.translateY,n.style.top=c+"px"):n.style.top=c+r.globals.translateY-o.tooltipRect.ttHeight/2+"px")}},{key:"getBarTooltipXY",value:function(t){var e=t.e,i=t.opt,a=this.w,s=null,r=this.ttCtx,o=0,n=0,l=0,h=0,c=0,d=e.target.classList;if(d.contains("apexcharts-bar-area")||d.contains("apexcharts-candlestick-area")||d.contains("apexcharts-boxPlot-area")||d.contains("apexcharts-rangebar-area")){var g=e.target,u=g.getBoundingClientRect(),p=i.elGrid.getBoundingClientRect(),f=u.height;c=u.height;var x=u.width,b=parseInt(g.getAttribute("cx"),10),v=parseInt(g.getAttribute("cy"),10);h=parseFloat(g.getAttribute("barWidth"));var m="touchmove"===e.type?e.touches[0].clientX:e.clientX;s=parseInt(g.getAttribute("j"),10),o=parseInt(g.parentNode.getAttribute("rel"),10)-1;var y=g.getAttribute("data-range-y1"),w=g.getAttribute("data-range-y2");a.globals.comboCharts&&(o=parseInt(g.parentNode.getAttribute("data:realIndex"),10)),r.tooltipLabels.drawSeriesTexts({ttItems:i.ttItems,i:o,j:s,y1:y?parseInt(y,10):null,y2:w?parseInt(w,10):null,shared:!r.showOnIntersect&&a.config.tooltip.shared,e:e}),a.config.tooltip.followCursor?a.globals.isBarHorizontal?(n=m-p.left+15,l=v-r.dataPointsDividedHeight+f/2-r.tooltipRect.ttHeight/2):(n=a.globals.isXNumeric?b-x/2:b-r.dataPointsDividedWidth+x/2,l=e.clientY-p.top-r.tooltipRect.ttHeight/2-15):a.globals.isBarHorizontal?((n=b)0&&i.setAttribute("width",e.xcrosshairsWidth)}},{key:"handleYCrosshair",value:function(){var t=this.w,e=this.ttCtx;e.ycrosshairs=t.globals.dom.baseEl.querySelector(".apexcharts-ycrosshairs"),e.ycrosshairsHidden=t.globals.dom.baseEl.querySelector(".apexcharts-ycrosshairs-hidden")}},{key:"drawYaxisTooltipText",value:function(t,e,i){var a=this.ttCtx,s=this.w,r=s.globals.yLabelFormatters[t];if(a.yaxisTooltips[t]){var o=a.getElGrid().getBoundingClientRect(),n=(e-o.top)*i.yRatio[t],l=s.globals.maxYArr[t]-s.globals.minYArr[t],h=s.globals.minYArr[t]+(l-n);a.tooltipPosition.moveYCrosshairs(e-o.top),a.yaxisTooltipText[t].innerHTML=r(h),a.tooltipPosition.moveYAxisTooltip(t)}}}]),t}(),bt=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w;var i=this.w;this.tConfig=i.config.tooltip,this.tooltipUtil=new dt(this),this.tooltipLabels=new gt(this),this.tooltipPosition=new ut(this),this.marker=new pt(this),this.intersect=new ft(this),this.axesTooltip=new xt(this),this.showOnIntersect=this.tConfig.intersect,this.showTooltipTitle=this.tConfig.x.show,this.fixedTooltip=this.tConfig.fixed.enabled,this.xaxisTooltip=null,this.yaxisTTEls=null,this.isBarShared=!i.globals.isBarHorizontal&&this.tConfig.shared,this.lastHoverTime=Date.now()}return r(t,[{key:"getElTooltip",value:function(t){return t||(t=this),t.w.globals.dom.baseEl.querySelector(".apexcharts-tooltip")}},{key:"getElXCrosshairs",value:function(){return this.w.globals.dom.baseEl.querySelector(".apexcharts-xcrosshairs")}},{key:"getElGrid",value:function(){return this.w.globals.dom.baseEl.querySelector(".apexcharts-grid")}},{key:"drawTooltip",value:function(t){var e=this.w;this.xyRatios=t,this.isXAxisTooltipEnabled=e.config.xaxis.tooltip.enabled&&e.globals.axisCharts,this.yaxisTooltips=e.config.yaxis.map((function(t,i){return!!(t.show&&t.tooltip.enabled&&e.globals.axisCharts)})),this.allTooltipSeriesGroups=[],e.globals.axisCharts||(this.showTooltipTitle=!1);var i=document.createElement("div");if(i.classList.add("apexcharts-tooltip"),i.classList.add("apexcharts-theme-".concat(this.tConfig.theme)),e.globals.dom.elWrap.appendChild(i),e.globals.axisCharts){this.axesTooltip.drawXaxisTooltip(),this.axesTooltip.drawYaxisTooltip(),this.axesTooltip.setXCrosshairWidth(),this.axesTooltip.handleYCrosshair();var a=new G(this.ctx);this.xAxisTicksPositions=a.getXAxisTicksPositions()}if(!e.globals.comboCharts&&!this.tConfig.intersect&&"rangeBar"!==e.config.chart.type||this.tConfig.shared||(this.showOnIntersect=!0),0!==e.config.markers.size&&0!==e.globals.markers.largestSize||this.marker.drawDynamicPoints(this),e.globals.collapsedSeries.length!==e.globals.series.length){this.dataPointsDividedHeight=e.globals.gridHeight/e.globals.dataPoints,this.dataPointsDividedWidth=e.globals.gridWidth/e.globals.dataPoints,this.showTooltipTitle&&(this.tooltipTitle=document.createElement("div"),this.tooltipTitle.classList.add("apexcharts-tooltip-title"),this.tooltipTitle.style.fontFamily=this.tConfig.style.fontFamily||e.config.chart.fontFamily,this.tooltipTitle.style.fontSize=this.tConfig.style.fontSize,i.appendChild(this.tooltipTitle));var s=e.globals.series.length;(e.globals.xyCharts||e.globals.comboCharts)&&this.tConfig.shared&&(s=this.showOnIntersect?1:e.globals.series.length),this.legendLabels=e.globals.dom.baseEl.querySelectorAll(".apexcharts-legend-text"),this.ttItems=this.createTTElements(s),this.addSVGEvents()}}},{key:"createTTElements",value:function(t){for(var e=this,i=this.w,a=[],s=this.getElTooltip(),r=function(r){var o=document.createElement("div");o.classList.add("apexcharts-tooltip-series-group"),o.style.order=i.config.tooltip.inverseOrder?t-r:r+1,e.tConfig.shared&&e.tConfig.enabledOnSeries&&Array.isArray(e.tConfig.enabledOnSeries)&&e.tConfig.enabledOnSeries.indexOf(r)<0&&o.classList.add("apexcharts-tooltip-series-group-hidden");var n=document.createElement("span");n.classList.add("apexcharts-tooltip-marker"),n.style.backgroundColor=i.globals.colors[r],o.appendChild(n);var l=document.createElement("div");l.classList.add("apexcharts-tooltip-text"),l.style.fontFamily=e.tConfig.style.fontFamily||i.config.chart.fontFamily,l.style.fontSize=e.tConfig.style.fontSize,["y","goals","z"].forEach((function(t){var e=document.createElement("div");e.classList.add("apexcharts-tooltip-".concat(t,"-group"));var i=document.createElement("span");i.classList.add("apexcharts-tooltip-text-".concat(t,"-label")),e.appendChild(i);var a=document.createElement("span");a.classList.add("apexcharts-tooltip-text-".concat(t,"-value")),e.appendChild(a),l.appendChild(e)})),o.appendChild(l),s.appendChild(o),a.push(o)},o=0;o0&&this.addPathsEventListeners(u,c),this.tooltipUtil.hasBars()&&!this.tConfig.shared&&this.addDatapointEventsListeners(c)}}},{key:"drawFixedTooltipRect",value:function(){var t=this.w,e=this.getElTooltip(),i=e.getBoundingClientRect(),a=i.width+10,s=i.height+10,r=this.tConfig.fixed.offsetX,o=this.tConfig.fixed.offsetY,n=this.tConfig.fixed.position.toLowerCase();return n.indexOf("right")>-1&&(r=r+t.globals.svgWidth-a+10),n.indexOf("bottom")>-1&&(o=o+t.globals.svgHeight-s-10),e.style.left=r+"px",e.style.top=o+"px",{x:r,y:o,ttWidth:a,ttHeight:s}}},{key:"addDatapointEventsListeners",value:function(t){var e=this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-series-markers .apexcharts-marker, .apexcharts-bar-area, .apexcharts-candlestick-area, .apexcharts-boxPlot-area, .apexcharts-rangebar-area");this.addPathsEventListeners(e,t)}},{key:"addPathsEventListeners",value:function(t,e){for(var i=this,a=function(a){var s={paths:t[a],tooltipEl:e.tooltipEl,tooltipY:e.tooltipY,tooltipX:e.tooltipX,elGrid:e.elGrid,hoverArea:e.hoverArea,ttItems:e.ttItems};["mousemove","mouseup","touchmove","mouseout","touchend"].map((function(e){return t[a].addEventListener(e,i.onSeriesHover.bind(i,s),{capture:!1,passive:!0})}))},s=0;s=100?this.seriesHover(t,e):(clearTimeout(this.seriesHoverTimeout),this.seriesHoverTimeout=setTimeout((function(){i.seriesHover(t,e)}),100-a))}},{key:"seriesHover",value:function(t,e){var i=this;this.lastHoverTime=Date.now();var a=[],s=this.w;s.config.chart.group&&(a=this.ctx.getGroupedCharts()),s.globals.axisCharts&&(s.globals.minX===-1/0&&s.globals.maxX===1/0||0===s.globals.dataPoints)||(a.length?a.forEach((function(a){var s=i.getElTooltip(a),r={paths:t.paths,tooltipEl:s,tooltipY:t.tooltipY,tooltipX:t.tooltipX,elGrid:t.elGrid,hoverArea:t.hoverArea,ttItems:a.w.globals.tooltip.ttItems};a.w.globals.minX===i.w.globals.minX&&a.w.globals.maxX===i.w.globals.maxX&&a.w.globals.tooltip.seriesHoverByContext({chartCtx:a,ttCtx:a.w.globals.tooltip,opt:r,e:e})})):this.seriesHoverByContext({chartCtx:this.ctx,ttCtx:this.w.globals.tooltip,opt:t,e:e}))}},{key:"seriesHoverByContext",value:function(t){var e=t.chartCtx,i=t.ttCtx,a=t.opt,s=t.e,r=e.w,o=this.getElTooltip();(i.tooltipRect={x:0,y:0,ttWidth:o.getBoundingClientRect().width,ttHeight:o.getBoundingClientRect().height},i.e=s,!i.tooltipUtil.hasBars()||r.globals.comboCharts||i.isBarShared)||this.tConfig.onDatasetHover.highlightDataSeries&&new z(e).toggleSeriesOnHover(s,s.target.parentNode);i.fixedTooltip&&i.drawFixedTooltipRect(),r.globals.axisCharts?i.axisChartsTooltips({e:s,opt:a,tooltipRect:i.tooltipRect}):i.nonAxisChartsTooltips({e:s,opt:a,tooltipRect:i.tooltipRect})}},{key:"axisChartsTooltips",value:function(t){var e,i,a=t.e,s=t.opt,r=this.w,o=s.elGrid.getBoundingClientRect(),n="touchmove"===a.type?a.touches[0].clientX:a.clientX,l="touchmove"===a.type?a.touches[0].clientY:a.clientY;if(this.clientY=l,this.clientX=n,r.globals.capturedSeriesIndex=-1,r.globals.capturedDataPointIndex=-1,lo.top+o.height)this.handleMouseOut(s);else{if(Array.isArray(this.tConfig.enabledOnSeries)&&!r.config.tooltip.shared){var h=parseInt(s.paths.getAttribute("index"),10);if(this.tConfig.enabledOnSeries.indexOf(h)<0)return void this.handleMouseOut(s)}var c=this.getElTooltip(),d=this.getElXCrosshairs(),g=r.globals.xyCharts||"bar"===r.config.chart.type&&!r.globals.isBarHorizontal&&this.tooltipUtil.hasBars()&&this.tConfig.shared||r.globals.comboCharts&&this.tooltipUtil.hasBars();if("mousemove"===a.type||"touchmove"===a.type||"mouseup"===a.type){null!==d&&d.classList.add("apexcharts-active");var u=this.yaxisTooltips.filter((function(t){return!0===t}));if(null!==this.ycrosshairs&&u.length&&this.ycrosshairs.classList.add("apexcharts-active"),g&&!this.showOnIntersect)this.handleStickyTooltip(a,n,l,s);else if("heatmap"===r.config.chart.type||"treemap"===r.config.chart.type){var p=this.intersect.handleHeatTreeTooltip({e:a,opt:s,x:e,y:i,type:r.config.chart.type});e=p.x,i=p.y,c.style.left=e+"px",c.style.top=i+"px"}else this.tooltipUtil.hasBars()&&this.intersect.handleBarTooltip({e:a,opt:s}),this.tooltipUtil.hasMarkers()&&this.intersect.handleMarkerTooltip({e:a,opt:s,x:e,y:i});if(this.yaxisTooltips.length)for(var f=0;fl.width?this.handleMouseOut(a):null!==n?this.handleStickyCapturedSeries(t,n,a,o):(this.tooltipUtil.isXoverlap(o)||s.globals.isBarHorizontal)&&this.create(t,this,0,o,a.ttItems)}},{key:"handleStickyCapturedSeries",value:function(t,e,i,a){var s=this.w;if(!this.tConfig.shared&&null===s.globals.series[e][a])return void this.handleMouseOut(i);void 0!==s.globals.series[e][a]?this.tConfig.shared&&this.tooltipUtil.isXoverlap(a)&&this.tooltipUtil.isInitialSeriesSameLen()?this.create(t,this,e,a,i.ttItems):this.create(t,this,e,a,i.ttItems,!1):this.tooltipUtil.isXoverlap(a)&&this.create(t,this,0,a,i.ttItems)}},{key:"deactivateHoverFilter",value:function(){for(var t=this.w,e=new b(this.ctx),i=t.globals.dom.Paper.select(".apexcharts-bar-area"),a=0;a5&&void 0!==arguments[5]?arguments[5]:null,o=this.w,n=e;"mouseup"===t.type&&this.markerClick(t,i,a),null===r&&(r=this.tConfig.shared);var l=this.tooltipUtil.hasMarkers(),h=this.tooltipUtil.getElBars();if(o.config.legend.tooltipHoverFormatter){var c=o.config.legend.tooltipHoverFormatter,d=Array.from(this.legendLabels);d.forEach((function(t){var e=t.getAttribute("data:default-text");t.innerHTML=decodeURIComponent(e)}));for(var g=0;g0?n.marker.enlargePoints(a):n.tooltipPosition.moveDynamicPointsOnHover(a)),this.tooltipUtil.hasBars()&&(this.barSeriesHeight=this.tooltipUtil.getBarsHeight(h),this.barSeriesHeight>0)){var v=new b(this.ctx),m=o.globals.dom.Paper.select(".apexcharts-bar-area[j='".concat(a,"']"));this.deactivateHoverFilter(),this.tooltipPosition.moveStickyTooltipOverBars(a);for(var y=0;y0&&(this.totalItems+=t[o].length);for(var n=this.graphics.group({class:"apexcharts-bar-series apexcharts-plot-series"}),l=0,h=0,c=function(r,o){var c=void 0,d=void 0,g=void 0,u=void 0,f=[],x=[],b=s.globals.comboCharts?i[r]:r;a.yRatio.length>1&&(a.yaxisIndex=b),a.isReversed=s.config.yaxis[a.yaxisIndex]&&s.config.yaxis[a.yaxisIndex].reversed;var v=a.graphics.group({class:"apexcharts-series",seriesName:p.escapeString(s.globals.seriesNames[b]),rel:r+1,"data:realIndex":b});a.ctx.series.addCollapsedClassToSeries(v,b);var m=a.graphics.group({class:"apexcharts-datalabels","data:realIndex":b}),y=0,w=0,k=a.initialPositions(l,h,c,d,g,u);h=k.y,y=k.barHeight,d=k.yDivision,u=k.zeroW,l=k.x,w=k.barWidth,c=k.xDivision,g=k.zeroH,a.yArrj=[],a.yArrjF=[],a.yArrjVal=[],a.xArrj=[],a.xArrjF=[],a.xArrjVal=[],1===a.prevY.length&&a.prevY[0].every((function(t){return isNaN(t)}))&&(a.prevY[0]=a.prevY[0].map((function(t){return g})),a.prevYF[0]=a.prevYF[0].map((function(t){return 0})));for(var A=0;A1?(i=l.globals.minXDiff/this.xRatio)*parseInt(this.barOptions.columnWidth,10)/100:n*parseInt(l.config.plotOptions.bar.columnWidth,10)/100,s=this.baseLineY[this.yaxisIndex]+(this.isReversed?l.globals.gridHeight:0)-(this.isReversed?2*this.baseLineY[this.yaxisIndex]:0),t=l.globals.padHorizontal+(i-n)/2),{x:t,y:e,yDivision:a,xDivision:i,barHeight:o,barWidth:n,zeroH:s,zeroW:r}}},{key:"drawStackedBarPaths",value:function(t){for(var e,i=t.indexes,a=t.barHeight,s=t.strokeWidth,r=t.zeroW,o=t.x,n=t.y,l=t.yDivision,h=t.elSeries,c=this.w,d=n,g=i.i,u=i.j,p=0,f=0;f0){var x=r;this.prevXVal[g-1][u]<0?x=this.series[g][u]>=0?this.prevX[g-1][u]+p-2*(this.isReversed?p:0):this.prevX[g-1][u]:this.prevXVal[g-1][u]>=0&&(x=this.series[g][u]>=0?this.prevX[g-1][u]:this.prevX[g-1][u]-p+2*(this.isReversed?p:0)),e=x}else e=r;o=null===this.series[g][u]?e:e+this.series[g][u]/this.invertedYRatio-2*(this.isReversed?this.series[g][u]/this.invertedYRatio:0);var b=this.barHelpers.getBarpaths({barYPosition:d,barHeight:a,x1:e,x2:o,strokeWidth:s,series:this.series,realIndex:i.realIndex,i:g,j:u,w:c});return this.barHelpers.barBackground({j:u,i:g,y1:d,y2:a,elSeries:h}),n+=l,{pathTo:b.pathTo,pathFrom:b.pathFrom,x:o,y:n}}},{key:"drawStackedColumnPaths",value:function(t){var e=t.indexes,i=t.x,a=t.y,s=t.xDivision,r=t.barWidth,o=t.zeroH;t.strokeWidth;var n=t.elSeries,l=this.w,h=e.i,c=e.j,d=e.bc;if(l.globals.isXNumeric){var g=l.globals.seriesX[h][c];g||(g=0),i=(g-l.globals.minX)/this.xRatio-r/2}for(var u,p=i,f=0,x=0;x0&&!l.globals.isXNumeric||h>0&&l.globals.isXNumeric&&l.globals.seriesX[h-1][c]===l.globals.seriesX[h][c]){var b,v,m=Math.min(this.yRatio.length+1,h+1);if(void 0!==this.prevY[h-1])for(var y=1;y=0?v-f+2*(this.isReversed?f:0):v;break}if(this.prevYVal[h-w][c]>=0){b=this.series[h][c]>=0?v:v+f-2*(this.isReversed?f:0);break}}void 0===b&&(b=l.globals.gridHeight),u=this.prevYF[0].every((function(t){return 0===t}))&&this.prevYF.slice(1,h).every((function(t){return t.every((function(t){return isNaN(t)}))}))?l.globals.gridHeight-o:b}else u=l.globals.gridHeight-o;a=u-this.series[h][c]/this.yRatio[this.yaxisIndex]+2*(this.isReversed?this.series[h][c]/this.yRatio[this.yaxisIndex]:0);var k=this.barHelpers.getColumnPaths({barXPosition:p,barWidth:r,y1:u,y2:a,yRatio:this.yRatio[this.yaxisIndex],strokeWidth:this.strokeWidth,series:this.series,realIndex:e.realIndex,i:h,j:c,w:l});return this.barHelpers.barBackground({bc:d,j:c,i:h,x1:p,x2:r,elSeries:n}),i+=s,{pathTo:k.pathTo,pathFrom:k.pathFrom,x:l.globals.isXNumeric?i-s:i,y:a}}}]),s}(E),mt=function(t){n(s,t);var i=d(s);function s(){return a(this,s),i.apply(this,arguments)}return r(s,[{key:"draw",value:function(t,i){var a=this,s=this.w,r=new b(this.ctx),o=new L(this.ctx);this.candlestickOptions=this.w.config.plotOptions.candlestick,this.boxOptions=this.w.config.plotOptions.boxPlot,this.isHorizontal=s.config.plotOptions.bar.horizontal;var n=new y(this.ctx,s);t=n.getLogSeries(t),this.series=t,this.yRatio=n.getLogYRatios(this.yRatio),this.barHelpers.initVariables(t);for(var l=r.group({class:"apexcharts-".concat(s.config.chart.type,"-series apexcharts-plot-series")}),h=function(n){a.isBoxPlot="boxPlot"===s.config.chart.type||"boxPlot"===s.config.series[n].type;var h,c,d,g,u=void 0,f=void 0,x=[],b=[],v=s.globals.comboCharts?i[n]:n,m=r.group({class:"apexcharts-series",seriesName:p.escapeString(s.globals.seriesNames[v]),rel:n+1,"data:realIndex":v});a.ctx.series.addCollapsedClassToSeries(m,v),t[n].length>0&&(a.visibleI=a.visibleI+1);var y,w;a.yRatio.length>1&&(a.yaxisIndex=v);var k=a.barHelpers.initialPositions();f=k.y,y=k.barHeight,c=k.yDivision,g=k.zeroW,u=k.x,w=k.barWidth,h=k.xDivision,d=k.zeroH,b.push(u+w/2);for(var A=r.group({class:"apexcharts-datalabels","data:realIndex":v}),S=function(i){var r=a.barHelpers.getStrokeWidth(n,i,v),l=null,p={indexes:{i:n,j:i,realIndex:v},x:u,y:f,strokeWidth:r,elSeries:m};l=a.isHorizontal?a.drawHorizontalBoxPaths(e(e({},p),{},{yDivision:c,barHeight:y,zeroW:g})):a.drawVerticalBoxPaths(e(e({},p),{},{xDivision:h,barWidth:w,zeroH:d})),f=l.y,u=l.x,i>0&&b.push(u+w/2),x.push(f),l.pathTo.forEach((function(e,h){var c=!a.isBoxPlot&&a.candlestickOptions.wick.useFillColor?l.color[h]:s.globals.stroke.colors[n],d=o.fillPath({seriesNumber:v,dataPointIndex:i,color:l.color[h],value:t[n][i]});a.renderSeries({realIndex:v,pathFill:d,lineFill:c,j:i,i:n,pathFrom:l.pathFrom,pathTo:e,strokeWidth:r,elSeries:m,x:u,y:f,series:t,barHeight:y,barWidth:w,elDataLabelsWrap:A,visibleSeries:a.visibleI,type:s.config.chart.type})}))},C=0;Cv.c&&(d=!1);var w=Math.min(v.o,v.c),k=Math.max(v.o,v.c),A=v.m;n.globals.isXNumeric&&(i=(n.globals.seriesX[x][c]-n.globals.minX)/this.xRatio-s/2);var S=i+s*this.visibleI;void 0===this.series[h][c]||null===this.series[h][c]?(w=r,k=r):(w=r-w/f,k=r-k/f,m=r-v.h/f,y=r-v.l/f,A=r-v.m/f);var C=l.move(S,r),L=l.move(S+s/2,w);return n.globals.previousPaths.length>0&&(L=this.getPreviousPath(x,c,!0)),C=this.isBoxPlot?[l.move(S,w)+l.line(S+s/2,w)+l.line(S+s/2,m)+l.line(S+s/4,m)+l.line(S+s-s/4,m)+l.line(S+s/2,m)+l.line(S+s/2,w)+l.line(S+s,w)+l.line(S+s,A)+l.line(S,A)+l.line(S,w+o/2),l.move(S,A)+l.line(S+s,A)+l.line(S+s,k)+l.line(S+s/2,k)+l.line(S+s/2,y)+l.line(S+s-s/4,y)+l.line(S+s/4,y)+l.line(S+s/2,y)+l.line(S+s/2,k)+l.line(S,k)+l.line(S,A)+"z"]:[l.move(S,k)+l.line(S+s/2,k)+l.line(S+s/2,m)+l.line(S+s/2,k)+l.line(S+s,k)+l.line(S+s,w)+l.line(S+s/2,w)+l.line(S+s/2,y)+l.line(S+s/2,w)+l.line(S,w)+l.line(S,k-o/2)],L+=l.move(S,w),n.globals.isXNumeric||(i+=a),{pathTo:C,pathFrom:L,x:i,y:k,barXPosition:S,color:this.isBoxPlot?p:d?[g]:[u]}}},{key:"drawHorizontalBoxPaths",value:function(t){var e=t.indexes;t.x;var i=t.y,a=t.yDivision,s=t.barHeight,r=t.zeroW,o=t.strokeWidth,n=this.w,l=new b(this.ctx),h=e.i,c=e.j,d=this.boxOptions.colors.lower;this.isBoxPlot&&(d=[this.boxOptions.colors.lower,this.boxOptions.colors.upper]);var g=this.invertedYRatio,u=e.realIndex,p=this.getOHLCValue(u,c),f=r,x=r,v=Math.min(p.o,p.c),m=Math.max(p.o,p.c),y=p.m;n.globals.isXNumeric&&(i=(n.globals.seriesX[u][c]-n.globals.minX)/this.invertedXRatio-s/2);var w=i+s*this.visibleI;void 0===this.series[h][c]||null===this.series[h][c]?(v=r,m=r):(v=r+v/g,m=r+m/g,f=r+p.h/g,x=r+p.l/g,y=r+p.m/g);var k=l.move(r,w),A=l.move(v,w+s/2);return n.globals.previousPaths.length>0&&(A=this.getPreviousPath(u,c,!0)),k=[l.move(v,w)+l.line(v,w+s/2)+l.line(f,w+s/2)+l.line(f,w+s/2-s/4)+l.line(f,w+s/2+s/4)+l.line(f,w+s/2)+l.line(v,w+s/2)+l.line(v,w+s)+l.line(y,w+s)+l.line(y,w)+l.line(v+o/2,w),l.move(y,w)+l.line(y,w+s)+l.line(m,w+s)+l.line(m,w+s/2)+l.line(x,w+s/2)+l.line(x,w+s-s/4)+l.line(x,w+s/4)+l.line(x,w+s/2)+l.line(m,w+s/2)+l.line(m,w)+l.line(y,w)+"z"],A+=l.move(v,w),n.globals.isXNumeric||(i+=a),{pathTo:k,pathFrom:A,x:m,y:i,barYPosition:w,color:d}}},{key:"getOHLCValue",value:function(t,e){var i=this.w;return{o:this.isBoxPlot?i.globals.seriesCandleH[t][e]:i.globals.seriesCandleO[t][e],h:this.isBoxPlot?i.globals.seriesCandleO[t][e]:i.globals.seriesCandleH[t][e],m:i.globals.seriesCandleM[t][e],l:this.isBoxPlot?i.globals.seriesCandleC[t][e]:i.globals.seriesCandleL[t][e],c:this.isBoxPlot?i.globals.seriesCandleL[t][e]:i.globals.seriesCandleC[t][e]}}}]),s}(E),yt=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"checkColorRange",value:function(){var t=this.w,e=!1,i=t.config.plotOptions[t.config.chart.type];return i.colorScale.ranges.length>0&&i.colorScale.ranges.map((function(t,i){t.from<=0&&(e=!0)})),e}},{key:"getShadeColor",value:function(t,e,i,a){var s=this.w,r=1,o=s.config.plotOptions[t].shadeIntensity,n=this.determineColor(t,e,i);s.globals.hasNegs||a?r=s.config.plotOptions[t].reverseNegativeShade?n.percent<0?n.percent/100*(1.25*o):(1-n.percent/100)*(1.25*o):n.percent<=0?1-(1+n.percent/100)*o:(1-n.percent/100)*o:(r=1-n.percent/100,"treemap"===t&&(r=(1-n.percent/100)*(1.25*o)));var l=n.color,h=new p;return s.config.plotOptions[t].enableShades&&(l="dark"===this.w.config.theme.mode?p.hexToRgba(h.shadeColor(-1*r,n.color),s.config.fill.opacity):p.hexToRgba(h.shadeColor(r,n.color),s.config.fill.opacity)),{color:l,colorProps:n}}},{key:"determineColor",value:function(t,e,i){var a=this.w,s=a.globals.series[e][i],r=a.config.plotOptions[t],o=r.colorScale.inverse?i:e;a.config.plotOptions[t].distributed&&(o=i);var n=a.globals.colors[o],l=null,h=Math.min.apply(Math,g(a.globals.series[e])),c=Math.max.apply(Math,g(a.globals.series[e]));r.distributed||"heatmap"!==t||(h=a.globals.minY,c=a.globals.maxY),void 0!==r.colorScale.min&&(h=r.colorScale.mina.globals.maxY?r.colorScale.max:a.globals.maxY);var d=Math.abs(c)+Math.abs(h),u=100*s/(0===d?d-1e-6:d);r.colorScale.ranges.length>0&&r.colorScale.ranges.map((function(t,e){if(s>=t.from&&s<=t.to){n=t.color,l=t.foreColor?t.foreColor:null,h=t.from,c=t.to;var i=Math.abs(c)+Math.abs(h);u=100*s/(0===i?i-1e-6:i)}}));return{color:n,foreColor:l,percent:u}}},{key:"calculateDataLabels",value:function(t){var e=t.text,i=t.x,a=t.y,s=t.i,r=t.j,o=t.colorProps,n=t.fontSize,l=this.w.config.dataLabels,h=new b(this.ctx),c=new M(this.ctx),d=null;if(l.enabled){d=h.group({class:"apexcharts-data-labels"});var g=l.offsetX,u=l.offsetY,p=i+g,f=a+parseFloat(l.style.fontSize)/3+u;c.plotDataLabelsText({x:p,y:f,text:e,i:s,j:r,color:o.foreColor,parent:d,fontSize:n,dataLabelsConfig:l})}return d}},{key:"addListeners",value:function(t){var e=new b(this.ctx);t.node.addEventListener("mouseenter",e.pathMouseEnter.bind(this,t)),t.node.addEventListener("mouseleave",e.pathMouseLeave.bind(this,t)),t.node.addEventListener("mousedown",e.pathMouseDown.bind(this,t))}}]),t}(),wt=function(){function t(e,i){a(this,t),this.ctx=e,this.w=e.w,this.xRatio=i.xRatio,this.yRatio=i.yRatio,this.dynamicAnim=this.w.config.chart.animations.dynamicAnimation,this.helpers=new yt(e),this.rectRadius=this.w.config.plotOptions.heatmap.radius,this.strokeWidth=this.w.config.stroke.show?this.w.config.stroke.width:0}return r(t,[{key:"draw",value:function(t){var e=this.w,i=new b(this.ctx),a=i.group({class:"apexcharts-heatmap"});a.attr("clip-path","url(#gridRectMask".concat(e.globals.cuid,")"));var s=e.globals.gridWidth/e.globals.dataPoints,r=e.globals.gridHeight/e.globals.series.length,o=0,n=!1;this.negRange=this.helpers.checkColorRange();var l=t.slice();e.config.yaxis[0].reversed&&(n=!0,l.reverse());for(var h=n?0:l.length-1;n?h=0;n?h++:h--){var c=i.group({class:"apexcharts-series apexcharts-heatmap-series",seriesName:p.escapeString(e.globals.seriesNames[h]),rel:h+1,"data:realIndex":h});if(this.ctx.series.addCollapsedClassToSeries(c,h),e.config.chart.dropShadow.enabled){var d=e.config.chart.dropShadow;new x(this.ctx).dropShadow(c,d,h)}for(var g=0,u=e.config.plotOptions.heatmap.shadeIntensity,f=0;f-1&&this.pieClicked(d),i.config.dataLabels.enabled){var A=w.x,S=w.y,C=100*u/this.fullAngle+"%";if(0!==u&&i.config.plotOptions.pie.dataLabels.minAngleToShowLabelthis.fullAngle?e.endAngle=e.endAngle-(a+o):a+o=this.fullAngle+this.w.config.plotOptions.pie.startAngle%this.fullAngle&&(n=this.fullAngle+this.w.config.plotOptions.pie.startAngle%this.fullAngle-.01),Math.ceil(n)>this.fullAngle&&(n-=this.fullAngle);var l=Math.PI*(n-90)/180,h=e.centerX+s*Math.cos(o),c=e.centerY+s*Math.sin(o),d=e.centerX+s*Math.cos(l),g=e.centerY+s*Math.sin(l),u=p.polarToCartesian(e.centerX,e.centerY,e.donutSize,n),f=p.polarToCartesian(e.centerX,e.centerY,e.donutSize,r),x=a>180?1:0,b=["M",h,c,"A",s,s,0,x,1,d,g];return"donut"===e.chartType?[].concat(b,["L",u.x,u.y,"A",e.donutSize,e.donutSize,0,x,0,f.x,f.y,"L",h,c,"z"]).join(" "):"pie"===e.chartType||"polarArea"===e.chartType?[].concat(b,["L",e.centerX,e.centerY,"L",h,c]).join(" "):[].concat(b).join(" ")}},{key:"drawPolarElements",value:function(t){var e=this.w,i=new j(this.ctx),a=new b(this.ctx),s=new kt(this.ctx),r=a.group(),o=a.group(),n=i.niceScale(0,Math.ceil(this.maxY),e.config.yaxis[0].tickAmount,0,!0),l=n.result.reverse(),h=n.result.length;this.maxY=n.niceMax;for(var c=e.globals.radialSize,d=c/(h-1),g=0;g1&&t.total.show&&(s=t.total.color);var o=r.globals.dom.baseEl.querySelector(".apexcharts-datalabel-label"),n=r.globals.dom.baseEl.querySelector(".apexcharts-datalabel-value");i=(0,t.value.formatter)(i,r),a||"function"!=typeof t.total.formatter||(i=t.total.formatter(r));var l=e===t.total.label;e=t.name.formatter(e,l,r),null!==o&&(o.textContent=e),null!==n&&(n.textContent=i),null!==o&&(o.style.fill=s)}},{key:"printDataLabelsInner",value:function(t,e){var i=this.w,a=t.getAttribute("data:value"),s=i.globals.seriesNames[parseInt(t.parentNode.getAttribute("rel"),10)-1];i.globals.series.length>1&&this.printInnerLabels(e,s,a,t);var r=i.globals.dom.baseEl.querySelector(".apexcharts-datalabels-group");null!==r&&(r.style.opacity=1)}},{key:"drawSpokes",value:function(t){var e=this,i=this.w,a=new b(this.ctx),s=i.config.plotOptions.polarArea.spokes;if(0!==s.strokeWidth){for(var r=[],o=360/i.globals.series.length,n=0;n1)o&&!e.total.showAlways?l({makeSliceOut:!1,printLabel:!0}):this.printInnerLabels(e,e.total.label,e.total.formatter(s));else if(l({makeSliceOut:!1,printLabel:!0}),!o)if(s.globals.selectedDataPoints.length&&s.globals.series.length>1)if(s.globals.selectedDataPoints[0].length>0){var h=s.globals.selectedDataPoints[0],c=s.globals.dom.baseEl.querySelector(".apexcharts-".concat(this.chartType.toLowerCase(),"-slice-").concat(h));this.printDataLabelsInner(c,e)}else r&&s.globals.selectedDataPoints.length&&0===s.globals.selectedDataPoints[0].length&&(r.style.opacity=0);else r&&s.globals.series.length>1&&(r.style.opacity=0)}}]),t}(),St=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.chartType=this.w.config.chart.type,this.initialAnim=this.w.config.chart.animations.enabled,this.dynamicAnim=this.initialAnim&&this.w.config.chart.animations.dynamicAnimation.enabled,this.animDur=0;var i=this.w;this.graphics=new b(this.ctx),this.lineColorArr=void 0!==i.globals.stroke.colors?i.globals.stroke.colors:i.globals.colors,this.defaultSize=i.globals.svgHeight0&&(b=i.getPreviousPath(n));for(var v=0;v=10?t.x>0?(i="start",a+=10):t.x<0&&(i="end",a-=10):i="middle",Math.abs(t.y)>=e-10&&(t.y<0?s-=10:t.y>0&&(s+=10)),{textAnchor:i,newX:a,newY:s}}},{key:"getPreviousPath",value:function(t){for(var e=this.w,i=null,a=0;a0&&parseInt(s.realIndex,10)===parseInt(t,10)&&void 0!==e.globals.previousPaths[a].paths[0]&&(i=e.globals.previousPaths[a].paths[0].d)}return i}},{key:"getDataPointsPos",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.dataPointsLen;t=t||[],e=e||[];for(var a=[],s=0;s=360&&(g=360-Math.abs(this.startAngle)-.1);var u=i.drawPath({d:"",stroke:c,strokeWidth:o*parseInt(h.strokeWidth,10)/100,fill:"none",strokeOpacity:h.opacity,classes:"apexcharts-radialbar-area"});if(h.dropShadow.enabled){var p=h.dropShadow;s.dropShadow(u,p)}l.add(u),u.attr("id","apexcharts-radialbarTrack-"+n),this.animatePaths(u,{centerX:t.centerX,centerY:t.centerY,endAngle:g,startAngle:d,size:t.size,i:n,totalItems:2,animBeginArr:0,dur:0,isTrack:!0,easing:e.globals.easing})}return a}},{key:"drawArcs",value:function(t){var e=this.w,i=new b(this.ctx),a=new L(this.ctx),s=new x(this.ctx),r=i.group(),o=this.getStrokeWidth(t);t.size=t.size-o/2;var n=e.config.plotOptions.radialBar.hollow.background,l=t.size-o*t.series.length-this.margin*t.series.length-o*parseInt(e.config.plotOptions.radialBar.track.strokeWidth,10)/100/2,h=l-e.config.plotOptions.radialBar.hollow.margin;void 0!==e.config.plotOptions.radialBar.hollow.image&&(n=this.drawHollowImage(t,r,l,n));var c=this.drawHollow({size:h,centerX:t.centerX,centerY:t.centerY,fill:n||"transparent"});if(e.config.plotOptions.radialBar.hollow.dropShadow.enabled){var d=e.config.plotOptions.radialBar.hollow.dropShadow;s.dropShadow(c,d)}var g=1;!this.radialDataLabels.total.show&&e.globals.series.length>1&&(g=0);var u=null;this.radialDataLabels.show&&(u=this.renderInnerDataLabels(this.radialDataLabels,{hollowSize:l,centerX:t.centerX,centerY:t.centerY,opacity:g})),"back"===e.config.plotOptions.radialBar.hollow.position&&(r.add(c),u&&r.add(u));var f=!1;e.config.plotOptions.radialBar.inverseOrder&&(f=!0);for(var v=f?t.series.length-1:0;f?v>=0:v100?100:t.series[v])/100,S=Math.round(this.totalAngle*A)+this.startAngle,C=void 0;e.globals.dataChanged&&(k=this.startAngle,C=Math.round(this.totalAngle*p.negToZero(e.globals.previousPaths[v])/100)+k),Math.abs(S)+Math.abs(w)>=360&&(S-=.01),Math.abs(C)+Math.abs(k)>=360&&(C-=.01);var P=S-w,T=Array.isArray(e.config.stroke.dashArray)?e.config.stroke.dashArray[v]:e.config.stroke.dashArray,M=i.drawPath({d:"",stroke:y,strokeWidth:o,fill:"none",fillOpacity:e.config.fill.opacity,classes:"apexcharts-radialbar-area apexcharts-radialbar-slice-"+v,strokeDashArray:T});if(b.setAttrs(M.node,{"data:angle":P,"data:value":t.series[v]}),e.config.chart.dropShadow.enabled){var I=e.config.chart.dropShadow;s.dropShadow(M,I,v)}s.setSelectionFilter(M,0,v),this.addListeners(M,this.radialDataLabels),m.add(M),M.attr({index:0,j:v});var z=0;!this.initialAnim||e.globals.resized||e.globals.dataChanged||(z=(S-w)/360*e.config.chart.animations.speed,this.animDur=z/(1.2*t.series.length)+this.animDur,this.animBeginArr.push(this.animDur)),e.globals.dataChanged&&(z=(S-w)/360*e.config.chart.animations.dynamicAnimation.speed,this.animDur=z/(1.2*t.series.length)+this.animDur,this.animBeginArr.push(this.animDur)),this.animatePaths(M,{centerX:t.centerX,centerY:t.centerY,endAngle:S,startAngle:w,prevEndAngle:C,prevStartAngle:k,size:t.size,i:v,totalItems:2,animBeginArr:this.animBeginArr,dur:z,shouldSetPrevPaths:!0,easing:e.globals.easing})}return{g:r,elHollow:c,dataLabels:u}}},{key:"drawHollow",value:function(t){var e=new b(this.ctx).drawCircle(2*t.size);return e.attr({class:"apexcharts-radialbar-hollow",cx:t.centerX,cy:t.centerY,r:t.size,fill:t.fill}),e}},{key:"drawHollowImage",value:function(t,e,i,a){var s=this.w,r=new L(this.ctx),o=p.randomId(),n=s.config.plotOptions.radialBar.hollow.image;if(s.config.plotOptions.radialBar.hollow.imageClipped)r.clippedImgArea({width:i,height:i,image:n,patternID:"pattern".concat(s.globals.cuid).concat(o)}),a="url(#pattern".concat(s.globals.cuid).concat(o,")");else{var l=s.config.plotOptions.radialBar.hollow.imageWidth,h=s.config.plotOptions.radialBar.hollow.imageHeight;if(void 0===l&&void 0===h){var c=s.globals.dom.Paper.image(n).loaded((function(e){this.move(t.centerX-e.width/2+s.config.plotOptions.radialBar.hollow.imageOffsetX,t.centerY-e.height/2+s.config.plotOptions.radialBar.hollow.imageOffsetY)}));e.add(c)}else{var d=s.globals.dom.Paper.image(n).loaded((function(e){this.move(t.centerX-l/2+s.config.plotOptions.radialBar.hollow.imageOffsetX,t.centerY-h/2+s.config.plotOptions.radialBar.hollow.imageOffsetY),this.size(l,h)}));e.add(d)}}return a}},{key:"getStrokeWidth",value:function(t){var e=this.w;return t.size*(100-parseInt(e.config.plotOptions.radialBar.hollow.size,10))/100/(t.series.length+1)-this.margin}}]),i}(At),Lt=function(){function t(e){a(this,t),this.w=e.w,this.lineCtx=e}return r(t,[{key:"sameValueSeriesFix",value:function(t,e){var i=this.w;if("line"===i.config.chart.type&&("gradient"===i.config.fill.type||"gradient"===i.config.fill.type[t])&&new y(this.lineCtx.ctx,i).seriesHaveSameValues(t)){var a=e[t].slice();a[a.length-1]=a[a.length-1]+1e-6,e[t]=a}return e}},{key:"calculatePoints",value:function(t){var e=t.series,i=t.realIndex,a=t.x,s=t.y,r=t.i,o=t.j,n=t.prevY,l=this.w,h=[],c=[];if(0===o){var d=this.lineCtx.categoryAxisCorrection+l.config.markers.offsetX;l.globals.isXNumeric&&(d=(l.globals.seriesX[i][0]-l.globals.minX)/this.lineCtx.xRatio+l.config.markers.offsetX),h.push(d),c.push(p.isNumber(e[r][0])?n+l.config.markers.offsetY:null),h.push(a+l.config.markers.offsetX),c.push(p.isNumber(e[r][o+1])?s+l.config.markers.offsetY:null)}else h.push(a+l.config.markers.offsetX),c.push(p.isNumber(e[r][o+1])?s+l.config.markers.offsetY:null);return{x:h,y:c}}},{key:"checkPreviousPaths",value:function(t){for(var e=t.pathFromLine,i=t.pathFromArea,a=t.realIndex,s=this.w,r=0;r0&&parseInt(o.realIndex,10)===parseInt(a,10)&&("line"===o.type?(this.lineCtx.appendPathFrom=!1,e=s.globals.previousPaths[r].paths[0].d):"area"===o.type&&(this.lineCtx.appendPathFrom=!1,i=s.globals.previousPaths[r].paths[0].d,s.config.stroke.show&&s.globals.previousPaths[r].paths[1]&&(e=s.globals.previousPaths[r].paths[1].d)))}return{pathFromLine:e,pathFromArea:i}}},{key:"determineFirstPrevY",value:function(t){var e=t.i,i=t.series,a=t.prevY,s=t.lineYPosition,r=this.w;if(void 0!==i[e][0])a=(s=r.config.chart.stacked&&e>0?this.lineCtx.prevSeriesY[e-1][0]:this.lineCtx.zeroY)-i[e][0]/this.lineCtx.yRatio[this.lineCtx.yaxisIndex]+2*(this.lineCtx.isReversed?i[e][0]/this.lineCtx.yRatio[this.lineCtx.yaxisIndex]:0);else if(r.config.chart.stacked&&e>0&&void 0===i[e][0])for(var o=e-1;o>=0;o--)if(null!==i[o][0]&&void 0!==i[o][0]){a=s=this.lineCtx.prevSeriesY[o][0];break}return{prevY:a,lineYPosition:s}}}]),t}(),Pt=function(){function t(e,i,s){a(this,t),this.ctx=e,this.w=e.w,this.xyRatios=i,this.pointsChart=!("bubble"!==this.w.config.chart.type&&"scatter"!==this.w.config.chart.type)||s,this.scatter=new T(this.ctx),this.noNegatives=this.w.globals.minX===Number.MAX_VALUE,this.lineHelpers=new Lt(this),this.markers=new P(this.ctx),this.prevSeriesY=[],this.categoryAxisCorrection=0,this.yaxisIndex=0}return r(t,[{key:"draw",value:function(t,e,i){var a=this.w,s=new b(this.ctx),r=a.globals.comboCharts?e:a.config.chart.type,o=s.group({class:"apexcharts-".concat(r,"-series apexcharts-plot-series")}),n=new y(this.ctx,a);this.yRatio=this.xyRatios.yRatio,this.zRatio=this.xyRatios.zRatio,this.xRatio=this.xyRatios.xRatio,this.baseLineY=this.xyRatios.baseLineY,t=n.getLogSeries(t),this.yRatio=n.getLogYRatios(this.yRatio);for(var l=[],h=0;h0&&(u=(a.globals.seriesX[c][0]-a.globals.minX)/this.xRatio),g.push(u);var p,f=u,x=f,v=this.zeroY;v=this.lineHelpers.determineFirstPrevY({i:h,series:t,prevY:v,lineYPosition:0}).prevY,d.push(v),p=v;var m=this._calculatePathsFrom({series:t,i:h,realIndex:c,prevX:x,prevY:v}),w=this._iterateOverDataPoints({series:t,realIndex:c,i:h,x:u,y:1,pX:f,pY:p,pathsFrom:m,linePaths:[],areaPaths:[],seriesIndex:i,lineYPosition:0,xArrj:g,yArrj:d});this._handlePaths({type:r,realIndex:c,i:h,paths:w}),this.elSeries.add(this.elPointsMain),this.elSeries.add(this.elDataLabelsWrap),l.push(this.elSeries)}if(a.config.chart.stacked)for(var k=l.length;k>0;k--)o.add(l[k-1]);else for(var A=0;A1&&(this.yaxisIndex=i),this.isReversed=a.config.yaxis[this.yaxisIndex]&&a.config.yaxis[this.yaxisIndex].reversed,this.zeroY=a.globals.gridHeight-this.baseLineY[this.yaxisIndex]-(this.isReversed?a.globals.gridHeight:0)+(this.isReversed?2*this.baseLineY[this.yaxisIndex]:0),this.areaBottomY=this.zeroY,(this.zeroY>a.globals.gridHeight||"end"===a.config.plotOptions.area.fillTo)&&(this.areaBottomY=a.globals.gridHeight),this.categoryAxisCorrection=this.xDivision/2,this.elSeries=s.group({class:"apexcharts-series",seriesName:p.escapeString(a.globals.seriesNames[i])}),this.elPointsMain=s.group({class:"apexcharts-series-markers-wrap","data:realIndex":i}),this.elDataLabelsWrap=s.group({class:"apexcharts-datalabels","data:realIndex":i});var r=t[e].length===a.globals.dataPoints;this.elSeries.attr({"data:longestSeries":r,rel:e+1,"data:realIndex":i}),this.appendPathFrom=!0}},{key:"_calculatePathsFrom",value:function(t){var e,i,a,s,r=t.series,o=t.i,n=t.realIndex,l=t.prevX,h=t.prevY,c=this.w,d=new b(this.ctx);if(null===r[o][0]){for(var g=0;g0){var u=this.lineHelpers.checkPreviousPaths({pathFromLine:a,pathFromArea:s,realIndex:n});a=u.pathFromLine,s=u.pathFromArea}return{prevX:l,prevY:h,linePath:e,areaPath:i,pathFromLine:a,pathFromArea:s}}},{key:"_handlePaths",value:function(t){var i=t.type,a=t.realIndex,s=t.i,r=t.paths,o=this.w,n=new b(this.ctx),l=new L(this.ctx);this.prevSeriesY.push(r.yArrj),o.globals.seriesXvalues[a]=r.xArrj,o.globals.seriesYvalues[a]=r.yArrj;var h=o.config.forecastDataPoints;if(h.count>0){var c=o.globals.seriesXvalues[a][o.globals.seriesXvalues[a].length-h.count-1],d=n.drawRect(c,0,o.globals.gridWidth,o.globals.gridHeight,0);o.globals.dom.elForecastMask.appendChild(d.node);var g=n.drawRect(0,0,c,o.globals.gridHeight,0);o.globals.dom.elNonForecastMask.appendChild(g.node)}this.pointsChart||o.globals.delayedElements.push({el:this.elPointsMain.node,index:a});var u={i:s,realIndex:a,animationDelay:s,initialSpeed:o.config.chart.animations.speed,dataChangeSpeed:o.config.chart.animations.dynamicAnimation.speed,className:"apexcharts-".concat(i)};if("area"===i)for(var p=l.fillPath({seriesNumber:a}),f=0;f0){var k=n.renderPaths(y);k.node.setAttribute("stroke-dasharray",h.dashArray),h.strokeWidth&&k.node.setAttribute("stroke-width",h.strokeWidth),this.elSeries.add(k),k.attr("clip-path","url(#forecastMask".concat(o.globals.cuid,")")),w.attr("clip-path","url(#nonForecastMask".concat(o.globals.cuid,")"))}}}}},{key:"_iterateOverDataPoints",value:function(t){for(var e=t.series,i=t.realIndex,a=t.i,s=t.x,r=t.y,o=t.pX,n=t.pY,l=t.pathsFrom,h=t.linePaths,c=t.areaPaths,d=t.seriesIndex,g=t.lineYPosition,u=t.xArrj,f=t.yArrj,x=this.w,v=new b(this.ctx),m=this.yRatio,y=l.prevY,w=l.linePath,k=l.areaPath,A=l.pathFromLine,S=l.pathFromArea,C=p.isNumber(x.globals.minYArr[i])?x.globals.minYArr[i]:x.globals.minY,L=x.globals.dataPoints>1?x.globals.dataPoints-1:x.globals.dataPoints,P=0;P0&&x.globals.collapsedSeries.length-1){e--;break}return e>=0?e:0}(a-1)][P+1]}else g=this.zeroY;else g=this.zeroY;r=T?g-C/m[this.yaxisIndex]+2*(this.isReversed?C/m[this.yaxisIndex]:0):g-e[a][P+1]/m[this.yaxisIndex]+2*(this.isReversed?e[a][P+1]/m[this.yaxisIndex]:0),u.push(s),f.push(r);var I=this.lineHelpers.calculatePoints({series:e,x:s,y:r,realIndex:i,i:a,j:P,prevY:y}),z=this._createPaths({series:e,i:a,realIndex:i,j:P,x:s,y:r,pX:o,pY:n,linePath:w,areaPath:k,linePaths:h,areaPaths:c,seriesIndex:d});c=z.areaPaths,h=z.linePaths,o=z.pX,n=z.pY,k=z.areaPath,w=z.linePath,this.appendPathFrom&&(A+=v.line(s,this.zeroY),S+=v.line(s,this.zeroY)),this.handleNullDataPoints(e,I,a,P,i),this._handleMarkersAndLabels({pointsPos:I,series:e,x:s,y:r,prevY:y,i:a,j:P,realIndex:i})}return{yArrj:f,xArrj:u,pathFromArea:S,areaPaths:c,pathFromLine:A,linePaths:h}}},{key:"_handleMarkersAndLabels",value:function(t){var e=t.pointsPos;t.series,t.x,t.y,t.prevY;var i=t.i,a=t.j,s=t.realIndex,r=this.w,o=new M(this.ctx);if(this.pointsChart)this.scatter.draw(this.elSeries,a,{realIndex:s,pointsPos:e,zRatio:this.zRatio,elParent:this.elPointsMain});else{r.globals.series[i].length>1&&this.elPointsMain.node.classList.add("apexcharts-element-hidden");var n=this.markers.plotChartMarkers(e,s,a+1);null!==n&&this.elPointsMain.add(n)}var l=o.drawDataLabel(e,s,a+1,null);null!==l&&this.elDataLabelsWrap.add(l)}},{key:"_createPaths",value:function(t){var e=t.series,i=t.i,a=t.realIndex,s=t.j,r=t.x,o=t.y,n=t.pX,l=t.pY,h=t.linePath,c=t.areaPath,d=t.linePaths,g=t.areaPaths,u=t.seriesIndex,p=this.w,f=new b(this.ctx),x=p.config.stroke.curve,v=this.areaBottomY;if(Array.isArray(p.config.stroke.curve)&&(x=Array.isArray(u)?p.config.stroke.curve[u[i]]:p.config.stroke.curve[i]),"smooth"===x){var m=.35*(r-n);p.globals.hasNullValues?(null!==e[i][s]&&(null!==e[i][s+1]?(h=f.move(n,l)+f.curve(n+m,l,r-m,o,r+1,o),c=f.move(n+1,l)+f.curve(n+m,l,r-m,o,r+1,o)+f.line(r,v)+f.line(n,v)+"z"):(h=f.move(n,l),c=f.move(n,l)+"z")),d.push(h),g.push(c)):(h+=f.curve(n+m,l,r-m,o,r,o),c+=f.curve(n+m,l,r-m,o,r,o)),n=r,l=o,s===e[i].length-2&&(c=c+f.curve(n,l,r,o,r,v)+f.move(r,o)+"z",p.globals.hasNullValues||(d.push(h),g.push(c)))}else{if(null===e[i][s+1]){h+=f.move(r,o);var y=p.globals.isXNumeric?(p.globals.seriesX[a][s]-p.globals.minX)/this.xRatio:r-this.xDivision;c=c+f.line(y,v)+f.move(r,o)+"z"}null===e[i][s]&&(h+=f.move(r,o),c+=f.move(r,v)),"stepline"===x?(h=h+f.line(r,null,"H")+f.line(null,o,"V"),c=c+f.line(r,null,"H")+f.line(null,o,"V")):"straight"===x&&(h+=f.line(r,o),c+=f.line(r,o)),s===e[i].length-2&&(c=c+f.line(r,v)+f.move(r,o)+"z",d.push(h),g.push(c))}return{linePaths:d,areaPaths:g,pX:n,pY:l,linePath:h,areaPath:c}}},{key:"handleNullDataPoints",value:function(t,e,i,a,s){var r=this.w;if(null===t[i][a]&&r.config.markers.showNullDataPoints||1===t[i].length){var o=this.markers.plotChartMarkers(e,s,a+1,this.strokeWidth-r.config.markers.strokeWidth/2,!0);null!==o&&this.elPointsMain.add(o)}}}]),t}();window.TreemapSquared={},window.TreemapSquared.generate=function(){function t(e,i,a,s){this.xoffset=e,this.yoffset=i,this.height=s,this.width=a,this.shortestEdge=function(){return Math.min(this.height,this.width)},this.getCoordinates=function(t){var e,i=[],a=this.xoffset,s=this.yoffset,o=r(t)/this.height,n=r(t)/this.width;if(this.width>=this.height)for(e=0;e=this.height){var a=e/this.height,s=this.width-a;i=new t(this.xoffset+a,this.yoffset,s,this.height)}else{var r=e/this.width,o=this.height-r;i=new t(this.xoffset,this.yoffset+r,this.width,o)}return i}}function e(e,a,s,o,n){return o=void 0===o?0:o,n=void 0===n?0:n,function(t){var e,i,a=[];for(e=0;e=o}(e,l=t[0],n)?(e.push(l),i(t.slice(1),e,s,o)):(h=s.cutArea(r(e),o),o.push(s.getCoordinates(e)),i(t,[],h,o)),o;o.push(s.getCoordinates(e))}function a(t,e){var i=Math.min.apply(Math,t),a=Math.max.apply(Math,t),s=r(t);return Math.max(Math.pow(e,2)*a/Math.pow(s,2),Math.pow(s,2)/(Math.pow(e,2)*i))}function s(t){return t&&t.constructor===Array}function r(t){var e,i=0;for(e=0;es-i&&n.width<=r-a){var l=o.rotateAroundCenter(t.node);t.node.setAttribute("transform","rotate(-90 ".concat(l.x," ").concat(l.y,")"))}}},{key:"animateTreemap",value:function(t,e,i,a){var s=new f(this.ctx);s.animateRect(t,{x:e.x,y:e.y,width:e.width,height:e.height},{x:i.x,y:i.y,width:i.width,height:i.height},a,(function(){s.animationCompleted(t)}))}}]),t}(),zt=86400,Xt=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.timeScaleArray=[],this.utc=this.w.config.xaxis.labels.datetimeUTC}return r(t,[{key:"calculateTimeScaleTicks",value:function(t,i){var a=this,s=this.w;if(s.globals.allSeriesCollapsed)return s.globals.labels=[],s.globals.timescaleLabels=[],[];var r=new Y(this.ctx),o=(i-t)/864e5;this.determineInterval(o),s.globals.disableZoomIn=!1,s.globals.disableZoomOut=!1,o<.00011574074074074075?s.globals.disableZoomIn=!0:o>5e4&&(s.globals.disableZoomOut=!0);var n=r.getTimeUnitsfromTimestamp(t,i,this.utc),l=s.globals.gridWidth/o,h=l/24,c=h/60,d=c/60,g=Math.floor(24*o),u=Math.floor(1440*o),p=Math.floor(o*zt),f=Math.floor(o),x=Math.floor(o/30),b=Math.floor(o/365),v={minMillisecond:n.minMillisecond,minSecond:n.minSecond,minMinute:n.minMinute,minHour:n.minHour,minDate:n.minDate,minMonth:n.minMonth,minYear:n.minYear},m={firstVal:v,currentMillisecond:v.minMillisecond,currentSecond:v.minSecond,currentMinute:v.minMinute,currentHour:v.minHour,currentMonthDate:v.minDate,currentDate:v.minDate,currentMonth:v.minMonth,currentYear:v.minYear,daysWidthOnXAxis:l,hoursWidthOnXAxis:h,minutesWidthOnXAxis:c,secondsWidthOnXAxis:d,numberOfSeconds:p,numberOfMinutes:u,numberOfHours:g,numberOfDays:f,numberOfMonths:x,numberOfYears:b};switch(this.tickInterval){case"years":this.generateYearScale(m);break;case"months":case"half_year":this.generateMonthScale(m);break;case"months_days":case"months_fortnight":case"days":case"week_days":this.generateDayScale(m);break;case"hours":this.generateHourScale(m);break;case"minutes_fives":case"minutes":this.generateMinuteScale(m);break;case"seconds_tens":case"seconds_fives":case"seconds":this.generateSecondScale(m)}var y=this.timeScaleArray.map((function(t){var i={position:t.position,unit:t.unit,year:t.year,day:t.day?t.day:1,hour:t.hour?t.hour:0,month:t.month+1};return"month"===t.unit?e(e({},i),{},{day:1,value:t.value+1}):"day"===t.unit||"hour"===t.unit?e(e({},i),{},{value:t.value}):"minute"===t.unit?e(e({},i),{},{value:t.value,minute:t.value}):"second"===t.unit?e(e({},i),{},{value:t.value,minute:t.minute,second:t.second}):t}));return y.filter((function(t){var e=1,i=Math.ceil(s.globals.gridWidth/120),r=t.value;void 0!==s.config.xaxis.tickAmount&&(i=s.config.xaxis.tickAmount),y.length>i&&(e=Math.floor(y.length/i));var o=!1,n=!1;switch(a.tickInterval){case"years":"year"===t.unit&&(o=!0);break;case"half_year":e=7,"year"===t.unit&&(o=!0);break;case"months":e=1,"year"===t.unit&&(o=!0);break;case"months_fortnight":e=15,"year"!==t.unit&&"month"!==t.unit||(o=!0),30===r&&(n=!0);break;case"months_days":e=10,"month"===t.unit&&(o=!0),30===r&&(n=!0);break;case"week_days":e=8,"month"===t.unit&&(o=!0);break;case"days":e=1,"month"===t.unit&&(o=!0);break;case"hours":"day"===t.unit&&(o=!0);break;case"minutes_fives":r%5!=0&&(n=!0);break;case"seconds_tens":r%10!=0&&(n=!0);break;case"seconds_fives":r%5!=0&&(n=!0)}if("hours"===a.tickInterval||"minutes_fives"===a.tickInterval||"seconds_tens"===a.tickInterval||"seconds_fives"===a.tickInterval){if(!n)return!0}else if((r%e==0||o)&&!n)return!0}))}},{key:"recalcDimensionsBasedOnFormat",value:function(t,e){var i=this.w,a=this.formatDates(t),s=this.removeOverlappingTS(a);i.globals.timescaleLabels=s.slice(),new ot(this.ctx).plotCoords()}},{key:"determineInterval",value:function(t){var e=24*t,i=60*e;switch(!0){case t/365>5:this.tickInterval="years";break;case t>800:this.tickInterval="half_year";break;case t>180:this.tickInterval="months";break;case t>90:this.tickInterval="months_fortnight";break;case t>60:this.tickInterval="months_days";break;case t>30:this.tickInterval="week_days";break;case t>2:this.tickInterval="days";break;case e>2.4:this.tickInterval="hours";break;case i>15:this.tickInterval="minutes_fives";break;case i>5:this.tickInterval="minutes";break;case i>1:this.tickInterval="seconds_tens";break;case 60*i>20:this.tickInterval="seconds_fives";break;default:this.tickInterval="seconds"}}},{key:"generateYearScale",value:function(t){var e=t.firstVal,i=t.currentMonth,a=t.currentYear,s=t.daysWidthOnXAxis,r=t.numberOfYears,o=e.minYear,n=0,l=new Y(this.ctx),h="year";if(e.minDate>1||e.minMonth>0){var c=l.determineRemainingDaysOfYear(e.minYear,e.minMonth,e.minDate);n=(l.determineDaysOfYear(e.minYear)-c+1)*s,o=e.minYear+1,this.timeScaleArray.push({position:n,value:o,unit:h,year:o,month:p.monthMod(i+1)})}else 1===e.minDate&&0===e.minMonth&&this.timeScaleArray.push({position:n,value:o,unit:h,year:a,month:p.monthMod(i+1)});for(var d=o,g=n,u=0;u1){l=(h.determineDaysOfMonths(a+1,e.minYear)-i+1)*r,n=p.monthMod(a+1);var g=s+d,u=p.monthMod(n),f=n;0===n&&(c="year",f=g,u=1,g+=d+=1),this.timeScaleArray.push({position:l,value:f,unit:c,year:g,month:u})}else this.timeScaleArray.push({position:l,value:n,unit:c,year:s,month:p.monthMod(a)});for(var x=n+1,b=l,v=0,m=1;vo.determineDaysOfMonths(e+1,i)?(h=1,n="month",g=e+=1,e):e},d=(24-e.minHour)*s,g=l,u=c(h,i,a);0===e.minHour&&1===e.minDate?(d=0,g=p.monthMod(e.minMonth),n="month",h=e.minDate,r++):1!==e.minDate&&0===e.minHour&&0===e.minMinute&&(d=0,l=e.minDate,g=l,u=c(h=l,i,a)),this.timeScaleArray.push({position:d,value:g,unit:n,year:this._getYear(a,u,0),month:p.monthMod(u),day:h});for(var f=d,x=0;xn.determineDaysOfMonths(e+1,s)&&(x=1,e+=1),{month:e,date:x}},c=function(t,e){return t>n.determineDaysOfMonths(e+1,s)?e+=1:e},d=60-(e.minMinute+e.minSecond/60),g=d*r,u=e.minHour+1,f=u+1;60===d&&(g=0,f=(u=e.minHour)+1);var x=i,b=c(x,a);this.timeScaleArray.push({position:g,value:u,unit:l,day:x,hour:f,year:s,month:p.monthMod(b)});for(var v=g,m=0;m=24)f=0,l="day",b=h(x+=1,b).month,b=c(x,b);var y=this._getYear(s,b,0);v=0===f&&0===m?d*r:60*r+v;var w=0===f?x:f;this.timeScaleArray.push({position:v,value:w,unit:l,hour:f,day:x,year:y,month:p.monthMod(b)}),f++}}},{key:"generateMinuteScale",value:function(t){for(var e=t.currentMillisecond,i=t.currentSecond,a=t.currentMinute,s=t.currentHour,r=t.currentDate,o=t.currentMonth,n=t.currentYear,l=t.minutesWidthOnXAxis,h=t.secondsWidthOnXAxis,c=t.numberOfMinutes,d=a+1,g=r,u=o,f=n,x=s,b=(60-i-e/1e3)*h,v=0;v=60&&(d=0,24===(x+=1)&&(x=0)),this.timeScaleArray.push({position:b,value:d,unit:"minute",hour:x,minute:d,day:g,year:this._getYear(f,u,0),month:p.monthMod(u)}),b+=l,d++}},{key:"generateSecondScale",value:function(t){for(var e=t.currentMillisecond,i=t.currentSecond,a=t.currentMinute,s=t.currentHour,r=t.currentDate,o=t.currentMonth,n=t.currentYear,l=t.secondsWidthOnXAxis,h=t.numberOfSeconds,c=i+1,d=a,g=r,u=o,f=n,x=s,b=(1e3-e)/1e3*l,v=0;v=60&&(c=0,++d>=60&&(d=0,24===++x&&(x=0))),this.timeScaleArray.push({position:b,value:c,unit:"second",hour:x,minute:d,second:c,day:g,year:this._getYear(f,u,0),month:p.monthMod(u)}),b+=l,c++}},{key:"createRawDateString",value:function(t,e){var i=t.year;return 0===t.month&&(t.month=1),i+="-"+("0"+t.month.toString()).slice(-2),"day"===t.unit?i+="day"===t.unit?"-"+("0"+e).slice(-2):"-01":i+="-"+("0"+(t.day?t.day:"1")).slice(-2),"hour"===t.unit?i+="hour"===t.unit?"T"+("0"+e).slice(-2):"T00":i+="T"+("0"+(t.hour?t.hour:"0")).slice(-2),"minute"===t.unit?i+=":"+("0"+e).slice(-2):i+=":"+(t.minute?("0"+t.minute).slice(-2):"00"),"second"===t.unit?i+=":"+("0"+e).slice(-2):i+=":00",this.utc&&(i+=".000Z"),i}},{key:"formatDates",value:function(t){var e=this,i=this.w;return t.map((function(t){var a=t.value.toString(),s=new Y(e.ctx),r=e.createRawDateString(t,a),o=s.getDate(s.parseDate(r));if(e.utc||(o=s.getDate(s.parseDateWithTimezone(r))),void 0===i.config.xaxis.labels.format){var n="dd MMM",l=i.config.xaxis.labels.datetimeFormatter;"year"===t.unit&&(n=l.year),"month"===t.unit&&(n=l.month),"day"===t.unit&&(n=l.day),"hour"===t.unit&&(n=l.hour),"minute"===t.unit&&(n=l.minute),"second"===t.unit&&(n=l.second),a=s.formatDate(o,n)}else a=s.formatDate(o,i.config.xaxis.labels.format);return{dateString:r,position:t.position,value:a,unit:t.unit,year:t.year,month:t.month}}))}},{key:"removeOverlappingTS",value:function(t){var e,i=this,a=new b(this.ctx),s=!1;t.length>0&&t[0].value&&t.every((function(e){return e.value.length===t[0].value.length}))&&(s=!0,e=a.getTextRects(t[0].value).width);var r=0,o=t.map((function(o,n){if(n>0&&i.w.config.xaxis.labels.hideOverlappingLabels){var l=s?e:a.getTextRects(t[r].value).width,h=t[r].position;return o.position>h+l+10?(r=n,o):null}return o}));return o=o.filter((function(t){return null!==t}))}},{key:"_getYear",value:function(t,e,i){return t+Math.floor(e/12)+i}}]),t}(),Et=function(){function t(e,i){a(this,t),this.ctx=i,this.w=i.w,this.el=e}return r(t,[{key:"setupElements",value:function(){var t=this.w.globals,e=this.w.config,i=e.chart.type;t.axisCharts=["line","area","bar","rangeBar","candlestick","boxPlot","scatter","bubble","radar","heatmap","treemap"].indexOf(i)>-1,t.xyCharts=["line","area","bar","rangeBar","candlestick","boxPlot","scatter","bubble"].indexOf(i)>-1,t.isBarHorizontal=("bar"===e.chart.type||"rangeBar"===e.chart.type||"boxPlot"===e.chart.type)&&e.plotOptions.bar.horizontal,t.chartClass=".apexcharts"+t.chartID,t.dom.baseEl=this.el,t.dom.elWrap=document.createElement("div"),b.setAttrs(t.dom.elWrap,{id:t.chartClass.substring(1),class:"apexcharts-canvas "+t.chartClass.substring(1)}),this.el.appendChild(t.dom.elWrap),t.dom.Paper=new window.SVG.Doc(t.dom.elWrap),t.dom.Paper.attr({class:"apexcharts-svg","xmlns:data":"ApexChartsNS",transform:"translate(".concat(e.chart.offsetX,", ").concat(e.chart.offsetY,")")}),t.dom.Paper.node.style.background=e.chart.background,this.setSVGDimensions(),t.dom.elGraphical=t.dom.Paper.group().attr({class:"apexcharts-inner apexcharts-graphical"}),t.dom.elAnnotations=t.dom.Paper.group().attr({class:"apexcharts-annotations"}),t.dom.elDefs=t.dom.Paper.defs(),t.dom.elLegendWrap=document.createElement("div"),t.dom.elLegendWrap.classList.add("apexcharts-legend"),t.dom.elWrap.appendChild(t.dom.elLegendWrap),t.dom.Paper.add(t.dom.elGraphical),t.dom.elGraphical.add(t.dom.elDefs)}},{key:"plotChartType",value:function(t,e){var i=this.w,a=i.config,s=i.globals,r={series:[],i:[]},o={series:[],i:[]},n={series:[],i:[]},l={series:[],i:[]},h={series:[],i:[]},c={series:[],i:[]},d={series:[],i:[]};s.series.map((function(e,g){var u=0;void 0!==t[g].type?("column"===t[g].type||"bar"===t[g].type?(s.series.length>1&&a.plotOptions.bar.horizontal&&console.warn("Horizontal bars are not supported in a mixed/combo chart. Please turn off `plotOptions.bar.horizontal`"),h.series.push(e),h.i.push(g),u++,i.globals.columnSeries=h.series):"area"===t[g].type?(o.series.push(e),o.i.push(g),u++):"line"===t[g].type?(r.series.push(e),r.i.push(g),u++):"scatter"===t[g].type?(n.series.push(e),n.i.push(g)):"bubble"===t[g].type?(l.series.push(e),l.i.push(g),u++):"candlestick"===t[g].type?(c.series.push(e),c.i.push(g),u++):"boxPlot"===t[g].type?(d.series.push(e),d.i.push(g),u++):console.warn("You have specified an unrecognized chart type. Available types for this property are line/area/column/bar/scatter/bubble"),u>1&&(s.comboCharts=!0)):(r.series.push(e),r.i.push(g))}));var g=new Pt(this.ctx,e),u=new mt(this.ctx,e);this.ctx.pie=new At(this.ctx);var p=new Ct(this.ctx);this.ctx.rangeBar=new F(this.ctx,e);var f=new St(this.ctx),x=[];if(s.comboCharts){if(o.series.length>0&&x.push(g.draw(o.series,"area",o.i)),h.series.length>0)if(i.config.chart.stacked){var b=new vt(this.ctx,e);x.push(b.draw(h.series,h.i))}else this.ctx.bar=new E(this.ctx,e),x.push(this.ctx.bar.draw(h.series,h.i));if(r.series.length>0&&x.push(g.draw(r.series,"line",r.i)),c.series.length>0&&x.push(u.draw(c.series,c.i)),d.series.length>0&&x.push(u.draw(d.series,d.i)),n.series.length>0){var v=new Pt(this.ctx,e,!0);x.push(v.draw(n.series,"scatter",n.i))}if(l.series.length>0){var m=new Pt(this.ctx,e,!0);x.push(m.draw(l.series,"bubble",l.i))}}else switch(a.chart.type){case"line":x=g.draw(s.series,"line");break;case"area":x=g.draw(s.series,"area");break;case"bar":if(a.chart.stacked)x=new vt(this.ctx,e).draw(s.series);else this.ctx.bar=new E(this.ctx,e),x=this.ctx.bar.draw(s.series);break;case"candlestick":x=new mt(this.ctx,e).draw(s.series);break;case"boxPlot":x=new mt(this.ctx,e).draw(s.series);break;case"rangeBar":x=this.ctx.rangeBar.draw(s.series);break;case"heatmap":x=new wt(this.ctx,e).draw(s.series);break;case"treemap":x=new It(this.ctx,e).draw(s.series);break;case"pie":case"donut":case"polarArea":x=this.ctx.pie.draw(s.series);break;case"radialBar":x=p.draw(s.series);break;case"radar":x=f.draw(s.series);break;default:x=g.draw(s.series)}return x}},{key:"setSVGDimensions",value:function(){var t=this.w.globals,e=this.w.config;t.svgWidth=e.chart.width,t.svgHeight=e.chart.height;var i=p.getDimensions(this.el),a=e.chart.width.toString().split(/[0-9]+/g).pop();"%"===a?p.isNumber(i[0])&&(0===i[0].width&&(i=p.getDimensions(this.el.parentNode)),t.svgWidth=i[0]*parseInt(e.chart.width,10)/100):"px"!==a&&""!==a||(t.svgWidth=parseInt(e.chart.width,10));var s=e.chart.height.toString().split(/[0-9]+/g).pop();if("auto"!==t.svgHeight&&""!==t.svgHeight)if("%"===s){var r=p.getDimensions(this.el.parentNode);t.svgHeight=r[1]*parseInt(e.chart.height,10)/100}else t.svgHeight=parseInt(e.chart.height,10);else t.axisCharts?t.svgHeight=t.svgWidth/1.61:t.svgHeight=t.svgWidth/1.2;if(t.svgWidth<0&&(t.svgWidth=0),t.svgHeight<0&&(t.svgHeight=0),b.setAttrs(t.dom.Paper.node,{width:t.svgWidth,height:t.svgHeight}),"%"!==s){var o=e.chart.sparkline.enabled?0:t.axisCharts?e.chart.parentHeightOffset:0;t.dom.Paper.node.parentNode.parentNode.style.minHeight=t.svgHeight+o+"px"}t.dom.elWrap.style.width=t.svgWidth+"px",t.dom.elWrap.style.height=t.svgHeight+"px"}},{key:"shiftGraphPosition",value:function(){var t=this.w.globals,e=t.translateY,i={transform:"translate("+t.translateX+", "+e+")"};b.setAttrs(t.dom.elGraphical.node,i)}},{key:"resizeNonAxisCharts",value:function(){var t=this.w,e=t.globals,i=0,a=t.config.chart.sparkline.enabled?1:15;a+=t.config.grid.padding.bottom,"top"!==t.config.legend.position&&"bottom"!==t.config.legend.position||!t.config.legend.show||t.config.legend.floating||(i=new lt(this.ctx).legendHelpers.getLegendBBox().clwh+10);var s=t.globals.dom.baseEl.querySelector(".apexcharts-radialbar, .apexcharts-pie"),r=2.05*t.globals.radialSize;if(s&&!t.config.chart.sparkline.enabled&&0!==t.config.plotOptions.radialBar.startAngle){var o=p.getBoundingClientRect(s);r=o.bottom;var n=o.bottom-o.top;r=Math.max(2.05*t.globals.radialSize,n)}var l=r+e.translateY+i+a;e.dom.elLegendForeign&&e.dom.elLegendForeign.setAttribute("height",l),e.dom.elWrap.style.height=l+"px",b.setAttrs(e.dom.Paper.node,{height:l}),e.dom.Paper.node.parentNode.parentNode.style.minHeight=l+"px"}},{key:"coreCalculations",value:function(){new U(this.ctx).init()}},{key:"resetGlobals",value:function(){var t=this,e=function(){return t.w.config.series.map((function(t){return[]}))},i=new D,a=this.w.globals;i.initGlobalVars(a),a.seriesXvalues=e(),a.seriesYvalues=e()}},{key:"isMultipleY",value:function(){if(this.w.config.yaxis.constructor===Array&&this.w.config.yaxis.length>1)return this.w.globals.isMultipleYAxis=!0,!0}},{key:"xySettings",value:function(){var t=null,e=this.w;if(e.globals.axisCharts){if("back"===e.config.xaxis.crosshairs.position)new Q(this.ctx).drawXCrosshairs();if("back"===e.config.yaxis[0].crosshairs.position)new Q(this.ctx).drawYCrosshairs();if("datetime"===e.config.xaxis.type&&void 0===e.config.xaxis.labels.formatter){this.ctx.timeScale=new Xt(this.ctx);var i=[];isFinite(e.globals.minX)&&isFinite(e.globals.maxX)&&!e.globals.isBarHorizontal?i=this.ctx.timeScale.calculateTimeScaleTicks(e.globals.minX,e.globals.maxX):e.globals.isBarHorizontal&&(i=this.ctx.timeScale.calculateTimeScaleTicks(e.globals.minY,e.globals.maxY)),this.ctx.timeScale.recalcDimensionsBasedOnFormat(i)}t=new y(this.ctx).getCalculatedRatios()}return t}},{key:"updateSourceChart",value:function(t){this.ctx.w.globals.selection=void 0,this.ctx.updateHelpers._updateOptions({chart:{selection:{xaxis:{min:t.w.globals.minX,max:t.w.globals.maxX}}}},!1,!1)}},{key:"setupBrushHandler",value:function(){var t=this,i=this.w;if(i.config.chart.brush.enabled&&"function"!=typeof i.config.chart.events.selection){var a=i.config.chart.brush.targets||[i.config.chart.brush.target];a.forEach((function(e){var i=ApexCharts.getChartByID(e);i.w.globals.brushSource=t.ctx,"function"!=typeof i.w.config.chart.events.zoomed&&(i.w.config.chart.events.zoomed=function(){t.updateSourceChart(i)}),"function"!=typeof i.w.config.chart.events.scrolled&&(i.w.config.chart.events.scrolled=function(){t.updateSourceChart(i)})})),i.config.chart.events.selection=function(t,s){a.forEach((function(t){var a=ApexCharts.getChartByID(t),r=p.clone(i.config.yaxis);if(i.config.chart.brush.autoScaleYaxis&&1===a.w.globals.series.length){var o=new j(a);r=o.autoScaleY(a,r,s)}var n=a.w.config.yaxis.reduce((function(t,i,s){return[].concat(g(t),[e(e({},a.w.config.yaxis[s]),{},{min:r[0].min,max:r[0].max})])}),[]);a.ctx.updateHelpers._updateOptions({xaxis:{min:s.xaxis.min,max:s.xaxis.max},yaxis:n},!1,!1,!1,!1)}))}}}}]),t}(),Yt=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"_updateOptions",value:function(t){var e=this,a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];return new Promise((function(n){var l=[e.ctx];r&&(l=e.ctx.getSyncedCharts()),e.ctx.w.globals.isExecCalled&&(l=[e.ctx],e.ctx.w.globals.isExecCalled=!1),l.forEach((function(r,h){var c=r.w;return c.globals.shouldAnimate=s,a||(c.globals.resized=!0,c.globals.dataChanged=!0,s&&r.series.getPreviousPaths()),t&&"object"===i(t)&&(r.config=new H(t),t=y.extendArrayProps(r.config,t,c),r.w.globals.chartID!==e.ctx.w.globals.chartID&&delete t.series,c.config=p.extend(c.config,t),o&&(c.globals.lastXAxis=t.xaxis?p.clone(t.xaxis):[],c.globals.lastYAxis=t.yaxis?p.clone(t.yaxis):[],c.globals.initialConfig=p.extend({},c.config),c.globals.initialSeries=p.clone(c.config.series))),r.update(t).then((function(){h===l.length-1&&n(r)}))}))}))}},{key:"_updateSeries",value:function(t,e){var i=this,a=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return new Promise((function(s){var r,o=i.w;return o.globals.shouldAnimate=e,o.globals.dataChanged=!0,e&&i.ctx.series.getPreviousPaths(),o.globals.axisCharts?(0===(r=t.map((function(t,e){return i._extendSeries(t,e)}))).length&&(r=[{data:[]}]),o.config.series=r):o.config.series=t.slice(),a&&(o.globals.initialSeries=p.clone(o.config.series)),i.ctx.update().then((function(){s(i.ctx)}))}))}},{key:"_extendSeries",value:function(t,i){var a=this.w,s=a.config.series[i];return e(e({},a.config.series[i]),{},{name:t.name?t.name:s&&s.name,color:t.color?t.color:s&&s.color,type:t.type?t.type:s&&s.type,data:t.data?t.data:s&&s.data})}},{key:"toggleDataPointSelection",value:function(t,e){var i=this.w,a=null,s=".apexcharts-series[data\\:realIndex='".concat(t,"']");return i.globals.axisCharts?a=i.globals.dom.Paper.select("".concat(s," path[j='").concat(e,"'], ").concat(s," circle[j='").concat(e,"'], ").concat(s," rect[j='").concat(e,"']")).members[0]:void 0===e&&(a=i.globals.dom.Paper.select("".concat(s," path[j='").concat(t,"']")).members[0],"pie"!==i.config.chart.type&&"polarArea"!==i.config.chart.type&&"donut"!==i.config.chart.type||this.ctx.pie.pieClicked(t)),a?(new b(this.ctx).pathMouseDown(a,null),a.node?a.node:null):(console.warn("toggleDataPointSelection: Element not found"),null)}},{key:"forceXAxisUpdate",value:function(t){var e=this.w;if(["min","max"].forEach((function(i){void 0!==t.xaxis[i]&&(e.config.xaxis[i]=t.xaxis[i],e.globals.lastXAxis[i]=t.xaxis[i])})),t.xaxis.categories&&t.xaxis.categories.length&&(e.config.xaxis.categories=t.xaxis.categories),e.config.xaxis.convertedCatToNumeric){var i=new R(t);t=i.convertCatToNumericXaxis(t,this.ctx)}return t}},{key:"forceYAxisUpdate",value:function(t){var e=this.w;return e.config.chart.stacked&&"100%"===e.config.chart.stackType&&(Array.isArray(t.yaxis)?t.yaxis.forEach((function(e,i){t.yaxis[i].min=0,t.yaxis[i].max=100})):(t.yaxis.min=0,t.yaxis.max=100)),t}},{key:"revertDefaultAxisMinMax",value:function(t){var e=this,i=this.w,a=i.globals.lastXAxis,s=i.globals.lastYAxis;t&&t.xaxis&&(a=t.xaxis),t&&t.yaxis&&(s=t.yaxis),i.config.xaxis.min=a.min,i.config.xaxis.max=a.max;var r=function(t){void 0!==s[t]&&(i.config.yaxis[t].min=s[t].min,i.config.yaxis[t].max=s[t].max)};i.config.yaxis.map((function(t,a){i.globals.zoomed||void 0!==s[a]?r(a):void 0!==e.ctx.opts.yaxis[a]&&(t.min=e.ctx.opts.yaxis[a].min,t.max=e.ctx.opts.yaxis[a].max)}))}}]),t}();Tt="undefined"!=typeof window?window:void 0,Mt=function(t,e){var a=(void 0!==this?this:t).SVG=function(t){if(a.supported)return t=new a.Doc(t),a.parser.draw||a.prepare(),t};if(a.ns="http://www.w3.org/2000/svg",a.xmlns="http://www.w3.org/2000/xmlns/",a.xlink="http://www.w3.org/1999/xlink",a.svgjs="http://svgjs.dev",a.supported=!0,!a.supported)return!1;a.did=1e3,a.eid=function(t){return"Svgjs"+d(t)+a.did++},a.create=function(t){var i=e.createElementNS(this.ns,t);return i.setAttribute("id",this.eid(t)),i},a.extend=function(){var t,e;e=(t=[].slice.call(arguments)).pop();for(var i=t.length-1;i>=0;i--)if(t[i])for(var s in e)t[i].prototype[s]=e[s];a.Set&&a.Set.inherit&&a.Set.inherit()},a.invent=function(t){var e="function"==typeof t.create?t.create:function(){this.constructor.call(this,a.create(t.create))};return t.inherit&&(e.prototype=new t.inherit),t.extend&&a.extend(e,t.extend),t.construct&&a.extend(t.parent||a.Container,t.construct),e},a.adopt=function(e){return e?e.instance?e.instance:((i="svg"==e.nodeName?e.parentNode instanceof t.SVGElement?new a.Nested:new a.Doc:"linearGradient"==e.nodeName?new a.Gradient("linear"):"radialGradient"==e.nodeName?new a.Gradient("radial"):a[d(e.nodeName)]?new(a[d(e.nodeName)]):new a.Element(e)).type=e.nodeName,i.node=e,e.instance=i,i instanceof a.Doc&&i.namespace().defs(),i.setData(JSON.parse(e.getAttribute("svgjs:data"))||{}),i):null;var i},a.prepare=function(){var t=e.getElementsByTagName("body")[0],i=(t?new a.Doc(t):a.adopt(e.documentElement).nested()).size(2,0);a.parser={body:t||e.documentElement,draw:i.style("opacity:0;position:absolute;left:-100%;top:-100%;overflow:hidden").node,poly:i.polyline().node,path:i.path().node,native:a.create("svg")}},a.parser={native:a.create("svg")},e.addEventListener("DOMContentLoaded",(function(){a.parser.draw||a.prepare()}),!1),a.regex={numberAndUnit:/^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i,hex:/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,rgb:/rgb\((\d+),(\d+),(\d+)\)/,reference:/#([a-z0-9\-_]+)/i,transforms:/\)\s*,?\s*/,whitespace:/\s/g,isHex:/^#[a-f0-9]{3,6}$/i,isRgb:/^rgb\(/,isCss:/[^:]+:[^;]+;?/,isBlank:/^(\s+)?$/,isNumber:/^[+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,isPercent:/^-?[\d\.]+%$/,isImage:/\.(jpg|jpeg|png|gif|svg)(\?[^=]+.*)?/i,delimiter:/[\s,]+/,hyphen:/([^e])\-/gi,pathLetters:/[MLHVCSQTAZ]/gi,isPathLetter:/[MLHVCSQTAZ]/i,numbersWithDots:/((\d?\.\d+(?:e[+-]?\d+)?)((?:\.\d+(?:e[+-]?\d+)?)+))+/gi,dots:/\./g},a.utils={map:function(t,e){for(var i=t.length,a=[],s=0;s1?1:t,new a.Color({r:~~(this.r+(this.destination.r-this.r)*t),g:~~(this.g+(this.destination.g-this.g)*t),b:~~(this.b+(this.destination.b-this.b)*t)})):this}}),a.Color.test=function(t){return t+="",a.regex.isHex.test(t)||a.regex.isRgb.test(t)},a.Color.isRgb=function(t){return t&&"number"==typeof t.r&&"number"==typeof t.g&&"number"==typeof t.b},a.Color.isColor=function(t){return a.Color.isRgb(t)||a.Color.test(t)},a.Array=function(t,e){0==(t=(t||[]).valueOf()).length&&e&&(t=e.valueOf()),this.value=this.parse(t)},a.extend(a.Array,{toString:function(){return this.value.join(" ")},valueOf:function(){return this.value},parse:function(t){return t=t.valueOf(),Array.isArray(t)?t:this.split(t)}}),a.PointArray=function(t,e){a.Array.call(this,t,e||[[0,0]])},a.PointArray.prototype=new a.Array,a.PointArray.prototype.constructor=a.PointArray;for(var s={M:function(t,e,i){return e.x=i.x=t[0],e.y=i.y=t[1],["M",e.x,e.y]},L:function(t,e){return e.x=t[0],e.y=t[1],["L",t[0],t[1]]},H:function(t,e){return e.x=t[0],["H",t[0]]},V:function(t,e){return e.y=t[0],["V",t[0]]},C:function(t,e){return e.x=t[4],e.y=t[5],["C",t[0],t[1],t[2],t[3],t[4],t[5]]},Q:function(t,e){return e.x=t[2],e.y=t[3],["Q",t[0],t[1],t[2],t[3]]},Z:function(t,e,i){return e.x=i.x,e.y=i.y,["Z"]}},r="mlhvqtcsaz".split(""),o=0,n=r.length;ol);return r},bbox:function(){return a.parser.draw||a.prepare(),a.parser.path.setAttribute("d",this.toString()),a.parser.path.getBBox()}}),a.Number=a.invent({create:function(t,e){this.value=0,this.unit=e||"","number"==typeof t?this.value=isNaN(t)?0:isFinite(t)?t:t<0?-34e37:34e37:"string"==typeof t?(e=t.match(a.regex.numberAndUnit))&&(this.value=parseFloat(e[1]),"%"==e[5]?this.value/=100:"s"==e[5]&&(this.value*=1e3),this.unit=e[5]):t instanceof a.Number&&(this.value=t.valueOf(),this.unit=t.unit)},extend:{toString:function(){return("%"==this.unit?~~(1e8*this.value)/1e6:"s"==this.unit?this.value/1e3:this.value)+this.unit},toJSON:function(){return this.toString()},valueOf:function(){return this.value},plus:function(t){return t=new a.Number(t),new a.Number(this+t,this.unit||t.unit)},minus:function(t){return t=new a.Number(t),new a.Number(this-t,this.unit||t.unit)},times:function(t){return t=new a.Number(t),new a.Number(this*t,this.unit||t.unit)},divide:function(t){return t=new a.Number(t),new a.Number(this/t,this.unit||t.unit)},to:function(t){var e=new a.Number(this);return"string"==typeof t&&(e.unit=t),e},morph:function(t){return this.destination=new a.Number(t),t.relative&&(this.destination.value+=this.value),this},at:function(t){return this.destination?new a.Number(this.destination).minus(this).times(t).plus(this):this}}}),a.Element=a.invent({create:function(t){this._stroke=a.defaults.attrs.stroke,this._event=null,this.dom={},(this.node=t)&&(this.type=t.nodeName,this.node.instance=this,this._stroke=t.getAttribute("stroke")||this._stroke)},extend:{x:function(t){return this.attr("x",t)},y:function(t){return this.attr("y",t)},cx:function(t){return null==t?this.x()+this.width()/2:this.x(t-this.width()/2)},cy:function(t){return null==t?this.y()+this.height()/2:this.y(t-this.height()/2)},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},width:function(t){return this.attr("width",t)},height:function(t){return this.attr("height",t)},size:function(t,e){var i=u(this,t,e);return this.width(new a.Number(i.width)).height(new a.Number(i.height))},clone:function(t){this.writeDataToDom();var e=x(this.node.cloneNode(!0));return t?t.add(e):this.after(e),e},remove:function(){return this.parent()&&this.parent().removeElement(this),this},replace:function(t){return this.after(t).remove(),t},addTo:function(t){return t.put(this)},putIn:function(t){return t.add(this)},id:function(t){return this.attr("id",t)},show:function(){return this.style("display","")},hide:function(){return this.style("display","none")},visible:function(){return"none"!=this.style("display")},toString:function(){return this.attr("id")},classes:function(){var t=this.attr("class");return null==t?[]:t.trim().split(a.regex.delimiter)},hasClass:function(t){return-1!=this.classes().indexOf(t)},addClass:function(t){if(!this.hasClass(t)){var e=this.classes();e.push(t),this.attr("class",e.join(" "))}return this},removeClass:function(t){return this.hasClass(t)&&this.attr("class",this.classes().filter((function(e){return e!=t})).join(" ")),this},toggleClass:function(t){return this.hasClass(t)?this.removeClass(t):this.addClass(t)},reference:function(t){return a.get(this.attr(t))},parent:function(e){var i=this;if(!i.node.parentNode)return null;if(i=a.adopt(i.node.parentNode),!e)return i;for(;i&&i.node instanceof t.SVGElement;){if("string"==typeof e?i.matches(e):i instanceof e)return i;if(!i.node.parentNode||"#document"==i.node.parentNode.nodeName)return null;i=a.adopt(i.node.parentNode)}},doc:function(){return this instanceof a.Doc?this:this.parent(a.Doc)},parents:function(t){var e=[],i=this;do{if(!(i=i.parent(t))||!i.node)break;e.push(i)}while(i.parent);return e},matches:function(t){return function(t,e){return(t.matches||t.matchesSelector||t.msMatchesSelector||t.mozMatchesSelector||t.webkitMatchesSelector||t.oMatchesSelector).call(t,e)}(this.node,t)},native:function(){return this.node},svg:function(t){var i=e.createElement("svg");if(!(t&&this instanceof a.Parent))return i.appendChild(t=e.createElement("svg")),this.writeDataToDom(),t.appendChild(this.node.cloneNode(!0)),i.innerHTML.replace(/^/,"").replace(/<\/svg>$/,"");i.innerHTML=""+t.replace(/\n/,"").replace(/<([\w:-]+)([^<]+?)\/>/g,"<$1$2>")+"";for(var s=0,r=i.firstChild.childNodes.length;s":function(t){return-Math.cos(t*Math.PI)/2+.5},">":function(t){return Math.sin(t*Math.PI/2)},"<":function(t){return 1-Math.cos(t*Math.PI/2)}},a.morph=function(t){return function(e,i){return new a.MorphObj(e,i).at(t)}},a.Situation=a.invent({create:function(t){this.init=!1,this.reversed=!1,this.reversing=!1,this.duration=new a.Number(t.duration).valueOf(),this.delay=new a.Number(t.delay).valueOf(),this.start=+new Date+this.delay,this.finish=this.start+this.duration,this.ease=t.ease,this.loop=0,this.loops=!1,this.animations={},this.attrs={},this.styles={},this.transforms=[],this.once={}}}),a.FX=a.invent({create:function(t){this._target=t,this.situations=[],this.active=!1,this.situation=null,this.paused=!1,this.lastPos=0,this.pos=0,this.absPos=0,this._speed=1},extend:{animate:function(t,e,s){"object"===i(t)&&(e=t.ease,s=t.delay,t=t.duration);var r=new a.Situation({duration:t||1e3,delay:s||0,ease:a.easing[e||"-"]||e});return this.queue(r),this},target:function(t){return t&&t instanceof a.Element?(this._target=t,this):this._target},timeToAbsPos:function(t){return(t-this.situation.start)/(this.situation.duration/this._speed)},absPosToTime:function(t){return this.situation.duration/this._speed*t+this.situation.start},startAnimFrame:function(){this.stopAnimFrame(),this.animationFrame=t.requestAnimationFrame(function(){this.step()}.bind(this))},stopAnimFrame:function(){t.cancelAnimationFrame(this.animationFrame)},start:function(){return!this.active&&this.situation&&(this.active=!0,this.startCurrent()),this},startCurrent:function(){return this.situation.start=+new Date+this.situation.delay/this._speed,this.situation.finish=this.situation.start+this.situation.duration/this._speed,this.initAnimations().step()},queue:function(t){return("function"==typeof t||t instanceof a.Situation)&&this.situations.push(t),this.situation||(this.situation=this.situations.shift()),this},dequeue:function(){return this.stop(),this.situation=this.situations.shift(),this.situation&&(this.situation instanceof a.Situation?this.start():this.situation.call(this)),this},initAnimations:function(){var t,e=this.situation;if(e.init)return this;for(var i in e.animations){t=this.target()[i](),Array.isArray(t)||(t=[t]),Array.isArray(e.animations[i])||(e.animations[i]=[e.animations[i]]);for(var s=t.length;s--;)e.animations[i][s]instanceof a.Number&&(t[s]=new a.Number(t[s])),e.animations[i][s]=t[s].morph(e.animations[i][s])}for(var i in e.attrs)e.attrs[i]=new a.MorphObj(this.target().attr(i),e.attrs[i]);for(var i in e.styles)e.styles[i]=new a.MorphObj(this.target().style(i),e.styles[i]);return e.initialTransformation=this.target().matrixify(),e.init=!0,this},clearQueue:function(){return this.situations=[],this},clearCurrent:function(){return this.situation=null,this},stop:function(t,e){var i=this.active;return this.active=!1,e&&this.clearQueue(),t&&this.situation&&(!i&&this.startCurrent(),this.atEnd()),this.stopAnimFrame(),this.clearCurrent()},after:function(t){var e=this.last();return this.target().on("finished.fx",(function i(a){a.detail.situation==e&&(t.call(this,e),this.off("finished.fx",i))})),this._callStart()},during:function(t){var e=this.last(),i=function(i){i.detail.situation==e&&t.call(this,i.detail.pos,a.morph(i.detail.pos),i.detail.eased,e)};return this.target().off("during.fx",i).on("during.fx",i),this.after((function(){this.off("during.fx",i)})),this._callStart()},afterAll:function(t){var e=function e(i){t.call(this),this.off("allfinished.fx",e)};return this.target().off("allfinished.fx",e).on("allfinished.fx",e),this._callStart()},last:function(){return this.situations.length?this.situations[this.situations.length-1]:this.situation},add:function(t,e,i){return this.last()[i||"animations"][t]=e,this._callStart()},step:function(t){var e,i,a;t||(this.absPos=this.timeToAbsPos(+new Date)),!1!==this.situation.loops?(e=Math.max(this.absPos,0),i=Math.floor(e),!0===this.situation.loops||ithis.lastPos&&r<=s&&(this.situation.once[r].call(this.target(),this.pos,s),delete this.situation.once[r]);return this.active&&this.target().fire("during",{pos:this.pos,eased:s,fx:this,situation:this.situation}),this.situation?(this.eachAt(),1==this.pos&&!this.situation.reversed||this.situation.reversed&&0==this.pos?(this.stopAnimFrame(),this.target().fire("finished",{fx:this,situation:this.situation}),this.situations.length||(this.target().fire("allfinished"),this.situations.length||(this.target().off(".fx"),this.active=!1)),this.active?this.dequeue():this.clearCurrent()):!this.paused&&this.active&&this.startAnimFrame(),this.lastPos=s,this):this},eachAt:function(){var t,e=this,i=this.target(),s=this.situation;for(var r in s.animations)t=[].concat(s.animations[r]).map((function(t){return"string"!=typeof t&&t.at?t.at(s.ease(e.pos),e.pos):t})),i[r].apply(i,t);for(var r in s.attrs)t=[r].concat(s.attrs[r]).map((function(t){return"string"!=typeof t&&t.at?t.at(s.ease(e.pos),e.pos):t})),i.attr.apply(i,t);for(var r in s.styles)t=[r].concat(s.styles[r]).map((function(t){return"string"!=typeof t&&t.at?t.at(s.ease(e.pos),e.pos):t})),i.style.apply(i,t);if(s.transforms.length){t=s.initialTransformation,r=0;for(var o=s.transforms.length;r=0;--s)this[m[s]]=null!=t[m[s]]?t[m[s]]:e[m[s]]},extend:{extract:function(){var t=p(this,0,1);p(this,1,0);var e=180/Math.PI*Math.atan2(t.y,t.x)-90;return{x:this.e,y:this.f,transformedX:(this.e*Math.cos(e*Math.PI/180)+this.f*Math.sin(e*Math.PI/180))/Math.sqrt(this.a*this.a+this.b*this.b),transformedY:(this.f*Math.cos(e*Math.PI/180)+this.e*Math.sin(-e*Math.PI/180))/Math.sqrt(this.c*this.c+this.d*this.d),rotation:e,a:this.a,b:this.b,c:this.c,d:this.d,e:this.e,f:this.f,matrix:new a.Matrix(this)}},clone:function(){return new a.Matrix(this)},morph:function(t){return this.destination=new a.Matrix(t),this},multiply:function(t){return new a.Matrix(this.native().multiply(function(t){return t instanceof a.Matrix||(t=new a.Matrix(t)),t}(t).native()))},inverse:function(){return new a.Matrix(this.native().inverse())},translate:function(t,e){return new a.Matrix(this.native().translate(t||0,e||0))},native:function(){for(var t=a.parser.native.createSVGMatrix(),e=m.length-1;e>=0;e--)t[m[e]]=this[m[e]];return t},toString:function(){return"matrix("+v(this.a)+","+v(this.b)+","+v(this.c)+","+v(this.d)+","+v(this.e)+","+v(this.f)+")"}},parent:a.Element,construct:{ctm:function(){return new a.Matrix(this.node.getCTM())},screenCTM:function(){if(this instanceof a.Nested){var t=this.rect(1,1),e=t.node.getScreenCTM();return t.remove(),new a.Matrix(e)}return new a.Matrix(this.node.getScreenCTM())}}}),a.Point=a.invent({create:function(t,e){var a;a=Array.isArray(t)?{x:t[0],y:t[1]}:"object"===i(t)?{x:t.x,y:t.y}:null!=t?{x:t,y:null!=e?e:t}:{x:0,y:0},this.x=a.x,this.y=a.y},extend:{clone:function(){return new a.Point(this)},morph:function(t,e){return this.destination=new a.Point(t,e),this}}}),a.extend(a.Element,{point:function(t,e){return new a.Point(t,e).transform(this.screenCTM().inverse())}}),a.extend(a.Element,{attr:function(t,e,s){if(null==t){for(t={},s=(e=this.node.attributes).length-1;s>=0;s--)t[e[s].nodeName]=a.regex.isNumber.test(e[s].nodeValue)?parseFloat(e[s].nodeValue):e[s].nodeValue;return t}if("object"===i(t))for(var r in t)this.attr(r,t[r]);else if(null===e)this.node.removeAttribute(t);else{if(null==e)return null==(e=this.node.getAttribute(t))?a.defaults.attrs[t]:a.regex.isNumber.test(e)?parseFloat(e):e;"stroke-width"==t?this.attr("stroke",parseFloat(e)>0?this._stroke:null):"stroke"==t&&(this._stroke=e),"fill"!=t&&"stroke"!=t||(a.regex.isImage.test(e)&&(e=this.doc().defs().image(e,0,0)),e instanceof a.Image&&(e=this.doc().defs().pattern(0,0,(function(){this.add(e)})))),"number"==typeof e?e=new a.Number(e):a.Color.isColor(e)?e=new a.Color(e):Array.isArray(e)&&(e=new a.Array(e)),"leading"==t?this.leading&&this.leading(e):"string"==typeof s?this.node.setAttributeNS(s,t,e.toString()):this.node.setAttribute(t,e.toString()),!this.rebuild||"font-size"!=t&&"x"!=t||this.rebuild(t,e)}return this}}),a.extend(a.Element,{transform:function(t,e){var s;return"object"!==i(t)?(s=new a.Matrix(this).extract(),"string"==typeof t?s[t]:s):(s=new a.Matrix(this),e=!!e||!!t.relative,null!=t.a&&(s=e?s.multiply(new a.Matrix(t)):new a.Matrix(t)),this.attr("transform",s))}}),a.extend(a.Element,{untransform:function(){return this.attr("transform",null)},matrixify:function(){return(this.attr("transform")||"").split(a.regex.transforms).slice(0,-1).map((function(t){var e=t.trim().split("(");return[e[0],e[1].split(a.regex.delimiter).map((function(t){return parseFloat(t)}))]})).reduce((function(t,e){return"matrix"==e[0]?t.multiply(f(e[1])):t[e[0]].apply(t,e[1])}),new a.Matrix)},toParent:function(t){if(this==t)return this;var e=this.screenCTM(),i=t.screenCTM().inverse();return this.addTo(t).untransform().transform(i.multiply(e)),this},toDoc:function(){return this.toParent(this.doc())}}),a.Transformation=a.invent({create:function(t,e){if(arguments.length>1&&"boolean"!=typeof e)return this.constructor.call(this,[].slice.call(arguments));if(Array.isArray(t))for(var a=0,s=this.arguments.length;a=0},index:function(t){return[].slice.call(this.node.childNodes).indexOf(t.node)},get:function(t){return a.adopt(this.node.childNodes[t])},first:function(){return this.get(0)},last:function(){return this.get(this.node.childNodes.length-1)},each:function(t,e){for(var i=this.children(),s=0,r=i.length;s=0;i--)e.childNodes[i]instanceof t.SVGElement&&x(e.childNodes[i]);return a.adopt(e).id(a.eid(e.nodeName))}function b(t){return null==t.x&&(t.x=0,t.y=0,t.width=0,t.height=0),t.w=t.width,t.h=t.height,t.x2=t.x+t.width,t.y2=t.y+t.height,t.cx=t.x+t.width/2,t.cy=t.y+t.height/2,t}function v(t){return Math.abs(t)>1e-37?t:0}["fill","stroke"].forEach((function(t){var e={};e[t]=function(e){if(void 0===e)return this;if("string"==typeof e||a.Color.isRgb(e)||e&&"function"==typeof e.fill)this.attr(t,e);else for(var i=l[t].length-1;i>=0;i--)null!=e[l[t][i]]&&this.attr(l.prefix(t,l[t][i]),e[l[t][i]]);return this},a.extend(a.Element,a.FX,e)})),a.extend(a.Element,a.FX,{translate:function(t,e){return this.transform({x:t,y:e})},matrix:function(t){return this.attr("transform",new a.Matrix(6==arguments.length?[].slice.call(arguments):t))},opacity:function(t){return this.attr("opacity",t)},dx:function(t){return this.x(new a.Number(t).plus(this instanceof a.FX?0:this.x()),!0)},dy:function(t){return this.y(new a.Number(t).plus(this instanceof a.FX?0:this.y()),!0)}}),a.extend(a.Path,{length:function(){return this.node.getTotalLength()},pointAt:function(t){return this.node.getPointAtLength(t)}}),a.Set=a.invent({create:function(t){Array.isArray(t)?this.members=t:this.clear()},extend:{add:function(){for(var t=[].slice.call(arguments),e=0,i=t.length;e-1&&this.members.splice(e,1),this},each:function(t){for(var e=0,i=this.members.length;e=0},index:function(t){return this.members.indexOf(t)},get:function(t){return this.members[t]},first:function(){return this.get(0)},last:function(){return this.get(this.members.length-1)},valueOf:function(){return this.members}},construct:{set:function(t){return new a.Set(t)}}}),a.FX.Set=a.invent({create:function(t){this.set=t}}),a.Set.inherit=function(){var t=[];for(var e in a.Shape.prototype)"function"==typeof a.Shape.prototype[e]&&"function"!=typeof a.Set.prototype[e]&&t.push(e);for(var e in t.forEach((function(t){a.Set.prototype[t]=function(){for(var e=0,i=this.members.length;e=0;t--)delete this.memory()[arguments[t]];return this},memory:function(){return this._memory||(this._memory={})}}),a.get=function(t){var i=e.getElementById(function(t){var e=(t||"").toString().match(a.regex.reference);if(e)return e[1]}(t)||t);return a.adopt(i)},a.select=function(t,i){return new a.Set(a.utils.map((i||e).querySelectorAll(t),(function(t){return a.adopt(t)})))},a.extend(a.Parent,{select:function(t){return a.select(t,this.node)}});var m="abcdef".split("");if("function"!=typeof t.CustomEvent){var y=function(t,i){i=i||{bubbles:!1,cancelable:!1,detail:void 0};var a=e.createEvent("CustomEvent");return a.initCustomEvent(t,i.bubbles,i.cancelable,i.detail),a};y.prototype=t.Event.prototype,a.CustomEvent=y}else a.CustomEvent=t.CustomEvent;return a},"function"==typeof define&&define.amd?define((function(){return Mt(Tt,Tt.document)})):"object"===("undefined"==typeof exports?"undefined":i(exports))&&"undefined"!=typeof module?module.exports=Tt.document?Mt(Tt,Tt.document):function(t){return Mt(t,t.document)}:Tt.SVG=Mt(Tt,Tt.document), +/*! svg.filter.js - v2.0.2 - 2016-02-24 + * https://github.com/wout/svg.filter.js + * Copyright (c) 2016 Wout Fierens; Licensed MIT */ +function(){SVG.Filter=SVG.invent({create:"filter",inherit:SVG.Parent,extend:{source:"SourceGraphic",sourceAlpha:"SourceAlpha",background:"BackgroundImage",backgroundAlpha:"BackgroundAlpha",fill:"FillPaint",stroke:"StrokePaint",autoSetIn:!0,put:function(t,e){return this.add(t,e),!t.attr("in")&&this.autoSetIn&&t.attr("in",this.source),t.attr("result")||t.attr("result",t),t},blend:function(t,e,i){return this.put(new SVG.BlendEffect(t,e,i))},colorMatrix:function(t,e){return this.put(new SVG.ColorMatrixEffect(t,e))},convolveMatrix:function(t){return this.put(new SVG.ConvolveMatrixEffect(t))},componentTransfer:function(t){return this.put(new SVG.ComponentTransferEffect(t))},composite:function(t,e,i){return this.put(new SVG.CompositeEffect(t,e,i))},flood:function(t,e){return this.put(new SVG.FloodEffect(t,e))},offset:function(t,e){return this.put(new SVG.OffsetEffect(t,e))},image:function(t){return this.put(new SVG.ImageEffect(t))},merge:function(){var t=[void 0];for(var e in arguments)t.push(arguments[e]);return this.put(new(SVG.MergeEffect.bind.apply(SVG.MergeEffect,t)))},gaussianBlur:function(t,e){return this.put(new SVG.GaussianBlurEffect(t,e))},morphology:function(t,e){return this.put(new SVG.MorphologyEffect(t,e))},diffuseLighting:function(t,e,i){return this.put(new SVG.DiffuseLightingEffect(t,e,i))},displacementMap:function(t,e,i,a,s){return this.put(new SVG.DisplacementMapEffect(t,e,i,a,s))},specularLighting:function(t,e,i,a){return this.put(new SVG.SpecularLightingEffect(t,e,i,a))},tile:function(){return this.put(new SVG.TileEffect)},turbulence:function(t,e,i,a,s){return this.put(new SVG.TurbulenceEffect(t,e,i,a,s))},toString:function(){return"url(#"+this.attr("id")+")"}}}),SVG.extend(SVG.Defs,{filter:function(t){var e=this.put(new SVG.Filter);return"function"==typeof t&&t.call(e,e),e}}),SVG.extend(SVG.Container,{filter:function(t){return this.defs().filter(t)}}),SVG.extend(SVG.Element,SVG.G,SVG.Nested,{filter:function(t){return this.filterer=t instanceof SVG.Element?t:this.doc().filter(t),this.doc()&&this.filterer.doc()!==this.doc()&&this.doc().defs().add(this.filterer),this.attr("filter",this.filterer),this.filterer},unfilter:function(t){return this.filterer&&!0===t&&this.filterer.remove(),delete this.filterer,this.attr("filter",null)}}),SVG.Effect=SVG.invent({create:function(){this.constructor.call(this)},inherit:SVG.Element,extend:{in:function(t){return null==t?this.parent()&&this.parent().select('[result="'+this.attr("in")+'"]').get(0)||this.attr("in"):this.attr("in",t)},result:function(t){return null==t?this.attr("result"):this.attr("result",t)},toString:function(){return this.result()}}}),SVG.ParentEffect=SVG.invent({create:function(){this.constructor.call(this)},inherit:SVG.Parent,extend:{in:function(t){return null==t?this.parent()&&this.parent().select('[result="'+this.attr("in")+'"]').get(0)||this.attr("in"):this.attr("in",t)},result:function(t){return null==t?this.attr("result"):this.attr("result",t)},toString:function(){return this.result()}}});var t={blend:function(t,e){return this.parent()&&this.parent().blend(this,t,e)},colorMatrix:function(t,e){return this.parent()&&this.parent().colorMatrix(t,e).in(this)},convolveMatrix:function(t){return this.parent()&&this.parent().convolveMatrix(t).in(this)},componentTransfer:function(t){return this.parent()&&this.parent().componentTransfer(t).in(this)},composite:function(t,e){return this.parent()&&this.parent().composite(this,t,e)},flood:function(t,e){return this.parent()&&this.parent().flood(t,e)},offset:function(t,e){return this.parent()&&this.parent().offset(t,e).in(this)},image:function(t){return this.parent()&&this.parent().image(t)},merge:function(){return this.parent()&&this.parent().merge.apply(this.parent(),[this].concat(arguments))},gaussianBlur:function(t,e){return this.parent()&&this.parent().gaussianBlur(t,e).in(this)},morphology:function(t,e){return this.parent()&&this.parent().morphology(t,e).in(this)},diffuseLighting:function(t,e,i){return this.parent()&&this.parent().diffuseLighting(t,e,i).in(this)},displacementMap:function(t,e,i,a){return this.parent()&&this.parent().displacementMap(this,t,e,i,a)},specularLighting:function(t,e,i,a){return this.parent()&&this.parent().specularLighting(t,e,i,a).in(this)},tile:function(){return this.parent()&&this.parent().tile().in(this)},turbulence:function(t,e,i,a,s){return this.parent()&&this.parent().turbulence(t,e,i,a,s).in(this)}};SVG.extend(SVG.Effect,t),SVG.extend(SVG.ParentEffect,t),SVG.ChildEffect=SVG.invent({create:function(){this.constructor.call(this)},inherit:SVG.Element,extend:{in:function(t){this.attr("in",t)}}});var e={blend:function(t,e,i){this.attr({in:t,in2:e,mode:i||"normal"})},colorMatrix:function(t,e){"matrix"==t&&(e=s(e)),this.attr({type:t,values:void 0===e?null:e})},convolveMatrix:function(t){t=s(t),this.attr({order:Math.sqrt(t.split(" ").length),kernelMatrix:t})},composite:function(t,e,i){this.attr({in:t,in2:e,operator:i})},flood:function(t,e){this.attr("flood-color",t),null!=e&&this.attr("flood-opacity",e)},offset:function(t,e){this.attr({dx:t,dy:e})},image:function(t){this.attr("href",t,SVG.xlink)},displacementMap:function(t,e,i,a,s){this.attr({in:t,in2:e,scale:i,xChannelSelector:a,yChannelSelector:s})},gaussianBlur:function(t,e){null!=t||null!=e?this.attr("stdDeviation",r(Array.prototype.slice.call(arguments))):this.attr("stdDeviation","0 0")},morphology:function(t,e){this.attr({operator:t,radius:e})},tile:function(){},turbulence:function(t,e,i,a,s){this.attr({numOctaves:e,seed:i,stitchTiles:a,baseFrequency:t,type:s})}},i={merge:function(){var t;if(arguments[0]instanceof SVG.Set){var e=this;arguments[0].each((function(t){this instanceof SVG.MergeNode?e.put(this):(this instanceof SVG.Effect||this instanceof SVG.ParentEffect)&&e.put(new SVG.MergeNode(this))}))}else{t=Array.isArray(arguments[0])?arguments[0]:arguments;for(var i=0;i1&&(T*=a=Math.sqrt(a),M*=a);s=(new SVG.Matrix).rotate(I).scale(1/T,1/M).rotate(-I),F=F.transform(s),R=R.transform(s),r=[R.x-F.x,R.y-F.y],n=r[0]*r[0]+r[1]*r[1],o=Math.sqrt(n),r[0]/=o,r[1]/=o,l=n<4?Math.sqrt(1-n/4):0,z===X&&(l*=-1);h=new SVG.Point((R.x+F.x)/2+l*-r[1],(R.y+F.y)/2+l*r[0]),c=new SVG.Point(F.x-h.x,F.y-h.y),d=new SVG.Point(R.x-h.x,R.y-h.y),g=Math.acos(c.x/Math.sqrt(c.x*c.x+c.y*c.y)),c.y<0&&(g*=-1);u=Math.acos(d.x/Math.sqrt(d.x*d.x+d.y*d.y)),d.y<0&&(u*=-1);X&&g>u&&(u+=2*Math.PI);!X&&gr.maxX-e.width&&(o=(a=r.maxX-e.width)-this.startPoints.box.x),null!=r.minY&&sr.maxY-e.height&&(n=(s=r.maxY-e.height)-this.startPoints.box.y),null!=r.snapToGrid&&(a-=a%r.snapToGrid,s-=s%r.snapToGrid,o-=o%r.snapToGrid,n-=n%r.snapToGrid),this.el instanceof SVG.G?this.el.matrix(this.startPoints.transform).transform({x:o,y:n},!0):this.el.move(a,s));return i},t.prototype.end=function(t){var e=this.drag(t);this.el.fire("dragend",{event:t,p:e,m:this.m,handler:this}),SVG.off(window,"mousemove.drag"),SVG.off(window,"touchmove.drag"),SVG.off(window,"mouseup.drag"),SVG.off(window,"touchend.drag")},SVG.extend(SVG.Element,{draggable:function(e,i){"function"!=typeof e&&"object"!=typeof e||(i=e,e=!0);var a=this.remember("_draggable")||new t(this);return(e=void 0===e||e)?a.init(i||{},e):(this.off("mousedown.drag"),this.off("touchstart.drag")),this}})}.call(void 0),function(){function t(t){this.el=t,t.remember("_selectHandler",this),this.pointSelection={isSelected:!1},this.rectSelection={isSelected:!1},this.pointsList={lt:[0,0],rt:["width",0],rb:["width","height"],lb:[0,"height"],t:["width",0],r:["width","height"],b:["width","height"],l:[0,"height"]},this.pointCoord=function(t,e,i){var a="string"!=typeof t?t:e[t];return i?a/2:a},this.pointCoords=function(t,e){var i=this.pointsList[t];return{x:this.pointCoord(i[0],e,"t"===t||"b"===t),y:this.pointCoord(i[1],e,"r"===t||"l"===t)}}}t.prototype.init=function(t,e){var i=this.el.bbox();this.options={};var a=this.el.selectize.defaults.points;for(var s in this.el.selectize.defaults)this.options[s]=this.el.selectize.defaults[s],void 0!==e[s]&&(this.options[s]=e[s]);var r=["points","pointsExclude"];for(var s in r){var o=this.options[r[s]];"string"==typeof o?o=o.length>0?o.split(/\s*,\s*/i):[]:"boolean"==typeof o&&"points"===r[s]&&(o=o?a:[]),this.options[r[s]]=o}this.options.points=[a,this.options.points].reduce((function(t,e){return t.filter((function(t){return e.indexOf(t)>-1}))})),this.options.points=[this.options.points,this.options.pointsExclude].reduce((function(t,e){return t.filter((function(t){return e.indexOf(t)<0}))})),this.parent=this.el.parent(),this.nested=this.nested||this.parent.group(),this.nested.matrix(new SVG.Matrix(this.el).translate(i.x,i.y)),this.options.deepSelect&&-1!==["line","polyline","polygon"].indexOf(this.el.type)?this.selectPoints(t):this.selectRect(t),this.observe(),this.cleanup()},t.prototype.selectPoints=function(t){return this.pointSelection.isSelected=t,this.pointSelection.set||(this.pointSelection.set=this.parent.set(),this.drawPoints()),this},t.prototype.getPointArray=function(){var t=this.el.bbox();return this.el.array().valueOf().map((function(e){return[e[0]-t.x,e[1]-t.y]}))},t.prototype.drawPoints=function(){for(var t=this,e=this.getPointArray(),i=0,a=e.length;i0&&this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y+i[1]).size(this.parameters.box.width-i[0],this.parameters.box.height-i[1])}};break;case"rt":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).size(this.parameters.box.width+i[0],this.parameters.box.height-i[1])}};break;case"rb":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x,this.parameters.box.y).size(this.parameters.box.width+i[0],this.parameters.box.height+i[1])}};break;case"lb":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0&&this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).size(this.parameters.box.width-i[0],this.parameters.box.height+i[1])}};break;case"t":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).height(this.parameters.box.height-i[1])}};break;case"r":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).width(this.parameters.box.width+i[0])}};break;case"b":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).height(this.parameters.box.height+i[1])}};break;case"l":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).width(this.parameters.box.width-i[0])}};break;case"rot":this.calc=function(t,e){var i=t+this.parameters.p.x,a=e+this.parameters.p.y,s=Math.atan2(this.parameters.p.y-this.parameters.box.y-this.parameters.box.height/2,this.parameters.p.x-this.parameters.box.x-this.parameters.box.width/2),r=Math.atan2(a-this.parameters.box.y-this.parameters.box.height/2,i-this.parameters.box.x-this.parameters.box.width/2),o=this.parameters.rotation+180*(r-s)/Math.PI+this.options.snapToAngle/2;this.el.center(this.parameters.box.cx,this.parameters.box.cy).rotate(o-o%this.options.snapToAngle,this.parameters.box.cx,this.parameters.box.cy)};break;case"point":this.calc=function(t,e){var i=this.snapToGrid(t,e,this.parameters.pointCoords[0],this.parameters.pointCoords[1]),a=this.el.array().valueOf();a[this.parameters.i][0]=this.parameters.pointCoords[0]+i[0],a[this.parameters.i][1]=this.parameters.pointCoords[1]+i[1],this.el.plot(a)}}this.el.fire("resizestart",{dx:this.parameters.x,dy:this.parameters.y,event:t}),SVG.on(window,"touchmove.resize",(function(t){e.update(t||window.event)})),SVG.on(window,"touchend.resize",(function(){e.done()})),SVG.on(window,"mousemove.resize",(function(t){e.update(t||window.event)})),SVG.on(window,"mouseup.resize",(function(){e.done()}))},t.prototype.update=function(t){if(t){var e=this._extractPosition(t),i=this.transformPoint(e.x,e.y),a=i.x-this.parameters.p.x,s=i.y-this.parameters.p.y;this.lastUpdateCall=[a,s],this.calc(a,s),this.el.fire("resizing",{dx:a,dy:s,event:t})}else this.lastUpdateCall&&this.calc(this.lastUpdateCall[0],this.lastUpdateCall[1])},t.prototype.done=function(){this.lastUpdateCall=null,SVG.off(window,"mousemove.resize"),SVG.off(window,"mouseup.resize"),SVG.off(window,"touchmove.resize"),SVG.off(window,"touchend.resize"),this.el.fire("resizedone")},t.prototype.snapToGrid=function(t,e,i,a){var s;return void 0!==a?s=[(i+t)%this.options.snapToGrid,(a+e)%this.options.snapToGrid]:(i=null==i?3:i,s=[(this.parameters.box.x+t+(1&i?0:this.parameters.box.width))%this.options.snapToGrid,(this.parameters.box.y+e+(2&i?0:this.parameters.box.height))%this.options.snapToGrid]),t<0&&(s[0]-=this.options.snapToGrid),e<0&&(s[1]-=this.options.snapToGrid),t-=Math.abs(s[0])o.maxX&&(t=o.maxX-s),void 0!==o.minY&&r+eo.maxY&&(e=o.maxY-r),[t,e]},t.prototype.checkAspectRatio=function(t,e){if(!this.options.saveAspectRatio)return t;var i=t.slice(),a=this.parameters.box.width/this.parameters.box.height,s=this.parameters.box.width+t[0],r=this.parameters.box.height-t[1],o=s/r;return oa&&(i[0]=this.parameters.box.width-r*a,e&&(i[0]=-i[0])),i},SVG.extend(SVG.Element,{resize:function(e){return(this.remember("_resizeHandler")||new t(this)).init(e||{}),this}}),SVG.Element.prototype.resize.defaults={snapToAngle:.1,snapToGrid:1,constraint:{},saveAspectRatio:!1}}).call(this)}(),void 0===window.Apex&&(window.Apex={});var Ft=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"initModules",value:function(){this.ctx.publicMethods=["updateOptions","updateSeries","appendData","appendSeries","toggleSeries","showSeries","hideSeries","setLocale","resetSeries","zoomX","toggleDataPointSelection","dataURI","addXaxisAnnotation","addYaxisAnnotation","addPointAnnotation","clearAnnotations","removeAnnotation","paper","destroy"],this.ctx.eventList=["click","mousedown","mousemove","mouseleave","touchstart","touchmove","touchleave","mouseup","touchend"],this.ctx.animations=new f(this.ctx),this.ctx.axes=new J(this.ctx),this.ctx.core=new Et(this.ctx.el,this.ctx),this.ctx.config=new H({}),this.ctx.data=new O(this.ctx),this.ctx.grid=new _(this.ctx),this.ctx.graphics=new b(this.ctx),this.ctx.coreUtils=new y(this.ctx),this.ctx.crosshairs=new Q(this.ctx),this.ctx.events=new Z(this.ctx),this.ctx.exports=new V(this.ctx),this.ctx.localization=new $(this.ctx),this.ctx.options=new S,this.ctx.responsive=new K(this.ctx),this.ctx.series=new z(this.ctx),this.ctx.theme=new tt(this.ctx),this.ctx.formatters=new W(this.ctx),this.ctx.titleSubtitle=new et(this.ctx),this.ctx.legend=new lt(this.ctx),this.ctx.toolbar=new ht(this.ctx),this.ctx.dimensions=new ot(this.ctx),this.ctx.updateHelpers=new Yt(this.ctx),this.ctx.zoomPanSelection=new ct(this.ctx),this.ctx.w.globals.tooltip=new bt(this.ctx)}}]),t}(),Rt=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:"clear",value:function(t){var e=t.isUpdating;this.ctx.zoomPanSelection&&this.ctx.zoomPanSelection.destroy(),this.ctx.toolbar&&this.ctx.toolbar.destroy(),this.ctx.animations=null,this.ctx.axes=null,this.ctx.annotations=null,this.ctx.core=null,this.ctx.data=null,this.ctx.grid=null,this.ctx.series=null,this.ctx.responsive=null,this.ctx.theme=null,this.ctx.formatters=null,this.ctx.titleSubtitle=null,this.ctx.legend=null,this.ctx.dimensions=null,this.ctx.options=null,this.ctx.crosshairs=null,this.ctx.zoomPanSelection=null,this.ctx.updateHelpers=null,this.ctx.toolbar=null,this.ctx.localization=null,this.ctx.w.globals.tooltip=null,this.clearDomElements({isUpdating:e})}},{key:"killSVG",value:function(t){t.each((function(t,e){this.removeClass("*"),this.off(),this.stop()}),!0),t.ungroup(),t.clear()}},{key:"clearDomElements",value:function(t){var e=this,i=t.isUpdating,a=this.w.globals.dom.Paper.node;a.parentNode&&a.parentNode.parentNode&&!i&&(a.parentNode.parentNode.style.minHeight="unset");var s=this.w.globals.dom.baseEl;s&&this.ctx.eventList.forEach((function(t){s.removeEventListener(t,e.ctx.events.documentEvent)}));var r=this.w.globals.dom;if(null!==this.ctx.el)for(;this.ctx.el.firstChild;)this.ctx.el.removeChild(this.ctx.el.firstChild);this.killSVG(r.Paper),r.Paper.remove(),r.elWrap=null,r.elGraphical=null,r.elAnnotations=null,r.elLegendWrap=null,r.baseEl=null,r.elGridRect=null,r.elGridRectMask=null,r.elGridRectMarkerMask=null,r.elForecastMask=null,r.elNonForecastMask=null,r.elDefs=null}}]),t}(),Ht=new WeakMap;return function(){function t(e,i){a(this,t),this.opts=i,this.ctx=this,this.w=new N(i).init(),this.el=e,this.w.globals.cuid=p.randomId(),this.w.globals.chartID=this.w.config.chart.id?p.escapeString(this.w.config.chart.id):this.w.globals.cuid,new Ft(this).initModules(),this.create=p.bind(this.create,this),this.windowResizeHandler=this._windowResizeHandler.bind(this),this.parentResizeHandler=this._parentResizeCallback.bind(this)}return r(t,[{key:"render",value:function(){var t=this;return new Promise((function(e,i){if(null!==t.el){void 0===Apex._chartInstances&&(Apex._chartInstances=[]),t.w.config.chart.id&&Apex._chartInstances.push({id:t.w.globals.chartID,group:t.w.config.chart.group,chart:t}),t.setLocale(t.w.config.chart.defaultLocale);var a=t.w.config.chart.events.beforeMount;if("function"==typeof a&&a(t,t.w),t.events.fireEvent("beforeMount",[t,t.w]),window.addEventListener("resize",t.windowResizeHandler),h=t.el.parentNode,c=t.parentResizeHandler,d=!1,g=new ResizeObserver((function(t){d&&c.call(h,t),d=!0})),h.nodeType===Node.DOCUMENT_FRAGMENT_NODE?Array.from(h.children).forEach((function(t){return g.observe(t)})):g.observe(h),Ht.set(c,g),!t.css){var s=t.el.getRootNode&&t.el.getRootNode(),r=p.is("ShadowRoot",s),o=t.el.ownerDocument,n=o.getElementById("apexcharts-css");!r&&n||(t.css=document.createElement("style"),t.css.id="apexcharts-css",t.css.textContent='.apexcharts-canvas {\n position: relative;\n user-select: none;\n /* cannot give overflow: hidden as it will crop tooltips which overflow outside chart area */\n}\n\n\n/* scrollbar is not visible by default for legend, hence forcing the visibility */\n.apexcharts-canvas ::-webkit-scrollbar {\n -webkit-appearance: none;\n width: 6px;\n}\n\n.apexcharts-canvas ::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: rgba(0, 0, 0, .5);\n box-shadow: 0 0 1px rgba(255, 255, 255, .5);\n -webkit-box-shadow: 0 0 1px rgba(255, 255, 255, .5);\n}\n\n\n.apexcharts-inner {\n position: relative;\n}\n\n.apexcharts-text tspan {\n font-family: inherit;\n}\n\n.legend-mouseover-inactive {\n transition: 0.15s ease all;\n opacity: 0.20;\n}\n\n.apexcharts-series-collapsed {\n opacity: 0;\n}\n\n.apexcharts-tooltip {\n border-radius: 5px;\n box-shadow: 2px 2px 6px -4px #999;\n cursor: default;\n font-size: 14px;\n left: 62px;\n opacity: 0;\n pointer-events: none;\n position: absolute;\n top: 20px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n white-space: nowrap;\n z-index: 12;\n transition: 0.15s ease all;\n}\n\n.apexcharts-tooltip.apexcharts-active {\n opacity: 1;\n transition: 0.15s ease all;\n}\n\n.apexcharts-tooltip.apexcharts-theme-light {\n border: 1px solid #e3e3e3;\n background: rgba(255, 255, 255, 0.96);\n}\n\n.apexcharts-tooltip.apexcharts-theme-dark {\n color: #fff;\n background: rgba(30, 30, 30, 0.8);\n}\n\n.apexcharts-tooltip * {\n font-family: inherit;\n}\n\n\n.apexcharts-tooltip-title {\n padding: 6px;\n font-size: 15px;\n margin-bottom: 4px;\n}\n\n.apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title {\n background: #ECEFF1;\n border-bottom: 1px solid #ddd;\n}\n\n.apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title {\n background: rgba(0, 0, 0, 0.7);\n border-bottom: 1px solid #333;\n}\n\n.apexcharts-tooltip-text-y-value,\n.apexcharts-tooltip-text-goals-value,\n.apexcharts-tooltip-text-z-value {\n display: inline-block;\n font-weight: 600;\n margin-left: 5px;\n}\n\n.apexcharts-tooltip-text-y-label:empty,\n.apexcharts-tooltip-text-y-value:empty,\n.apexcharts-tooltip-text-goals-label:empty,\n.apexcharts-tooltip-text-goals-value:empty,\n.apexcharts-tooltip-text-z-value:empty {\n display: none;\n}\n\n.apexcharts-tooltip-text-y-value,\n.apexcharts-tooltip-text-goals-value,\n.apexcharts-tooltip-text-z-value {\n font-weight: 600;\n}\n\n.apexcharts-tooltip-text-goals-label, \n.apexcharts-tooltip-text-goals-value {\n padding: 6px 0 5px;\n}\n\n.apexcharts-tooltip-goals-group, \n.apexcharts-tooltip-text-goals-label, \n.apexcharts-tooltip-text-goals-value {\n display: flex;\n}\n.apexcharts-tooltip-text-goals-label:not(:empty),\n.apexcharts-tooltip-text-goals-value:not(:empty) {\n margin-top: -6px;\n}\n\n.apexcharts-tooltip-marker {\n width: 12px;\n height: 12px;\n position: relative;\n top: 0px;\n margin-right: 10px;\n border-radius: 50%;\n}\n\n.apexcharts-tooltip-series-group {\n padding: 0 10px;\n display: none;\n text-align: left;\n justify-content: left;\n align-items: center;\n}\n\n.apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-marker {\n opacity: 1;\n}\n\n.apexcharts-tooltip-series-group.apexcharts-active,\n.apexcharts-tooltip-series-group:last-child {\n padding-bottom: 4px;\n}\n\n.apexcharts-tooltip-series-group-hidden {\n opacity: 0;\n height: 0;\n line-height: 0;\n padding: 0 !important;\n}\n\n.apexcharts-tooltip-y-group {\n padding: 6px 0 5px;\n}\n\n.apexcharts-tooltip-box, .apexcharts-custom-tooltip {\n padding: 4px 8px;\n}\n\n.apexcharts-tooltip-boxPlot {\n display: flex;\n flex-direction: column-reverse;\n}\n\n.apexcharts-tooltip-box>div {\n margin: 4px 0;\n}\n\n.apexcharts-tooltip-box span.value {\n font-weight: bold;\n}\n\n.apexcharts-tooltip-rangebar {\n padding: 5px 8px;\n}\n\n.apexcharts-tooltip-rangebar .category {\n font-weight: 600;\n color: #777;\n}\n\n.apexcharts-tooltip-rangebar .series-name {\n font-weight: bold;\n display: block;\n margin-bottom: 5px;\n}\n\n.apexcharts-xaxistooltip {\n opacity: 0;\n padding: 9px 10px;\n pointer-events: none;\n color: #373d3f;\n font-size: 13px;\n text-align: center;\n border-radius: 2px;\n position: absolute;\n z-index: 10;\n background: #ECEFF1;\n border: 1px solid #90A4AE;\n transition: 0.15s ease all;\n}\n\n.apexcharts-xaxistooltip.apexcharts-theme-dark {\n background: rgba(0, 0, 0, 0.7);\n border: 1px solid rgba(0, 0, 0, 0.5);\n color: #fff;\n}\n\n.apexcharts-xaxistooltip:after,\n.apexcharts-xaxistooltip:before {\n left: 50%;\n border: solid transparent;\n content: " ";\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none;\n}\n\n.apexcharts-xaxistooltip:after {\n border-color: rgba(236, 239, 241, 0);\n border-width: 6px;\n margin-left: -6px;\n}\n\n.apexcharts-xaxistooltip:before {\n border-color: rgba(144, 164, 174, 0);\n border-width: 7px;\n margin-left: -7px;\n}\n\n.apexcharts-xaxistooltip-bottom:after,\n.apexcharts-xaxistooltip-bottom:before {\n bottom: 100%;\n}\n\n.apexcharts-xaxistooltip-top:after,\n.apexcharts-xaxistooltip-top:before {\n top: 100%;\n}\n\n.apexcharts-xaxistooltip-bottom:after {\n border-bottom-color: #ECEFF1;\n}\n\n.apexcharts-xaxistooltip-bottom:before {\n border-bottom-color: #90A4AE;\n}\n\n.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:after {\n border-bottom-color: rgba(0, 0, 0, 0.5);\n}\n\n.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:before {\n border-bottom-color: rgba(0, 0, 0, 0.5);\n}\n\n.apexcharts-xaxistooltip-top:after {\n border-top-color: #ECEFF1\n}\n\n.apexcharts-xaxistooltip-top:before {\n border-top-color: #90A4AE;\n}\n\n.apexcharts-xaxistooltip-top.apexcharts-theme-dark:after {\n border-top-color: rgba(0, 0, 0, 0.5);\n}\n\n.apexcharts-xaxistooltip-top.apexcharts-theme-dark:before {\n border-top-color: rgba(0, 0, 0, 0.5);\n}\n\n.apexcharts-xaxistooltip.apexcharts-active {\n opacity: 1;\n transition: 0.15s ease all;\n}\n\n.apexcharts-yaxistooltip {\n opacity: 0;\n padding: 4px 10px;\n pointer-events: none;\n color: #373d3f;\n font-size: 13px;\n text-align: center;\n border-radius: 2px;\n position: absolute;\n z-index: 10;\n background: #ECEFF1;\n border: 1px solid #90A4AE;\n}\n\n.apexcharts-yaxistooltip.apexcharts-theme-dark {\n background: rgba(0, 0, 0, 0.7);\n border: 1px solid rgba(0, 0, 0, 0.5);\n color: #fff;\n}\n\n.apexcharts-yaxistooltip:after,\n.apexcharts-yaxistooltip:before {\n top: 50%;\n border: solid transparent;\n content: " ";\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none;\n}\n\n.apexcharts-yaxistooltip:after {\n border-color: rgba(236, 239, 241, 0);\n border-width: 6px;\n margin-top: -6px;\n}\n\n.apexcharts-yaxistooltip:before {\n border-color: rgba(144, 164, 174, 0);\n border-width: 7px;\n margin-top: -7px;\n}\n\n.apexcharts-yaxistooltip-left:after,\n.apexcharts-yaxistooltip-left:before {\n left: 100%;\n}\n\n.apexcharts-yaxistooltip-right:after,\n.apexcharts-yaxistooltip-right:before {\n right: 100%;\n}\n\n.apexcharts-yaxistooltip-left:after {\n border-left-color: #ECEFF1;\n}\n\n.apexcharts-yaxistooltip-left:before {\n border-left-color: #90A4AE;\n}\n\n.apexcharts-yaxistooltip-left.apexcharts-theme-dark:after {\n border-left-color: rgba(0, 0, 0, 0.5);\n}\n\n.apexcharts-yaxistooltip-left.apexcharts-theme-dark:before {\n border-left-color: rgba(0, 0, 0, 0.5);\n}\n\n.apexcharts-yaxistooltip-right:after {\n border-right-color: #ECEFF1;\n}\n\n.apexcharts-yaxistooltip-right:before {\n border-right-color: #90A4AE;\n}\n\n.apexcharts-yaxistooltip-right.apexcharts-theme-dark:after {\n border-right-color: rgba(0, 0, 0, 0.5);\n}\n\n.apexcharts-yaxistooltip-right.apexcharts-theme-dark:before {\n border-right-color: rgba(0, 0, 0, 0.5);\n}\n\n.apexcharts-yaxistooltip.apexcharts-active {\n opacity: 1;\n}\n\n.apexcharts-yaxistooltip-hidden {\n display: none;\n}\n\n.apexcharts-xcrosshairs,\n.apexcharts-ycrosshairs {\n pointer-events: none;\n opacity: 0;\n transition: 0.15s ease all;\n}\n\n.apexcharts-xcrosshairs.apexcharts-active,\n.apexcharts-ycrosshairs.apexcharts-active {\n opacity: 1;\n transition: 0.15s ease all;\n}\n\n.apexcharts-ycrosshairs-hidden {\n opacity: 0;\n}\n\n.apexcharts-selection-rect {\n cursor: move;\n}\n\n.svg_select_boundingRect, .svg_select_points_rot {\n pointer-events: none;\n opacity: 0;\n visibility: hidden;\n}\n.apexcharts-selection-rect + g .svg_select_boundingRect,\n.apexcharts-selection-rect + g .svg_select_points_rot {\n opacity: 0;\n visibility: hidden;\n}\n\n.apexcharts-selection-rect + g .svg_select_points_l,\n.apexcharts-selection-rect + g .svg_select_points_r {\n cursor: ew-resize;\n opacity: 1;\n visibility: visible;\n}\n\n.svg_select_points {\n fill: #efefef;\n stroke: #333;\n rx: 2;\n}\n\n.apexcharts-svg.apexcharts-zoomable.hovering-zoom {\n cursor: crosshair\n}\n\n.apexcharts-svg.apexcharts-zoomable.hovering-pan {\n cursor: move\n}\n\n.apexcharts-zoom-icon,\n.apexcharts-zoomin-icon,\n.apexcharts-zoomout-icon,\n.apexcharts-reset-icon,\n.apexcharts-pan-icon,\n.apexcharts-selection-icon,\n.apexcharts-menu-icon,\n.apexcharts-toolbar-custom-icon {\n cursor: pointer;\n width: 20px;\n height: 20px;\n line-height: 24px;\n color: #6E8192;\n text-align: center;\n}\n\n.apexcharts-zoom-icon svg,\n.apexcharts-zoomin-icon svg,\n.apexcharts-zoomout-icon svg,\n.apexcharts-reset-icon svg,\n.apexcharts-menu-icon svg {\n fill: #6E8192;\n}\n\n.apexcharts-selection-icon svg {\n fill: #444;\n transform: scale(0.76)\n}\n\n.apexcharts-theme-dark .apexcharts-zoom-icon svg,\n.apexcharts-theme-dark .apexcharts-zoomin-icon svg,\n.apexcharts-theme-dark .apexcharts-zoomout-icon svg,\n.apexcharts-theme-dark .apexcharts-reset-icon svg,\n.apexcharts-theme-dark .apexcharts-pan-icon svg,\n.apexcharts-theme-dark .apexcharts-selection-icon svg,\n.apexcharts-theme-dark .apexcharts-menu-icon svg,\n.apexcharts-theme-dark .apexcharts-toolbar-custom-icon svg {\n fill: #f3f4f5;\n}\n\n.apexcharts-canvas .apexcharts-zoom-icon.apexcharts-selected svg,\n.apexcharts-canvas .apexcharts-selection-icon.apexcharts-selected svg,\n.apexcharts-canvas .apexcharts-reset-zoom-icon.apexcharts-selected svg {\n fill: #008FFB;\n}\n\n.apexcharts-theme-light .apexcharts-selection-icon:not(.apexcharts-selected):hover svg,\n.apexcharts-theme-light .apexcharts-zoom-icon:not(.apexcharts-selected):hover svg,\n.apexcharts-theme-light .apexcharts-zoomin-icon:hover svg,\n.apexcharts-theme-light .apexcharts-zoomout-icon:hover svg,\n.apexcharts-theme-light .apexcharts-reset-icon:hover svg,\n.apexcharts-theme-light .apexcharts-menu-icon:hover svg {\n fill: #333;\n}\n\n.apexcharts-selection-icon,\n.apexcharts-menu-icon {\n position: relative;\n}\n\n.apexcharts-reset-icon {\n margin-left: 5px;\n}\n\n.apexcharts-zoom-icon,\n.apexcharts-reset-icon,\n.apexcharts-menu-icon {\n transform: scale(0.85);\n}\n\n.apexcharts-zoomin-icon,\n.apexcharts-zoomout-icon {\n transform: scale(0.7)\n}\n\n.apexcharts-zoomout-icon {\n margin-right: 3px;\n}\n\n.apexcharts-pan-icon {\n transform: scale(0.62);\n position: relative;\n left: 1px;\n top: 0px;\n}\n\n.apexcharts-pan-icon svg {\n fill: #fff;\n stroke: #6E8192;\n stroke-width: 2;\n}\n\n.apexcharts-pan-icon.apexcharts-selected svg {\n stroke: #008FFB;\n}\n\n.apexcharts-pan-icon:not(.apexcharts-selected):hover svg {\n stroke: #333;\n}\n\n.apexcharts-toolbar {\n position: absolute;\n z-index: 11;\n max-width: 176px;\n text-align: right;\n border-radius: 3px;\n padding: 0px 6px 2px 6px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.apexcharts-menu {\n background: #fff;\n position: absolute;\n top: 100%;\n border: 1px solid #ddd;\n border-radius: 3px;\n padding: 3px;\n right: 10px;\n opacity: 0;\n min-width: 110px;\n transition: 0.15s ease all;\n pointer-events: none;\n}\n\n.apexcharts-menu.apexcharts-menu-open {\n opacity: 1;\n pointer-events: all;\n transition: 0.15s ease all;\n}\n\n.apexcharts-menu-item {\n padding: 6px 7px;\n font-size: 12px;\n cursor: pointer;\n}\n\n.apexcharts-theme-light .apexcharts-menu-item:hover {\n background: #eee;\n}\n\n.apexcharts-theme-dark .apexcharts-menu {\n background: rgba(0, 0, 0, 0.7);\n color: #fff;\n}\n\n@media screen and (min-width: 768px) {\n .apexcharts-canvas:hover .apexcharts-toolbar {\n opacity: 1;\n }\n}\n\n.apexcharts-datalabel.apexcharts-element-hidden {\n opacity: 0;\n}\n\n.apexcharts-pie-label,\n.apexcharts-datalabels,\n.apexcharts-datalabel,\n.apexcharts-datalabel-label,\n.apexcharts-datalabel-value {\n cursor: default;\n pointer-events: none;\n}\n\n.apexcharts-pie-label-delay {\n opacity: 0;\n animation-name: opaque;\n animation-duration: 0.3s;\n animation-fill-mode: forwards;\n animation-timing-function: ease;\n}\n\n.apexcharts-canvas .apexcharts-element-hidden {\n opacity: 0;\n}\n\n.apexcharts-hide .apexcharts-series-points {\n opacity: 0;\n}\n\n.apexcharts-gridline,\n.apexcharts-annotation-rect,\n.apexcharts-tooltip .apexcharts-marker,\n.apexcharts-area-series .apexcharts-area,\n.apexcharts-line,\n.apexcharts-zoom-rect,\n.apexcharts-toolbar svg,\n.apexcharts-area-series .apexcharts-series-markers .apexcharts-marker.no-pointer-events,\n.apexcharts-line-series .apexcharts-series-markers .apexcharts-marker.no-pointer-events,\n.apexcharts-radar-series path,\n.apexcharts-radar-series polygon {\n pointer-events: none;\n}\n\n\n/* markers */\n\n.apexcharts-marker {\n transition: 0.15s ease all;\n}\n\n@keyframes opaque {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n\n/* Resize generated styles */\n\n@keyframes resizeanim {\n from {\n opacity: 0;\n }\n to {\n opacity: 0;\n }\n}\n\n.resize-triggers {\n animation: 1ms resizeanim;\n visibility: hidden;\n opacity: 0;\n}\n\n.resize-triggers,\n.resize-triggers>div,\n.contract-trigger:before {\n content: " ";\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n.resize-triggers>div {\n background: #eee;\n overflow: auto;\n}\n\n.contract-trigger:before {\n width: 200%;\n height: 200%;\n}',r?s.prepend(t.css):o.head.appendChild(t.css))}var l=t.create(t.w.config.series,{});if(!l)return e(t);t.mount(l).then((function(){"function"==typeof t.w.config.chart.events.mounted&&t.w.config.chart.events.mounted(t,t.w),t.events.fireEvent("mounted",[t,t.w]),e(l)})).catch((function(t){i(t)}))}else i(new Error("Element not found"));var h,c,d,g}))}},{key:"create",value:function(t,e){var i=this.w;new Ft(this).initModules();var a=this.w.globals;(a.noData=!1,a.animationEnded=!1,this.responsive.checkResponsiveConfig(e),i.config.xaxis.convertedCatToNumeric)&&new R(i.config).convertCatToNumericXaxis(i.config,this.ctx);if(null===this.el)return a.animationEnded=!0,null;if(this.core.setupElements(),"treemap"===i.config.chart.type&&(i.config.grid.show=!1,i.config.yaxis[0].show=!1),0===a.svgWidth)return a.animationEnded=!0,null;var s=y.checkComboSeries(t);a.comboCharts=s.comboCharts,a.comboBarCount=s.comboBarCount;var r=t.every((function(t){return t.data&&0===t.data.length}));(0===t.length||r)&&this.series.handleNoData(),this.events.setupEventHandlers(),this.data.parseData(t),this.theme.init(),new P(this).setGlobalMarkerSize(),this.formatters.setLabelFormatters(),this.titleSubtitle.draw(),a.noData&&a.collapsedSeries.length!==a.series.length&&!i.config.legend.showForSingleSeries||this.legend.init(),this.series.hasAllSeriesEqualX(),a.axisCharts&&(this.core.coreCalculations(),"category"!==i.config.xaxis.type&&this.formatters.setLabelFormatters(),this.ctx.toolbar.minX=i.globals.minX,this.ctx.toolbar.maxX=i.globals.maxX),this.formatters.heatmapLabelFormatters(),this.dimensions.plotCoords();var o=this.core.xySettings();this.grid.createGridMask();var n=this.core.plotChartType(t,o),l=new M(this);l.bringForward(),i.config.dataLabels.background.enabled&&l.dataLabelsBackground(),this.core.shiftGraphPosition();var h={plot:{left:i.globals.translateX,top:i.globals.translateY,width:i.globals.gridWidth,height:i.globals.gridHeight}};return{elGraph:n,xyRatios:o,elInner:i.globals.dom.elGraphical,dimensions:h}}},{key:"mount",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,i=this,a=i.w;return new Promise((function(s,r){if(null===i.el)return r(new Error("Not enough data to display or target element not found"));(null===e||a.globals.allSeriesCollapsed)&&i.series.handleNoData(),"treemap"!==a.config.chart.type&&i.axes.drawAxis(a.config.chart.type,e.xyRatios),i.grid=new _(i);var o=i.grid.drawGrid();i.annotations=new C(i),i.annotations.drawImageAnnos(),i.annotations.drawTextAnnos(),"back"===a.config.grid.position&&o&&a.globals.dom.elGraphical.add(o.el);var n=new G(t.ctx),l=new q(t.ctx);if(null!==o&&(n.xAxisLabelCorrections(o.xAxisTickWidth),l.setYAxisTextAlignments(),a.config.yaxis.map((function(t,e){-1===a.globals.ignoreYAxisIndexes.indexOf(e)&&l.yAxisTitleRotate(e,t.opposite)}))),"back"===a.config.annotations.position&&(a.globals.dom.Paper.add(a.globals.dom.elAnnotations),i.annotations.drawAxesAnnotations()),Array.isArray(e.elGraph))for(var h=0;h0&&a.globals.memory.methodsToExec.forEach((function(t){t.method(t.params,!1,t.context)})),a.globals.axisCharts||a.globals.noData||i.core.resizeNonAxisCharts(),s(i)}))}},{key:"destroy",value:function(){var t,e;window.removeEventListener("resize",this.windowResizeHandler),this.el.parentNode,t=this.parentResizeHandler,(e=Ht.get(t))&&(e.disconnect(),Ht.delete(t));var i=this.w.config.chart.id;i&&Apex._chartInstances.forEach((function(t,e){t.id===p.escapeString(i)&&Apex._chartInstances.splice(e,1)})),new Rt(this.ctx).clear({isUpdating:!1})}},{key:"updateOptions",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],s=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=this.w;return o.globals.selection=void 0,t.series&&(this.series.resetSeries(!1,!0,!1),t.series.length&&t.series[0].data&&(t.series=t.series.map((function(t,i){return e.updateHelpers._extendSeries(t,i)}))),this.updateHelpers.revertDefaultAxisMinMax()),t.xaxis&&(t=this.updateHelpers.forceXAxisUpdate(t)),t.yaxis&&(t=this.updateHelpers.forceYAxisUpdate(t)),o.globals.collapsedSeriesIndices.length>0&&this.series.clearPreviousPaths(),t.theme&&(t=this.theme.updateThemeOptions(t)),this.updateHelpers._updateOptions(t,i,a,s,r)}},{key:"updateSeries",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return this.series.resetSeries(!1),this.updateHelpers.revertDefaultAxisMinMax(),this.updateHelpers._updateSeries(t,e,i)}},{key:"appendSeries",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],a=this.w.config.series.slice();return a.push(t),this.series.resetSeries(!1),this.updateHelpers.revertDefaultAxisMinMax(),this.updateHelpers._updateSeries(a,e,i)}},{key:"appendData",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this;i.w.globals.dataChanged=!0,i.series.getPreviousPaths();for(var a=i.w.config.series.slice(),s=0;s0&&void 0!==arguments[0])||arguments[0],e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.series.resetSeries(t,e)}},{key:"addEventListener",value:function(t,e){this.events.addEventListener(t,e)}},{key:"removeEventListener",value:function(t,e){this.events.removeEventListener(t,e)}},{key:"addXaxisAnnotation",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,a=this;i&&(a=i),a.annotations.addXaxisAnnotationExternal(t,e,a)}},{key:"addYaxisAnnotation",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,a=this;i&&(a=i),a.annotations.addYaxisAnnotationExternal(t,e,a)}},{key:"addPointAnnotation",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,a=this;i&&(a=i),a.annotations.addPointAnnotationExternal(t,e,a)}},{key:"clearAnnotations",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0,e=this;t&&(e=t),e.annotations.clearAnnotations(e)}},{key:"removeAnnotation",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,i=this;e&&(i=e),i.annotations.removeAnnotation(i,t)}},{key:"getChartArea",value:function(){return this.w.globals.dom.baseEl.querySelector(".apexcharts-inner")}},{key:"getSeriesTotalXRange",value:function(t,e){return this.coreUtils.getSeriesTotalsXRange(t,e)}},{key:"getHighestValueInSeries",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=new U(this.ctx);return e.getMinYMaxY(t).highestY}},{key:"getLowestValueInSeries",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=new U(this.ctx);return e.getMinYMaxY(t).lowestY}},{key:"getSeriesTotal",value:function(){return this.w.globals.seriesTotals}},{key:"toggleDataPointSelection",value:function(t,e){return this.updateHelpers.toggleDataPointSelection(t,e)}},{key:"zoomX",value:function(t,e){this.ctx.toolbar.zoomUpdateOptions(t,e)}},{key:"setLocale",value:function(t){this.localization.setCurrentLocaleValues(t)}},{key:"dataURI",value:function(t){return new V(this.ctx).dataURI(t)}},{key:"paper",value:function(){return this.w.globals.dom.Paper}},{key:"_parentResizeCallback",value:function(){this.w.globals.animationEnded&&this.w.config.chart.redrawOnParentResize&&this._windowResize()}},{key:"_windowResize",value:function(){var t=this;clearTimeout(this.w.globals.resizeTimer),this.w.globals.resizeTimer=window.setTimeout((function(){t.w.globals.resized=!0,t.w.globals.dataChanged=!1,t.ctx.update()}),150)}},{key:"_windowResizeHandler",value:function(){var t=this.w.config.chart.redrawOnWindowResize;"function"==typeof t&&(t=t()),t&&this._windowResize()}}],[{key:"getChartByID",value:function(t){var e=p.escapeString(t),i=Apex._chartInstances.filter((function(t){return t.id===e}))[0];return i&&i.chart}},{key:"initOnLoad",value:function(){for(var e=document.querySelectorAll("[data-apexcharts]"),i=0;i2?s-2:0),o=2;o + * @copyright 2011 Colin Mollenhour + * @license http://www.opensource.org/licenses/mit-license.php The MIT License + * @package Credis_Client + */ + +if( ! defined('CRLF')) define('CRLF', sprintf('%s%s', chr(13), chr(10))); + +/** + * Credis-specific errors, wraps native Redis errors + */ +class CredisException extends Exception +{ + + const CODE_TIMED_OUT = 1; + const CODE_DISCONNECTED = 2; + + public function __construct($message, $code = 0, $exception = NULL) + { + if ($exception && get_class($exception) == 'RedisException' && strpos($message,'read error on connection') === 0) { + $code = CredisException::CODE_DISCONNECTED; + } + parent::__construct($message, $code, $exception); + } + +} + +/** + * Credis_Client, a lightweight Redis PHP standalone client and phpredis wrapper + * + * Server/Connection: + * @method Credis_Client pipeline() + * @method Credis_Client multi() + * @method Credis_Client watch(string ...$keys) + * @method Credis_Client unwatch() + * @method array exec() + * @method string|Credis_Client flushAll() + * @method string|Credis_Client flushDb() + * @method array|Credis_Client info(string $section = null) + * @method bool|array|Credis_Client config(string $setGet, string $key, string $value = null) + * @method array|Credis_Client role() + * @method array|Credis_Client time() + * @method int|Credis_Client dbsize() + * + * Keys: + * @method int|Credis_Client del(string|array $key) + * @method int|Credis_Client exists(string $key) + * @method int|Credis_Client expire(string $key, int $seconds) + * @method int|Credis_Client expireAt(string $key, int $timestamp) + * @method array|Credis_Client keys(string $key) + * @method int|Credis_Client persist(string $key) + * @method bool|Credis_Client rename(string $key, string $newKey) + * @method bool|Credis_Client renameNx(string $key, string $newKey) + * @method array|Credis_Client sort(string $key, string $arg1, string $valueN = null) + * @method int|Credis_Client ttl(string $key) + * @method string|Credis_Client type(string $key) + * + * Scalars: + * @method int|Credis_Client append(string $key, string $value) + * @method int|Credis_Client decr(string $key) + * @method int|Credis_Client decrBy(string $key, int $decrement) + * @method false|string|Credis_Client get(string $key) + * @method int|Credis_Client getBit(string $key, int $offset) + * @method string|Credis_Client getRange(string $key, int $start, int $end) + * @method string|Credis_Client getSet(string $key, string $value) + * @method int|Credis_Client incr(string $key) + * @method int|Credis_Client incrBy(string $key, int $decrement) + * @method false|array|Credis_Client mGet(array $keys) + * @method bool|Credis_Client mSet(array $keysValues) + * @method int|Credis_Client mSetNx(array $keysValues) + * @method bool|Credis_Client set(string $key, string $value, int | array $options = null) + * @method int|Credis_Client setBit(string $key, int $offset, int $value) + * @method bool|Credis_Client setEx(string $key, int $seconds, string $value) + * @method int|Credis_Client setNx(string $key, string $value) + * @method int |Credis_Client setRange(string $key, int $offset, int $value) + * @method int|Credis_Client strLen(string $key) + * + * Sets: + * @method int|Credis_Client sAdd(string $key, mixed $value, string $valueN = null) + * @method int|Credis_Client sRem(string $key, mixed $value, string $valueN = null) + * @method array|Credis_Client sMembers(string $key) + * @method array|Credis_Client sUnion(mixed $keyOrArray, string $valueN = null) + * @method array|Credis_Client sInter(mixed $keyOrArray, string $valueN = null) + * @method array |Credis_Client sDiff(mixed $keyOrArray, string $valueN = null) + * @method string|Credis_Client sPop(string $key) + * @method int|Credis_Client sCard(string $key) + * @method int|Credis_Client sIsMember(string $key, string $member) + * @method int|Credis_Client sMove(string $source, string $dest, string $member) + * @method string|array|Credis_Client sRandMember(string $key, int $count = null) + * @method int|Credis_Client sUnionStore(string $dest, string $key1, string $key2 = null) + * @method int|Credis_Client sInterStore(string $dest, string $key1, string $key2 = null) + * @method int|Credis_Client sDiffStore(string $dest, string $key1, string $key2 = null) + * + * Hashes: + * @method bool|int|Credis_Client hSet(string $key, string $field, string $value) + * @method bool|Credis_Client hSetNx(string $key, string $field, string $value) + * @method bool|string|Credis_Client hGet(string $key, string $field) + * @method bool|int|Credis_Client hLen(string $key) + * @method bool|Credis_Client hDel(string $key, string $field) + * @method array|Credis_Client hKeys(string $key, string $field) + * @method array|Credis_Client hVals(string $key) + * @method array|Credis_Client hGetAll(string $key) + * @method bool|Credis_Client hExists(string $key, string $field) + * @method int|Credis_Client hIncrBy(string $key, string $field, int $value) + * @method float|Credis_Client hIncrByFloat(string $key, string $member, float $value) + * @method bool|Credis_Client hMSet(string $key, array $keysValues) + * @method array|Credis_Client hMGet(string $key, array $fields) + * + * Lists: + * @method array|null|Credis_Client blPop(string $keyN, int $timeout) + * @method array|null|Credis_Client brPop(string $keyN, int $timeout) + * @method array|null |Credis_Client brPoplPush(string $source, string $destination, int $timeout) + * @method string|null|Credis_Client lIndex(string $key, int $index) + * @method int|Credis_Client lInsert(string $key, string $beforeAfter, string $pivot, string $value) + * @method int|Credis_Client lLen(string $key) + * @method string|null|Credis_Client lPop(string $key) + * @method int|Credis_Client lPush(string $key, mixed $value, mixed $valueN = null) + * @method int|Credis_Client lPushX(string $key, mixed $value) + * @method array|Credis_Client lRange(string $key, int $start, int $stop) + * @method int|Credis_Client lRem(string $key, int $count, mixed $value) + * @method bool|Credis_Client lSet(string $key, int $index, mixed $value) + * @method bool|Credis_Client lTrim(string $key, int $start, int $stop) + * @method string|null|Credis_Client rPop(string $key) + * @method string|null|Credis_Client rPoplPush(string $source, string $destination) + * @method int|Credis_Client rPush(string $key, mixed $value, mixed $valueN = null) + * @method int |Credis_Client rPushX(string $key, mixed $value) + * + * Sorted Sets: + * @method int|Credis_Client zAdd(string $key, double $score, string $value) + * @method int|Credis_Client zCard(string $key) + * @method int|Credis_Client zSize(string $key) + * @method int|Credis_Client zCount(string $key, mixed $start, mixed $stop) + * @method int|Credis_Client zIncrBy(string $key, double $value, string $member) + * @method array|Credis_Client zRangeByScore(string $key, mixed $start, mixed $stop, array $args = null) + * @method array|Credis_Client zRevRangeByScore(string $key, mixed $start, mixed $stop, array $args = null) + * @method int|Credis_Client zRemRangeByScore(string $key, mixed $start, mixed $stop) + * @method array|Credis_Client zRange(string $key, mixed $start, mixed $stop, array $args = null) + * @method array|Credis_Client zRevRange(string $key, mixed $start, mixed $stop, array $args = null) + * @method int|Credis_Client zRank(string $key, string $member) + * @method int|Credis_Client zRevRank(string $key, string $member) + * @method int|Credis_Client zRem(string $key, string $member) + * @method int|Credis_Client zDelete(string $key, string $member) + * TODO + * + * Pub/Sub + * @method int |Credis_Client publish(string $channel, string $message) + * @method int|array|Credis_Client pubsub(string $subCommand, $arg = null) + * + * Scripting: + * @method string|int|Credis_Client script(string $command, string $arg1 = null) + * @method string|int|array|bool|Credis_Client eval(string $script, array $keys = null, array $args = null) + * @method string|int|array|bool|Credis_Client evalSha(string $script, array $keys = null, array $args = null) + */ +class Credis_Client { + + const VERSION = '1.11.4'; + + const TYPE_STRING = 'string'; + const TYPE_LIST = 'list'; + const TYPE_SET = 'set'; + const TYPE_ZSET = 'zset'; + const TYPE_HASH = 'hash'; + const TYPE_NONE = 'none'; + + const FREAD_BLOCK_SIZE = 8192; + + /** + * Socket connection to the Redis server or Redis library instance + * @var resource|Redis + */ + protected $redis; + protected $redisMulti; + + /** + * Host of the Redis server + * @var string + */ + protected $host; + + /** + * Scheme of the Redis server (tcp, tls, tlsv1.2, unix) + * @var string|null + */ + protected $scheme; + + /** + * SSL Meta information + * @var string + */ + protected $sslMeta; + + /** + * Port on which the Redis server is running + * @var int|null + */ + protected $port; + + /** + * Timeout for connecting to Redis server + * @var float|null + */ + protected $timeout; + + /** + * Timeout for reading response from Redis server + * @var float|null + */ + protected $readTimeout; + + /** + * Unique identifier for persistent connections + * @var string + */ + protected $persistent; + + /** + * @var bool + */ + protected $closeOnDestruct = TRUE; + + /** + * @var bool + */ + protected $connected = FALSE; + + /** + * @var bool + */ + protected $standalone; + + /** + * @var int + */ + protected $maxConnectRetries = 0; + + /** + * @var int + */ + protected $connectFailures = 0; + + /** + * @var bool + */ + protected $usePipeline = FALSE; + + /** + * @var array + */ + protected $commandNames; + + /** + * @var string + */ + protected $commands; + + /** + * @var bool + */ + protected $isMulti = FALSE; + + /** + * @var bool + */ + protected $isWatching = FALSE; + + /** + * @var string|null + */ + protected $authUsername; + + /** + * @var string|null + */ + protected $authPassword; + + /** + * @var int + */ + protected $selectedDb = 0; + + /** + * Aliases for backwards compatibility with phpredis + * @var array + */ + protected $wrapperMethods = array('delete' => 'del', 'getkeys' => 'keys', 'sremove' => 'srem'); + + /** + * @var array|callable|null + */ + protected $renamedCommands; + + /** + * @var int + */ + protected $requests = 0; + + /** + * @var bool + */ + protected $subscribed = false; + + /** @var bool */ + protected $oldPhpRedis = false; + + /** @var array */ + protected $tlsOptions = []; + + + /** + * @var bool + */ + protected $isTls = false; + + /** + * Gets Useful Meta debug information about the SSL + * + * @return string + */ + public function getSslMeta() + { + return $this->sslMeta; + } + + /** + * Creates a Redisent connection to the Redis server on host {@link $host} and port {@link $port}. + * $host may also be a path to a unix socket or a string in the form of tcp://[hostname]:[port] or unix://[path] + * + * @param string $host The hostname of the Redis server + * @param int|null $port The port number of the Redis server + * @param float|null $timeout Timeout period in seconds + * @param string $persistent Flag to establish persistent connection + * @param int $db The selected database of the Redis server + * @param string|null $password The authentication password of the Redis server + * @param string|null $username The authentication username of the Redis server + * @param array|null $tlsOptions The TLS/SSL context options. See https://www.php.net/manual/en/context.ssl.php for details + */ + public function __construct($host = '127.0.0.1', $port = 6379, $timeout = null, $persistent = '', $db = 0, $password = null, $username = null, array $tlsOptions = null) + { + $this->host = (string) $host; + if ($port !== null) { + $this->port = (int) $port; + } + $this->scheme = null; + $this->timeout = $timeout; + $this->persistent = (string) $persistent; + $this->standalone = ! extension_loaded('redis'); + $this->authPassword = $password; + $this->authUsername = $username; + $this->selectedDb = (int)$db; + $this->convertHost(); + if ($tlsOptions) { + $this->setTlsOptions($tlsOptions); + } + // PHP Redis extension support TLS/ACL AUTH since 5.3.0 + $this->oldPhpRedis = (bool)version_compare(phpversion('redis'),'5.3.0','<'); + if (( + $this->isTls + || $this->authUsername !== null + ) + && !$this->standalone && $this->oldPhpRedis){ + $this->standalone = true; + } + } + + public function __destruct() + { + if ($this->closeOnDestruct) { + $this->close(); + } + } + + /** + * @return bool + */ + public function isSubscribed() + { + return $this->subscribed; + } + + /** + * Return the host of the Redis instance + * @return string + */ + public function getHost() + { + return $this->host; + } + /** + * Return the port of the Redis instance + * @return int|null + */ + public function getPort() + { + return $this->port; + } + + /** + * @return bool + */ + public function isTls() + { + return $this->isTls; + } + + /** + * Return the selected database + * @return int + */ + public function getSelectedDb() + { + return $this->selectedDb; + } + /** + * @return string + */ + public function getPersistence() + { + return $this->persistent; + } + /** + * @throws CredisException + * @return Credis_Client + */ + public function forceStandalone() + { + if ($this->standalone) { + return $this; + } + if($this->connected) { + throw new CredisException('Cannot force Credis_Client to use standalone PHP driver after a connection has already been established.'); + } + $this->standalone = TRUE; + return $this; + } + + /** + * @param int $retries + * @return Credis_Client + */ + public function setMaxConnectRetries($retries) + { + $this->maxConnectRetries = $retries; + return $this; + } + + /** + * @param bool $flag + * @return Credis_Client + */ + public function setCloseOnDestruct($flag) + { + $this->closeOnDestruct = $flag; + return $this; + } + + public function setTlsOptions(array $tlsOptions) + { + if($this->connected) { + throw new CredisException('Cannot change TLS options after a connection has already been established.'); + } + $this->tlsOptions = $tlsOptions; + } + + protected function convertHost() + { + if (preg_match('#^(tcp|tls|ssl|tlsv\d(?:\.\d)?|unix)://(.+)$#', $this->host, $matches)) { + $this->isTls = strpos($matches[1], 'tls') === 0 || strpos($matches[1], 'ssl') === 0; + if($this->isTls || $matches[1] === 'tcp') { + $this->scheme = $matches[1]; + if ( ! preg_match('#^([^:]+)(:([0-9]+))?(/(.+))?$#', $matches[2], $matches)) { + throw new CredisException('Invalid host format; expected '.$this->scheme.'://host[:port][/persistence_identifier]'); + } + $this->host = $matches[1]; + $this->port = (int) (isset($matches[3]) ? $matches[3] : $this->port); + $this->persistent = isset($matches[5]) ? $matches[5] : $this->persistent; + } else { + $this->host = $matches[2]; + $this->port = NULL; + $this->scheme = 'unix'; + if (substr($this->host,0,1) != '/') { + throw new CredisException('Invalid unix socket format; expected unix:///path/to/redis.sock'); + } + } + } + if ($this->port !== NULL && substr($this->host,0,1) == '/') { + $this->port = NULL; + $this->scheme = 'unix'; + } + if (!$this->scheme) { + $this->scheme = 'tcp'; + } + } + + /** + * @throws CredisException + * @return Credis_Client + */ + public function connect() + { + if ($this->connected) { + return $this; + } + $this->close(true); + $tlsOptions = $this->isTls ? $this->tlsOptions : []; + if ($this->standalone) { + $flags = STREAM_CLIENT_CONNECT; + $remote_socket = $this->port === NULL + ? $this->scheme.'://'.$this->host + : $this->scheme.'://'.$this->host.':'.$this->port; + if ($this->persistent && $this->port !== NULL) { + // Persistent connections to UNIX sockets are not supported + $remote_socket .= '/'.$this->persistent; + $flags = $flags | STREAM_CLIENT_PERSISTENT; + } + if ($this->isTls) { + $tlsOptions = array_merge($tlsOptions, [ + 'capture_peer_cert' => true, + 'capture_peer_cert_chain' => true, + 'capture_session_meta' => true, + ]); + } + + // passing $context as null errors before php 8.0 + $context = stream_context_create(['ssl' => $tlsOptions]); + + $result = $this->redis = @stream_socket_client($remote_socket, $errno, $errstr, $this->timeout !== null ? $this->timeout : 2.5, $flags, $context); + + if ($result && $this->isTls) { + $this->sslMeta = stream_context_get_options($context); + } + } + else { + if ( ! $this->redis) { + $this->redis = new Redis; + } + $socketTimeout = $this->timeout ?: 0.0; + try + { + if ($this->oldPhpRedis) + { + $result = $this->persistent + ? $this->redis->pconnect($this->host, (int)$this->port, $socketTimeout, $this->persistent) + : $this->redis->connect($this->host, (int)$this->port, $socketTimeout); + } + else + { + // 7th argument is non-documented TLS options. But it only exists on the newer versions of phpredis + if ($tlsOptions) { + $context = ['stream' => $tlsOptions]; + } else { + $context = []; + } + /** @noinspection PhpMethodParametersCountMismatchInspection */ + $result = $this->persistent + ? $this->redis->pconnect($this->scheme.'://'.$this->host, (int)$this->port, $socketTimeout, $this->persistent, 0, 0.0, $context) + : $this->redis->connect($this->scheme.'://'.$this->host, (int)$this->port, $socketTimeout, null, 0, 0.0, $context); + } + } + catch(Exception $e) + { + // Some applications will capture the php error that phpredis can sometimes generate and throw it as an Exception + $result = false; + $errno = 1; + $errstr = $e->getMessage(); + } + } + + // Use recursion for connection retries + if ( ! $result) { + $this->connectFailures++; + if ($this->connectFailures <= $this->maxConnectRetries) { + return $this->connect(); + } + $failures = $this->connectFailures; + $this->connectFailures = 0; + throw new CredisException(sprintf("Connection to Redis%s %s://%s failed after %s failures.%s", + $this->standalone ? ' standalone' : '', + $this->scheme, + $this->host.($this->port ? ':'.$this->port : ''), + $failures, + (isset($errno) && isset($errstr) ? "Last Error : ({$errno}) {$errstr}" : "") + )); + } + + $this->connectFailures = 0; + $this->connected = TRUE; + + // Set read timeout + if ($this->readTimeout) { + $this->setReadTimeout($this->readTimeout); + } + if($this->authPassword) { + $this->auth($this->authPassword, $this->authUsername); + } + if($this->selectedDb !== 0) { + $this->select($this->selectedDb); + } + return $this; + } + /** + * @return bool + */ + public function isConnected() + { + return $this->connected; + } + /** + * Set the read timeout for the connection. Use 0 to disable timeouts entirely (or use a very long timeout + * if not supported). + * + * @param float $timeout 0 (or -1) for no timeout, otherwise number of seconds + * @throws CredisException + * @return Credis_Client + */ + public function setReadTimeout($timeout) + { + if ($timeout < -1) { + throw new CredisException('Timeout values less than -1 are not accepted.'); + } + $this->readTimeout = $timeout; + if ($this->isConnected()) { + if ($this->standalone) { + $timeout = $timeout <= 0 ? 315360000 : $timeout; // Ten-year timeout + stream_set_blocking($this->redis, TRUE); + stream_set_timeout($this->redis, (int) floor($timeout), ($timeout - floor($timeout)) * 1000000); + } else if (defined('Redis::OPT_READ_TIMEOUT')) { + // supported in phpredis 2.2.3 + // a timeout value of -1 means reads will not timeout + $timeout = $timeout == 0 ? -1 : $timeout; + $this->redis->setOption(Redis::OPT_READ_TIMEOUT, $timeout); + } + } + return $this; + } + + /** + * @return bool + */ + public function close($force = FALSE) + { + $result = TRUE; + if ($this->redis && ($force || $this->connected && ! $this->persistent)) { + try { + if (is_callable(array($this->redis, 'close'))) { + $this->redis->close(); + } else { + @fclose($this->redis); + $this->redis = null; + } + } catch (Exception $e) { + ; // Ignore exceptions on close + } + $this->connected = $this->usePipeline = $this->isMulti = $this->isWatching = FALSE; + } + return $result; + } + + /** + * Enabled command renaming and provide mapping method. Supported methods are: + * + * 1. renameCommand('foo') // Salted md5 hash for all commands -> md5('foo'.$command) + * 2. renameCommand(function($command){ return 'my'.$command; }); // Callable + * 3. renameCommand('get', 'foo') // Single command -> alias + * 4. renameCommand(['get' => 'foo', 'set' => 'bar']) // Full map of [command -> alias] + * + * @param string|callable|array $command + * @param string|null $alias + * @return $this + */ + public function renameCommand($command, $alias = NULL) + { + if ( ! $this->standalone) { + $this->forceStandalone(); + } + if ($alias === NULL) { + $this->renamedCommands = $command; + } else { + if ( ! $this->renamedCommands) { + $this->renamedCommands = array(); + } + $this->renamedCommands[$command] = $alias; + } + return $this; + } + + /** + * @param $command + * @return string + */ + public function getRenamedCommand($command) + { + static $map; + + // Command renaming not enabled + if ($this->renamedCommands === NULL) { + return $command; + } + + // Initialize command map + if ($map === NULL) { + if (is_array($this->renamedCommands)) { + $map = $this->renamedCommands; + } else { + $map = array(); + } + } + + // Generate and return cached result + if ( ! isset($map[$command])) { + // String means all commands are hashed with salted md5 + if (is_string($this->renamedCommands)) { + $map[$command] = md5($this->renamedCommands.$command); + } + // Would already be set in $map if it was intended to be renamed + else if (is_array($this->renamedCommands)) { + return $command; + } + // User-supplied function + else if (is_callable($this->renamedCommands)) { + $map[$command] = call_user_func($this->renamedCommands, $command); + } + } + return $map[$command]; + } + + /** + * @param string $password + * @param string|null $username + * @return bool + */ + public function auth($password, $username = null) + { + if ($username !== null) { + $response = $this->__call('auth', array($username, $password)); + $this->authUsername= $username; + } else { + $response = $this->__call('auth', array($password)); + } + $this->authPassword = $password; + return $response; + } + + /** + * @param int $index + * @return bool + */ + public function select($index) + { + $response = $this->__call('select', array($index)); + $this->selectedDb = (int) $index; + return $response; + } + + /** + * @param string|array $pattern + * @return array + */ + public function pUnsubscribe() + { + list($command, $channel, $subscribedChannels) = $this->__call('punsubscribe', func_get_args()); + $this->subscribed = $subscribedChannels > 0; + return array($command, $channel, $subscribedChannels); + } + + /** + * @param int $Iterator + * @param string $pattern + * @param int $count + * @return bool|array + */ + public function scan(&$Iterator, $pattern = null, $count = null) + { + return $this->__call('scan', array(&$Iterator, $pattern, $count)); + } + + /** + * @param int $Iterator + * @param string $field + * @param string $pattern + * @param int $count + * @return bool|array + */ + public function hscan(&$Iterator, $field, $pattern = null, $count = null) + { + return $this->__call('hscan', array($field, &$Iterator, $pattern, $count)); + } + + /** + * @param int $Iterator + * @param string $field + * @param string $pattern + * @param int $Iterator + * @return bool|array + */ + public function sscan(&$Iterator, $field, $pattern = null, $count = null) + { + return $this->__call('sscan', array($field, &$Iterator, $pattern, $count)); + } + + /** + * @param int $Iterator + * @param string $field + * @param string $pattern + * @param int $Iterator + * @return bool|array + */ + public function zscan(&$Iterator, $field, $pattern = null, $count = null) + { + return $this->__call('zscan', array($field, &$Iterator, $pattern, $count)); + } + + /** + * @param string|array $patterns + * @param $callback + * @return $this|array|bool|Credis_Client|mixed|null|string + * @throws CredisException + */ + public function pSubscribe($patterns, $callback) + { + if ( ! $this->standalone) { + return $this->__call('pSubscribe', array((array)$patterns, $callback)); + } + + // Standalone mode: use infinite loop to subscribe until timeout + $patternCount = is_array($patterns) ? count($patterns) : 1; + while ($patternCount--) { + if (isset($status)) { + list($command, $pattern, $status) = $this->read_reply(); + } else { + list($command, $pattern, $status) = $this->__call('psubscribe', array($patterns)); + } + $this->subscribed = $status > 0; + if ( ! $status) { + throw new CredisException('Invalid pSubscribe response.'); + } + } + while ($this->subscribed) { + list($type, $pattern, $channel, $message) = $this->read_reply(); + if ($type != 'pmessage') { + throw new CredisException('Received non-pmessage reply.'); + } + $callback($this, $pattern, $channel, $message); + } + return null; + } + + /** + * @param string|array $pattern + * @return array + */ + public function unsubscribe() + { + list($command, $channel, $subscribedChannels) = $this->__call('unsubscribe', func_get_args()); + $this->subscribed = $subscribedChannels > 0; + return array($command, $channel, $subscribedChannels); + } + + /** + * @param string|array $channels + * @param $callback + * @throws CredisException + * @return $this|array|bool|Credis_Client|mixed|null|string + */ + public function subscribe($channels, $callback) + { + if ( ! $this->standalone) { + return $this->__call('subscribe', array((array)$channels, $callback)); + } + + // Standalone mode: use infinite loop to subscribe until timeout + $channelCount = is_array($channels) ? count($channels) : 1; + while ($channelCount--) { + if (isset($status)) { + list($command, $channel, $status) = $this->read_reply(); + } else { + list($command, $channel, $status) = $this->__call('subscribe', array($channels)); + } + $this->subscribed = $status > 0; + if ( ! $status) { + throw new CredisException('Invalid subscribe response.'); + } + } + while ($this->subscribed) { + list($type, $channel, $message) = $this->read_reply(); + if ($type != 'message') { + throw new CredisException('Received non-message reply.'); + } + $callback($this, $channel, $message); + } + return null; + } + + /** + * @param string|null $name + * @return string|Credis_Client + */ + public function ping($name = null) + { + return $this->__call('ping', $name ? array($name) : array()); + } + + /** + * @param string $command + * @param array $args + * + * @return array|Credis_Client + */ + public function rawCommand($command, array $args) + { + if($this->standalone) + { + return $this->__call($command, $args); + } + else + { + \array_unshift($args, $command); + return $this->__call('rawCommand', $args); + } + } + + public function __call($name, $args) + { + // Lazy connection + $this->connect(); + + $name = strtolower($name); + + // Send request via native PHP + if($this->standalone) + { + $trackedArgs = array(); + switch ($name) { + case 'eval': + case 'evalsha': + $script = array_shift($args); + $keys = (array) array_shift($args); + $eArgs = (array) array_shift($args); + $args = array($script, count($keys), $keys, $eArgs); + break; + case 'zinterstore': + case 'zunionstore': + $dest = array_shift($args); + $keys = (array) array_shift($args); + $weights = array_shift($args); + $aggregate = array_shift($args); + $args = array($dest, count($keys), $keys); + if ($weights) { + $args[] = (array) $weights; + } + if ($aggregate) { + $args[] = $aggregate; + } + break; + case 'set': + // The php redis module has different behaviour with ttl + // https://github.com/phpredis/phpredis#set + if (count($args) === 3 && is_int($args[2])) { + $args = array($args[0], $args[1], array('EX', $args[2])); + } elseif (count($args) === 3 && is_array($args[2])) { + $tmp_args = $args; + $args = array($tmp_args[0], $tmp_args[1]); + foreach ($tmp_args[2] as $k=>$v) { + if (is_string($k)) { + $args[] = array($k,$v); + } elseif (is_int($k)) { + $args[] = $v; + } + } + unset($tmp_args); + } + break; + case 'scan': + $trackedArgs = array(&$args[0]); + if (empty($trackedArgs[0])) + { + $trackedArgs[0] = 0; + } + $eArgs = array($trackedArgs[0]); + if (!empty($args[1])) + { + $eArgs[] = 'MATCH'; + $eArgs[] = $args[1]; + } + if (!empty($args[2])) + { + $eArgs[] = 'COUNT'; + $eArgs[] = $args[2]; + } + $args = $eArgs; + break; + case 'sscan': + case 'zscan': + case 'hscan': + $trackedArgs = array(&$args[1]); + if (empty($trackedArgs[0])) + { + $trackedArgs[0] = 0; + } + $eArgs = array($args[0],$trackedArgs[0]); + if (!empty($args[2])) + { + $eArgs[] = 'MATCH'; + $eArgs[] = $args[2]; + } + if (!empty($args[3])) + { + $eArgs[] = 'COUNT'; + $eArgs[] = $args[3]; + } + $args = $eArgs; + break; + case 'zrangebyscore': + case 'zrevrangebyscore': + case 'zrange': + case 'zrevrange': + if (isset($args[3]) && is_array($args[3])) { + // map options + $cArgs = array(); + if (!empty($args[3]['withscores'])) { + $cArgs[] = 'withscores'; + } + if (($name == 'zrangebyscore' || $name == 'zrevrangebyscore') && array_key_exists('limit', $args[3])) { + $cArgs[] = array('limit' => $args[3]['limit']); + } + $args[3] = $cArgs; + $trackedArgs = $cArgs; + } + break; + case 'mget': + if (isset($args[0]) && is_array($args[0])) + { + $args = array_values($args[0]); + } + break; + case 'hmset': + if (isset($args[1]) && is_array($args[1])) + { + $cArgs = array(); + foreach($args[1] as $id => $value) + { + $cArgs[] = $id; + $cArgs[] = $value; + } + $args[1] = $cArgs; + } + break; + case 'zsize': + $name = 'zcard'; + break; + case 'zdelete': + $name = 'zrem'; + break; + case 'hmget': + // hmget needs to track the keys for rehydrating the results + if (isset($args[1])) + { + $trackedArgs = $args[1]; + } + break; + } + // Flatten arguments + $args = self::_flattenArguments($args); + + // In pipeline mode + if($this->usePipeline) + { + if($name === 'pipeline') { + throw new CredisException('A pipeline is already in use and only one pipeline is supported.'); + } + else if($name === 'exec') { + if($this->isMulti) { + $this->commandNames[] = array($name, $trackedArgs); + $this->commands .= self::_prepare_command(array($this->getRenamedCommand($name))); + } + + // Write request + if($this->commands) { + $this->write_command($this->commands); + } + $this->commands = NULL; + + // Read response + $queuedResponses = array(); + $response = array(); + foreach($this->commandNames as $command) { + list($name, $arguments) = $command; + $result = $this->read_reply($name, true); + if ($result !== null) + { + $result = $this->decode_reply($name, $result, $arguments); + } + else + { + $queuedResponses[] = $command; + } + $response[] = $result; + } + + if($this->isMulti) { + $response = array_pop($response); + foreach($queuedResponses as $key => $command) + { + list($name, $arguments) = $command; + $response[$key] = $this->decode_reply($name, $response[$key], $arguments); + } + } + + $this->commandNames = NULL; + $this->usePipeline = $this->isMulti = FALSE; + return $response; + } + else if ($name === 'discard') + { + $this->commands = NULL; + $this->commandNames = NULL; + $this->usePipeline = $this->isMulti = FALSE; + } + else { + if($name === 'multi') { + $this->isMulti = TRUE; + } + array_unshift($args, $this->getRenamedCommand($name)); + $this->commandNames[] = array($name, $trackedArgs); + $this->commands .= self::_prepare_command($args); + return $this; + } + } + + // Start pipeline mode + if($name === 'pipeline') + { + $this->usePipeline = TRUE; + $this->commandNames = array(); + $this->commands = ''; + return $this; + } + + // If unwatching, allow reconnect with no error thrown + if($name === 'unwatch') { + $this->isWatching = FALSE; + } + + // Non-pipeline mode + array_unshift($args, $this->getRenamedCommand($name)); + $command = self::_prepare_command($args); + $this->write_command($command); + $response = $this->read_reply($name); + $response = $this->decode_reply($name, $response, $trackedArgs); + + // Watch mode disables reconnect so error is thrown + if($name == 'watch') { + $this->isWatching = TRUE; + } + // Transaction mode + else if($this->isMulti && ($name == 'exec' || $name == 'discard')) { + $this->isMulti = FALSE; + } + // Started transaction + else if($this->isMulti || $name == 'multi') { + $this->isMulti = TRUE; + $response = $this; + } + } + + // Send request via phpredis client + else + { + // Tweak arguments + switch($name) { + case 'get': // optimize common cases + case 'set': + case 'hget': + case 'hset': + case 'setex': + case 'mset': + case 'msetnx': + case 'hmset': + case 'hmget': + case 'del': + case 'zrangebyscore': + case 'zrevrangebyscore': + break; + case 'zrange': + case 'zrevrange': + if (isset($args[3]) && is_array($args[3])) + { + $cArgs = $args[3]; + $args[3] = !empty($cArgs['withscores']); + } + $args = self::_flattenArguments($args); + break; + case 'zinterstore': + case 'zunionstore': + $cArgs = array(); + $cArgs[] = array_shift($args); // destination + $cArgs[] = array_shift($args); // keys + if(isset($args[0]) and isset($args[0]['weights'])) { + $cArgs[] = (array) $args[0]['weights']; + } else { + $cArgs[] = null; + } + if(isset($args[0]) and isset($args[0]['aggregate'])) { + $cArgs[] = strtoupper($args[0]['aggregate']); + } + $args = $cArgs; + break; + case 'mget': + if(isset($args[0]) && ! is_array($args[0])) { + $args = array($args); + } + break; + case 'lrem': + $args = array($args[0], $args[2], $args[1]); + break; + case 'eval': + case 'evalsha': + if (isset($args[1]) && is_array($args[1])) { + $cKeys = $args[1]; + } elseif (isset($args[1]) && is_string($args[1])) { + $cKeys = array($args[1]); + } else { + $cKeys = array(); + } + if (isset($args[2]) && is_array($args[2])) { + $cArgs = $args[2]; + } elseif (isset($args[2]) && is_string($args[2])) { + $cArgs = array($args[2]); + } else { + $cArgs = array(); + } + $args = array($args[0], array_merge($cKeys, $cArgs), count($cKeys)); + break; + case 'subscribe': + case 'psubscribe': + break; + case 'scan': + case 'sscan': + case 'hscan': + case 'zscan': + // allow phpredis to see the caller's reference + //$param_ref =& $args[0]; + break; + case 'auth': + // For phpredis pre-v5.3, the type signature is string, not array|string + $args = $this->oldPhpRedis ? $args : array($args); + break; + default: + // Flatten arguments + $args = self::_flattenArguments($args); + } + + try { + // Proxy pipeline mode to the phpredis library + if($name == 'pipeline' || $name == 'multi') { + if($this->isMulti) { + return $this; + } else { + $this->isMulti = TRUE; + $this->redisMulti = call_user_func_array(array($this->redis, $name), $args); + return $this; + } + } + else if($name == 'exec' || $name == 'discard') { + $this->isMulti = FALSE; + $response = $this->redisMulti->$name(); + $this->redisMulti = NULL; + #echo "> $name : ".substr(print_r($response, TRUE),0,100)."\n"; + return $response; + } + + // Use aliases to be compatible with phpredis wrapper + if(isset($this->wrapperMethods[$name])) { + $name = $this->wrapperMethods[$name]; + } + + // Multi and pipeline return self for chaining + if($this->isMulti) { + call_user_func_array(array($this->redisMulti, $name), $args); + return $this; + } + + + // Send request, retry one time when using persistent connections on the first request only + $this->requests++; + try { + $response = call_user_func_array(array($this->redis, $name), $args); + } catch (RedisException $e) { + if ($this->persistent && $this->requests == 1 && $e->getMessage() == 'read error on connection') { + $this->close(true); + $this->connect(); + $response = call_user_func_array(array($this->redis, $name), $args); + } else { + throw $e; + } + } + } + // Wrap exceptions + catch(RedisException $e) { + $code = 0; + if ( ! ($result = $this->redis->IsConnected())) { + $this->close(true); + $code = CredisException::CODE_DISCONNECTED; + } + throw new CredisException($e->getMessage(), $code, $e); + } + + #echo "> $name : ".substr(print_r($response, TRUE),0,100)."\n"; + + // change return values where it is too difficult to minim in standalone mode + switch($name) + { + case 'type': + $typeMap = array( + self::TYPE_NONE, + self::TYPE_STRING, + self::TYPE_SET, + self::TYPE_LIST, + self::TYPE_ZSET, + self::TYPE_HASH, + ); + $response = $typeMap[$response]; + break; + + // Handle scripting errors + case 'eval': + case 'evalsha': + case 'script': + $error = $this->redis->getLastError(); + $this->redis->clearLastError(); + if ($error && substr($error,0,8) == 'NOSCRIPT') { + $response = NULL; + } else if ($error) { + throw new CredisException($error); + } + break; + case 'exists': + // smooth over phpredis-v4 vs earlier difference to match documented credis return results + $response = (int) $response; + break; + case 'ping': + if ($response) { + if ($response === true) { + $response = isset($args[0]) ? $args[0] : "PONG"; + } else if ($response[0] === '+') { + $response = substr($response, 1); + } + } + break; + case 'auth': + if (is_bool($response) && $response === true){ + $this->redis->clearLastError(); + } + default: + $error = $this->redis->getLastError(); + $this->redis->clearLastError(); + if ($error) { + throw new CredisException(rtrim($error)); + } + break; + } + } + + return $response; + } + + protected function write_command($command) + { + // Reconnect on lost connection (Redis server "timeout" exceeded since last command) + if(feof($this->redis)) { + // If a watch or transaction was in progress and connection was lost, throw error rather than reconnect + // since transaction/watch state will be lost. + if(($this->isMulti && ! $this->usePipeline) || $this->isWatching) { + $this->close(true); + throw new CredisException('Lost connection to Redis server during watch or transaction.'); + } + $this->close(true); + $this->connect(); + if($this->authPassword) { + $this->auth($this->authPassword); + } + if($this->selectedDb != 0) { + $this->select($this->selectedDb); + } + } + + $commandLen = strlen($command); + $lastFailed = FALSE; + for ($written = 0; $written < $commandLen; $written += $fwrite) { + $fwrite = fwrite($this->redis, substr($command, $written)); + if ($fwrite === FALSE || ($fwrite == 0 && $lastFailed)) { + $this->close(true); + throw new CredisException('Failed to write entire command to stream'); + } + $lastFailed = $fwrite == 0; + } + } + + protected function read_reply($name = '', $returnQueued = false) + { + $reply = fgets($this->redis); + if($reply === FALSE) { + $info = stream_get_meta_data($this->redis); + $this->close(true); + if ($info['timed_out']) { + throw new CredisException('Read operation timed out.', CredisException::CODE_TIMED_OUT); + } else { + throw new CredisException('Lost connection to Redis server.', CredisException::CODE_DISCONNECTED); + } + } + $reply = rtrim($reply, CRLF); + #echo "> $name: $reply\n"; + $replyType = substr($reply, 0, 1); + switch ($replyType) { + /* Error reply */ + case '-': + if($this->isMulti || $this->usePipeline) { + $response = FALSE; + } else if ($name == 'evalsha' && substr($reply,0,9) == '-NOSCRIPT') { + $response = NULL; + } else { + throw new CredisException(substr($reply,0,4) == '-ERR' ? 'ERR '.substr($reply, 5) : substr($reply,1)); + } + break; + /* Inline reply */ + case '+': + $response = substr($reply, 1); + if($response == 'OK') { + return TRUE; + } + if($response == 'QUEUED') { + return $returnQueued ? null : true; + } + break; + /* Bulk reply */ + case '$': + if ($reply == '$-1') return FALSE; + $size = (int) substr($reply, 1); + $response = stream_get_contents($this->redis, $size + 2); + if( ! $response) { + $this->close(true); + throw new CredisException('Error reading reply.'); + } + $response = substr($response, 0, $size); + break; + /* Multi-bulk reply */ + case '*': + $count = substr($reply, 1); + if ($count == '-1') return FALSE; + + $response = array(); + for ($i = 0; $i < $count; $i++) { + $response[] = $this->read_reply(); + } + break; + /* Integer reply */ + case ':': + $response = intval(substr($reply, 1)); + break; + default: + throw new CredisException('Invalid response: '.print_r($reply, TRUE)); + break; + } + + return $response; + } + + protected function decode_reply($name, $response, array &$arguments = array() ) + { + // Smooth over differences between phpredis and standalone response + switch ($name) + { + case '': // Minor optimization for multi-bulk replies + break; + case 'config': + case 'hgetall': + $keys = $values = array(); + while ($response) + { + $keys[] = array_shift($response); + $values[] = array_shift($response); + } + $response = count($keys) ? array_combine($keys, $values) : array(); + break; + case 'info': + $lines = explode(CRLF, trim($response, CRLF)); + $response = array(); + foreach ($lines as $line) + { + if (!$line || substr($line, 0, 1) == '#') + { + continue; + } + list($key, $value) = explode(':', $line, 2); + $response[$key] = $value; + } + break; + case 'ttl': + if ($response === -1) + { + $response = false; + } + break; + case 'hmget': + if (count($arguments) != count($response)) + { + throw new CredisException( + 'hmget arguments and response do not match: ' . print_r($arguments, true) . ' ' . print_r( + $response, true + ) + ); + } + // rehydrate results into key => value form + $response = array_combine($arguments, $response); + break; + + case 'scan': + case 'sscan': + $arguments[0] = intval(array_shift($response)); + $response = empty($response[0]) ? array() : $response[0]; + break; + case 'hscan': + case 'zscan': + $arguments[0] = intval(array_shift($response)); + $response = empty($response[0]) ? array() : $response[0]; + if (!empty($response) && is_array($response)) + { + $count = count($response); + $out = array(); + for ($i = 0; $i < $count; $i += 2) + { + $out[$response[$i]] = $response[$i + 1]; + } + $response = $out; + } + break; + case 'zrangebyscore': + case 'zrevrangebyscore': + case 'zrange': + case 'zrevrange': + if (in_array('withscores', $arguments, true)) + { + // Map array of values into key=>score list like phpRedis does + $item = null; + $out = array(); + foreach ($response as $value) + { + if ($item == null) + { + $item = $value; + } + else + { + // 2nd value is the score + $out[$item] = (float)$value; + $item = null; + } + } + $response = $out; + } + break; + } + + return $response; + } + + /** + * Build the Redis unified protocol command + * + * @param array $args + * @return string + */ + private static function _prepare_command($args) + { + return sprintf('*%d%s%s%s', count($args), CRLF, implode(CRLF, array_map([static::class, '_map'], $args)), CRLF); + } + + private static function _map($arg) + { + return sprintf('$%d%s%s', strlen($arg), CRLF, $arg); + } + + /** + * Flatten arguments + * + * If an argument is an array, the key is inserted as argument followed by the array values + * array('zrangebyscore', '-inf', 123, array('limit' => array('0', '1'))) + * becomes + * array('zrangebyscore', '-inf', 123, 'limit', '0', '1') + * + * @param array $in + * @return array + */ + private static function _flattenArguments(array $arguments, &$out = array()) + { + foreach ($arguments as $key => $arg) { + if (!is_int($key)) { + $out[] = $key; + } + + if (is_array($arg)) { + self::_flattenArguments($arg, $out); + } else { + $out[] = $arg; + } + } + + return $out; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Cluster.php b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Cluster.php new file mode 100644 index 000000000..eda43b833 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Cluster.php @@ -0,0 +1,343 @@ + + * @copyright 2009 Justin Poliey + * @license http://www.opensource.org/licenses/mit-license.php The MIT License + * @package Credis + */ + +/** + * A generalized Credis_Client interface for a cluster of Redis servers + * + * @deprecated + */ +class Credis_Cluster +{ + /** + * Collection of Credis_Client objects attached to Redis servers + * @var Credis_Client[] + */ + protected $clients; + /** + * If a server is set as master, all write commands go to that one + * @var Credis_Client + */ + protected $masterClient; + /** + * Aliases of Credis_Client objects attached to Redis servers, used to route commands to specific servers + * @see Credis_Cluster::to + * @var array + */ + protected $aliases; + + /** + * Hash ring of Redis server nodes + * @var array + */ + protected $ring; + + /** + * Individual nodes of pointers to Redis servers on the hash ring + * @var array + */ + protected $nodes; + + /** + * The commands that are not subject to hashing + * @var array + * @access protected + */ + protected $dont_hash; + + /** + * Currently working cluster-wide database number. + * @var int + */ + protected $selectedDb = 0; + + /** + * Creates an interface to a cluster of Redis servers + * Each server should be in the format: + * array( + * 'host' => hostname, + * 'port' => port, + * 'db' => db, + * 'password' => password, + * 'timeout' => timeout, + * 'alias' => alias, + * 'persistent' => persistence_identifier, + * 'master' => master + * 'write_only'=> true/false + * ) + * + * @param array $servers The Redis servers in the cluster. + * @param int $replicas + * @param bool $standAlone + * @throws CredisException + */ + public function __construct($servers, $replicas = 128, $standAlone = false) + { + $this->clients = array(); + $this->masterClient = null; + $this->aliases = array(); + $this->ring = array(); + $this->replicas = (int)$replicas; + $client = null; + foreach ($servers as $server) + { + if(is_array($server)){ + $client = new Credis_Client( + $server['host'], + $server['port'], + isset($server['timeout']) ? $server['timeout'] : 2.5, + isset($server['persistent']) ? $server['persistent'] : '', + isset($server['db']) ? $server['db'] : 0, + isset($server['password']) ? $server['password'] : null + ); + if (isset($server['alias'])) { + $this->aliases[$server['alias']] = $client; + } + if(isset($server['master']) && $server['master'] === true){ + $this->masterClient = $client; + if(isset($server['write_only']) && $server['write_only'] === true){ + continue; + } + } + } elseif($server instanceof Credis_Client){ + $client = $server; + } else { + throw new CredisException('Server should either be an array or an instance of Credis_Client'); + } + if($standAlone) { + $client->forceStandalone(); + } + $this->clients[] = $client; + for ($replica = 0; $replica <= $this->replicas; $replica++) { + $md5num = hexdec(substr(md5($client->getHost().':'.$client->getPort().'-'.$replica),0,7)); + $this->ring[$md5num] = count($this->clients)-1; + } + } + ksort($this->ring, SORT_NUMERIC); + $this->nodes = array_keys($this->ring); + $this->dont_hash = array_flip(array( + 'RANDOMKEY', 'DBSIZE', 'PIPELINE', 'EXEC', + 'SELECT', 'MOVE', 'FLUSHDB', 'FLUSHALL', + 'SAVE', 'BGSAVE', 'LASTSAVE', 'SHUTDOWN', + 'INFO', 'MONITOR', 'SLAVEOF' + )); + if($this->masterClient !== null && count($this->clients()) == 0){ + $this->clients[] = $this->masterClient; + for ($replica = 0; $replica <= $this->replicas; $replica++) { + $md5num = hexdec(substr(md5($this->masterClient->getHost().':'.$this->masterClient->getHost().'-'.$replica),0,7)); + $this->ring[$md5num] = count($this->clients)-1; + } + $this->nodes = array_keys($this->ring); + } + } + + /** + * @param Credis_Client $masterClient + * @param bool $writeOnly + * @return Credis_Cluster + */ + public function setMasterClient(Credis_Client $masterClient, $writeOnly=false) + { + if(!$masterClient instanceof Credis_Client){ + throw new CredisException('Master client should be an instance of Credis_Client'); + } + $this->masterClient = $masterClient; + if (!isset($this->aliases['master'])) { + $this->aliases['master'] = $masterClient; + } + if(!$writeOnly){ + $this->clients[] = $this->masterClient; + for ($replica = 0; $replica <= $this->replicas; $replica++) { + $md5num = hexdec(substr(md5($this->masterClient->getHost().':'.$this->masterClient->getHost().'-'.$replica),0,7)); + $this->ring[$md5num] = count($this->clients)-1; + } + $this->nodes = array_keys($this->ring); + } + return $this; + } + /** + * Get a client by index or alias. + * + * @param string|int $alias + * @throws CredisException + * @return Credis_Client + */ + public function client($alias) + { + if (is_int($alias) && isset($this->clients[$alias])) { + return $this->clients[$alias]; + } + else if (isset($this->aliases[$alias])) { + return $this->aliases[$alias]; + } + throw new CredisException("Client $alias does not exist."); + } + + /** + * Get an array of all clients + * + * @return array|Credis_Client[] + */ + public function clients() + { + return $this->clients; + } + + /** + * Execute a command on all clients + * + * @return array + */ + public function all() + { + $args = func_get_args(); + $name = array_shift($args); + $results = array(); + foreach($this->clients as $client) { + $results[] = call_user_func_array([$client, $name], $args); + } + return $results; + } + + /** + * Get the client that the key would hash to. + * + * @param string $key + * @return \Credis_Client + */ + public function byHash($key) + { + return $this->clients[$this->hash($key)]; + } + + /** + * @param int $index + * @return void + */ + public function select($index) + { + $this->selectedDb = (int) $index; + } + + /** + * Execute a Redis command on the cluster with automatic consistent hashing and read/write splitting + * + * @param string $name + * @param array $args + * @return mixed + */ + public function __call($name, $args) + { + if($this->masterClient !== null && !$this->isReadOnlyCommand($name)){ + $client = $this->masterClient; + }elseif (count($this->clients()) == 1 || isset($this->dont_hash[strtoupper($name)]) || !isset($args[0])) { + $client = $this->clients[0]; + } + else { + $hashKey = $args[0]; + if (is_array($hashKey)) { + $hashKey = join('|', $hashKey); + } + $client = $this->byHash($hashKey); + } + // Ensure that current client is working on the same database as expected. + if ($client->getSelectedDb() != $this->selectedDb) { + $client->select($this->selectedDb); + } + return call_user_func_array([$client, $name], $args); + } + + /** + * Get client index for a key by searching ring with binary search + * + * @param string $key The key to hash + * @return int The index of the client object associated with the hash of the key + */ + public function hash($key) + { + $needle = hexdec(substr(md5($key),0,7)); + $server = $min = 0; + $max = count($this->nodes) - 1; + while ($max >= $min) { + $position = (int) (($min + $max) / 2); + $server = $this->nodes[$position]; + if ($needle < $server) { + $max = $position - 1; + } + else if ($needle > $server) { + $min = $position + 1; + } + else { + break; + } + } + return $this->ring[$server]; + } + + public function isReadOnlyCommand($command) + { + static $readOnlyCommands = array( + 'DBSIZE' => true, + 'INFO' => true, + 'MONITOR' => true, + 'EXISTS' => true, + 'TYPE' => true, + 'KEYS' => true, + 'SCAN' => true, + 'RANDOMKEY' => true, + 'TTL' => true, + 'GET' => true, + 'MGET' => true, + 'SUBSTR' => true, + 'STRLEN' => true, + 'GETRANGE' => true, + 'GETBIT' => true, + 'LLEN' => true, + 'LRANGE' => true, + 'LINDEX' => true, + 'SCARD' => true, + 'SISMEMBER' => true, + 'SINTER' => true, + 'SUNION' => true, + 'SDIFF' => true, + 'SMEMBERS' => true, + 'SSCAN' => true, + 'SRANDMEMBER' => true, + 'ZRANGE' => true, + 'ZREVRANGE' => true, + 'ZRANGEBYSCORE' => true, + 'ZREVRANGEBYSCORE' => true, + 'ZCARD' => true, + 'ZSCORE' => true, + 'ZCOUNT' => true, + 'ZRANK' => true, + 'ZREVRANK' => true, + 'ZSCAN' => true, + 'HGET' => true, + 'HMGET' => true, + 'HEXISTS' => true, + 'HLEN' => true, + 'HKEYS' => true, + 'HVALS' => true, + 'HGETALL' => true, + 'HSCAN' => true, + 'PING' => true, + 'AUTH' => true, + 'SELECT' => true, + 'ECHO' => true, + 'QUIT' => true, + 'OBJECT' => true, + 'BITCOUNT' => true, + 'TIME' => true, + 'SORT' => true, + ); + return array_key_exists(strtoupper($command), $readOnlyCommands); + } +} + diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/LICENSE b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/LICENSE new file mode 100644 index 000000000..c0a2f41ad --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2009 Justin Poliey +Copyright (c) 2011 Colin Mollenhour + +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/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Module.php b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Module.php new file mode 100644 index 000000000..70b9ba9a4 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Module.php @@ -0,0 +1,68 @@ + + * @license http://www.opensource.org/licenses/mit-license.php The MIT License + * @package Credis_Module + */ +class Credis_Module +{ + const MODULE_COUNTING_BLOOM_FILTER = 'CBF'; + + /** @var Credis_Client */ + protected $client; + + /** @var string */ + protected $moduleName; + + /** + * @param Credis_Client $client + * @param string $module + */ + public function __construct(Credis_Client $client, $module = null) + { + $client->forceStandalone(); // Redis Modules command not currently supported by phpredis + $this->client = $client; + + if (isset($module)) { + $this->setModule($module); + } + } + + /** + * Clean up client on destruct + */ + public function __destruct() + { + $this->client->close(); + } + + /** + * @param $moduleName + * @return $this + */ + public function setModule($moduleName) + { + $this->moduleName = (string) $moduleName; + + return $this; + } + + /** + * @param string $name + * @param string $args + * @return mixed + */ + public function __call($name, $args) + { + if ($this->moduleName === null) { + throw new \LogicException('Module must be set.'); + } + + return call_user_func(array($this->client, sprintf('%s.%s', $this->moduleName, $name)), $args); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/README.markdown b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/README.markdown new file mode 100644 index 000000000..0a9f09a94 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/README.markdown @@ -0,0 +1,214 @@ +![Build Status](https://github.com/colinmollenhour/credis/actions/workflows/ci.yml/badge.svg) + +# Credis + +Credis is a lightweight interface to the [Redis](http://redis.io/) key-value store which wraps the [phpredis](https://github.com/nicolasff/phpredis) +library when available for better performance. This project was forked from one of the many redisent forks. + +## Getting Started + +Credis_Client uses methods named the same as Redis commands, and translates return values to the appropriate +PHP equivalents. + +```php +require 'Credis/Client.php'; +$redis = new Credis_Client('localhost'); +$redis->set('awesome', 'absolutely'); +echo sprintf('Is Credis awesome? %s.\n', $redis->get('awesome')); + +// When arrays are given as arguments they are flattened automatically +$redis->rpush('particles', array('proton','electron','neutron')); +$particles = $redis->lrange('particles', 0, -1); +``` +Redis error responses will be wrapped in a CredisException class and thrown. + +Credis_Client also supports transparent command renaming. Write code using the original command names and the +client will send the aliased commands to the server transparently. Specify the renamed commands using a prefix +for md5, a callable function, individual aliases, or an array map of aliases. See "Redis Security":http://redis.io/topics/security for more info. + +## Supported connection string formats + +```php +$redis = new Credis_Client(/* connection string */); +``` + +### Unix socket connection string + +`unix:///path/to/redis.sock` + +### TCP connection string + +`tcp://host[:port][/persistence_identifier]` + +### TLS connection string + +`tls://host[:port][/persistence_identifier]` + +or + +`tlsv1.2://host[:port][/persistence_identifier]` + +Before php 7.2, `tls://` only supports TLSv1.0, either `ssl://` or `tlsv1.2` can be used to force TLSv1.2 support. + +Recent versions of redis do not support the protocols/cyphers that older versions of php default to, which may result in cryptic connection failures. + +#### Enable transport level security (TLS) + +Use TLS connection string `tls://127.0.0.1:6379` instead of TCP connection `tcp://127.0.0.1:6379` string in order to enable transport level security. + +```php +require 'Credis/Client.php'; +$redis = new Credis_Client('tls://127.0.0.1:6379'); +$redis->set('awesome', 'absolutely'); +echo sprintf('Is Credis awesome? %s.\n', $redis->get('awesome')); + +// When arrays are given as arguments they are flattened automatically +$redis->rpush('particles', array('proton','electron','neutron')); +$particles = $redis->lrange('particles', 0, -1); +``` + +## Clustering your servers + +Credis also includes a way for developers to fully utilize the scalability of Redis with multiple servers and [consistent hashing](http://en.wikipedia.org/wiki/Consistent_hashing). +Using the [Credis_Cluster](Cluster.php) class, you can use Credis the same way, except that keys will be hashed across multiple servers. +Here is how to set up a cluster: + +### Basic clustering example +```php + '127.0.0.1', 'port' => 6379, 'alias'=>'alpha'), + array('host' => '127.0.0.1', 'port' => 6380, 'alias'=>'beta') +)); +$cluster->set('key','value'); +echo "Alpha: ".$cluster->client('alpha')->get('key').PHP_EOL; +echo "Beta: ".$cluster->client('beta')->get('key').PHP_EOL; +``` + +### Explicit definition of replicas + +The consistent hashing strategy stores keys on a so called "ring". The position of each key is relative to the position of its target node. The target node that has the closest position will be the selected node for that specific key. + +To avoid an uneven distribution of keys (especially on small clusters), it is common to duplicate target nodes. Based on the number of replicas, each target node will exist *n times* on the "ring". + +The following example explicitly sets the number of replicas to 5. Both Redis instances will have 5 copies. The default value is 128. + +```php + '127.0.0.1', 'port' => 6379, 'alias'=>'alpha'), + array('host' => '127.0.0.1', 'port' => 6380, 'alias'=>'beta') + ), 5 +); +$cluster->set('key','value'); +echo "Alpha: ".$cluster->client('alpha')->get('key').PHP_EOL; +echo "Beta: ".$cluster->client('beta')->get('key').PHP_EOL; +``` + +## Master/slave replication + +The [Credis_Cluster](Cluster.php) class can also be used for [master/slave replication](http://redis.io/topics/replication). +Credis_Cluster will automatically perform *read/write splitting* and send the write requests exclusively to the master server. +Read requests will be handled by all servers unless you set the *write_only* flag to true in the connection string of the master server. + +### Redis server settings for master/slave replication + +Setting up master/slave replication is simple and only requires adding the following line to the config of the slave server: + +``` +slaveof 127.0.0.1 6379 +``` + +### Basic master/slave example +```php + '127.0.0.1', 'port' => 6379, 'alias'=>'master', 'master'=>true), + array('host' => '127.0.0.1', 'port' => 6380, 'alias'=>'slave') +)); +$cluster->set('key','value'); +echo $cluster->get('key').PHP_EOL; +echo $cluster->client('slave')->get('key').PHP_EOL; + +$cluster->client('master')->set('key2','value'); +echo $cluster->client('slave')->get('key2').PHP_EOL; +``` + +### No read on master + +The following example illustrates how to disable reading on the master server. This will cause the master server only to be used for writing. +This should only happen when you have enough write calls to create a certain load on the master server. Otherwise this is an inefficient usage of server resources. + +```php + '127.0.0.1', 'port' => 6379, 'alias'=>'master', 'master'=>true, 'write_only'=>true), + array('host' => '127.0.0.1', 'port' => 6380, 'alias'=>'slave') +)); +$cluster->set('key','value'); +echo $cluster->get('key').PHP_EOL; +``` +## Automatic failover with Sentinel + +[Redis Sentinel](http://redis.io/topics/sentinel) is a system that can monitor Redis instances. You register master servers and Sentinel automatically detects its slaves. + +When a master server dies, Sentinel will make sure one of the slaves is promoted to be the new master. This autofailover mechanism will also demote failed masters to avoid data inconsistency. + +The [Credis_Sentinel](Sentinel.php) class interacts with the *Redis Sentinel* instance(s) and acts as a proxy. Sentinel will automatically create [Credis_Cluster](Cluster.php) objects and will set the master and slaves accordingly. + +Sentinel uses the same protocol as Redis. In the example below we register the Sentinel server running on port *26379* and assign it to the [Credis_Sentinel](Sentinel.php) object. +We then ask Sentinel the hostname and port for the master server known as *mymaster*. By calling the *getCluster* method we immediately get a [Credis_Cluster](Cluster.php) object that allows us to perform basic Redis calls. + +```php +getMasterAddressByName('mymaster'); +$cluster = $sentinel->getCluster('mymaster'); + +echo 'Writing to master: '.$masterAddress[0].' on port '.$masterAddress[1].PHP_EOL; +$cluster->set('key','value'); +echo $cluster->get('key').PHP_EOL; +``` +### Additional parameters + +Because [Credis_Sentinel](Sentinel.php) will create [Credis_Cluster](Cluster.php) objects using the *"getCluster"* or *"createCluster"* methods, additional parameters can be passed. + +First of all there's the *"write_only"* flag. You can also define the selected database and the number of replicas. And finally there's a *"selectRandomSlave"* option. + +The *"selectRandomSlave"* flag is used in setups for masters that have multiple slaves. The Credis_Sentinel will either select one random slave to be used when creating the Credis_Cluster object or to pass them all and use the built-in hashing. + +The example below shows how to use these 3 options. It selects database 2, sets the number of replicas to 10, it doesn't select a random slave and doesn't allow reading on the master server. + +```php +getCluster('mymaster',2,10,false,true); +$cluster->set('key','value'); +echo $cluster->get('key').PHP_EOL; +``` + +## About + +© 2011 [Colin Mollenhour](http://colin.mollenhour.com) +© 2009 [Justin Poliey](http://justinpoliey.com) diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Sentinel.php b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Sentinel.php new file mode 100644 index 000000000..b5f4116fc --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/Sentinel.php @@ -0,0 +1,424 @@ + + * @license http://www.opensource.org/licenses/mit-license.php The MIT License + * @package Credis_Sentinel + */ +class Credis_Sentinel +{ + /** + * Contains a client that connects to a Sentinel node. + * Sentinel uses the same protocol as Redis which makes using Credis_Client convenient. + * @var Credis_Client + */ + protected $_client; + + /** + * Contains an active instance of Credis_Cluster per master pool + * @var array + */ + protected $_cluster = array(); + + /** + * Contains an active instance of Credis_Client representing a master + * @var array + */ + protected $_master = array(); + + /** + * Contains an array Credis_Client objects representing all slaves per master pool + * @var array + */ + protected $_slaves = array(); + + /** + * Use the phpredis extension or the standalone implementation + * @var bool + * @deprecated + */ + protected $_standAlone = false; + + /** + * Store the AUTH password used by Credis_Client instances + * @var string + */ + protected $_password = ''; + /** + * Store the AUTH username used by Credis_Client instances (Redis v6+) + * @var string + */ + protected $_username = ''; + /** + * @var null|float + */ + protected $_timeout; + /** + * @var string + */ + protected $_persistent; + /** + * @var int + */ + protected $_db; + /** + * @var string|null + */ + protected $_replicaCmd = null; + /** + * @var string|null + */ + protected $_redisVersion = null; + + /** + * Connect with a Sentinel node. Sentinel will do the master and slave discovery + * + * @param Credis_Client $client + * @param string $password (deprecated - use setClientPassword) + * @throws CredisException + */ + public function __construct(Credis_Client $client, $password = NULL, $username = NULL) + { + $client->forceStandalone(); // SENTINEL command not currently supported by phpredis + $this->_client = $client; + $this->_password = $password; + $this->_username = $username; + $this->_timeout = NULL; + $this->_persistent = ''; + $this->_db = 0; + } + + /** + * Clean up client on destruct + */ + public function __destruct() + { + $this->_client->close(); + } + + /** + * @param float $timeout + * @return $this + */ + public function setClientTimeout($timeout) + { + $this->_timeout = $timeout; + return $this; + } + + /** + * @param string $persistent + * @return $this + */ + public function setClientPersistent($persistent) + { + $this->_persistent = $persistent; + return $this; + } + + /** + * @param int $db + * @return $this + */ + public function setClientDatabase($db) + { + $this->_db = $db; + return $this; + } + + /** + * @param null|string $password + * @return $this + */ + public function setClientPassword($password) + { + $this->_password = $password; + return $this; + } + + /** + * @param null|string $username + * @return $this + */ + public function setClientUsername($username) + { + $this->_username = $username; + return $this; + } + + /** + * @param null|string $replicaCmd + * @return $this + */ + public function setReplicaCommand($replicaCmd) + { + $this->_replicaCmd = $replicaCmd; + return $this; + } + + public function detectRedisVersion() + { + if ($this->_redisVersion !== null && $this->_replicaCmd !== null) { + return; + } + $serverInfo = $this->info('server'); + $this->_redisVersion = $serverInfo['redis_version']; + // Redis v7+ renames the replica command to 'replicas' instead of 'slaves' + $this->_replicaCmd = version_compare($this->_redisVersion, '7.0.0', '>=') ? 'replicas' : 'slaves'; + } + + /** + * @return Credis_Sentinel + * @deprecated + */ + public function forceStandalone() + { + $this->_standAlone = true; + return $this; + } + + /** + * Discover the master node automatically and return an instance of Credis_Client that connects to the master + * + * @param string $name + * @return Credis_Client + * @throws CredisException + */ + public function createMasterClient($name) + { + $master = $this->getMasterAddressByName($name); + if(!isset($master[0]) || !isset($master[1])){ + throw new CredisException('Master not found'); + } + return new Credis_Client($master[0], $master[1], $this->_timeout, $this->_persistent, $this->_db, $this->_password, $this->_username); + } + + /** + * If a Credis_Client object exists for a master, return it. Otherwise create one and return it + * @param string $name + * @return Credis_Client + */ + public function getMasterClient($name) + { + if(!isset($this->_master[$name])){ + $this->_master[$name] = $this->createMasterClient($name); + } + return $this->_master[$name]; + } + + /** + * Discover the slave nodes automatically and return an array of Credis_Client objects + * + * @param string $name + * @return Credis_Client[] + * @throws CredisException + */ + public function createSlaveClients($name) + { + $slaves = $this->slaves($name); + $workingSlaves = array(); + foreach($slaves as $slave) { + if(!isset($slave[9])){ + throw new CredisException('Can\' retrieve slave status'); + } + if(!strstr($slave[9],'s_down') && !strstr($slave[9],'disconnected')) { + $workingSlaves[] = new Credis_Client($slave[3], $slave[5], $this->_timeout, $this->_persistent, $this->_db, $this->_password, $this->_username); + } + } + return $workingSlaves; + } + + /** + * If an array of Credis_Client objects exist for a set of slaves, return them. Otherwise create and return them + * @param string $name + * @return Credis_Client[] + */ + public function getSlaveClients($name) + { + if(!isset($this->_slaves[$name])){ + $this->_slaves[$name] = $this->createSlaveClients($name); + } + return $this->_slaves[$name]; + } + + /** + * Returns a Redis cluster object containing a random slave and the master + * When $selectRandomSlave is true, only one random slave is passed. + * When $selectRandomSlave is false, all clients are passed and hashing is applied in Credis_Cluster + * When $writeOnly is false, the master server will also be used for read commands. + * When $masterOnly is true, only the master server will also be used for both read and write commands. $writeOnly will be ignored and forced to set to false. + * @param string $name + * @param int $db + * @param int $replicas + * @param bool $selectRandomSlave + * @param bool $writeOnly + * @param bool $masterOnly + * @return Credis_Cluster + * @throws CredisException + * @deprecated + */ + public function createCluster($name, $db=0, $replicas=128, $selectRandomSlave=true, $writeOnly=false, $masterOnly=false) + { + $clients = array(); + $workingClients = array(); + $master = $this->master($name); + if(strstr($master[9],'s_down') || strstr($master[9],'disconnected')) { + throw new CredisException('The master is down'); + } + if (!$masterOnly) { + $slaves = $this->slaves($name); + foreach($slaves as $slave){ + if(!strstr($slave[9],'s_down') && !strstr($slave[9],'disconnected')) { + $workingClients[] = array('host'=>$slave[3],'port'=>$slave[5],'master'=>false,'db'=>$db,'password'=>$this->_password); + } + } + if(count($workingClients)>0){ + if($selectRandomSlave){ + if(!$writeOnly){ + $workingClients[] = array('host'=>$master[3],'port'=>$master[5],'master'=>false,'db'=>$db,'password'=>$this->_password); + } + $clients[] = $workingClients[rand(0,count($workingClients)-1)]; + } else { + $clients = $workingClients; + } + } + } else { + $writeOnly = false; + } + $clients[] = array('host'=>$master[3],'port'=>$master[5], 'db'=>$db ,'master'=>true,'write_only'=>$writeOnly,'password'=>$this->_password); + return new Credis_Cluster($clients,$replicas,$this->_standAlone); + } + + /** + * If a Credis_Cluster object exists, return it. Otherwise create one and return it. + * @param string $name + * @param int $db + * @param int $replicas + * @param bool $selectRandomSlave + * @param bool $writeOnly + * @param bool $masterOnly + * @return Credis_Cluster + * @throws CredisException + * @deprecated + */ + public function getCluster($name, $db=0, $replicas=128, $selectRandomSlave=true, $writeOnly=false, $masterOnly=false) + { + if(!isset($this->_cluster[$name])){ + $this->_cluster[$name] = $this->createCluster($name, $db, $replicas, $selectRandomSlave, $writeOnly, $masterOnly); + } + return $this->_cluster[$name]; + } + + /** + * Catch-all method + * @param string $name + * @param array $args + * @return mixed + */ + public function __call($name, $args) + { + array_unshift($args,$name); + return call_user_func(array($this->_client,'sentinel'),$args); + } + + /** + * get information block for the sentinel instance + * + * @param string|NUll $section + * + * @return array + */ + public function info($section = null) + { + if ($section) + { + return $this->_client->info($section); + } + return $this->_client->info(); + } + + /** + * Return information about all registered master servers + * @return mixed + */ + public function masters() + { + return $this->_client->sentinel('masters'); + } + + /** + * Return all information for slaves that are associated with a single master + * @param string $name + * @return mixed + */ + public function slaves($name) + { + if ($this->_replicaCmd === null) { + $this->detectRedisVersion(); + } + return $this->_client->sentinel($this->_replicaCmd,$name); + } + + /** + * Get the information for a specific master + * @param string $name + * @return mixed + */ + public function master($name) + { + return $this->_client->sentinel('master',$name); + } + + /** + * Get the hostname and port for a specific master + * @param string $name + * @return mixed + */ + public function getMasterAddressByName($name) + { + return $this->_client->sentinel('get-master-addr-by-name',$name); + } + + /** + * Check if the Sentinel is still responding + * @return string|Credis_Client + */ + public function ping() + { + return $this->_client->ping(); + } + + /** + * Perform an auto-failover which will re-elect another master and make the current master a slave + * @param string $name + * @return mixed + */ + public function failover($name) + { + return $this->_client->sentinel('failover',$name); + } + + /** + * @return string + */ + public function getHost() + { + return $this->_client->getHost(); + } + + /** + * @return int + */ + public function getPort() + { + return $this->_client->getPort(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/composer.json b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/composer.json new file mode 100644 index 000000000..2b781e6e8 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/composer.json @@ -0,0 +1,27 @@ +{ + "name": "colinmollenhour/credis", + "type": "library", + "description": "Credis is a lightweight interface to the Redis key-value store which wraps the phpredis library when available for better performance.", + "homepage": "https://github.com/colinmollenhour/credis", + "license": "MIT", + "authors": [ + { + "name": "Colin Mollenhour", + "email": "colin@mollenhour.com" + } + ], + "require": { + "php": ">=5.6.0" + }, + "suggest": { + "ext-redis": "Improved performance for communicating with redis" + }, + "autoload": { + "classmap": [ + "Client.php", + "Cluster.php", + "Sentinel.php", + "Module.php" + ] + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/phpunit_local.sh b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/phpunit_local.sh new file mode 100644 index 000000000..218d1c735 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/phpunit_local.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +# This script runs unit tests locally in environment similar to Travis-CI +# It runs tests in different PHP versions with suitable PHPUnite version. +# +# You can see results of unit tests execution in console. +# Also all execution logs are saved to files phpunit_.log +# +# Prerequisites for running unit tests on local machine: +# - docker +# - docker-compose +# +# You can find definition of all test environments in folder testenv/ +# This folder is not automatically synced with .travis.yml +# If you add new PHP version to .travis.yml then you'll need to adjust files in testenv/ + +cd testenv + +# build containers and run tests +docker-compose build && docker-compose up + +# save logs to log file +docker-compose logs --no-color --timestamps | sort >"../phpunit_$(date '+%Y%m%d-%H%M%S').log" + +# remove containers +docker-compose rm -f diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/docker-compose.yml b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/docker-compose.yml new file mode 100644 index 000000000..c527d8f1b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/docker-compose.yml @@ -0,0 +1,32 @@ +version: '2' +services: + + php-56: + build: env/php-5.6/ + volumes: + - ../:/src/ + + php-70: + build: env/php-7.0/ + volumes: + - ../:/src/ + + php-71: + build: env/php-7.1/ + volumes: + - ../:/src/ + + php-72: + build: env/php-7.2/ + volumes: + - ../:/src/ + + php-73: + build: env/php-7.3/ + volumes: + - ../:/src/ + + php-74: + build: env/php-7.4/ + volumes: + - ../:/src/ diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-5.6/Dockerfile b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-5.6/Dockerfile new file mode 100644 index 000000000..c6378a421 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-5.6/Dockerfile @@ -0,0 +1,24 @@ +FROM php:5.6 +ENV phpunit_verison 5.7 +ENV redis_version 4.0.11 + +RUN apt-get update && \ + apt-get install -y wget + +RUN wget https://phar.phpunit.de/phpunit-${phpunit_verison}.phar && \ + chmod +x phpunit-${phpunit_verison}.phar && \ + mv phpunit-${phpunit_verison}.phar /usr/local/bin/phpunit + +# install php extension +RUN yes '' | pecl install -f redis-4.3.0 && \ + docker-php-ext-enable redis + +# install redis server +RUN wget http://download.redis.io/releases/redis-${redis_version}.tar.gz && \ + tar -xzf redis-${redis_version}.tar.gz && \ + make -s -C redis-${redis_version} -j + +CMD PATH=$PATH:/usr/local/bin/:/redis-${redis_version}/src/ && \ + cp -rp /src /app && \ + cd /app && \ + phpunit diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.0/Dockerfile b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.0/Dockerfile new file mode 100644 index 000000000..82dfef904 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.0/Dockerfile @@ -0,0 +1,25 @@ +FROM php:7.0 +ENV phpunit_verison 6.5 +ENV redis_version 6.0.8 + +RUN apt-get update && \ + apt-get install -y wget libssl-dev + +RUN wget https://phar.phpunit.de/phpunit-${phpunit_verison}.phar && \ + chmod +x phpunit-${phpunit_verison}.phar && \ + mv phpunit-${phpunit_verison}.phar /usr/local/bin/phpunit + +# install php extension +RUN yes '' | pecl install -f redis && \ + docker-php-ext-enable redis + +# install redis server +RUN wget http://download.redis.io/releases/redis-${redis_version}.tar.gz && \ + tar -xzf redis-${redis_version}.tar.gz && \ + export BUILD_TLS=yes && \ + make -s -C redis-${redis_version} -j + +CMD PATH=$PATH:/usr/local/bin/:/redis-${redis_version}/src/ && \ + cp -rp /src /app && \ + cd /app && \ + phpunit diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.1/Dockerfile b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.1/Dockerfile new file mode 100644 index 000000000..e75a4c04b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.1/Dockerfile @@ -0,0 +1,25 @@ +FROM php:7.1 +ENV phpunit_verison 7.5 +ENV redis_version 6.0.8 + +RUN apt-get update && \ + apt-get install -y wget libssl-dev + +RUN wget https://phar.phpunit.de/phpunit-${phpunit_verison}.phar && \ + chmod +x phpunit-${phpunit_verison}.phar && \ + mv phpunit-${phpunit_verison}.phar /usr/local/bin/phpunit + +# install php extension +RUN yes '' | pecl install -f redis && \ + docker-php-ext-enable redis + +# install redis server +RUN wget http://download.redis.io/releases/redis-${redis_version}.tar.gz && \ + tar -xzf redis-${redis_version}.tar.gz && \ + export BUILD_TLS=yes && \ + make -s -C redis-${redis_version} -j + +CMD PATH=$PATH:/usr/local/bin/:/redis-${redis_version}/src/ && \ + cp -rp /src /app && \ + cd /app && \ + phpunit diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.2/Dockerfile b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.2/Dockerfile new file mode 100644 index 000000000..0e34aabbc --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.2/Dockerfile @@ -0,0 +1,25 @@ +FROM php:7.2 +ENV phpunit_verison 7.5 +ENV redis_version 6.0.8 + +RUN apt-get update && \ + apt-get install -y wget libssl-dev + +RUN wget https://phar.phpunit.de/phpunit-${phpunit_verison}.phar && \ + chmod +x phpunit-${phpunit_verison}.phar && \ + mv phpunit-${phpunit_verison}.phar /usr/local/bin/phpunit + +# install php extension +RUN yes '' | pecl install -f redis && \ + docker-php-ext-enable redis + +# install redis server +RUN wget http://download.redis.io/releases/redis-${redis_version}.tar.gz && \ + tar -xzf redis-${redis_version}.tar.gz && \ + export BUILD_TLS=yes && \ + make -s -C redis-${redis_version} -j + +CMD PATH=$PATH:/usr/local/bin/:/redis-${redis_version}/src/ && \ + cp -rp /src /app && \ + cd /app && \ + phpunit diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.3/Dockerfile b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.3/Dockerfile new file mode 100644 index 000000000..279ffa9fe --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.3/Dockerfile @@ -0,0 +1,25 @@ +FROM php:7.3 +ENV phpunit_verison 7.5 +ENV redis_version 6.0.8 + +RUN apt-get update && \ + apt-get install -y wget libssl-dev + +RUN wget https://phar.phpunit.de/phpunit-${phpunit_verison}.phar && \ + chmod +x phpunit-${phpunit_verison}.phar && \ + mv phpunit-${phpunit_verison}.phar /usr/local/bin/phpunit + +# install php extension +RUN yes '' | pecl install -f redis && \ + docker-php-ext-enable redis + +# install redis server +RUN wget http://download.redis.io/releases/redis-${redis_version}.tar.gz && \ + tar -xzf redis-${redis_version}.tar.gz && \ + export BUILD_TLS=yes && \ + make -s -C redis-${redis_version} -j + +CMD PATH=$PATH:/usr/local/bin/:/redis-${redis_version}/src/ && \ + cp -rp /src /app && \ + cd /app && \ + phpunit diff --git a/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.4/Dockerfile b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.4/Dockerfile new file mode 100644 index 000000000..5de537eb0 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/colinmollenhour/credis/testenv/env/php-7.4/Dockerfile @@ -0,0 +1,25 @@ +FROM php:7.4 +ENV phpunit_verison 7.5 +ENV redis_version 6.0.8 + +RUN apt-get update && \ + apt-get install -y wget libssl-dev + +RUN wget https://phar.phpunit.de/phpunit-${phpunit_verison}.phar && \ + chmod +x phpunit-${phpunit_verison}.phar && \ + mv phpunit-${phpunit_verison}.phar /usr/local/bin/phpunit + +# install php extension +RUN yes '' | pecl install -f redis && \ + docker-php-ext-enable redis + +# install redis server +RUN wget http://download.redis.io/releases/redis-${redis_version}.tar.gz && \ + tar -xzf redis-${redis_version}.tar.gz && \ + export BUILD_TLS=yes && \ + make -s -C redis-${redis_version} -j + +CMD PATH=$PATH:/usr/local/bin/:/redis-${redis_version}/src/ && \ + cp -rp /src /app && \ + cd /app && \ + phpunit diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/LICENSE b/wp-content/plugins/redis-cache/dependencies/predis/predis/LICENSE new file mode 100644 index 000000000..9a8cd865b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2009-2020 Daniele Alessandri (original work) +Copyright (c) 2021-2023 Till Krüss (modified work) + +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/wp-content/plugins/redis-cache/dependencies/predis/predis/README.md b/wp-content/plugins/redis-cache/dependencies/predis/predis/README.md new file mode 100644 index 000000000..913af580c --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/README.md @@ -0,0 +1,473 @@ +# Predis # + +[![Software license][ico-license]](LICENSE) +[![Latest stable][ico-version-stable]][link-releases] +[![Latest development][ico-version-dev]][link-releases] +[![Monthly installs][ico-downloads-monthly]][link-downloads] +[![Build status][ico-build]][link-actions] +[![Coverage Status][ico-coverage]][link-coverage] + +A flexible and feature-complete [Redis](http://redis.io) client for PHP 7.2 and newer. + +More details about this project can be found on the [frequently asked questions](FAQ.md). + + +## Main features ## + +- Support for Redis from __3.0__ to __7.0__. +- Support for clustering using client-side sharding and pluggable keyspace distributors. +- Support for [redis-cluster](http://redis.io/topics/cluster-tutorial) (Redis >= 3.0). +- Support for master-slave replication setups and [redis-sentinel](http://redis.io/topics/sentinel). +- Transparent key prefixing of keys using a customizable prefix strategy. +- Command pipelining on both single nodes and clusters (client-side sharding only). +- Abstraction for Redis transactions (Redis >= 2.0) and CAS operations (Redis >= 2.2). +- Abstraction for Lua scripting (Redis >= 2.6) and automatic switching between `EVALSHA` or `EVAL`. +- Abstraction for `SCAN`, `SSCAN`, `ZSCAN` and `HSCAN` (Redis >= 2.8) based on PHP iterators. +- Connections are established lazily by the client upon the first command and can be persisted. +- Connections can be established via TCP/IP (also TLS/SSL-encrypted) or UNIX domain sockets. +- Support for custom connection classes for providing different network or protocol backends. +- Flexible system for defining custom commands and override the default ones. + + +## How to _install_ and use Predis ## + +This library can be found on [Packagist](http://packagist.org/packages/predis/predis) for an easier +management of projects dependencies using [Composer](http://packagist.org/about-composer). +Compressed archives of each release are [available on GitHub](https://github.com/predis/predis/releases). + +```shell +composer require predis/predis +``` + + +### Loading the library ### + +Predis relies on the autoloading features of PHP to load its files when needed and complies with the +[PSR-4 standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md). +Autoloading is handled automatically when dependencies are managed through Composer, but it is also +possible to leverage its own autoloader in projects or scripts lacking any autoload facility: + +```php +// Prepend a base path if Predis is not available in your "include_path". +require 'Predis/Autoloader.php'; + +Predis\Autoloader::register(); +``` + + +### Connecting to Redis ### + +When creating a client instance without passing any connection parameter, Predis assumes `127.0.0.1` +and `6379` as default host and port. The default timeout for the `connect()` operation is 5 seconds: + +```php +$client = new Predis\Client(); +$client->set('foo', 'bar'); +$value = $client->get('foo'); +``` + +Connection parameters can be supplied either in the form of URI strings or named arrays. The latter +is the preferred way to supply parameters, but URI strings can be useful when parameters are read +from non-structured or partially-structured sources: + +```php +// Parameters passed using a named array: +$client = new Predis\Client([ + 'scheme' => 'tcp', + 'host' => '10.0.0.1', + 'port' => 6379, +]); + +// Same set of parameters, passed using an URI string: +$client = new Predis\Client('tcp://10.0.0.1:6379'); +``` + +Password protected servers can be accessed by adding `password` to the parameters set. When ACLs are +enabled on Redis >= 6.0, both `username` and `password` are required for user authentication. + +It is also possible to connect to local instances of Redis using UNIX domain sockets, in this case +the parameters must use the `unix` scheme and specify a path for the socket file: + +```php +$client = new Predis\Client(['scheme' => 'unix', 'path' => '/path/to/redis.sock']); +$client = new Predis\Client('unix:/path/to/redis.sock'); +``` + +The client can leverage TLS/SSL encryption to connect to secured remote Redis instances without the +need to configure an SSL proxy like stunnel. This can be useful when connecting to nodes running on +various cloud hosting providers. Encryption can be enabled with using the `tls` scheme and an array +of suitable [options](http://php.net/manual/context.ssl.php) passed via the `ssl` parameter: + +```php +// Named array of connection parameters: +$client = new Predis\Client([ + 'scheme' => 'tls', + 'ssl' => ['cafile' => 'private.pem', 'verify_peer' => true], +]); + +// Same set of parameters, but using an URI string: +$client = new Predis\Client('tls://127.0.0.1?ssl[cafile]=private.pem&ssl[verify_peer]=1'); +``` + +The connection schemes [`redis`](http://www.iana.org/assignments/uri-schemes/prov/redis) (alias of +`tcp`) and [`rediss`](http://www.iana.org/assignments/uri-schemes/prov/rediss) (alias of `tls`) are +also supported, with the difference that URI strings containing these schemes are parsed following +the rules described on their respective IANA provisional registration documents. + +The actual list of supported connection parameters can vary depending on each connection backend so +it is recommended to refer to their specific documentation or implementation for details. + +Predis can aggregate multiple connections when providing an array of connection parameters and the +appropriate option to instruct the client about how to aggregate them (clustering, replication or a +custom aggregation logic). Named arrays and URI strings can be mixed when providing configurations +for each node: + +```php +$client = new Predis\Client([ + 'tcp://10.0.0.1?alias=first-node', ['host' => '10.0.0.2', 'alias' => 'second-node'], +], [ + 'cluster' => 'predis', +]); +``` + +See the [aggregate connections](#aggregate-connections) section of this document for more details. + +Connections to Redis are lazy meaning that the client connects to a server only if and when needed. +While it is recommended to let the client do its own stuff under the hood, there may be times when +it is still desired to have control of when the connection is opened or closed: this can easily be +achieved by invoking `$client->connect()` and `$client->disconnect()`. Please note that the effect +of these methods on aggregate connections may differ depending on each specific implementation. + + +### Client configuration ### + +Many aspects and behaviors of the client can be configured by passing specific client options to the +second argument of `Predis\Client::__construct()`: + +```php +$client = new Predis\Client($parameters, ['prefix' => 'sample:']); +``` + +Options are managed using a mini DI-alike container and their values can be lazily initialized only +when needed. The client options supported by default in Predis are: + + - `prefix`: prefix string applied to every key found in commands. + - `exceptions`: whether the client should throw or return responses upon Redis errors. + - `connections`: list of connection backends or a connection factory instance. + - `cluster`: specifies a cluster backend (`predis`, `redis` or callable). + - `replication`: specifies a replication backend (`predis`, `sentinel` or callable). + - `aggregate`: configures the client with a custom aggregate connection (callable). + - `parameters`: list of default connection parameters for aggregate connections. + - `commands`: specifies a command factory instance to use through the library. + +Users can also provide custom options with values or callable objects (for lazy initialization) that +are stored in the options container for later use through the library. + + +### Aggregate connections ### + +Aggregate connections are the foundation upon which Predis implements clustering and replication and +they are used to group multiple connections to single Redis nodes and hide the specific logic needed +to handle them properly depending on the context. Aggregate connections usually require an array of +connection parameters along with the appropriate client option when creating a new client instance. + +#### Cluster #### + +Predis can be configured to work in clustering mode with a traditional client-side sharding approach +to create a cluster of independent nodes and distribute the keyspace among them. This approach needs +some sort of external health monitoring of nodes and requires the keyspace to be rebalanced manually +when nodes are added or removed: + +```php +$parameters = ['tcp://10.0.0.1', 'tcp://10.0.0.2', 'tcp://10.0.0.3']; +$options = ['cluster' => 'predis']; + +$client = new Predis\Client($parameters); +``` + +Along with Redis 3.0, a new supervised and coordinated type of clustering was introduced in the form +of [redis-cluster](http://redis.io/topics/cluster-tutorial). This kind of approach uses a different +algorithm to distribute the keyspaces, with Redis nodes coordinating themselves by communicating via +a gossip protocol to handle health status, rebalancing, nodes discovery and request redirection. In +order to connect to a cluster managed by redis-cluster, the client requires a list of its nodes (not +necessarily complete since it will automatically discover new nodes if necessary) and the `cluster` +client options set to `redis`: + +```php +$parameters = ['tcp://10.0.0.1', 'tcp://10.0.0.2', 'tcp://10.0.0.3']; +$options = ['cluster' => 'redis']; + +$client = new Predis\Client($parameters, $options); +``` + +#### Replication #### + +The client can be configured to operate in a single master / multiple slaves setup to provide better +service availability. When using replication, Predis recognizes read-only commands and sends them to +a random slave in order to provide some sort of load-balancing and switches to the master as soon as +it detects a command that performs any kind of operation that would end up modifying the keyspace or +the value of a key. Instead of raising a connection error when a slave fails, the client attempts to +fall back to a different slave among the ones provided in the configuration. + +The basic configuration needed to use the client in replication mode requires one Redis server to be +identified as the master (this can be done via connection parameters by setting the `role` parameter +to `master`) and one or more slaves (in this case setting `role` to `slave` for slaves is optional): + +```php +$parameters = ['tcp://10.0.0.1?role=master', 'tcp://10.0.0.2', 'tcp://10.0.0.3']; +$options = ['replication' => 'predis']; + +$client = new Predis\Client($parameters, $options); +``` + +The above configuration has a static list of servers and relies entirely on the client's logic, but +it is possible to rely on [`redis-sentinel`](http://redis.io/topics/sentinel) for a more robust HA +environment with sentinel servers acting as a source of authority for clients for service discovery. +The minimum configuration required by the client to work with redis-sentinel is a list of connection +parameters pointing to a bunch of sentinel instances, the `replication` option set to `sentinel` and +the `service` option set to the name of the service: + +```php +$sentinels = ['tcp://10.0.0.1', 'tcp://10.0.0.2', 'tcp://10.0.0.3']; +$options = ['replication' => 'sentinel', 'service' => 'mymaster']; + +$client = new Predis\Client($sentinels, $options); +``` + +If the master and slave nodes are configured to require an authentication from clients, a password +must be provided via the global `parameters` client option. This option can also be used to specify +a different database index. The client options array would then look like this: + +```php +$options = [ + 'replication' => 'sentinel', + 'service' => 'mymaster', + 'parameters' => [ + 'password' => $secretpassword, + 'database' => 10, + ], +]; +``` + +While Predis is able to distinguish commands performing write and read-only operations, `EVAL` and +`EVALSHA` represent a corner case in which the client switches to the master node because it cannot +tell when a Lua script is safe to be executed on slaves. While this is indeed the default behavior, +when certain Lua scripts do not perform write operations it is possible to provide an hint to tell +the client to stick with slaves for their execution: + +```php +$parameters = ['tcp://10.0.0.1?role=master', 'tcp://10.0.0.2', 'tcp://10.0.0.3']; +$options = ['replication' => function () { + // Set scripts that won't trigger a switch from a slave to the master node. + $strategy = new Predis\Replication\ReplicationStrategy(); + $strategy->setScriptReadOnly($LUA_SCRIPT); + + return new Predis\Connection\Replication\MasterSlaveReplication($strategy); +}]; + +$client = new Predis\Client($parameters, $options); +$client->eval($LUA_SCRIPT, 0); // Sticks to slave using `eval`... +$client->evalsha(sha1($LUA_SCRIPT), 0); // ... and `evalsha`, too. +``` + +The [`examples`](examples/) directory contains a few scripts that demonstrate how the client can be +configured and used to leverage replication in both basic and complex scenarios. + + +### Command pipelines ### + +Pipelining can help with performances when many commands need to be sent to a server by reducing the +latency introduced by network round-trip timings. Pipelining also works with aggregate connections. +The client can execute the pipeline inside a callable block or return a pipeline instance with the +ability to chain commands thanks to its fluent interface: + +```php +// Executes a pipeline inside the given callable block: +$responses = $client->pipeline(function ($pipe) { + for ($i = 0; $i < 1000; $i++) { + $pipe->set("key:$i", str_pad($i, 4, '0', 0)); + $pipe->get("key:$i"); + } +}); + +// Returns a pipeline that can be chained thanks to its fluent interface: +$responses = $client->pipeline()->set('foo', 'bar')->get('foo')->execute(); +``` + + +### Transactions ### + +The client provides an abstraction for Redis transactions based on `MULTI` and `EXEC` with a similar +interface to command pipelines: + +```php +// Executes a transaction inside the given callable block: +$responses = $client->transaction(function ($tx) { + $tx->set('foo', 'bar'); + $tx->get('foo'); +}); + +// Returns a transaction that can be chained thanks to its fluent interface: +$responses = $client->transaction()->set('foo', 'bar')->get('foo')->execute(); +``` + +This abstraction can perform check-and-set operations thanks to `WATCH` and `UNWATCH` and provides +automatic retries of transactions aborted by Redis when `WATCH`ed keys are touched. For an example +of a transaction using CAS you can see [the following example](examples/transaction_using_cas.php). + + +### Adding new commands ### + +While we try to update Predis to stay up to date with all the commands available in Redis, you might +prefer to stick with an old version of the library or provide a different way to filter arguments or +parse responses for specific commands. To achieve that, Predis provides the ability to implement new +command classes to define or override commands in the default command factory used by the client: + +```php +// Define a new command by extending Predis\Command\Command: +class BrandNewRedisCommand extends Predis\Command\Command +{ + public function getId() + { + return 'NEWCMD'; + } +} + +// Inject your command in the current command factory: +$client = new Predis\Client($parameters, [ + 'commands' => [ + 'newcmd' => 'BrandNewRedisCommand', + ], +]); + +$response = $client->newcmd(); +``` + +There is also a method to send raw commands without filtering their arguments or parsing responses. +Users must provide the list of arguments for the command as an array, following the signatures as +defined by the [Redis documentation for commands](http://redis.io/commands): + +```php +$response = $client->executeRaw(['SET', 'foo', 'bar']); +``` + + +### Script commands ### + +While it is possible to leverage [Lua scripting](http://redis.io/commands/eval) on Redis 2.6+ using +directly [`EVAL`](http://redis.io/commands/eval) and [`EVALSHA`](http://redis.io/commands/evalsha), +Predis offers script commands as an higher level abstraction built upon them to make things simple. +Script commands can be registered in the command factory used by the client and are accessible as if +they were plain Redis commands, but they define Lua scripts that get transmitted to the server for +remote execution. Internally they use [`EVALSHA`](http://redis.io/commands/evalsha) by default and +identify a script by its SHA1 hash to save bandwidth, but [`EVAL`](http://redis.io/commands/eval) +is used as a fall back when needed: + +```php +// Define a new script command by extending Predis\Command\ScriptCommand: +class ListPushRandomValue extends Predis\Command\ScriptCommand +{ + public function getKeysCount() + { + return 1; + } + + public function getScript() + { + return << [ + 'lpushrand' => 'ListPushRandomValue', + ], +]); + +$response = $client->lpushrand('random_values', $seed = mt_rand()); +``` + + +### Customizable connection backends ### + +Developers can create their own connection classes to support whole new network backends, extend +existing classes or provide completely different implementations. Connection classes must implement +`Predis\Connection\NodeConnectionInterface` or extend `Predis\Connection\AbstractConnection`: + +```php +class MyConnectionClass implements Predis\Connection\NodeConnectionInterface +{ + // Implementation goes here... +} + +// Use MyConnectionClass to handle connections for the `tcp` scheme: +$client = new Predis\Client('tcp://127.0.0.1', [ + 'connections' => ['tcp' => 'MyConnectionClass'], +]); +``` + +For a more in-depth insight on how to create new connection backends you can refer to the actual +implementation of the standard connection classes available in the `Predis\Connection` namespace. + + +## Development ## + + +### Reporting bugs and contributing code ### + +Contributions to Predis are highly appreciated either in the form of pull requests for new features, +bug fixes, or just bug reports. We only ask you to adhere to issue and pull request templates. + + +### Test suite ### + +__ATTENTION__: Do not ever run the test suite shipped with Predis against instances of Redis running +in production environments or containing data you are interested in! + +Predis has a comprehensive test suite covering every aspect of the library and that can optionally +perform integration tests against a running instance of Redis (required >= 2.4.0 in order to verify +the correct behavior of the implementation of each command. Integration tests for unsupported Redis +commands are automatically skipped. If you do not have Redis up and running, integration tests can +be disabled. See [the tests README](tests/README.md) for more details about testing this library. + +Predis uses GitHub Actions for continuous integration and the history for past and current builds can be +found [on its actions page](https://github.com/predis/predis/actions). + + +## Other ## + + +### Project related links ### + +- [Source code](https://github.com/predis/predis) +- [Wiki](https://github.com/predis/predis/wiki) +- [Issue tracker](https://github.com/predis/predis/issues) + + +### Author ### + +- [Till Krüss](https://till.im) ([Twitter](http://twitter.com/tillkruss)) +- [Daniele Alessandri](mailto:suppakilla@gmail.com) ([twitter](http://twitter.com/JoL1hAHN)) + + +### License ### + +The code for Predis is distributed under the terms of the MIT license (see [LICENSE](LICENSE)). + +[ico-license]: https://img.shields.io/github/license/predis/predis.svg?style=flat-square +[ico-version-stable]: https://img.shields.io/github/v/tag/predis/predis?label=stable&style=flat-square +[ico-version-dev]: https://img.shields.io/github/v/tag/predis/predis?include_prereleases&label=pre-release&style=flat-square +[ico-downloads-monthly]: https://img.shields.io/packagist/dm/predis/predis.svg?style=flat-square +[ico-build]: https://img.shields.io/github/actions/workflow/status/predis/predis/tests.yml?branch=main&style=flat-square +[ico-coverage]: https://img.shields.io/coverallsCoverage/github/predis/predis?style=flat-square + +[link-releases]: https://github.com/predis/predis/releases +[link-actions]: https://github.com/predis/predis/actions +[link-downloads]: https://packagist.org/packages/predis/predis/stats +[link-coverage]: https://coveralls.io/github/predis/predis diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/autoload.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/autoload.php new file mode 100644 index 000000000..5d96d680b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/autoload.php @@ -0,0 +1,12 @@ +options = $options; + } + + public static function fromCommandLine() + { + $parameters = array( + 'c:' => 'class:', + 'r::' => 'realm::', + 'o::' => 'output::', + 'x::' => 'overwrite::' + ); + + $getops = getopt(implode(array_keys($parameters)), $parameters); + + $options = array( + 'overwrite' => false, + 'tests' => __DIR__.'/../tests/Predis', + ); + + foreach ($getops as $option => $value) { + switch ($option) { + case 'c': + case 'class': + $options['class'] = $value; + break; + + case 'r': + case 'realm': + $options['realm'] = $value; + break; + + case 'o': + case 'output': + $options['output'] = $value; + break; + + case 'x': + case 'overwrite': + $options['overwrite'] = true; + break; + } + } + + if (!isset($options['class'])) { + throw new RuntimeException("Missing 'class' option."); + } + + if (!isset($options['realm'])) { + throw new RuntimeException("Missing 'realm' option."); + } + + $options['fqn'] = "Predis\\Command\\Redis\\{$options['class']}"; + $options['path'] = "Command/Redis/{$options['class']}.php"; + + $source = __DIR__.'/../src/'.$options['path']; + if (!file_exists($source)) { + throw new RuntimeException("Cannot find class file for {$options['fqn']} in $source."); + } + + if (!isset($options['output'])) { + $options['output'] = sprintf("%s/%s", $options['tests'], str_replace('.php', '_Test.php', $options['path'])); + } + + return new self($options); + } + + protected function getTestRealm() + { + if (empty($this->options['realm'])) { + throw new RuntimeException('Invalid value for realm has been specified (empty).'); + } + + return $this->options['realm']; + } + + public function generate() + { + $reflection = new ReflectionClass($class = $this->options['fqn']); + + if (!$reflection->isInstantiable()) { + throw new RuntimeException("Class $class must be instantiable, abstract classes or interfaces are not allowed."); + } + + if (!$reflection->implementsInterface('Predis\Command\CommandInterface')) { + throw new RuntimeException("Class $class must implement Predis\Command\CommandInterface."); + } + + /* + * @var CommandInterface + */ + $instance = $reflection->newInstance(); + + $buffer = $this->getTestCaseBuffer($instance); + + return $buffer; + } + + public function save() + { + $options = $this->options; + if (file_exists($options['output']) && !$options['overwrite']) { + throw new RuntimeException("File {$options['output']} already exist. Specify the --overwrite option to overwrite the existing file."); + } + file_put_contents($options['output'], $this->generate()); + } + + protected function getTestCaseBuffer(CommandInterface $instance) + { + $id = $instance->getId(); + $fqn = get_class($instance); + $fqnParts = explode('\\', $fqn); + $class = array_pop($fqnParts) . "Test"; + $realm = $this->getTestRealm(); + + $buffer =<<markTestIncomplete('This test has not been implemented yet.'); + + \$arguments = array(/* add arguments */); + \$expected = array(/* add arguments */); + + \$command = \$this->getCommand(); + \$command->setArguments(\$arguments); + + \$this->assertSame(\$expected, \$command->getArguments()); + } + + /** + * @group disconnected + */ + public function testParseResponse(): void + { + \$this->markTestIncomplete('This test has not been implemented yet.'); + + \$raw = null; + \$expected = null; + + \$command = \$this->getCommand(); + + \$this->assertSame(\$expected, \$command->parseResponse(\$raw)); + } + +PHP; + + if ($instance instanceof PrefixableCommandInterface) { + $buffer .=<<markTestIncomplete('This test has not been implemented yet.'); + + \$arguments = array(/* add arguments */); + \$expected = array(/* add arguments */); + + \$command = \$this->getCommandWithArgumentsArray(\$arguments); + \$command->prefixKeys('prefix:'); + + \$this->assertSame(\$expected, \$command->getArguments()); + } + + /** + * @group disconnected + */ + public function testPrefixKeysIgnoredOnEmptyArguments(): void + { + \$command = \$this->getCommand(); + \$command->prefixKeys('prefix:'); + + \$this->assertSame(array(), \$command->getArguments()); + } + +PHP; + } + + return "$buffer}\n"; + } +} + +// ------------------------------------------------------------------------- // + +require __DIR__.'/../autoload.php'; + +$generator = CommandTestCaseGenerator::fromCommandLine(); +$generator->save(); diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/composer.json b/wp-content/plugins/redis-cache/dependencies/predis/predis/composer.json new file mode 100644 index 000000000..7968991c6 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/composer.json @@ -0,0 +1,48 @@ +{ + "name": "predis/predis", + "type": "library", + "description": "A flexible and feature-complete Redis client for PHP.", + "keywords": ["nosql", "redis", "predis"], + "homepage": "http://github.com/predis/predis", + "license": "MIT", + "support": { + "issues": "https://github.com/predis/predis/issues" + }, + "authors": [ + { + "name": "Till Krüss", + "homepage": "https://till.im", + "role": "Maintainer" + } + ], + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/tillkruss" + } + ], + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.3", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^8.0 || ~9.4.4" + }, + "scripts": { + "phpstan": "phpstan analyse", + "style": "php-cs-fixer fix --diff --dry-run", + "style:fix": "php-cs-fixer fix" + }, + "autoload": { + "psr-4": { + "Predis\\": "src/" + } + }, + "config": { + "sort-packages": true, + "preferred-install": "dist" + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Autoloader.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Autoloader.php new file mode 100644 index 000000000..054f7bbb2 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Autoloader.php @@ -0,0 +1,64 @@ + + * @author Daniele Alessandri + * @codeCoverageIgnore + */ +class Autoloader +{ + private $directory; + private $prefix; + private $prefixLength; + + /** + * @param string $baseDirectory Base directory where the source files are located. + */ + public function __construct($baseDirectory = __DIR__) + { + $this->directory = $baseDirectory; + $this->prefix = __NAMESPACE__ . '\\'; + $this->prefixLength = strlen($this->prefix); + } + + /** + * Registers the autoloader class with the PHP SPL autoloader. + * + * @param bool $prepend Prepend the autoloader on the stack instead of appending it. + */ + public static function register($prepend = false) + { + spl_autoload_register([new self(), 'autoload'], true, $prepend); + } + + /** + * Loads a class from a file using its fully qualified name. + * + * @param string $className Fully qualified name of a class. + */ + public function autoload($className) + { + if (0 === strpos($className, $this->prefix)) { + $parts = explode('\\', substr($className, $this->prefixLength)); + $filepath = $this->directory . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $parts) . '.php'; + + if (is_file($filepath)) { + require $filepath; + } + } + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Client.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Client.php new file mode 100644 index 000000000..91c126f4b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Client.php @@ -0,0 +1,566 @@ + + */ +class Client implements ClientInterface, IteratorAggregate +{ + public const VERSION = '2.1.2'; + + /** @var OptionsInterface */ + private $options; + + /** @var ConnectionInterface */ + private $connection; + + /** @var Command\FactoryInterface */ + private $commands; + + /** + * @param mixed $parameters Connection parameters for one or more servers. + * @param mixed $options Options to configure some behaviours of the client. + */ + public function __construct($parameters = null, $options = null) + { + $this->options = static::createOptions($options ?? new Options()); + $this->connection = static::createConnection($this->options, $parameters ?? new Parameters()); + $this->commands = $this->options->commands; + } + + /** + * Creates a new set of client options for the client. + * + * @param array|OptionsInterface $options Set of client options + * + * @return OptionsInterface + * @throws InvalidArgumentException + */ + protected static function createOptions($options) + { + if (is_array($options)) { + return new Options($options); + } elseif ($options instanceof OptionsInterface) { + return $options; + } else { + throw new InvalidArgumentException('Invalid type for client options'); + } + } + + /** + * Creates single or aggregate connections from supplied arguments. + * + * This method accepts the following types to create a connection instance: + * + * - Array (dictionary: single connection, indexed: aggregate connections) + * - String (URI for a single connection) + * - Callable (connection initializer callback) + * - Instance of Predis\Connection\ParametersInterface (used as-is) + * - Instance of Predis\Connection\ConnectionInterface (returned as-is) + * + * When a callable is passed, it receives the original set of client options + * and must return an instance of Predis\Connection\ConnectionInterface. + * + * Connections are created using the connection factory (in case of single + * connections) or a specialized aggregate connection initializer (in case + * of cluster and replication) retrieved from the supplied client options. + * + * @param OptionsInterface $options Client options container + * @param mixed $parameters Connection parameters + * + * @return ConnectionInterface + * @throws InvalidArgumentException + */ + protected static function createConnection(OptionsInterface $options, $parameters) + { + if ($parameters instanceof ConnectionInterface) { + return $parameters; + } + + if ($parameters instanceof ParametersInterface || is_string($parameters)) { + return $options->connections->create($parameters); + } + + if (is_array($parameters)) { + if (!isset($parameters[0])) { + return $options->connections->create($parameters); + } elseif ($options->defined('cluster') && $initializer = $options->cluster) { + return $initializer($parameters, true); + } elseif ($options->defined('replication') && $initializer = $options->replication) { + return $initializer($parameters, true); + } elseif ($options->defined('aggregate') && $initializer = $options->aggregate) { + return $initializer($parameters, false); + } else { + throw new InvalidArgumentException( + 'Array of connection parameters requires `cluster`, `replication` or `aggregate` client option' + ); + } + } + + if (is_callable($parameters)) { + $connection = call_user_func($parameters, $options); + + if (!$connection instanceof ConnectionInterface) { + throw new InvalidArgumentException('Callable parameters must return a valid connection'); + } + + return $connection; + } + + throw new InvalidArgumentException('Invalid type for connection parameters'); + } + + /** + * {@inheritdoc} + */ + public function getCommandFactory() + { + return $this->commands; + } + + /** + * {@inheritdoc} + */ + public function getOptions() + { + return $this->options; + } + + /** + * Creates a new client using a specific underlying connection. + * + * This method allows to create a new client instance by picking a specific + * connection out of an aggregate one, with the same options of the original + * client instance. + * + * The specified selector defines which logic to use to look for a suitable + * connection by the specified value. Supported selectors are: + * + * - `id` + * - `key` + * - `slot` + * - `command` + * - `alias` + * - `role` + * + * Internally the client relies on duck-typing and follows this convention: + * + * $selector string => getConnectionBy$selector($value) method + * + * This means that support for specific selectors may vary depending on the + * actual logic implemented by connection classes and there is no interface + * binding a connection class to implement any of these. + * + * @param string $selector Type of selector. + * @param mixed $value Value to be used by the selector. + * + * @return ClientInterface + */ + public function getClientBy($selector, $value) + { + $selector = strtolower($selector); + + if (!in_array($selector, ['id', 'key', 'slot', 'role', 'alias', 'command'])) { + throw new InvalidArgumentException("Invalid selector type: `$selector`"); + } + + if (!method_exists($this->connection, $method = "getConnectionBy$selector")) { + $class = get_class($this->connection); + throw new InvalidArgumentException("Selecting connection by $selector is not supported by $class"); + } + + if (!$connection = $this->connection->$method($value)) { + throw new InvalidArgumentException("Cannot find a connection by $selector matching `$value`"); + } + + return new static($connection, $this->getOptions()); + } + + /** + * Opens the underlying connection and connects to the server. + */ + public function connect() + { + $this->connection->connect(); + } + + /** + * Closes the underlying connection and disconnects from the server. + */ + public function disconnect() + { + $this->connection->disconnect(); + } + + /** + * Closes the underlying connection and disconnects from the server. + * + * This is the same as `Client::disconnect()` as it does not actually send + * the `QUIT` command to Redis, but simply closes the connection. + */ + public function quit() + { + $this->disconnect(); + } + + /** + * Returns the current state of the underlying connection. + * + * @return bool + */ + public function isConnected() + { + return $this->connection->isConnected(); + } + + /** + * {@inheritdoc} + */ + public function getConnection() + { + return $this->connection; + } + + /** + * Executes a command without filtering its arguments, parsing the response, + * applying any prefix to keys or throwing exceptions on Redis errors even + * regardless of client options. + * + * It is possible to identify Redis error responses from normal responses + * using the second optional argument which is populated by reference. + * + * @param array $arguments Command arguments as defined by the command signature. + * @param bool $error Set to TRUE when Redis returned an error response. + * + * @return mixed + */ + public function executeRaw(array $arguments, &$error = null) + { + $error = false; + $commandID = array_shift($arguments); + + $response = $this->connection->executeCommand( + new RawCommand($commandID, $arguments) + ); + + if ($response instanceof ResponseInterface) { + if ($response instanceof ErrorResponseInterface) { + $error = true; + } + + return (string) $response; + } + + return $response; + } + + /** + * {@inheritdoc} + */ + public function __call($commandID, $arguments) + { + return $this->executeCommand( + $this->createCommand($commandID, $arguments) + ); + } + + /** + * {@inheritdoc} + */ + public function createCommand($commandID, $arguments = []) + { + return $this->commands->create($commandID, $arguments); + } + + /** + * @param $name + * @return ContainerInterface + */ + public function __get($name) + { + return ContainerFactory::create($this, $name); + } + + /** + * @param $name + * @param $value + * @return mixed + */ + public function __set($name, $value) + { + throw new RuntimeException('Not allowed'); + } + + /** + * @param $name + * @return mixed + */ + public function __isset($name) + { + throw new RuntimeException('Not allowed'); + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + $response = $this->connection->executeCommand($command); + + if ($response instanceof ResponseInterface) { + if ($response instanceof ErrorResponseInterface) { + $response = $this->onErrorResponse($command, $response); + } + + return $response; + } + + return $command->parseResponse($response); + } + + /** + * Handles -ERR responses returned by Redis. + * + * @param CommandInterface $command Redis command that generated the error. + * @param ErrorResponseInterface $response Instance of the error response. + * + * @return mixed + * @throws ServerException + */ + protected function onErrorResponse(CommandInterface $command, ErrorResponseInterface $response) + { + if ($command instanceof ScriptCommand && $response->getErrorType() === 'NOSCRIPT') { + $response = $this->executeCommand($command->getEvalCommand()); + + if (!$response instanceof ResponseInterface) { + $response = $command->parseResponse($response); + } + + return $response; + } + + if ($this->options->exceptions) { + throw new ServerException($response->getMessage()); + } + + return $response; + } + + /** + * Executes the specified initializer method on `$this` by adjusting the + * actual invocation depending on the arity (0, 1 or 2 arguments). This is + * simply an utility method to create Redis contexts instances since they + * follow a common initialization path. + * + * @param string $initializer Method name. + * @param array $argv Arguments for the method. + * + * @return mixed + */ + private function sharedContextFactory($initializer, $argv = null) + { + switch (count($argv)) { + case 0: + return $this->$initializer(); + + case 1: + return is_array($argv[0]) + ? $this->$initializer($argv[0]) + : $this->$initializer(null, $argv[0]); + + case 2: + [$arg0, $arg1] = $argv; + + return $this->$initializer($arg0, $arg1); + + default: + return $this->$initializer($this, $argv); + } + } + + /** + * Creates a new pipeline context and returns it, or returns the results of + * a pipeline executed inside the optionally provided callable object. + * + * @param mixed ...$arguments Array of options, a callable for execution, or both. + * + * @return Pipeline|array + */ + public function pipeline(...$arguments) + { + return $this->sharedContextFactory('createPipeline', func_get_args()); + } + + /** + * Actual pipeline context initializer method. + * + * @param array $options Options for the context. + * @param mixed $callable Optional callable used to execute the context. + * + * @return Pipeline|array + */ + protected function createPipeline(array $options = null, $callable = null) + { + if (isset($options['atomic']) && $options['atomic']) { + $class = 'Predis\Pipeline\Atomic'; + } elseif (isset($options['fire-and-forget']) && $options['fire-and-forget']) { + $class = 'Predis\Pipeline\FireAndForget'; + } else { + $class = 'Predis\Pipeline\Pipeline'; + } + + /* + * @var ClientContextInterface + */ + $pipeline = new $class($this); + + if (isset($callable)) { + return $pipeline->execute($callable); + } + + return $pipeline; + } + + /** + * Creates a new transaction context and returns it, or returns the results + * of a transaction executed inside the optionally provided callable object. + * + * @param mixed ...$arguments Array of options, a callable for execution, or both. + * + * @return MultiExecTransaction|array + */ + public function transaction(...$arguments) + { + return $this->sharedContextFactory('createTransaction', func_get_args()); + } + + /** + * Actual transaction context initializer method. + * + * @param array $options Options for the context. + * @param mixed $callable Optional callable used to execute the context. + * + * @return MultiExecTransaction|array + */ + protected function createTransaction(array $options = null, $callable = null) + { + $transaction = new MultiExecTransaction($this, $options); + + if (isset($callable)) { + return $transaction->execute($callable); + } + + return $transaction; + } + + /** + * Creates a new publish/subscribe context and returns it, or starts its loop + * inside the optionally provided callable object. + * + * @param mixed ...$arguments Array of options, a callable for execution, or both. + * + * @return PubSubConsumer|null + */ + public function pubSubLoop(...$arguments) + { + return $this->sharedContextFactory('createPubSub', func_get_args()); + } + + /** + * Actual publish/subscribe context initializer method. + * + * @param array $options Options for the context. + * @param mixed $callable Optional callable used to execute the context. + * + * @return PubSubConsumer|null + */ + protected function createPubSub(array $options = null, $callable = null) + { + $pubsub = new PubSubConsumer($this, $options); + + if (!isset($callable)) { + return $pubsub; + } + + foreach ($pubsub as $message) { + if (call_user_func($callable, $pubsub, $message) === false) { + $pubsub->stop(); + } + } + + return null; + } + + /** + * Creates a new monitor consumer and returns it. + * + * @return MonitorConsumer + */ + public function monitor() + { + return new MonitorConsumer($this); + } + + /** + * @return Traversable + */ + #[ReturnTypeWillChange] + public function getIterator() + { + $clients = []; + $connection = $this->getConnection(); + + if (!$connection instanceof Traversable) { + return new ArrayIterator([ + (string) $connection => new static($connection, $this->getOptions()), + ]); + } + + foreach ($connection as $node) { + $clients[(string) $node] = new static($node, $this->getOptions()); + } + + return new ArrayIterator($clients); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/ClientContextInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/ClientContextInterface.php new file mode 100644 index 000000000..c241e83e8 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/ClientContextInterface.php @@ -0,0 +1,238 @@ +commands = $this->getDefaultCommands(); + } + + /** + * Returns the default map of supported commands with their handlers. + * + * @return array + */ + protected function getDefaultCommands() + { + $getKeyFromFirstArgument = [$this, 'getKeyFromFirstArgument']; + $getKeyFromAllArguments = [$this, 'getKeyFromAllArguments']; + + return [ + /* commands operating on the key space */ + 'EXISTS' => $getKeyFromAllArguments, + 'DEL' => $getKeyFromAllArguments, + 'TYPE' => $getKeyFromFirstArgument, + 'EXPIRE' => $getKeyFromFirstArgument, + 'EXPIREAT' => $getKeyFromFirstArgument, + 'PERSIST' => $getKeyFromFirstArgument, + 'PEXPIRE' => $getKeyFromFirstArgument, + 'PEXPIREAT' => $getKeyFromFirstArgument, + 'TTL' => $getKeyFromFirstArgument, + 'PTTL' => $getKeyFromFirstArgument, + 'SORT' => [$this, 'getKeyFromSortCommand'], + 'DUMP' => $getKeyFromFirstArgument, + 'RESTORE' => $getKeyFromFirstArgument, + + /* commands operating on string values */ + 'APPEND' => $getKeyFromFirstArgument, + 'DECR' => $getKeyFromFirstArgument, + 'DECRBY' => $getKeyFromFirstArgument, + 'GET' => $getKeyFromFirstArgument, + 'GETBIT' => $getKeyFromFirstArgument, + 'MGET' => $getKeyFromAllArguments, + 'SET' => $getKeyFromFirstArgument, + 'GETRANGE' => $getKeyFromFirstArgument, + 'GETSET' => $getKeyFromFirstArgument, + 'INCR' => $getKeyFromFirstArgument, + 'INCRBY' => $getKeyFromFirstArgument, + 'INCRBYFLOAT' => $getKeyFromFirstArgument, + 'SETBIT' => $getKeyFromFirstArgument, + 'SETEX' => $getKeyFromFirstArgument, + 'MSET' => [$this, 'getKeyFromInterleavedArguments'], + 'MSETNX' => [$this, 'getKeyFromInterleavedArguments'], + 'SETNX' => $getKeyFromFirstArgument, + 'SETRANGE' => $getKeyFromFirstArgument, + 'STRLEN' => $getKeyFromFirstArgument, + 'SUBSTR' => $getKeyFromFirstArgument, + 'BITOP' => [$this, 'getKeyFromBitOp'], + 'BITCOUNT' => $getKeyFromFirstArgument, + 'BITFIELD' => $getKeyFromFirstArgument, + + /* commands operating on lists */ + 'LINSERT' => $getKeyFromFirstArgument, + 'LINDEX' => $getKeyFromFirstArgument, + 'LLEN' => $getKeyFromFirstArgument, + 'LPOP' => $getKeyFromFirstArgument, + 'RPOP' => $getKeyFromFirstArgument, + 'RPOPLPUSH' => $getKeyFromAllArguments, + 'BLPOP' => [$this, 'getKeyFromBlockingListCommands'], + 'BRPOP' => [$this, 'getKeyFromBlockingListCommands'], + 'BRPOPLPUSH' => [$this, 'getKeyFromBlockingListCommands'], + 'LPUSH' => $getKeyFromFirstArgument, + 'LPUSHX' => $getKeyFromFirstArgument, + 'RPUSH' => $getKeyFromFirstArgument, + 'RPUSHX' => $getKeyFromFirstArgument, + 'LRANGE' => $getKeyFromFirstArgument, + 'LREM' => $getKeyFromFirstArgument, + 'LSET' => $getKeyFromFirstArgument, + 'LTRIM' => $getKeyFromFirstArgument, + + /* commands operating on sets */ + 'SADD' => $getKeyFromFirstArgument, + 'SCARD' => $getKeyFromFirstArgument, + 'SDIFF' => $getKeyFromAllArguments, + 'SDIFFSTORE' => $getKeyFromAllArguments, + 'SINTER' => $getKeyFromAllArguments, + 'SINTERSTORE' => $getKeyFromAllArguments, + 'SUNION' => $getKeyFromAllArguments, + 'SUNIONSTORE' => $getKeyFromAllArguments, + 'SISMEMBER' => $getKeyFromFirstArgument, + 'SMEMBERS' => $getKeyFromFirstArgument, + 'SSCAN' => $getKeyFromFirstArgument, + 'SPOP' => $getKeyFromFirstArgument, + 'SRANDMEMBER' => $getKeyFromFirstArgument, + 'SREM' => $getKeyFromFirstArgument, + + /* commands operating on sorted sets */ + 'ZADD' => $getKeyFromFirstArgument, + 'ZCARD' => $getKeyFromFirstArgument, + 'ZCOUNT' => $getKeyFromFirstArgument, + 'ZINCRBY' => $getKeyFromFirstArgument, + 'ZINTERSTORE' => [$this, 'getKeyFromZsetAggregationCommands'], + 'ZRANGE' => $getKeyFromFirstArgument, + 'ZRANGEBYSCORE' => $getKeyFromFirstArgument, + 'ZRANK' => $getKeyFromFirstArgument, + 'ZREM' => $getKeyFromFirstArgument, + 'ZREMRANGEBYRANK' => $getKeyFromFirstArgument, + 'ZREMRANGEBYSCORE' => $getKeyFromFirstArgument, + 'ZREVRANGE' => $getKeyFromFirstArgument, + 'ZREVRANGEBYSCORE' => $getKeyFromFirstArgument, + 'ZREVRANK' => $getKeyFromFirstArgument, + 'ZSCORE' => $getKeyFromFirstArgument, + 'ZUNIONSTORE' => [$this, 'getKeyFromZsetAggregationCommands'], + 'ZSCAN' => $getKeyFromFirstArgument, + 'ZLEXCOUNT' => $getKeyFromFirstArgument, + 'ZRANGEBYLEX' => $getKeyFromFirstArgument, + 'ZREMRANGEBYLEX' => $getKeyFromFirstArgument, + 'ZREVRANGEBYLEX' => $getKeyFromFirstArgument, + + /* commands operating on hashes */ + 'HDEL' => $getKeyFromFirstArgument, + 'HEXISTS' => $getKeyFromFirstArgument, + 'HGET' => $getKeyFromFirstArgument, + 'HGETALL' => $getKeyFromFirstArgument, + 'HMGET' => $getKeyFromFirstArgument, + 'HMSET' => $getKeyFromFirstArgument, + 'HINCRBY' => $getKeyFromFirstArgument, + 'HINCRBYFLOAT' => $getKeyFromFirstArgument, + 'HKEYS' => $getKeyFromFirstArgument, + 'HLEN' => $getKeyFromFirstArgument, + 'HSET' => $getKeyFromFirstArgument, + 'HSETNX' => $getKeyFromFirstArgument, + 'HVALS' => $getKeyFromFirstArgument, + 'HSCAN' => $getKeyFromFirstArgument, + 'HSTRLEN' => $getKeyFromFirstArgument, + + /* commands operating on HyperLogLog */ + 'PFADD' => $getKeyFromFirstArgument, + 'PFCOUNT' => $getKeyFromAllArguments, + 'PFMERGE' => $getKeyFromAllArguments, + + /* scripting */ + 'EVAL' => [$this, 'getKeyFromScriptingCommands'], + 'EVALSHA' => [$this, 'getKeyFromScriptingCommands'], + + /* commands performing geospatial operations */ + 'GEOADD' => $getKeyFromFirstArgument, + 'GEOHASH' => $getKeyFromFirstArgument, + 'GEOPOS' => $getKeyFromFirstArgument, + 'GEODIST' => $getKeyFromFirstArgument, + 'GEORADIUS' => [$this, 'getKeyFromGeoradiusCommands'], + 'GEORADIUSBYMEMBER' => [$this, 'getKeyFromGeoradiusCommands'], + ]; + } + + /** + * Returns the list of IDs for the supported commands. + * + * @return array + */ + public function getSupportedCommands() + { + return array_keys($this->commands); + } + + /** + * Sets an handler for the specified command ID. + * + * The signature of the callback must have a single parameter of type + * Predis\Command\CommandInterface. + * + * When the callback argument is omitted or NULL, the previously associated + * handler for the specified command ID is removed. + * + * @param string $commandID Command ID. + * @param mixed $callback A valid callable object, or NULL to unset the handler. + * + * @throws InvalidArgumentException + */ + public function setCommandHandler($commandID, $callback = null) + { + $commandID = strtoupper($commandID); + + if (!isset($callback)) { + unset($this->commands[$commandID]); + + return; + } + + if (!is_callable($callback)) { + throw new InvalidArgumentException( + 'The argument must be a callable object or NULL.' + ); + } + + $this->commands[$commandID] = $callback; + } + + /** + * Extracts the key from the first argument of a command instance. + * + * @param CommandInterface $command Command instance. + * + * @return string + */ + protected function getKeyFromFirstArgument(CommandInterface $command) + { + return $command->getArgument(0); + } + + /** + * Extracts the key from a command with multiple keys only when all keys in + * the arguments array produce the same hash. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromAllArguments(CommandInterface $command) + { + $arguments = $command->getArguments(); + + if (!$this->checkSameSlotForKeys($arguments)) { + return null; + } + + return $arguments[0]; + } + + /** + * Extracts the key from a command with multiple keys only when all keys in + * the arguments array produce the same hash. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromInterleavedArguments(CommandInterface $command) + { + $arguments = $command->getArguments(); + $keys = []; + + for ($i = 0; $i < count($arguments); $i += 2) { + $keys[] = $arguments[$i]; + } + + if (!$this->checkSameSlotForKeys($keys)) { + return null; + } + + return $arguments[0]; + } + + /** + * Extracts the key from SORT command. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromSortCommand(CommandInterface $command) + { + $arguments = $command->getArguments(); + $firstKey = $arguments[0]; + + if (1 === $argc = count($arguments)) { + return $firstKey; + } + + $keys = [$firstKey]; + + for ($i = 1; $i < $argc; ++$i) { + if (strtoupper($arguments[$i]) === 'STORE') { + $keys[] = $arguments[++$i]; + } + } + + if (!$this->checkSameSlotForKeys($keys)) { + return null; + } + + return $firstKey; + } + + /** + * Extracts the key from BLPOP and BRPOP commands. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromBlockingListCommands(CommandInterface $command) + { + $arguments = $command->getArguments(); + + if (!$this->checkSameSlotForKeys(array_slice($arguments, 0, count($arguments) - 1))) { + return null; + } + + return $arguments[0]; + } + + /** + * Extracts the key from BITOP command. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromBitOp(CommandInterface $command) + { + $arguments = $command->getArguments(); + + if (!$this->checkSameSlotForKeys(array_slice($arguments, 1, count($arguments)))) { + return null; + } + + return $arguments[1]; + } + + /** + * Extracts the key from GEORADIUS and GEORADIUSBYMEMBER commands. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromGeoradiusCommands(CommandInterface $command) + { + $arguments = $command->getArguments(); + $argc = count($arguments); + $startIndex = $command->getId() === 'GEORADIUS' ? 5 : 4; + + if ($argc > $startIndex) { + $keys = [$arguments[0]]; + + for ($i = $startIndex; $i < $argc; ++$i) { + $argument = strtoupper($arguments[$i]); + if ($argument === 'STORE' || $argument === 'STOREDIST') { + $keys[] = $arguments[++$i]; + } + } + + if (!$this->checkSameSlotForKeys($keys)) { + return null; + } + } + + return $arguments[0]; + } + + /** + * Extracts the key from ZINTERSTORE and ZUNIONSTORE commands. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromZsetAggregationCommands(CommandInterface $command) + { + $arguments = $command->getArguments(); + $keys = array_merge([$arguments[0]], array_slice($arguments, 2, $arguments[1])); + + if (!$this->checkSameSlotForKeys($keys)) { + return null; + } + + return $arguments[0]; + } + + /** + * Extracts the key from EVAL and EVALSHA commands. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromScriptingCommands(CommandInterface $command) + { + $keys = $command instanceof ScriptCommand + ? $command->getKeys() + : array_slice($args = $command->getArguments(), 2, $args[1]); + + if (!$keys || !$this->checkSameSlotForKeys($keys)) { + return null; + } + + return $keys[0]; + } + + /** + * {@inheritdoc} + */ + public function getSlot(CommandInterface $command) + { + $slot = $command->getSlot(); + + if (!isset($slot) && isset($this->commands[$cmdID = $command->getId()])) { + $key = call_user_func($this->commands[$cmdID], $command); + + if (isset($key)) { + $slot = $this->getSlotByKey($key); + $command->setSlot($slot); + } + } + + return $slot; + } + + /** + * Checks if the specified array of keys will generate the same hash. + * + * @param array $keys Array of keys. + * + * @return bool + */ + protected function checkSameSlotForKeys(array $keys) + { + if (!$count = count($keys)) { + return false; + } + + $currentSlot = $this->getSlotByKey($keys[0]); + + for ($i = 1; $i < $count; ++$i) { + $nextSlot = $this->getSlotByKey($keys[$i]); + + if ($currentSlot !== $nextSlot) { + return false; + } + + $currentSlot = $nextSlot; + } + + return true; + } + + /** + * Returns only the hashable part of a key (delimited by "{...}"), or the + * whole key if a key tag is not found in the string. + * + * @param string $key A key. + * + * @return string + */ + protected function extractKeyTag($key) + { + if (false !== $start = strpos($key, '{')) { + if (false !== ($end = strpos($key, '}', $start)) && $end !== ++$start) { + $key = substr($key, $start, $end - $start); + } + } + + return $key; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Distributor/DistributorInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Distributor/DistributorInterface.php new file mode 100644 index 000000000..593d9bb3c --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Distributor/DistributorInterface.php @@ -0,0 +1,81 @@ + + */ +class HashRing implements DistributorInterface, HashGeneratorInterface +{ + public const DEFAULT_REPLICAS = 128; + public const DEFAULT_WEIGHT = 100; + + private $ring; + private $ringKeys; + private $ringKeysCount; + private $replicas; + private $nodeHashCallback; + private $nodes = []; + + /** + * @param int $replicas Number of replicas in the ring. + * @param mixed $nodeHashCallback Callback returning a string used to calculate the hash of nodes. + */ + public function __construct($replicas = self::DEFAULT_REPLICAS, $nodeHashCallback = null) + { + $this->replicas = $replicas; + $this->nodeHashCallback = $nodeHashCallback; + } + + /** + * Adds a node to the ring with an optional weight. + * + * @param mixed $node Node object. + * @param int $weight Weight for the node. + */ + public function add($node, $weight = null) + { + // In case of collisions in the hashes of the nodes, the node added + // last wins, thus the order in which nodes are added is significant. + $this->nodes[] = [ + 'object' => $node, + 'weight' => (int) $weight ?: $this::DEFAULT_WEIGHT, + ]; + + $this->reset(); + } + + /** + * {@inheritdoc} + */ + public function remove($node) + { + // A node is removed by resetting the ring so that it's recreated from + // scratch, in order to reassign possible hashes with collisions to the + // right node according to the order in which they were added in the + // first place. + for ($i = 0; $i < count($this->nodes); ++$i) { + if ($this->nodes[$i]['object'] === $node) { + array_splice($this->nodes, $i, 1); + $this->reset(); + + break; + } + } + } + + /** + * Resets the distributor. + */ + private function reset() + { + unset( + $this->ring, + $this->ringKeys, + $this->ringKeysCount + ); + } + + /** + * Returns the initialization status of the distributor. + * + * @return bool + */ + private function isInitialized() + { + return isset($this->ringKeys); + } + + /** + * Calculates the total weight of all the nodes in the distributor. + * + * @return int + */ + private function computeTotalWeight() + { + $totalWeight = 0; + + foreach ($this->nodes as $node) { + $totalWeight += $node['weight']; + } + + return $totalWeight; + } + + /** + * Initializes the distributor. + */ + private function initialize() + { + if ($this->isInitialized()) { + return; + } + + if (!$this->nodes) { + throw new EmptyRingException('Cannot initialize an empty hashring.'); + } + + $this->ring = []; + $totalWeight = $this->computeTotalWeight(); + $nodesCount = count($this->nodes); + + foreach ($this->nodes as $node) { + $weightRatio = $node['weight'] / $totalWeight; + $this->addNodeToRing($this->ring, $node, $nodesCount, $this->replicas, $weightRatio); + } + + ksort($this->ring, SORT_NUMERIC); + $this->ringKeys = array_keys($this->ring); + $this->ringKeysCount = count($this->ringKeys); + } + + /** + * Implements the logic needed to add a node to the hashring. + * + * @param array $ring Source hashring. + * @param mixed $node Node object to be added. + * @param int $totalNodes Total number of nodes. + * @param int $replicas Number of replicas in the ring. + * @param float $weightRatio Weight ratio for the node. + */ + protected function addNodeToRing(&$ring, $node, $totalNodes, $replicas, $weightRatio) + { + $nodeObject = $node['object']; + $nodeHash = $this->getNodeHash($nodeObject); + $replicas = (int) round($weightRatio * $totalNodes * $replicas); + + for ($i = 0; $i < $replicas; ++$i) { + $key = $this->hash("$nodeHash:$i"); + $ring[$key] = $nodeObject; + } + } + + /** + * {@inheritdoc} + */ + protected function getNodeHash($nodeObject) + { + if (!isset($this->nodeHashCallback)) { + return (string) $nodeObject; + } + + return call_user_func($this->nodeHashCallback, $nodeObject); + } + + /** + * {@inheritdoc} + */ + public function hash($value) + { + return crc32($value); + } + + /** + * {@inheritdoc} + */ + public function getByHash($hash) + { + return $this->ring[$this->getSlot($hash)]; + } + + /** + * {@inheritdoc} + */ + public function getBySlot($slot) + { + $this->initialize(); + + if (isset($this->ring[$slot])) { + return $this->ring[$slot]; + } + } + + /** + * {@inheritdoc} + */ + public function getSlot($hash) + { + $this->initialize(); + + $ringKeys = $this->ringKeys; + $upper = $this->ringKeysCount - 1; + $lower = 0; + + while ($lower <= $upper) { + $index = ($lower + $upper) >> 1; + $item = $ringKeys[$index]; + + if ($item > $hash) { + $upper = $index - 1; + } elseif ($item < $hash) { + $lower = $index + 1; + } else { + return $item; + } + } + + return $ringKeys[$this->wrapAroundStrategy($upper, $lower, $this->ringKeysCount)]; + } + + /** + * {@inheritdoc} + */ + public function get($value) + { + $hash = $this->hash($value); + + return $this->getByHash($hash); + } + + /** + * Implements a strategy to deal with wrap-around errors during binary searches. + * + * @param int $upper + * @param int $lower + * @param int $ringKeysCount + * + * @return int + */ + protected function wrapAroundStrategy($upper, $lower, $ringKeysCount) + { + // Binary search for the last item in ringkeys with a value less or + // equal to the key. If no such item exists, return the last item. + return $upper >= 0 ? $upper : $ringKeysCount - 1; + } + + /** + * {@inheritdoc} + */ + public function getHashGenerator() + { + return $this; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Distributor/KetamaRing.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Distributor/KetamaRing.php new file mode 100644 index 000000000..af3b88455 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Distributor/KetamaRing.php @@ -0,0 +1,70 @@ + + */ +class KetamaRing extends HashRing +{ + public const DEFAULT_REPLICAS = 160; + + /** + * @param mixed $nodeHashCallback Callback returning a string used to calculate the hash of nodes. + */ + public function __construct($nodeHashCallback = null) + { + parent::__construct($this::DEFAULT_REPLICAS, $nodeHashCallback); + } + + /** + * {@inheritdoc} + */ + protected function addNodeToRing(&$ring, $node, $totalNodes, $replicas, $weightRatio) + { + $nodeObject = $node['object']; + $nodeHash = $this->getNodeHash($nodeObject); + $replicas = (int) floor($weightRatio * $totalNodes * ($replicas / 4)); + + for ($i = 0; $i < $replicas; ++$i) { + $unpackedDigest = unpack('V4', md5("$nodeHash-$i", true)); + + foreach ($unpackedDigest as $key) { + $ring[$key] = $nodeObject; + } + } + } + + /** + * {@inheritdoc} + */ + public function hash($value) + { + $hash = unpack('V', md5($value, true)); + + return $hash[1]; + } + + /** + * {@inheritdoc} + */ + protected function wrapAroundStrategy($upper, $lower, $ringKeysCount) + { + // Binary search for the first item in ringkeys with a value greater + // or equal to the key. If no such item exists, return the first item. + return $lower < $ringKeysCount ? $lower : 0; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Hash/CRC16.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Hash/CRC16.php new file mode 100644 index 000000000..4b21d5d21 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Hash/CRC16.php @@ -0,0 +1,73 @@ +> 8) ^ ord($value[$i])]) & 0xFFFF; + } + + return $crc; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Hash/HashGeneratorInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Hash/HashGeneratorInterface.php new file mode 100644 index 000000000..c835c0e66 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/Hash/HashGeneratorInterface.php @@ -0,0 +1,29 @@ +distributor = $distributor ?: new HashRing(); + } + + /** + * {@inheritdoc} + */ + public function getSlotByKey($key) + { + $key = $this->extractKeyTag($key); + $hash = $this->distributor->hash($key); + + return $this->distributor->getSlot($hash); + } + + /** + * {@inheritdoc} + */ + protected function checkSameSlotForKeys(array $keys) + { + if (!$count = count($keys)) { + return false; + } + + $currentKey = $this->extractKeyTag($keys[0]); + + for ($i = 1; $i < $count; ++$i) { + $nextKey = $this->extractKeyTag($keys[$i]); + + if ($currentKey !== $nextKey) { + return false; + } + + $currentKey = $nextKey; + } + + return true; + } + + /** + * {@inheritdoc} + */ + public function getDistributor() + { + return $this->distributor; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/RedisStrategy.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/RedisStrategy.php new file mode 100644 index 000000000..8ae5c0f5e --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/RedisStrategy.php @@ -0,0 +1,55 @@ +hashGenerator = $hashGenerator ?: new CRC16(); + } + + /** + * {@inheritdoc} + */ + public function getSlotByKey($key) + { + $key = $this->extractKeyTag($key); + + return $this->hashGenerator->hash($key) & 0x3FFF; + } + + /** + * {@inheritdoc} + */ + public function getDistributor() + { + $class = get_class($this); + throw new NotSupportedException("$class does not provide an external distributor"); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/SlotMap.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/SlotMap.php new file mode 100644 index 000000000..0557c25e1 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/SlotMap.php @@ -0,0 +1,208 @@ += 0x0000 && $slot <= 0x3FFF; + } + + /** + * Checks if the given slot range is valid. + * + * @param int $first Initial slot of the range. + * @param int $last Last slot of the range. + * + * @return bool + */ + public static function isValidRange($first, $last) + { + return $first >= 0x0000 && $first <= 0x3FFF && $last >= 0x0000 && $last <= 0x3FFF && $first <= $last; + } + + /** + * Resets the slot map. + */ + public function reset() + { + $this->slots = []; + } + + /** + * Checks if the slot map is empty. + * + * @return bool + */ + public function isEmpty() + { + return empty($this->slots); + } + + /** + * Returns the current slot map as a dictionary of $slot => $node. + * + * The order of the slots in the dictionary is not guaranteed. + * + * @return array + */ + public function toArray() + { + return $this->slots; + } + + /** + * Returns the list of unique nodes in the slot map. + * + * @return array + */ + public function getNodes() + { + return array_keys(array_flip($this->slots)); + } + + /** + * Assigns the specified slot range to a node. + * + * @param int $first Initial slot of the range. + * @param int $last Last slot of the range. + * @param NodeConnectionInterface|string $connection ID or connection instance. + * + * @throws OutOfBoundsException + */ + public function setSlots($first, $last, $connection) + { + if (!static::isValidRange($first, $last)) { + throw new OutOfBoundsException("Invalid slot range $first-$last for `$connection`"); + } + + $this->slots += array_fill($first, $last - $first + 1, (string) $connection); + } + + /** + * Returns the specified slot range. + * + * @param int $first Initial slot of the range. + * @param int $last Last slot of the range. + * + * @return array + */ + public function getSlots($first, $last) + { + if (!static::isValidRange($first, $last)) { + throw new OutOfBoundsException("Invalid slot range $first-$last"); + } + + return array_intersect_key($this->slots, array_fill($first, $last - $first + 1, null)); + } + + /** + * Checks if the specified slot is assigned. + * + * @param int $slot Slot index. + * + * @return bool + */ + #[ReturnTypeWillChange] + public function offsetExists($slot) + { + return isset($this->slots[$slot]); + } + + /** + * Returns the node assigned to the specified slot. + * + * @param int $slot Slot index. + * + * @return string|null + */ + #[ReturnTypeWillChange] + public function offsetGet($slot) + { + return $this->slots[$slot] ?? null; + } + + /** + * Assigns the specified slot to a node. + * + * @param int $slot Slot index. + * @param NodeConnectionInterface|string $connection ID or connection instance. + * + * @return void + */ + #[ReturnTypeWillChange] + public function offsetSet($slot, $connection) + { + if (!static::isValid($slot)) { + throw new OutOfBoundsException("Invalid slot $slot for `$connection`"); + } + + $this->slots[(int) $slot] = (string) $connection; + } + + /** + * Returns the node assigned to the specified slot. + * + * @param int $slot Slot index. + * + * @return void + */ + #[ReturnTypeWillChange] + public function offsetUnset($slot) + { + unset($this->slots[$slot]); + } + + /** + * Returns the current number of assigned slots. + * + * @return int + */ + #[ReturnTypeWillChange] + public function count() + { + return count($this->slots); + } + + /** + * Returns an iterator over the slot map. + * + * @return ArrayIterator + */ + #[ReturnTypeWillChange] + public function getIterator() + { + return new ArrayIterator($this->slots); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/StrategyInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/StrategyInterface.php new file mode 100644 index 000000000..83801ae6f --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Cluster/StrategyInterface.php @@ -0,0 +1,52 @@ +client = $client; + $this->match = $match; + $this->count = $count; + + $this->reset(); + } + + /** + * Ensures that the client supports the specified Redis command required to + * fetch elements from the server to perform the iteration. + * + * @param ClientInterface $client Client connected to Redis. + * @param string $commandID Command ID. + * + * @throws NotSupportedException + */ + protected function requiredCommand(ClientInterface $client, $commandID) + { + if (!$client->getCommandFactory()->supports($commandID)) { + throw new NotSupportedException("'$commandID' is not supported by the current command factory."); + } + } + + /** + * Resets the inner state of the iterator. + */ + protected function reset() + { + $this->valid = true; + $this->fetchmore = true; + $this->elements = []; + $this->cursor = 0; + $this->position = -1; + $this->current = null; + } + + /** + * Returns an array of options for the `SCAN` command. + * + * @return array + */ + protected function getScanOptions() + { + $options = []; + + if (strlen(strval($this->match)) > 0) { + $options['MATCH'] = $this->match; + } + + if ($this->count > 0) { + $options['COUNT'] = $this->count; + } + + return $options; + } + + /** + * Fetches a new set of elements from the remote collection, effectively + * advancing the iteration process. + * + * @return array + */ + abstract protected function executeCommand(); + + /** + * Populates the local buffer of elements fetched from the server during + * the iteration. + */ + protected function fetch() + { + [$cursor, $elements] = $this->executeCommand(); + + if (!$cursor) { + $this->fetchmore = false; + } + + $this->cursor = $cursor; + $this->elements = $elements; + } + + /** + * Extracts next values for key() and current(). + */ + protected function extractNext() + { + ++$this->position; + $this->current = array_shift($this->elements); + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function rewind() + { + $this->reset(); + $this->next(); + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function current() + { + return $this->current; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function key() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function next() + { + tryFetch: + if (!$this->elements && $this->fetchmore) { + $this->fetch(); + } + + if ($this->elements) { + $this->extractNext(); + } elseif ($this->cursor) { + goto tryFetch; + } else { + $this->valid = false; + } + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function valid() + { + return $this->valid; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/HashKey.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/HashKey.php new file mode 100644 index 000000000..91b7d27ff --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/HashKey.php @@ -0,0 +1,57 @@ += 2.8) wrapped in a fully-rewindable PHP iterator. + * + * @see http://redis.io/commands/scan + */ +class HashKey extends CursorBasedIterator +{ + protected $key; + + /** + * {@inheritdoc} + */ + public function __construct(ClientInterface $client, $key, $match = null, $count = null) + { + $this->requiredCommand($client, 'HSCAN'); + + parent::__construct($client, $match, $count); + + $this->key = $key; + } + + /** + * {@inheritdoc} + */ + protected function executeCommand() + { + return $this->client->hscan($this->key, $this->cursor, $this->getScanOptions()); + } + + /** + * {@inheritdoc} + */ + protected function extractNext() + { + $this->position = key($this->elements); + $this->current = current($this->elements); + + unset($this->elements[$this->position]); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/Keyspace.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/Keyspace.php new file mode 100644 index 000000000..b5fa022aa --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/Keyspace.php @@ -0,0 +1,42 @@ += 2.8) wrapped in a fully-rewindable PHP iterator. + * + * @see http://redis.io/commands/scan + */ +class Keyspace extends CursorBasedIterator +{ + /** + * {@inheritdoc} + */ + public function __construct(ClientInterface $client, $match = null, $count = null) + { + $this->requiredCommand($client, 'SCAN'); + + parent::__construct($client, $match, $count); + } + + /** + * {@inheritdoc} + */ + protected function executeCommand() + { + return $this->client->scan($this->cursor, $this->getScanOptions()); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/ListKey.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/ListKey.php new file mode 100644 index 000000000..9f4a21ca5 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/ListKey.php @@ -0,0 +1,183 @@ +requiredCommand($client, 'LRANGE'); + + if ((false === $count = filter_var($count, FILTER_VALIDATE_INT)) || $count < 0) { + throw new InvalidArgumentException('The $count argument must be a positive integer.'); + } + + $this->client = $client; + $this->key = $key; + $this->count = $count; + + $this->reset(); + } + + /** + * Ensures that the client instance supports the specified Redis command + * required to fetch elements from the server to perform the iteration. + * + * @param ClientInterface $client Client connected to Redis. + * @param string $commandID Command ID. + * + * @throws NotSupportedException + */ + protected function requiredCommand(ClientInterface $client, $commandID) + { + if (!$client->getCommandFactory()->supports($commandID)) { + throw new NotSupportedException("'$commandID' is not supported by the current command factory."); + } + } + + /** + * Resets the inner state of the iterator. + */ + protected function reset() + { + $this->valid = true; + $this->fetchmore = true; + $this->elements = []; + $this->position = -1; + $this->current = null; + } + + /** + * Fetches a new set of elements from the remote collection, effectively + * advancing the iteration process. + * + * @return array + */ + protected function executeCommand() + { + return $this->client->lrange($this->key, $this->position + 1, $this->position + $this->count); + } + + /** + * Populates the local buffer of elements fetched from the server during the + * iteration. + */ + protected function fetch() + { + $elements = $this->executeCommand(); + + if (count($elements) < $this->count) { + $this->fetchmore = false; + } + + $this->elements = $elements; + } + + /** + * Extracts next values for key() and current(). + */ + protected function extractNext() + { + ++$this->position; + $this->current = array_shift($this->elements); + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function rewind() + { + $this->reset(); + $this->next(); + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function current() + { + return $this->current; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function key() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function next() + { + if (!$this->elements && $this->fetchmore) { + $this->fetch(); + } + + if ($this->elements) { + $this->extractNext(); + } else { + $this->valid = false; + } + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function valid() + { + return $this->valid; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/SetKey.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/SetKey.php new file mode 100644 index 000000000..74f982346 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/SetKey.php @@ -0,0 +1,46 @@ += 2.8) wrapped in a fully-rewindable PHP iterator. + * + * @see http://redis.io/commands/scan + */ +class SetKey extends CursorBasedIterator +{ + protected $key; + + /** + * {@inheritdoc} + */ + public function __construct(ClientInterface $client, $key, $match = null, $count = null) + { + $this->requiredCommand($client, 'SSCAN'); + + parent::__construct($client, $match, $count); + + $this->key = $key; + } + + /** + * {@inheritdoc} + */ + protected function executeCommand() + { + return $this->client->sscan($this->key, $this->cursor, $this->getScanOptions()); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/SortedSetKey.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/SortedSetKey.php new file mode 100644 index 000000000..abee8c252 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Collection/Iterator/SortedSetKey.php @@ -0,0 +1,57 @@ += 2.8) wrapped in a fully-rewindable PHP iterator. + * + * @see http://redis.io/commands/scan + */ +class SortedSetKey extends CursorBasedIterator +{ + protected $key; + + /** + * {@inheritdoc} + */ + public function __construct(ClientInterface $client, $key, $match = null, $count = null) + { + $this->requiredCommand($client, 'ZSCAN'); + + parent::__construct($client, $match, $count); + + $this->key = $key; + } + + /** + * {@inheritdoc} + */ + protected function executeCommand() + { + return $this->client->zscan($this->key, $this->cursor, $this->getScanOptions()); + } + + /** + * {@inheritdoc} + */ + protected function extractNext() + { + $this->position = key($this->elements); + $this->current = current($this->elements); + + unset($this->elements[$this->position]); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/ArrayableArgument.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/ArrayableArgument.php new file mode 100644 index 000000000..11073c054 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/ArrayableArgument.php @@ -0,0 +1,26 @@ +unit = $unit; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/ByBox.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/ByBox.php new file mode 100644 index 000000000..7dd9f23b7 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/ByBox.php @@ -0,0 +1,43 @@ +width = $width; + $this->height = $height; + $this->setUnit($unit); + } + + /** + * {@inheritDoc} + */ + public function toArray(): array + { + return [self::KEYWORD, $this->width, $this->height, $this->unit]; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/ByInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/ByInterface.php new file mode 100644 index 000000000..767886cef --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/ByInterface.php @@ -0,0 +1,19 @@ +radius = $radius; + $this->setUnit($unit); + } + + /** + * {@inheritDoc} + */ + public function toArray(): array + { + return [self::KEYWORD, $this->radius, $this->unit]; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/FromInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/FromInterface.php new file mode 100644 index 000000000..44700bda4 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/FromInterface.php @@ -0,0 +1,19 @@ +longitude = $longitude; + $this->latitude = $latitude; + } + + /** + * {@inheritDoc} + */ + public function toArray(): array + { + return [self::KEYWORD, $this->longitude, $this->latitude]; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/FromMember.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/FromMember.php new file mode 100644 index 000000000..9e24b2ba0 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Geospatial/FromMember.php @@ -0,0 +1,36 @@ +member = $member; + } + + /** + * {@inheritDoc} + */ + public function toArray(): array + { + return [self::KEYWORD, $this->member]; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Server/LimitInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Server/LimitInterface.php new file mode 100644 index 000000000..95ebd6433 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Server/LimitInterface.php @@ -0,0 +1,19 @@ +offset = $offset; + $this->count = $count; + } + + /** + * {@inheritDoc} + */ + public function toArray(): array + { + return [self::KEYWORD, $this->offset, $this->count]; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Server/To.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Server/To.php new file mode 100644 index 000000000..1d77ef681 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Argument/Server/To.php @@ -0,0 +1,57 @@ +host = $host; + $this->port = $port; + $this->isForce = $isForce; + } + + /** + * {@inheritDoc} + */ + public function toArray(): array + { + $arguments = [self::KEYWORD, $this->host, $this->port]; + + if ($this->isForce) { + $arguments[] = self::FORCE_KEYWORD; + } + + return $arguments; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Command.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Command.php new file mode 100644 index 000000000..68629c454 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Command.php @@ -0,0 +1,126 @@ +arguments = $arguments; + unset($this->slot); + } + + /** + * {@inheritdoc} + */ + public function setRawArguments(array $arguments) + { + $this->arguments = $arguments; + unset($this->slot); + } + + /** + * {@inheritdoc} + */ + public function getArguments() + { + return $this->arguments; + } + + /** + * {@inheritdoc} + */ + public function getArgument($index) + { + if (isset($this->arguments[$index])) { + return $this->arguments[$index]; + } + } + + /** + * {@inheritdoc} + */ + public function setSlot($slot) + { + $this->slot = $slot; + } + + /** + * {@inheritdoc} + */ + public function getSlot() + { + return $this->slot ?? null; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return $data; + } + + /** + * Normalizes the arguments array passed to a Redis command. + * + * @param array $arguments Arguments for a command. + * + * @return array + */ + public static function normalizeArguments(array $arguments) + { + if (count($arguments) === 1 && isset($arguments[0]) && is_array($arguments[0])) { + return $arguments[0]; + } + + return $arguments; + } + + /** + * Normalizes the arguments array passed to a variadic Redis command. + * + * @param array $arguments Arguments for a command. + * + * @return array + */ + public static function normalizeVariadic(array $arguments) + { + if (count($arguments) === 2 && is_array($arguments[1])) { + return array_merge([$arguments[0]], $arguments[1]); + } + + return $arguments; + } + + /** + * Remove all false values from arguments. + * + * @return void + */ + public function filterArguments(): void + { + $this->arguments = array_filter($this->arguments, static function ($argument) { + return $argument !== false && $argument !== null; + }); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/CommandInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/CommandInterface.php new file mode 100644 index 000000000..20480316d --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/CommandInterface.php @@ -0,0 +1,80 @@ +getCommandClass($commandID) === null) { + return false; + } + } + + return true; + } + + /** + * Returns the FQCN of a class that represents the specified command ID. + * + * @codeCoverageIgnore + * + * @param string $commandID Command ID + * + * @return string|null + */ + public function getCommandClass(string $commandID): ?string + { + return $this->commands[strtoupper($commandID)] ?? null; + } + + /** + * {@inheritdoc} + */ + public function create(string $commandID, array $arguments = []): CommandInterface + { + if (!$commandClass = $this->getCommandClass($commandID)) { + $commandID = strtoupper($commandID); + + throw new ClientException("Command `$commandID` is not a registered Redis command."); + } + + $command = new $commandClass(); + $command->setArguments($arguments); + + if (isset($this->processor)) { + $this->processor->process($command); + } + + return $command; + } + + /** + * Defines a command in the factory. + * + * Only classes implementing Predis\Command\CommandInterface are allowed to + * handle a command. If the command specified by its ID is already handled + * by the factory, the underlying command class is replaced by the new one. + * + * @param string $commandID Command ID + * @param string $commandClass FQCN of a class implementing Predis\Command\CommandInterface + * + * @throws InvalidArgumentException + */ + public function define(string $commandID, string $commandClass): void + { + if (!is_a($commandClass, 'Predis\Command\CommandInterface', true)) { + throw new InvalidArgumentException( + "Class $commandClass must implement Predis\Command\CommandInterface" + ); + } + + $this->commands[strtoupper($commandID)] = $commandClass; + } + + /** + * Undefines a command in the factory. + * + * When the factory already has a class handler associated to the specified + * command ID it is removed from the map of known commands. Nothing happens + * when the command is not handled by the factory. + * + * @param string $commandID Command ID + */ + public function undefine(string $commandID): void + { + unset($this->commands[strtoupper($commandID)]); + } + + /** + * Sets a command processor for processing command arguments. + * + * Command processors are used to process and transform arguments of Redis + * commands before their newly created instances are returned to the caller + * of "create()". + * + * A NULL value can be used to effectively unset any processor if previously + * set for the command factory. + * + * @param ProcessorInterface|null $processor Command processor or NULL value. + */ + public function setProcessor(?ProcessorInterface $processor): void + { + $this->processor = $processor; + } + + /** + * Returns the current command processor. + * + * @return ProcessorInterface|null + */ + public function getProcessor(): ?ProcessorInterface + { + return $this->processor; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/FactoryInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/FactoryInterface.php new file mode 100644 index 000000000..e81951086 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/FactoryInterface.php @@ -0,0 +1,42 @@ +prefix = $prefix; + + $prefixFirst = static::class . '::first'; + $prefixAll = static::class . '::all'; + $prefixInterleaved = static::class . '::interleaved'; + $prefixSkipFirst = static::class . '::skipFirst'; + $prefixSkipLast = static::class . '::skipLast'; + $prefixSort = static::class . '::sort'; + $prefixEvalKeys = static::class . '::evalKeys'; + $prefixZsetStore = static::class . '::zsetStore'; + $prefixMigrate = static::class . '::migrate'; + $prefixGeoradius = static::class . '::georadius'; + + $this->commands = [ + /* ---------------- Redis 1.2 ---------------- */ + 'EXISTS' => $prefixAll, + 'DEL' => $prefixAll, + 'TYPE' => $prefixFirst, + 'KEYS' => $prefixFirst, + 'RENAME' => $prefixAll, + 'RENAMENX' => $prefixAll, + 'EXPIRE' => $prefixFirst, + 'EXPIREAT' => $prefixFirst, + 'TTL' => $prefixFirst, + 'MOVE' => $prefixFirst, + 'SORT' => $prefixSort, + 'DUMP' => $prefixFirst, + 'RESTORE' => $prefixFirst, + 'SET' => $prefixFirst, + 'SETNX' => $prefixFirst, + 'MSET' => $prefixInterleaved, + 'MSETNX' => $prefixInterleaved, + 'GET' => $prefixFirst, + 'MGET' => $prefixAll, + 'GETSET' => $prefixFirst, + 'INCR' => $prefixFirst, + 'INCRBY' => $prefixFirst, + 'DECR' => $prefixFirst, + 'DECRBY' => $prefixFirst, + 'RPUSH' => $prefixFirst, + 'LPUSH' => $prefixFirst, + 'LLEN' => $prefixFirst, + 'LRANGE' => $prefixFirst, + 'LTRIM' => $prefixFirst, + 'LINDEX' => $prefixFirst, + 'LSET' => $prefixFirst, + 'LREM' => $prefixFirst, + 'LPOP' => $prefixFirst, + 'RPOP' => $prefixFirst, + 'RPOPLPUSH' => $prefixAll, + 'SADD' => $prefixFirst, + 'SREM' => $prefixFirst, + 'SPOP' => $prefixFirst, + 'SMOVE' => $prefixSkipLast, + 'SCARD' => $prefixFirst, + 'SISMEMBER' => $prefixFirst, + 'SINTER' => $prefixAll, + 'SINTERSTORE' => $prefixAll, + 'SUNION' => $prefixAll, + 'SUNIONSTORE' => $prefixAll, + 'SDIFF' => $prefixAll, + 'SDIFFSTORE' => $prefixAll, + 'SMEMBERS' => $prefixFirst, + 'SRANDMEMBER' => $prefixFirst, + 'ZADD' => $prefixFirst, + 'ZINCRBY' => $prefixFirst, + 'ZREM' => $prefixFirst, + 'ZRANGE' => $prefixFirst, + 'ZREVRANGE' => $prefixFirst, + 'ZRANGEBYSCORE' => $prefixFirst, + 'ZCARD' => $prefixFirst, + 'ZSCORE' => $prefixFirst, + 'ZREMRANGEBYSCORE' => $prefixFirst, + /* ---------------- Redis 2.0 ---------------- */ + 'SETEX' => $prefixFirst, + 'APPEND' => $prefixFirst, + 'SUBSTR' => $prefixFirst, + 'BLPOP' => $prefixSkipLast, + 'BRPOP' => $prefixSkipLast, + 'ZUNIONSTORE' => $prefixZsetStore, + 'ZINTERSTORE' => $prefixZsetStore, + 'ZCOUNT' => $prefixFirst, + 'ZRANK' => $prefixFirst, + 'ZREVRANK' => $prefixFirst, + 'ZREMRANGEBYRANK' => $prefixFirst, + 'HSET' => $prefixFirst, + 'HSETNX' => $prefixFirst, + 'HMSET' => $prefixFirst, + 'HINCRBY' => $prefixFirst, + 'HGET' => $prefixFirst, + 'HMGET' => $prefixFirst, + 'HDEL' => $prefixFirst, + 'HEXISTS' => $prefixFirst, + 'HLEN' => $prefixFirst, + 'HKEYS' => $prefixFirst, + 'HVALS' => $prefixFirst, + 'HGETALL' => $prefixFirst, + 'SUBSCRIBE' => $prefixAll, + 'UNSUBSCRIBE' => $prefixAll, + 'PSUBSCRIBE' => $prefixAll, + 'PUNSUBSCRIBE' => $prefixAll, + 'PUBLISH' => $prefixFirst, + /* ---------------- Redis 2.2 ---------------- */ + 'PERSIST' => $prefixFirst, + 'STRLEN' => $prefixFirst, + 'SETRANGE' => $prefixFirst, + 'GETRANGE' => $prefixFirst, + 'SETBIT' => $prefixFirst, + 'GETBIT' => $prefixFirst, + 'RPUSHX' => $prefixFirst, + 'LPUSHX' => $prefixFirst, + 'LINSERT' => $prefixFirst, + 'BRPOPLPUSH' => $prefixSkipLast, + 'ZREVRANGEBYSCORE' => $prefixFirst, + 'WATCH' => $prefixAll, + /* ---------------- Redis 2.6 ---------------- */ + 'PTTL' => $prefixFirst, + 'PEXPIRE' => $prefixFirst, + 'PEXPIREAT' => $prefixFirst, + 'PSETEX' => $prefixFirst, + 'INCRBYFLOAT' => $prefixFirst, + 'BITOP' => $prefixSkipFirst, + 'BITCOUNT' => $prefixFirst, + 'HINCRBYFLOAT' => $prefixFirst, + 'EVAL' => $prefixEvalKeys, + 'EVALSHA' => $prefixEvalKeys, + 'MIGRATE' => $prefixMigrate, + /* ---------------- Redis 2.8 ---------------- */ + 'SSCAN' => $prefixFirst, + 'ZSCAN' => $prefixFirst, + 'HSCAN' => $prefixFirst, + 'PFADD' => $prefixFirst, + 'PFCOUNT' => $prefixAll, + 'PFMERGE' => $prefixAll, + 'ZLEXCOUNT' => $prefixFirst, + 'ZRANGEBYLEX' => $prefixFirst, + 'ZREMRANGEBYLEX' => $prefixFirst, + 'ZREVRANGEBYLEX' => $prefixFirst, + 'BITPOS' => $prefixFirst, + /* ---------------- Redis 3.2 ---------------- */ + 'HSTRLEN' => $prefixFirst, + 'BITFIELD' => $prefixFirst, + 'GEOADD' => $prefixFirst, + 'GEOHASH' => $prefixFirst, + 'GEOPOS' => $prefixFirst, + 'GEODIST' => $prefixFirst, + 'GEORADIUS' => $prefixGeoradius, + 'GEORADIUSBYMEMBER' => $prefixGeoradius, + /* ---------------- Redis 5.0 ---------------- */ + 'XADD' => $prefixFirst, + 'XRANGE' => $prefixFirst, + 'XDEL' => $prefixFirst, + 'XLEN' => $prefixFirst, + 'XACK' => $prefixFirst, + ]; + } + + /** + * Sets a prefix that is applied to all the keys. + * + * @param string $prefix Prefix for the keys. + */ + public function setPrefix($prefix) + { + $this->prefix = $prefix; + } + + /** + * Gets the current prefix. + * + * @return string + */ + public function getPrefix() + { + return $this->prefix; + } + + /** + * {@inheritdoc} + */ + public function process(CommandInterface $command) + { + if ($command instanceof PrefixableCommandInterface) { + $command->prefixKeys($this->prefix); + } elseif (isset($this->commands[$commandID = strtoupper($command->getId())])) { + $this->commands[$commandID]($command, $this->prefix); + } + } + + /** + * Sets an handler for the specified command ID. + * + * The callback signature must have 2 parameters of the following types: + * + * - Predis\Command\CommandInterface (command instance) + * - String (prefix) + * + * When the callback argument is omitted or NULL, the previously + * associated handler for the specified command ID is removed. + * + * @param string $commandID The ID of the command to be handled. + * @param mixed $callback A valid callable object or NULL. + * + * @throws InvalidArgumentException + */ + public function setCommandHandler($commandID, $callback = null) + { + $commandID = strtoupper($commandID); + + if (!isset($callback)) { + unset($this->commands[$commandID]); + + return; + } + + if (!is_callable($callback)) { + throw new InvalidArgumentException( + 'Callback must be a valid callable object or NULL' + ); + } + + $this->commands[$commandID] = $callback; + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return $this->getPrefix(); + } + + /** + * Applies the specified prefix only the first argument. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function first(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $arguments[0] = "$prefix{$arguments[0]}"; + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to all the arguments. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function all(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + foreach ($arguments as &$key) { + $key = "$prefix$key"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix only to even arguments in the list. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function interleaved(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $length = count($arguments); + + for ($i = 0; $i < $length; $i += 2) { + $arguments[$i] = "$prefix{$arguments[$i]}"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to all the arguments but the first one. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function skipFirst(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $length = count($arguments); + + for ($i = 1; $i < $length; ++$i) { + $arguments[$i] = "$prefix{$arguments[$i]}"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to all the arguments but the last one. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function skipLast(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $length = count($arguments); + + for ($i = 0; $i < $length - 1; ++$i) { + $arguments[$i] = "$prefix{$arguments[$i]}"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to the keys of a SORT command. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function sort(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $arguments[0] = "$prefix{$arguments[0]}"; + + if (($count = count($arguments)) > 1) { + for ($i = 1; $i < $count; ++$i) { + switch (strtoupper($arguments[$i])) { + case 'BY': + case 'STORE': + $arguments[$i] = "$prefix{$arguments[++$i]}"; + break; + + case 'GET': + $value = $arguments[++$i]; + if ($value !== '#') { + $arguments[$i] = "$prefix$value"; + } + break; + + case 'LIMIT': + $i += 2; + break; + } + } + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to the keys of an EVAL-based command. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function evalKeys(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + for ($i = 2; $i < $arguments[1] + 2; ++$i) { + $arguments[$i] = "$prefix{$arguments[$i]}"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to the keys of Z[INTERSECTION|UNION]STORE. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function zsetStore(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $arguments[0] = "$prefix{$arguments[0]}"; + $length = ((int) $arguments[1]) + 2; + + for ($i = 2; $i < $length; ++$i) { + $arguments[$i] = "$prefix{$arguments[$i]}"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to the key of a MIGRATE command. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function migrate(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $arguments[2] = "$prefix{$arguments[2]}"; + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to the key of a GEORADIUS command. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function georadius(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $arguments[0] = "$prefix{$arguments[0]}"; + $startIndex = $command->getId() === 'GEORADIUS' ? 5 : 4; + + if (($count = count($arguments)) > $startIndex) { + for ($i = $startIndex; $i < $count; ++$i) { + switch (strtoupper($arguments[$i])) { + case 'STORE': + case 'STOREDIST': + $arguments[$i] = "$prefix{$arguments[++$i]}"; + break; + } + } + } + + $command->setRawArguments($arguments); + } + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Processor/ProcessorChain.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Processor/ProcessorChain.php new file mode 100644 index 000000000..8ecfc4d90 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Processor/ProcessorChain.php @@ -0,0 +1,137 @@ +add($processor); + } + } + + /** + * {@inheritdoc} + */ + public function add(ProcessorInterface $processor) + { + $this->processors[] = $processor; + } + + /** + * {@inheritdoc} + */ + public function remove(ProcessorInterface $processor) + { + if (false !== $index = array_search($processor, $this->processors, true)) { + unset($this[$index]); + } + } + + /** + * {@inheritdoc} + */ + public function process(CommandInterface $command) + { + for ($i = 0; $i < $count = count($this->processors); ++$i) { + $this->processors[$i]->process($command); + } + } + + /** + * {@inheritdoc} + */ + public function getProcessors() + { + return $this->processors; + } + + /** + * Returns an iterator over the list of command processor in the chain. + * + * @return Traversable + */ + public function getIterator() + { + return new ArrayIterator($this->processors); + } + + /** + * Returns the number of command processors in the chain. + * + * @return int + */ + public function count() + { + return count($this->processors); + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function offsetExists($index) + { + return isset($this->processors[$index]); + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function offsetGet($index) + { + return $this->processors[$index]; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function offsetSet($index, $processor) + { + if (!$processor instanceof ProcessorInterface) { + throw new InvalidArgumentException( + 'Processor chain accepts only instances of `Predis\Command\Processor\ProcessorInterface`' + ); + } + + $this->processors[$index] = $processor; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function offsetUnset($index) + { + unset($this->processors[$index]); + $this->processors = array_values($this->processors); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Processor/ProcessorInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Processor/ProcessorInterface.php new file mode 100644 index 000000000..f915b9eb6 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Processor/ProcessorInterface.php @@ -0,0 +1,28 @@ +commandID = strtoupper($commandID); + $this->setArguments($arguments); + } + + /** + * Creates a new raw command using a variadic method. + * + * @param string $commandID Redis command ID + * @param string ...$args Arguments list for the command + * + * @return CommandInterface + */ + public static function create($commandID, ...$args) + { + $arguments = func_get_args(); + + return new static(array_shift($arguments), $arguments); + } + + /** + * {@inheritdoc} + */ + public function getId() + { + return $this->commandID; + } + + /** + * {@inheritdoc} + */ + public function setArguments(array $arguments) + { + $this->arguments = $arguments; + unset($this->slot); + } + + /** + * {@inheritdoc} + */ + public function setRawArguments(array $arguments) + { + $this->setArguments($arguments); + } + + /** + * {@inheritdoc} + */ + public function getArguments() + { + return $this->arguments; + } + + /** + * {@inheritdoc} + */ + public function getArgument($index) + { + if (isset($this->arguments[$index])) { + return $this->arguments[$index]; + } + } + + /** + * {@inheritdoc} + */ + public function setSlot($slot) + { + $this->slot = $slot; + } + + /** + * {@inheritdoc} + */ + public function getSlot() + { + return $this->slot ?? null; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return $data; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/RawFactory.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/RawFactory.php new file mode 100644 index 000000000..2c0637f22 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/RawFactory.php @@ -0,0 +1,43 @@ +setKeys($arguments, false); + } + + public function parseResponse($data) + { + $key = array_shift($data); + + if (null === $key) { + return [$key]; + } + + return array_combine([$key], [[$data[0] => $data[1]]]); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BGREWRITEAOF.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BGREWRITEAOF.php new file mode 100644 index 000000000..97d443d90 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/BGREWRITEAOF.php @@ -0,0 +1,37 @@ +getArguments(), CASE_UPPER); + + switch (strtoupper($args[0])) { + case 'LIST': + return $this->parseClientList($data); + case 'KILL': + case 'GETNAME': + case 'SETNAME': + default: + return $data; + } // @codeCoverageIgnore + } + + /** + * Parses the response to CLIENT LIST and returns a structured list. + * + * @param string $data Response buffer. + * + * @return array + */ + protected function parseClientList($data) + { + $clients = []; + + foreach (explode("\n", $data, -1) as $clientData) { + $client = []; + + foreach (explode(' ', $clientData) as $kv) { + @[$k, $v] = explode('=', $kv); + $client[$k] = $v; + } + + $clients[] = $client; + } + + return $clients; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/COMMAND.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/COMMAND.php new file mode 100644 index 000000000..a215f47ee --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/COMMAND.php @@ -0,0 +1,29 @@ +setDB($arguments); + $arguments = $this->getArguments(); + + $this->setReplace($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/AbstractContainer.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/AbstractContainer.php new file mode 100644 index 000000000..6ba86d0fa --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/AbstractContainer.php @@ -0,0 +1,42 @@ +client = $client; + } + + /** + * {@inheritDoc} + */ + public function __call($subcommandID, $arguments) + { + array_unshift($arguments, strtoupper($subcommandID)); + + return $this->client->executeCommand( + $this->client->createCommand($this->getContainerCommandId(), $arguments) + ); + } + + abstract public function getContainerCommandId(): string; +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/ContainerFactory.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/ContainerFactory.php new file mode 100644 index 000000000..c9a0665fb --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/ContainerFactory.php @@ -0,0 +1,54 @@ + FunctionContainer::class, + ]; + + /** + * Creates container command. + * + * @param ClientInterface $client + * @param string $containerCommandID + * @return ContainerInterface + */ + public static function create(ClientInterface $client, string $containerCommandID): ContainerInterface + { + $containerCommandID = strtoupper($containerCommandID); + + if (class_exists($containerClass = self::CONTAINER_NAMESPACE . '\\' . $containerCommandID)) { + return new $containerClass($client); + } + + if (array_key_exists($containerCommandID, self::$specialMappings)) { + $containerClass = self::$specialMappings[$containerCommandID]; + + return new $containerClass($client); + } + + throw new UnexpectedValueException('Given command is not supported.'); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/ContainerInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/ContainerInterface.php new file mode 100644 index 000000000..ce3989b55 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/Container/ContainerInterface.php @@ -0,0 +1,33 @@ +getArgument(0); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EVALSHA_RO.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EVALSHA_RO.php new file mode 100644 index 000000000..809a08757 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EVALSHA_RO.php @@ -0,0 +1,27 @@ +getArgument(0)); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EVAL_RO.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EVAL_RO.php new file mode 100644 index 000000000..cef8bd35e --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/EVAL_RO.php @@ -0,0 +1,34 @@ +setTimeout($arguments); + $arguments = $this->getArguments(); + + $this->setTo($arguments); + $this->filterArguments(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/FCALL.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/FCALL.php new file mode 100644 index 000000000..cc5639321 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/FCALL.php @@ -0,0 +1,33 @@ +strategyResolver = new SubcommandStrategyResolver(); + } + + public function getId() + { + return 'FUNCTION'; + } + + public function setArguments(array $arguments) + { + $strategy = $this->strategyResolver->resolve('functions', $arguments[0]); + $arguments = $strategy->processArguments($arguments); + + parent::setArguments($arguments); + $this->filterArguments(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEOADD.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEOADD.php new file mode 100644 index 000000000..56156b72b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEOADD.php @@ -0,0 +1,43 @@ +setSorting($arguments); + $arguments = $this->getArguments(); + + $this->setWithCoord($arguments); + $arguments = $this->getArguments(); + + $this->setWithDist($arguments); + $arguments = $this->getArguments(); + + $this->setWithHash($arguments); + $arguments = $this->getArguments(); + + $this->setCount($arguments, $arguments[5] ?? false); + $arguments = $this->getArguments(); + + $this->setFrom($arguments); + $arguments = $this->getArguments(); + + $this->setBy($arguments); + $this->filterArguments(); + } + + public function parseResponse($data) + { + $parsedData = []; + $itemKey = ''; + + foreach ($data as $item) { + if (!is_array($item)) { + $parsedData[] = $item; + continue; + } + + foreach ($item as $key => $itemRow) { + if ($key === 0) { + $itemKey = $itemRow; + continue; + } + + if (is_string($itemRow)) { + $parsedData[$itemKey]['dist'] = round((float) $itemRow, 5); + } elseif (is_int($itemRow)) { + $parsedData[$itemKey]['hash'] = $itemRow; + } else { + $parsedData[$itemKey]['lng'] = round($itemRow[0], 5); + $parsedData[$itemKey]['lat'] = round($itemRow[1], 5); + } + } + } + + return $parsedData; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEOSEARCHSTORE.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEOSEARCHSTORE.php new file mode 100644 index 000000000..6798db7ed --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GEOSEARCHSTORE.php @@ -0,0 +1,71 @@ +setStoreDist($arguments); + $arguments = $this->getArguments(); + + $this->setCount($arguments, $arguments[6] ?? false); + $arguments = $this->getArguments(); + + $this->setSorting($arguments); + $arguments = $this->getArguments(); + + $this->setFrom($arguments); + $arguments = $this->getArguments(); + + $this->setBy($arguments); + $this->filterArguments(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GET.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GET.php new file mode 100644 index 000000000..e9177ab28 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GET.php @@ -0,0 +1,29 @@ + 'EX', + 'px' => 'PX', + 'exat' => 'EXAT', + 'pxat' => 'PXAT', + 'persist' => 'PERSIST', + ]; + + public function getId() + { + return 'GETEX'; + } + + public function setArguments(array $arguments) + { + if (!array_key_exists(1, $arguments) || $arguments[1] === '') { + parent::setArguments([$arguments[0]]); + + return; + } + + if (!in_array(strtoupper($arguments[1]), self::$modifierEnum)) { + $enumValues = implode(', ', array_keys(self::$modifierEnum)); + throw new UnexpectedValueException("Modifier argument accepts only: {$enumValues} values"); + } + + if ($arguments[1] === 'persist') { + parent::setArguments([$arguments[0], self::$modifierEnum[$arguments[1]]]); + + return; + } + + $arguments[1] = self::$modifierEnum[$arguments[1]]; + + if (!array_key_exists(2, $arguments)) { + throw new UnexpectedValueException('You should provide value for current modifier'); + } + + parent::setArguments($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GETRANGE.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GETRANGE.php new file mode 100644 index 000000000..c6feb408b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/GETRANGE.php @@ -0,0 +1,29 @@ + $v) { + $flattenedKVs[] = $k; + $flattenedKVs[] = $v; + } + + $arguments = $flattenedKVs; + } + + parent::setArguments($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HRANDFIELD.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HRANDFIELD.php new file mode 100644 index 000000000..0d0fb75db --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HRANDFIELD.php @@ -0,0 +1,34 @@ +prepareOptions(array_pop($arguments)); + $arguments = array_merge($arguments, $options); + } + + parent::setArguments($arguments); + } + + /** + * Returns a list of options and modifiers compatible with Redis. + * + * @param array $options List of options. + * + * @return array + */ + protected function prepareOptions($options) + { + $options = array_change_key_case($options, CASE_UPPER); + $normalized = []; + + if (!empty($options['MATCH'])) { + $normalized[] = 'MATCH'; + $normalized[] = $options['MATCH']; + } + + if (!empty($options['COUNT'])) { + $normalized[] = 'COUNT'; + $normalized[] = $options['COUNT']; + } + + return $normalized; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + if (is_array($data)) { + $fields = $data[1]; + $result = []; + + for ($i = 0; $i < count($fields); ++$i) { + $result[$fields[$i]] = $fields[++$i]; + } + + $data[1] = $result; + } + + return $data; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HSET.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HSET.php new file mode 100644 index 000000000..662094a3c --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/HSET.php @@ -0,0 +1,29 @@ +parseNewResponseFormat($lines); + } else { + return $this->parseOldResponseFormat($lines); + } + } + + /** + * {@inheritdoc} + */ + public function parseNewResponseFormat($lines) + { + $info = []; + $current = null; + + foreach ($lines as $row) { + if ($row === '') { + continue; + } + + if (preg_match('/^# (\w+)$/', $row, $matches)) { + $info[$matches[1]] = []; + $current = &$info[$matches[1]]; + continue; + } + + [$k, $v] = $this->parseRow($row); + $current[$k] = $v; + } + + return $info; + } + + /** + * {@inheritdoc} + */ + public function parseOldResponseFormat($lines) + { + $info = []; + + foreach ($lines as $row) { + if (strpos($row, ':') === false) { + continue; + } + + [$k, $v] = $this->parseRow($row); + $info[$k] = $v; + } + + return $info; + } + + /** + * Parses a single row of the response and returns the key-value pair. + * + * @param string $row Single row of the response. + * + * @return array + */ + protected function parseRow($row) + { + [$k, $v] = explode(':', $row, 2); + + if (preg_match('/^db\d+$/', $k)) { + $v = $this->parseDatabaseStats($v); + } + + return [$k, $v]; + } + + /** + * Extracts the statistics of each logical DB from the string buffer. + * + * @param string $str Response buffer. + * + * @return array + */ + protected function parseDatabaseStats($str) + { + $db = []; + + foreach (explode(',', $str) as $dbvar) { + [$dbvk, $dbvv] = explode('=', $dbvar); + $db[trim($dbvk)] = $dbvv; + } + + return $db; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/KEYS.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/KEYS.php new file mode 100644 index 000000000..fadb8d7dd --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/KEYS.php @@ -0,0 +1,29 @@ +filterArguments(); + } + + public function parseResponse($data) + { + if (is_array($data)) { + return [$data[0] => $data[1], $data[2] => $data[3]]; + } + + return $data; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LINDEX.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LINDEX.php new file mode 100644 index 000000000..80510e1e4 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LINDEX.php @@ -0,0 +1,29 @@ +setCount($arguments); + $arguments = $this->getArguments(); + + $this->setLeftRight($arguments); + $arguments = $this->getArguments(); + + $this->setKeys($arguments); + $this->filterArguments(); + } + + public function parseResponse($data) + { + if (null === $data) { + return null; + } + + return [$data[0] => $data[1]]; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LPOP.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LPOP.php new file mode 100644 index 000000000..d375bacaf --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/LPOP.php @@ -0,0 +1,29 @@ + $value) { + $modifier = strtoupper($modifier); + + if ($modifier === 'COPY' && $value == true) { + $arguments[] = $modifier; + } + + if ($modifier === 'REPLACE' && $value == true) { + $arguments[] = $modifier; + } + } + } + + parent::setArguments($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MONITOR.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MONITOR.php new file mode 100644 index 000000000..06e9e59b6 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MONITOR.php @@ -0,0 +1,29 @@ + $v) { + $flattenedKVs[] = $k; + $flattenedKVs[] = $v; + } + + $arguments = $flattenedKVs; + } + + parent::setArguments($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MSETNX.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MSETNX.php new file mode 100644 index 000000000..94d9ce269 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/MSETNX.php @@ -0,0 +1,27 @@ +getArgument(0))) { + case 'numsub': + return self::processNumsub($data); + + default: + return $data; + } + } + + /** + * Returns the processed response to PUBSUB NUMSUB. + * + * @param array $channels List of channels + * + * @return array + */ + protected static function processNumsub(array $channels) + { + $processed = []; + $count = count($channels); + + for ($i = 0; $i < $count; ++$i) { + $processed[$channels[$i]] = $channels[++$i]; + } + + return $processed; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PUNSUBSCRIBE.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PUNSUBSCRIBE.php new file mode 100644 index 000000000..f15a39fbb --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/PUNSUBSCRIBE.php @@ -0,0 +1,39 @@ +prepareOptions(array_pop($arguments)); + $arguments = array_merge($arguments, $options); + } + + parent::setArguments($arguments); + } + + /** + * Returns a list of options and modifiers compatible with Redis. + * + * @param array $options List of options. + * + * @return array + */ + protected function prepareOptions($options) + { + $options = array_change_key_case($options, CASE_UPPER); + $normalized = []; + + if (!empty($options['MATCH'])) { + $normalized[] = 'MATCH'; + $normalized[] = $options['MATCH']; + } + + if (!empty($options['COUNT'])) { + $normalized[] = 'COUNT'; + $normalized[] = $options['COUNT']; + } + + return $normalized; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SCARD.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SCARD.php new file mode 100644 index 000000000..daf1393da --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SCARD.php @@ -0,0 +1,29 @@ +getArgument(0); + $argument = is_null($argument) ? null : strtolower($argument); + + switch ($argument) { + case 'masters': + case 'slaves': + return self::processMastersOrSlaves($data); + + default: + return $data; + } + } + + /** + * Returns a processed response to SENTINEL MASTERS or SENTINEL SLAVES. + * + * @param array $servers List of Redis servers. + * + * @return array + */ + protected static function processMastersOrSlaves(array $servers) + { + foreach ($servers as $idx => $node) { + $processed = []; + $count = count($node); + + for ($i = 0; $i < $count; ++$i) { + $processed[$node[$i]] = $node[++$i]; + } + + $servers[$idx] = $processed; + } + + return $servers; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SET.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SET.php new file mode 100644 index 000000000..f8956f40b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SET.php @@ -0,0 +1,29 @@ +setLimit($arguments); + $arguments = $this->getArguments(); + + $this->setKeys($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SINTERSTORE.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SINTERSTORE.php new file mode 100644 index 000000000..144335a1f --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SINTERSTORE.php @@ -0,0 +1,41 @@ + $entry) { + $log[$index] = [ + 'id' => $entry[0], + 'timestamp' => $entry[1], + 'duration' => $entry[2], + 'command' => $entry[3], + ]; + } + + return $log; + } + + return $data; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SMEMBERS.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SMEMBERS.php new file mode 100644 index 000000000..8f32be40e --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SMEMBERS.php @@ -0,0 +1,29 @@ +setSorting($arguments); + $arguments = $this->getArguments(); + + $this->setGetArgument($arguments); + $arguments = $this->getArguments(); + + $this->setLimit($arguments); + $arguments = $this->getArguments(); + + $this->setBy($arguments); + $this->filterArguments(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SPOP.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SPOP.php new file mode 100644 index 000000000..e09a3d55a --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/SPOP.php @@ -0,0 +1,29 @@ +prepareOptions(array_pop($arguments)); + $arguments = array_merge($arguments, $options); + } + + parent::setArguments($arguments); + } + + /** + * Returns a list of options and modifiers compatible with Redis. + * + * @param array $options List of options. + * + * @return array + */ + protected function prepareOptions($options) + { + $options = array_change_key_case($options, CASE_UPPER); + $normalized = []; + + if (!empty($options['MATCH'])) { + $normalized[] = 'MATCH'; + $normalized[] = $options['MATCH']; + } + + if (!empty($options['COUNT'])) { + $normalized[] = 'COUNT'; + $normalized[] = $options['COUNT']; + } + + return $normalized; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/STRLEN.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/STRLEN.php new file mode 100644 index 000000000..f51775662 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/STRLEN.php @@ -0,0 +1,29 @@ + $val) { + $args[] = $key; + $args[] = $val; + } + } + + parent::setArguments($args); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/XDEL.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/XDEL.php new file mode 100644 index 000000000..f1c509e35 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/XDEL.php @@ -0,0 +1,39 @@ + $score) { + $arguments[] = $score; + $arguments[] = $member; + } + } + + parent::setArguments($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZCARD.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZCARD.php new file mode 100644 index 000000000..7f6cfd4d0 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZCARD.php @@ -0,0 +1,29 @@ +setKeys($arguments); + $arguments = $this->getArguments(); + + $this->setWithScore($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZDIFFSTORE.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZDIFFSTORE.php new file mode 100644 index 000000000..729988372 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZDIFFSTORE.php @@ -0,0 +1,40 @@ +setLimit($arguments); + $arguments = $this->getArguments(); + + $this->setKeys($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZINTERSTORE.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZINTERSTORE.php new file mode 100644 index 000000000..7f0aa4498 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZINTERSTORE.php @@ -0,0 +1,27 @@ +setCount($arguments); + $arguments = $this->getArguments(); + + $this->resolveModifier(static::$modifierArgumentPositionOffset, $arguments); + + $this->setKeys($arguments); + $arguments = $this->getArguments(); + + parent::setArguments($arguments); + } + + public function parseResponse($data) + { + $key = array_shift($data); + + if (null === $key) { + return [$key]; + } + + $data = $data[0]; + $parsedData = []; + + for ($i = 0, $iMax = count($data); $i < $iMax; $i++) { + for ($j = 0, $jMax = count($data[$i]); $j < $jMax; ++$j) { + if ($data[$i][$j + 1] ?? false) { + $parsedData[$data[$i][$j]] = $data[$i][++$j]; + } + } + } + + return array_combine([$key], [$parsedData]); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZMSCORE.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZMSCORE.php new file mode 100644 index 000000000..2dd76fd65 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZMSCORE.php @@ -0,0 +1,34 @@ + true]; + $lastType = 'array'; + } + + if ($lastType === 'array') { + $options = $this->prepareOptions(array_pop($arguments)); + $arguments = array_merge($arguments, $options); + } + } + + parent::setArguments($arguments); + } + + /** + * Returns a list of options and modifiers compatible with Redis. + * + * @param array $options List of options. + * + * @return array + */ + protected function prepareOptions($options) + { + $opts = array_change_key_case($options, CASE_UPPER); + $finalizedOpts = []; + + if (!empty($opts['WITHSCORES'])) { + $finalizedOpts[] = 'WITHSCORES'; + } + + return $finalizedOpts; + } + + /** + * Checks for the presence of the WITHSCORES modifier. + * + * @return bool + */ + protected function withScores() + { + $arguments = $this->getArguments(); + + if (count($arguments) < 4) { + return false; + } + + return strtoupper($arguments[3]) === 'WITHSCORES'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + if ($this->withScores()) { + $result = []; + + for ($i = 0; $i < count($data); ++$i) { + $result[$data[$i]] = $data[++$i]; + } + + return $result; + } + + return $data; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANGEBYLEX.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANGEBYLEX.php new file mode 100644 index 000000000..18b4a6d30 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANGEBYLEX.php @@ -0,0 +1,54 @@ +getArguments(); + + for ($i = 3; $i < count($arguments); ++$i) { + switch (strtoupper($arguments[$i])) { + case 'WITHSCORES': + return true; + + case 'LIMIT': + $i += 2; + break; + } + } + + return false; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANGESTORE.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANGESTORE.php new file mode 100644 index 000000000..4f820b06c --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANGESTORE.php @@ -0,0 +1,57 @@ +setByLexByScoreArgument($arguments); + $arguments = $this->getArguments(); + + $this->setReversedArgument($arguments); + $arguments = $this->getArguments(); + + $this->setLimitArguments($arguments); + $this->filterArguments(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANK.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANK.php new file mode 100644 index 000000000..3c6ac2a6e --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZRANK.php @@ -0,0 +1,29 @@ +prepareOptions(array_pop($arguments)); + $arguments = array_merge($arguments, $options); + } + + parent::setArguments($arguments); + } + + /** + * Returns a list of options and modifiers compatible with Redis. + * + * @param array $options List of options. + * + * @return array + */ + protected function prepareOptions($options) + { + $options = array_change_key_case($options, CASE_UPPER); + $normalized = []; + + if (!empty($options['MATCH'])) { + $normalized[] = 'MATCH'; + $normalized[] = $options['MATCH']; + } + + if (!empty($options['COUNT'])) { + $normalized[] = 'COUNT'; + $normalized[] = $options['COUNT']; + } + + return $normalized; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + if (is_array($data)) { + $members = $data[1]; + $result = []; + + for ($i = 0; $i < count($members); ++$i) { + $result[$members[$i]] = (float) $members[++$i]; + } + + $data[1] = $result; + } + + return $data; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZSCORE.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZSCORE.php new file mode 100644 index 000000000..978a17292 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Redis/ZSCORE.php @@ -0,0 +1,29 @@ +setAggregate($arguments); + $arguments = $this->getArguments(); + + $this->setWeights($arguments); + $arguments = $this->getArguments(); + + $this->setKeys($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/RedisFactory.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/RedisFactory.php new file mode 100644 index 000000000..ed845f31d --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/RedisFactory.php @@ -0,0 +1,69 @@ +commands = [ + 'ECHO' => 'Predis\Command\Redis\ECHO_', + 'EVAL' => 'Predis\Command\Redis\EVAL_', + 'OBJECT' => 'Predis\Command\Redis\OBJECT_', + // Class name corresponds to PHP reserved word "function", added mapping to bypass restrictions + 'FUNCTION' => FUNCTIONS::class, + ]; + } + + /** + * {@inheritdoc} + */ + public function getCommandClass(string $commandID): ?string + { + $commandID = strtoupper($commandID); + + if (isset($this->commands[$commandID]) || array_key_exists($commandID, $this->commands)) { + $commandClass = $this->commands[$commandID]; + } elseif (class_exists($commandClass = "Predis\Command\Redis\\$commandID")) { + $this->commands[$commandID] = $commandClass; + } else { + return null; + } + + return $commandClass; + } + + /** + * {@inheritdoc} + */ + public function undefine(string $commandID): void + { + // NOTE: we explicitly associate `NULL` to the command ID in the map + // instead of the parent's `unset()` because our subclass tries to load + // a predefined class from the Predis\Command\Redis namespace when no + // explicit mapping is defined, see RedisFactory::getCommandClass() for + // details of the implementation of this mechanism. + $this->commands[strtoupper($commandID)] = null; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/ScriptCommand.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/ScriptCommand.php new file mode 100644 index 000000000..330ee94b3 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/ScriptCommand.php @@ -0,0 +1,108 @@ +getScript()); + } + + /** + * Specifies the number of arguments that should be considered as keys. + * + * The default behaviour for the base class is to return 0 to indicate that + * all the elements of the arguments array should be considered as keys, but + * subclasses can enforce a static number of keys. + * + * @return int + */ + protected function getKeysCount() + { + return 0; + } + + /** + * Returns the elements from the arguments that are identified as keys. + * + * @return array + */ + public function getKeys() + { + return array_slice($this->getArguments(), 2, $this->getKeysCount()); + } + + /** + * {@inheritdoc} + */ + public function setArguments(array $arguments) + { + if (($numkeys = $this->getKeysCount()) && $numkeys < 0) { + $numkeys = count($arguments) + $numkeys; + } + + $arguments = array_merge([$this->getScriptHash(), (int) $numkeys], $arguments); + + parent::setArguments($arguments); + } + + /** + * Returns arguments for EVAL command. + * + * @return array + */ + public function getEvalArguments() + { + $arguments = $this->getArguments(); + $arguments[0] = $this->getScript(); + + return $arguments; + } + + /** + * Returns the equivalent EVAL command as a raw command instance. + * + * @return RawCommand + */ + public function getEvalCommand() + { + return new RawCommand('EVAL', $this->getEvalArguments()); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Strategy/ContainerCommands/Functions/DeleteStrategy.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Strategy/ContainerCommands/Functions/DeleteStrategy.php new file mode 100644 index 000000000..250ae744e --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Strategy/ContainerCommands/Functions/DeleteStrategy.php @@ -0,0 +1,26 @@ + 'MIN', + 'max' => 'MAX', + 'sum' => 'SUM', + ]; + + /** + * @var string + */ + private static $aggregateModifier = 'AGGREGATE'; + + public function setArguments(array $arguments) + { + $argumentsLength = count($arguments); + + if (static::$aggregateArgumentPositionOffset >= $argumentsLength) { + parent::setArguments($arguments); + + return; + } + + $argument = $arguments[static::$aggregateArgumentPositionOffset]; + + if (is_string($argument) && in_array(strtoupper($argument), self::$aggregateValuesEnum)) { + $argument = self::$aggregateValuesEnum[$argument]; + } else { + $enumValues = implode(', ', array_keys(self::$aggregateValuesEnum)); + throw new UnexpectedValueException("Aggregate argument accepts only: {$enumValues} values"); + } + + $argumentsBefore = array_slice($arguments, 0, static::$aggregateArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$aggregateArgumentPositionOffset + 1); + + parent::setArguments(array_merge( + $argumentsBefore, + [self::$aggregateModifier], + [$argument], + $argumentsAfter + )); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/BitByte.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/BitByte.php new file mode 100644 index 000000000..b7ce689ce --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/BitByte.php @@ -0,0 +1,34 @@ + 'BIT', + 'byte' => 'BYTE', + ]; + + public function setArguments(array $arguments) + { + $value = array_pop($arguments); + + if (in_array(strtoupper($value), self::$argumentEnum, true)) { + $arguments[] = self::$argumentEnum[$value]; + } else { + $arguments[] = $value; + } + + parent::setArguments($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/ByArgument.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/ByArgument.php new file mode 100644 index 000000000..99bd1722f --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/ByArgument.php @@ -0,0 +1,40 @@ += $argumentsLength || null === $arguments[static::$byArgumentPositionOffset]) { + parent::setArguments($arguments); + + return; + } + + $argument = $arguments[static::$byArgumentPositionOffset]; + $argumentsBefore = array_slice($arguments, 0, static::$byArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$byArgumentPositionOffset + 1); + + parent::setArguments(array_merge($argumentsBefore, [$this->byModifier, $argument], $argumentsAfter)); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/ByLexByScore.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/ByLexByScore.php new file mode 100644 index 000000000..66c531584 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/ByLexByScore.php @@ -0,0 +1,49 @@ + 'BYLEX', + 'byscore' => 'BYSCORE', + ]; + + public function setArguments(array $arguments) + { + $argument = $arguments[static::$byLexByScoreArgumentPositionOffset]; + + if (false === $argument) { + parent::setArguments($arguments); + + return; + } + + if (is_string($argument) && in_array(strtoupper($argument), self::$argumentsEnum)) { + $argument = self::$argumentsEnum[$argument]; + } else { + throw new UnexpectedValueException('By argument accepts only "bylex" and "byscore" values'); + } + + $argumentsBefore = array_slice($arguments, 0, static::$byLexByScoreArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$byLexByScoreArgumentPositionOffset + 1); + + parent::setArguments(array_merge($argumentsBefore, [$argument], $argumentsAfter)); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/GeoBy.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/GeoBy.php new file mode 100644 index 000000000..c5ee2b7d1 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/By/GeoBy.php @@ -0,0 +1,49 @@ +getByArgumentPositionOffset($arguments); + + if (null === $argumentPositionOffset) { + throw new InvalidArgumentException('Invalid BY argument value given'); + } + + $byArgumentObject = $arguments[$argumentPositionOffset]; + $argumentsBefore = array_slice($arguments, 0, $argumentPositionOffset); + $argumentsAfter = array_slice($arguments, $argumentPositionOffset + 1); + + parent::setArguments(array_merge( + $argumentsBefore, + $byArgumentObject->toArray(), + $argumentsAfter + )); + } + + private function getByArgumentPositionOffset(array $arguments): ?int + { + foreach ($arguments as $i => $value) { + if ($value instanceof ByInterface) { + return $i; + } + } + + return null; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Count.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Count.php new file mode 100644 index 000000000..46ae489d6 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Count.php @@ -0,0 +1,71 @@ += $argumentsLength) { + parent::setArguments($arguments); + + return; + } + + if ($arguments[static::$countArgumentPositionOffset] === -1) { + array_splice($arguments, static::$countArgumentPositionOffset, 1, [false]); + parent::setArguments($arguments); + + return; + } + + if ($arguments[static::$countArgumentPositionOffset] < 1) { + throw new UnexpectedValueException('Wrong count argument value or position offset'); + } + + $countArgument = $arguments[static::$countArgumentPositionOffset]; + $argumentsBefore = array_slice($arguments, 0, static::$countArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$countArgumentPositionOffset + 2); + + if (!$any) { + $argumentsAfter = array_slice($arguments, static::$countArgumentPositionOffset + 1); + parent::setArguments(array_merge( + $argumentsBefore, + [$this->countModifier], + [$countArgument], + $argumentsAfter + )); + + return; + } + + parent::setArguments(array_merge( + $argumentsBefore, + [$this->countModifier], + [$countArgument], + [$this->anyModifier], + $argumentsAfter + )); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/DB.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/DB.php new file mode 100644 index 000000000..cf494f96a --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/DB.php @@ -0,0 +1,53 @@ += $argumentsLength) { + parent::setArguments($arguments); + + return; + } + + if (!is_numeric($arguments[static::$dbArgumentPositionOffset])) { + throw new UnexpectedValueException('DB argument should be a valid numeric value'); + } + + if ($arguments[static::$dbArgumentPositionOffset] < 0) { + array_splice($arguments, static::$dbArgumentPositionOffset, 1); + parent::setArguments($arguments); + + return; + } + + $argument = $arguments[static::$dbArgumentPositionOffset]; + $argumentsBefore = array_slice($arguments, 0, static::$dbArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$dbArgumentPositionOffset + 1); + + parent::setArguments(array_merge( + $argumentsBefore, + [$this->dbModifier], + [$argument], + $argumentsAfter + )); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Expire/ExpireOptions.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Expire/ExpireOptions.php new file mode 100644 index 000000000..85cff7a2a --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Expire/ExpireOptions.php @@ -0,0 +1,36 @@ + 'NX', + 'xx' => 'XX', + 'gt' => 'GT', + 'lt' => 'LT', + ]; + + public function setArguments(array $arguments) + { + $value = array_pop($arguments); + + if (in_array(strtoupper($value), self::$argumentEnum, true)) { + $arguments[] = self::$argumentEnum[strtolower($value)]; + } else { + $arguments[] = $value; + } + + parent::setArguments($arguments); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/From/GeoFrom.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/From/GeoFrom.php new file mode 100644 index 000000000..22688adba --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/From/GeoFrom.php @@ -0,0 +1,49 @@ +getFromArgumentPositionOffset($arguments); + + if (null === $argumentPositionOffset) { + throw new InvalidArgumentException('Invalid FROM argument value given'); + } + + $fromArgumentObject = $arguments[$argumentPositionOffset]; + $argumentsBefore = array_slice($arguments, 0, $argumentPositionOffset); + $argumentsAfter = array_slice($arguments, $argumentPositionOffset + 1); + + parent::setArguments(array_merge( + $argumentsBefore, + $fromArgumentObject->toArray(), + $argumentsAfter + )); + } + + private function getFromArgumentPositionOffset(array $arguments): ?int + { + foreach ($arguments as $i => $value) { + if ($value instanceof FromInterface) { + return $i; + } + } + + return null; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Get/Get.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Get/Get.php new file mode 100644 index 000000000..256676e9e --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Get/Get.php @@ -0,0 +1,47 @@ += $argumentsLength) { + parent::setArguments($arguments); + + return; + } + + if (!is_array($arguments[static::$getArgumentPositionOffset])) { + throw new UnexpectedValueException('Wrong get argument type'); + } + + $patterns = []; + + foreach ($arguments[static::$getArgumentPositionOffset] as $pattern) { + $patterns[] = self::$getModifier; + $patterns[] = $pattern; + } + + $argumentsBeforeKeys = array_slice($arguments, 0, static::$getArgumentPositionOffset); + $argumentsAfterKeys = array_slice($arguments, static::$getArgumentPositionOffset + 1); + + parent::setArguments(array_merge($argumentsBeforeKeys, $patterns, $argumentsAfterKeys)); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Keys.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Keys.php new file mode 100644 index 000000000..a623e9cab --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Keys.php @@ -0,0 +1,47 @@ + $argumentsLength || + !is_array($arguments[static::$keysArgumentPositionOffset]) + ) { + throw new UnexpectedValueException('Wrong keys argument type or position offset'); + } + + $keysArgument = $arguments[static::$keysArgumentPositionOffset]; + $argumentsBeforeKeys = array_slice($arguments, 0, static::$keysArgumentPositionOffset); + $argumentsAfterKeys = array_slice($arguments, static::$keysArgumentPositionOffset + 1); + + if ($withNumkeys) { + $numkeys = count($keysArgument); + parent::setArguments(array_merge($argumentsBeforeKeys, [$numkeys], $keysArgument, $argumentsAfterKeys)); + + return; + } + + parent::setArguments(array_merge($argumentsBeforeKeys, $keysArgument, $argumentsAfterKeys)); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/LeftRight.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/LeftRight.php new file mode 100644 index 000000000..181fbd143 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/LeftRight.php @@ -0,0 +1,60 @@ + 'LEFT', + 'right' => 'RIGHT', + ]; + + public function setArguments(array $arguments) + { + $argumentsLength = count($arguments); + + if (static::$leftRightArgumentPositionOffset >= $argumentsLength) { + $arguments[] = 'LEFT'; + parent::setArguments($arguments); + + return; + } + + $argument = $arguments[static::$leftRightArgumentPositionOffset]; + + if (is_string($argument) && in_array(strtoupper($argument), self::$leftRightEnum, true)) { + $argument = self::$leftRightEnum[$argument]; + } else { + $enumValues = implode(', ', array_keys(self::$leftRightEnum)); + throw new UnexpectedValueException("Left/Right argument accepts only: {$enumValues} values"); + } + + $argumentsBefore = array_slice($arguments, 0, static::$leftRightArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$leftRightArgumentPositionOffset + 1); + + parent::setArguments(array_merge( + $argumentsBefore, + [$argument], + $argumentsAfter + )); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Limit/Limit.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Limit/Limit.php new file mode 100644 index 000000000..e24499472 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Limit/Limit.php @@ -0,0 +1,54 @@ += $argumentsLength + || false === $arguments[static::$limitArgumentPositionOffset] + ) { + parent::setArguments($argumentsBefore); + + return; + } + + $argument = $arguments[static::$limitArgumentPositionOffset]; + $argumentsAfter = array_slice($arguments, static::$limitArgumentPositionOffset + 1); + + if (true === $argument) { + parent::setArguments(array_merge($argumentsBefore, [self::$limitModifier], $argumentsAfter)); + + return; + } + + if (!is_int($argument)) { + throw new UnexpectedValueException('Wrong limit argument type'); + } + + parent::setArguments(array_merge($argumentsBefore, [self::$limitModifier], [$argument], $argumentsAfter)); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Limit/LimitObject.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Limit/LimitObject.php new file mode 100644 index 000000000..3e47de9ab --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Limit/LimitObject.php @@ -0,0 +1,50 @@ +getLimitArgumentPositionOffset($arguments); + + if (null === $argumentPositionOffset) { + parent::setArguments($arguments); + + return; + } + + $limitObject = $arguments[$argumentPositionOffset]; + $argumentsBefore = array_slice($arguments, 0, $argumentPositionOffset); + $argumentsAfter = array_slice($arguments, $argumentPositionOffset + 1); + + parent::setArguments(array_merge( + $argumentsBefore, + $limitObject->toArray(), + $argumentsAfter + )); + } + + private function getLimitArgumentPositionOffset(array $arguments): ?int + { + foreach ($arguments as $i => $value) { + if ($value instanceof LimitInterface) { + return $i; + } + } + + return null; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/MinMaxModifier.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/MinMaxModifier.php new file mode 100644 index 000000000..f48f4c1e8 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/MinMaxModifier.php @@ -0,0 +1,45 @@ + 'MIN', + 'max' => 'MAX', + ]; + + public function resolveModifier(int $offset, array &$arguments): void + { + if ($offset >= count($arguments)) { + $arguments[$offset] = $this->modifierEnum['min']; + + return; + } + + if (!is_string($arguments[$offset]) || !array_key_exists($arguments[$offset], $this->modifierEnum)) { + throw new UnexpectedValueException('Wrong type of modifier given'); + } + + $arguments[$offset] = $this->modifierEnum[$arguments[$offset]]; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Replace.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Replace.php new file mode 100644 index 000000000..d193d66d3 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Replace.php @@ -0,0 +1,34 @@ + 'ASC', + 'desc' => 'DESC', + ]; + + public function setArguments(array $arguments) + { + $argumentsLength = count($arguments); + + if (static::$sortArgumentPositionOffset >= $argumentsLength) { + parent::setArguments($arguments); + + return; + } + + $argument = $arguments[static::$sortArgumentPositionOffset]; + + if (null === $argument) { + array_splice($arguments, static::$sortArgumentPositionOffset, 1, [false]); + parent::setArguments($arguments); + + return; + } + + if (!in_array(strtoupper($argument), self::$sortingEnum, true)) { + $enumValues = implode(', ', array_keys(self::$sortingEnum)); + throw new UnexpectedValueException("Sorting argument accepts only: {$enumValues} values"); + } + + $argumentsBefore = array_slice($arguments, 0, static::$sortArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$sortArgumentPositionOffset + 1); + + parent::setArguments(array_merge( + $argumentsBefore, + [self::$sortingEnum[$argument]], + $argumentsAfter + )); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Storedist.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Storedist.php new file mode 100644 index 000000000..6feed1e8c --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Storedist.php @@ -0,0 +1,49 @@ += $argumentsLength + || false === $arguments[static::$storeDistArgumentPositionOffset] + ) { + parent::setArguments($arguments); + + return; + } + + $argument = $arguments[static::$storeDistArgumentPositionOffset]; + + if (true === $argument) { + $argument = 'STOREDIST'; + } else { + throw new UnexpectedValueException('Wrong STOREDIST argument type'); + } + + $argumentsBefore = array_slice($arguments, 0, static::$storeDistArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$storeDistArgumentPositionOffset + 1); + + parent::setArguments(array_merge($argumentsBefore, [$argument], $argumentsAfter)); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Timeout.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Timeout.php new file mode 100644 index 000000000..fd33ea9cf --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Timeout.php @@ -0,0 +1,53 @@ += $argumentsLength) { + parent::setArguments($arguments); + + return; + } + + if ($arguments[static::$timeoutArgumentPositionOffset] === -1) { + array_splice($arguments, static::$timeoutArgumentPositionOffset, 1, [false]); + parent::setArguments($arguments); + + return; + } + + if ($arguments[static::$timeoutArgumentPositionOffset] < 1) { + throw new UnexpectedValueException('Wrong timeout argument value or position offset'); + } + + $argument = $arguments[static::$timeoutArgumentPositionOffset]; + $argumentsBefore = array_slice($arguments, 0, static::$timeoutArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$timeoutArgumentPositionOffset + 1); + + parent::setArguments(array_merge( + $argumentsBefore, + [self::$timeoutModifier], + [$argument], + $argumentsAfter + )); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/To/ServerTo.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/To/ServerTo.php new file mode 100644 index 000000000..1ab13eca9 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/To/ServerTo.php @@ -0,0 +1,48 @@ += $argumentsLength) { + parent::setArguments($arguments); + + return; + } + + /** @var To|null $toArgument */ + $toArgument = $arguments[static::$toArgumentPositionOffset]; + + if (null === $toArgument) { + array_splice($arguments, static::$toArgumentPositionOffset, 1, [false]); + parent::setArguments($arguments); + + return; + } + + $argumentsBefore = array_slice($arguments, 0, static::$toArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$toArgumentPositionOffset + 1); + + parent::setArguments(array_merge( + $argumentsBefore, + $toArgument->toArray(), + $argumentsAfter + )); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Weights.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Weights.php new file mode 100644 index 000000000..1f175ed8b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/Weights.php @@ -0,0 +1,61 @@ += $argumentsLength) { + parent::setArguments($arguments); + + return; + } + + if (!is_array($arguments[static::$weightsArgumentPositionOffset])) { + throw new UnexpectedValueException('Wrong weights argument type'); + } + + $weightsArray = $arguments[static::$weightsArgumentPositionOffset]; + + if (empty($weightsArray)) { + unset($arguments[static::$weightsArgumentPositionOffset]); + parent::setArguments($arguments); + + return; + } + + $argumentsBefore = array_slice($arguments, 0, static::$weightsArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$weightsArgumentPositionOffset + 1); + + parent::setArguments(array_merge( + $argumentsBefore, + [self::$weightsModifier], + $weightsArray, + $argumentsAfter + )); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithCoord.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithCoord.php new file mode 100644 index 000000000..797ae2e52 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithCoord.php @@ -0,0 +1,49 @@ += $argumentsLength + || false === $arguments[static::$withCoordArgumentPositionOffset] + ) { + parent::setArguments($arguments); + + return; + } + + $argument = $arguments[static::$withCoordArgumentPositionOffset]; + + if (true === $argument) { + $argument = 'WITHCOORD'; + } else { + throw new UnexpectedValueException('Wrong WITHCOORD argument type'); + } + + $argumentsBefore = array_slice($arguments, 0, static::$withCoordArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$withCoordArgumentPositionOffset + 1); + + parent::setArguments(array_merge($argumentsBefore, [$argument], $argumentsAfter)); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithDist.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithDist.php new file mode 100644 index 000000000..479606dca --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithDist.php @@ -0,0 +1,45 @@ += $argumentsLength + || false === $arguments[static::$withDistArgumentPositionOffset] + ) { + parent::setArguments($arguments); + + return; + } + + $argument = $arguments[static::$withDistArgumentPositionOffset]; + + if (true === $argument) { + $argument = 'WITHDIST'; + } else { + throw new UnexpectedValueException('Wrong WITHDIST argument type'); + } + + $argumentsBefore = array_slice($arguments, 0, static::$withDistArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$withDistArgumentPositionOffset + 1); + + parent::setArguments(array_merge($argumentsBefore, [$argument], $argumentsAfter)); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithHash.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithHash.php new file mode 100644 index 000000000..c00f680b2 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithHash.php @@ -0,0 +1,45 @@ += $argumentsLength + || false === $arguments[static::$withHashArgumentPositionOffset] + ) { + parent::setArguments($arguments); + + return; + } + + $argument = $arguments[static::$withHashArgumentPositionOffset]; + + if (true === $argument) { + $argument = 'WITHHASH'; + } else { + throw new UnexpectedValueException('Wrong WITHHASH argument type'); + } + + $argumentsBefore = array_slice($arguments, 0, static::$withHashArgumentPositionOffset); + $argumentsAfter = array_slice($arguments, static::$withHashArgumentPositionOffset + 1); + + parent::setArguments(array_merge($argumentsBefore, [$argument], $argumentsAfter)); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithScores.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithScores.php new file mode 100644 index 000000000..e98b4ea23 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithScores.php @@ -0,0 +1,66 @@ +isWithScoreModifier()) { + $result = []; + + for ($i = 0, $iMax = count($data); $i < $iMax; ++$i) { + if ($data[$i + 1] ?? false) { + $result[$data[$i]] = $data[++$i]; + } + } + + return $result; + } + + return $data; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithValues.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithValues.php new file mode 100644 index 000000000..4efb06584 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Command/Traits/With/WithValues.php @@ -0,0 +1,34 @@ +connection = $connection; + } + + /** + * Gets the connection that generated the exception. + * + * @return NodeConnectionInterface + */ + public function getConnection() + { + return $this->connection; + } + + /** + * Indicates if the receiver should reset the underlying connection. + * + * @return bool + */ + public function shouldResetConnection() + { + return true; + } + + /** + * Helper method to handle exceptions generated by a connection object. + * + * @param CommunicationException $exception Exception. + * + * @throws CommunicationException + */ + public static function handle(CommunicationException $exception) + { + if ($exception->shouldResetConnection()) { + $connection = $exception->getConnection(); + + if ($connection->isConnected()) { + $connection->disconnect(); + } + } + + throw $exception; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Aggregate.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Aggregate.php new file mode 100644 index 000000000..262f8d64d --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Aggregate.php @@ -0,0 +1,114 @@ +getConnectionInitializer($options, $value); + } + + /** + * Wraps a user-supplied callable used to create a new aggregate connection. + * + * When the original callable acting as a connection initializer is executed + * by the client to create a new aggregate connection, it will receive the + * following arguments: + * + * - $parameters (same as passed to Predis\Client::__construct()) + * - $options (options container, Predis\Configuration\OptionsInterface) + * - $option (current option, Predis\Configuration\OptionInterface) + * + * The original callable must return a valid aggregation connection instance + * of type Predis\Connection\AggregateConnectionInterface, this is enforced + * by the wrapper returned by this method and an exception is thrown when + * invalid values are returned. + * + * @param OptionsInterface $options Client options + * @param callable $callable Callable initializer + * + * @return callable + * @throws InvalidArgumentException + */ + protected function getConnectionInitializer(OptionsInterface $options, callable $callable) + { + return function ($parameters = null, $autoaggregate = false) use ($callable, $options) { + $connection = call_user_func_array($callable, [&$parameters, $options, $this]); + + if (!$connection instanceof AggregateConnectionInterface) { + throw new InvalidArgumentException(sprintf( + '%s expects the supplied callable to return an instance of %s, but %s was returned', + static::class, + AggregateConnectionInterface::class, + is_object($connection) ? get_class($connection) : gettype($connection) + )); + } + + if ($parameters && $autoaggregate) { + static::aggregate($options, $connection, $parameters); + } + + return $connection; + }; + } + + /** + * Adds single connections to an aggregate connection instance. + * + * @param OptionsInterface $options Client options + * @param AggregateConnectionInterface $connection Target aggregate connection + * @param array $nodes List of nodes to be added to the target aggregate connection + */ + public static function aggregate(OptionsInterface $options, AggregateConnectionInterface $connection, array $nodes) + { + $connections = $options->connections; + + foreach ($nodes as $node) { + $connection->add($node instanceof NodeConnectionInterface ? $node : $connections->create($node)); + } + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + return; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/CRC16.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/CRC16.php new file mode 100644 index 000000000..b17144922 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/CRC16.php @@ -0,0 +1,74 @@ +getHashGeneratorByDescription($options, $value); + } elseif ($value instanceof Hash\HashGeneratorInterface) { + return $value; + } else { + $class = get_class($this); + throw new InvalidArgumentException("$class expects a valid hash generator"); + } + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + return function_exists('phpiredis_utils_crc16') + ? new Hash\PhpiredisCRC16() + : new Hash\CRC16(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Cluster.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Cluster.php new file mode 100644 index 000000000..34b33de47 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Cluster.php @@ -0,0 +1,99 @@ +getConnectionInitializerByString($options, $value); + } + + if (is_callable($value)) { + return $this->getConnectionInitializer($options, $value); + } else { + throw new InvalidArgumentException(sprintf( + '%s expects either a string or a callable value, %s given', + static::class, + is_object($value) ? get_class($value) : gettype($value) + )); + } + } + + /** + * Returns a connection initializer from a descriptive name. + * + * @param OptionsInterface $options Client options + * @param string $description Identifier of a replication backend (`predis`, `sentinel`) + * + * @return callable + */ + protected function getConnectionInitializerByString(OptionsInterface $options, string $description) + { + switch ($description) { + case 'redis': + case 'redis-cluster': + return function ($parameters, $options, $option) { + return new RedisCluster($options->connections, new RedisStrategy($options->crc16)); + }; + + case 'predis': + return $this->getDefaultConnectionInitializer(); + + default: + throw new InvalidArgumentException(sprintf( + '%s expects either `predis`, `redis` or `redis-cluster` as valid string values, `%s` given', + static::class, + $description + )); + } + } + + /** + * Returns the default connection initializer. + * + * @return callable + */ + protected function getDefaultConnectionInitializer() + { + return function ($parameters, $options, $option) { + return new PredisCluster(); + }; + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + return $this->getConnectionInitializer( + $options, + $this->getDefaultConnectionInitializer() + ); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Commands.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Commands.php new file mode 100644 index 000000000..2fbe00e74 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Commands.php @@ -0,0 +1,146 @@ +createFactoryByArray($options, $value); + } elseif (is_string($value)) { + return $this->createFactoryByString($options, $value); + } else { + throw new InvalidArgumentException(sprintf( + '%s expects a valid command factory', + static::class + )); + } + } + + /** + * Creates a new default command factory from a named array. + * + * The factory instance is configured according to the supplied named array + * mapping command IDs (passed as keys) to the FCQN of classes implementing + * Predis\Command\CommandInterface. + * + * @param OptionsInterface $options Client options container + * @param array $value Named array mapping command IDs to classes + * + * @return FactoryInterface + */ + protected function createFactoryByArray(OptionsInterface $options, array $value) + { + /** + * @var FactoryInterface + */ + $commands = $this->getDefault($options); + + foreach ($value as $commandID => $commandClass) { + if ($commandClass === null) { + $commands->undefine($commandID); + } else { + $commands->define($commandID, $commandClass); + } + } + + return $commands; + } + + /** + * Creates a new command factory from a descriptive string. + * + * The factory instance is configured according to the supplied descriptive + * string that identifies specific configurations of schemes and connection + * classes. Supported configuration values are: + * + * - "predis" returns the default command factory used by Predis + * - "raw" returns a command factory that creates only raw commands + * - "default" is simply an alias of "predis" + * + * @param OptionsInterface $options Client options container + * @param string $value Descriptive string identifying the desired configuration + * + * @return FactoryInterface + */ + protected function createFactoryByString(OptionsInterface $options, string $value) + { + switch (strtolower($value)) { + case 'default': + case 'predis': + return $this->getDefault($options); + + case 'raw': + return $this->createRawFactory($options); + + default: + throw new InvalidArgumentException(sprintf( + '%s does not recognize `%s` as a supported configuration string', + static::class, + $value + )); + } + } + + /** + * Creates a new raw command factory instance. + * + * @param OptionsInterface $options Client options container + */ + protected function createRawFactory(OptionsInterface $options): FactoryInterface + { + $commands = new RawFactory(); + + if (isset($options->prefix)) { + throw new InvalidArgumentException(sprintf( + '%s does not support key prefixing', RawFactory::class + )); + } + + return $commands; + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + $commands = new RedisFactory(); + + if (isset($options->prefix)) { + $commands->setProcessor($options->prefix); + } + + return $commands; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Connections.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Connections.php new file mode 100644 index 000000000..fdc665693 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Connections.php @@ -0,0 +1,144 @@ +createFactoryByArray($options, $value); + } elseif (is_string($value)) { + return $this->createFactoryByString($options, $value); + } else { + throw new InvalidArgumentException(sprintf( + '%s expects a valid connection factory', static::class + )); + } + } + + /** + * Creates a new connection factory from a named array. + * + * The factory instance is configured according to the supplied named array + * mapping URI schemes (passed as keys) to the FCQN of classes implementing + * Predis\Connection\NodeConnectionInterface, or callable objects acting as + * lazy initalizers and returning new instances of classes implementing + * Predis\Connection\NodeConnectionInterface. + * + * @param OptionsInterface $options Client options + * @param array $value Named array mapping URI schemes to classes or callables + * + * @return FactoryInterface + */ + protected function createFactoryByArray(OptionsInterface $options, array $value) + { + /** + * @var FactoryInterface + */ + $factory = $this->getDefault($options); + + foreach ($value as $scheme => $initializer) { + $factory->define($scheme, $initializer); + } + + return $factory; + } + + /** + * Creates a new connection factory from a descriptive string. + * + * The factory instance is configured according to the supplied descriptive + * string that identifies specific configurations of schemes and connection + * classes. Supported configuration values are: + * + * - "phpiredis-stream" maps tcp, redis, unix to PhpiredisStreamConnection + * - "phpiredis-socket" maps tcp, redis, unix to PhpiredisSocketConnection + * - "phpiredis" is an alias of "phpiredis-stream" + * + * @param OptionsInterface $options Client options + * @param string $value Descriptive string identifying the desired configuration + * + * @return FactoryInterface + */ + protected function createFactoryByString(OptionsInterface $options, string $value) + { + /** + * @var FactoryInterface + */ + $factory = $this->getDefault($options); + + switch (strtolower($value)) { + case 'phpiredis': + case 'phpiredis-stream': + $factory->define('tcp', PhpiredisStreamConnection::class); + $factory->define('redis', PhpiredisStreamConnection::class); + $factory->define('unix', PhpiredisStreamConnection::class); + break; + + case 'phpiredis-socket': + $factory->define('tcp', PhpiredisSocketConnection::class); + $factory->define('redis', PhpiredisSocketConnection::class); + $factory->define('unix', PhpiredisSocketConnection::class); + break; + + case 'default': + return $factory; + + default: + throw new InvalidArgumentException(sprintf( + '%s does not recognize `%s` as a supported configuration string', static::class, $value + )); + } + + return $factory; + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + $factory = new Factory(); + + if ($options->defined('parameters')) { + $factory->setDefaultParameters($options->parameters); + } + + return $factory; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Exceptions.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Exceptions.php new file mode 100644 index 000000000..6834272f0 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/Option/Exceptions.php @@ -0,0 +1,39 @@ +getConnectionInitializerByString($options, $value); + } + + if (is_callable($value)) { + return $this->getConnectionInitializer($options, $value); + } else { + throw new InvalidArgumentException(sprintf( + '%s expects either a string or a callable value, %s given', + static::class, + is_object($value) ? get_class($value) : gettype($value) + )); + } + } + + /** + * Returns a connection initializer (callable) from a descriptive string. + * + * Each connection initializer is specialized for the specified replication + * backend so that all the necessary steps for the configuration of the new + * aggregate connection are performed inside the initializer and the client + * receives a ready-to-use connection. + * + * Supported configuration values are: + * + * - `predis` for unmanaged replication setups + * - `redis-sentinel` for replication setups managed by redis-sentinel + * - `sentinel` is an alias of `redis-sentinel` + * + * @param OptionsInterface $options Client options + * @param string $description Identifier of a replication backend + * + * @return callable + */ + protected function getConnectionInitializerByString(OptionsInterface $options, string $description) + { + switch ($description) { + case 'sentinel': + case 'redis-sentinel': + return function ($parameters, $options) { + return new SentinelReplication($options->service, $parameters, $options->connections); + }; + + case 'predis': + return $this->getDefaultConnectionInitializer(); + + default: + throw new InvalidArgumentException(sprintf( + '%s expects either `predis`, `sentinel` or `redis-sentinel` as valid string values, `%s` given', + static::class, + $description + )); + } + } + + /** + * Returns the default connection initializer. + * + * @return callable + */ + protected function getDefaultConnectionInitializer() + { + return function ($parameters, $options) { + $connection = new MasterSlaveReplication(); + + if ($options->autodiscovery) { + $connection->setConnectionFactory($options->connections); + $connection->setAutoDiscovery(true); + } + + return $connection; + }; + } + + /** + * {@inheritdoc} + */ + public static function aggregate(OptionsInterface $options, AggregateConnectionInterface $connection, array $nodes) + { + if (!$connection instanceof SentinelReplication) { + parent::aggregate($options, $connection, $nodes); + } + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + return $this->getConnectionInitializer( + $options, + $this->getDefaultConnectionInitializer() + ); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/OptionInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/OptionInterface.php new file mode 100644 index 000000000..538fc0ba7 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/OptionInterface.php @@ -0,0 +1,39 @@ + Option\Aggregate::class, + 'cluster' => Option\Cluster::class, + 'replication' => Option\Replication::class, + 'connections' => Option\Connections::class, + 'commands' => Option\Commands::class, + 'exceptions' => Option\Exceptions::class, + 'prefix' => Option\Prefix::class, + 'crc16' => Option\CRC16::class, + ]; + + /** @var array */ + protected $options = []; + + /** @var array */ + protected $input; + + /** + * @param array $options Named array of client options + */ + public function __construct(array $options = null) + { + $this->input = $options ?? []; + } + + /** + * {@inheritdoc} + */ + public function getDefault($option) + { + if (isset($this->handlers[$option])) { + $handler = $this->handlers[$option]; + $handler = new $handler(); + + return $handler->getDefault($this); + } + } + + /** + * {@inheritdoc} + */ + public function defined($option) + { + return + array_key_exists($option, $this->options) || + array_key_exists($option, $this->input) + ; + } + + /** + * {@inheritdoc} + */ + public function __isset($option) + { + return ( + array_key_exists($option, $this->options) || + array_key_exists($option, $this->input) + ) && $this->__get($option) !== null; + } + + /** + * {@inheritdoc} + */ + public function __get($option) + { + if (isset($this->options[$option]) || array_key_exists($option, $this->options)) { + return $this->options[$option]; + } + + if (isset($this->input[$option]) || array_key_exists($option, $this->input)) { + $value = $this->input[$option]; + unset($this->input[$option]); + + if (isset($this->handlers[$option])) { + $handler = $this->handlers[$option]; + $handler = new $handler(); + $value = $handler->filter($this, $value); + } elseif (is_object($value) && method_exists($value, '__invoke')) { + $value = $value($this); + } + + return $this->options[$option] = $value; + } + + if (isset($this->handlers[$option])) { + return $this->options[$option] = $this->getDefault($option); + } + + return; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/OptionsInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/OptionsInterface.php new file mode 100644 index 000000000..597a0579b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Configuration/OptionsInterface.php @@ -0,0 +1,63 @@ +parameters = $this->assertParameters($parameters); + } + + /** + * Disconnects from the server and destroys the underlying resource when + * PHP's garbage collector kicks in. + */ + public function __destruct() + { + $this->disconnect(); + } + + /** + * Checks some of the parameters used to initialize the connection. + * + * @param ParametersInterface $parameters Initialization parameters for the connection. + * + * @return ParametersInterface + * @throws InvalidArgumentException + */ + abstract protected function assertParameters(ParametersInterface $parameters); + + /** + * Creates the underlying resource used to communicate with Redis. + * + * @return mixed + */ + abstract protected function createResource(); + + /** + * {@inheritdoc} + */ + public function isConnected() + { + return isset($this->resource); + } + + /** + * {@inheritdoc} + */ + public function connect() + { + if (!$this->isConnected()) { + $this->resource = $this->createResource(); + + return true; + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + unset($this->resource); + } + + /** + * {@inheritdoc} + */ + public function addConnectCommand(CommandInterface $command) + { + $this->initCommands[] = $command; + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + $this->writeRequest($command); + + return $this->readResponse($command); + } + + /** + * {@inheritdoc} + */ + public function readResponse(CommandInterface $command) + { + return $this->read(); + } + + /** + * Helper method to handle connection errors. + * + * @param string $message Error message. + * @param int $code Error code. + */ + protected function onConnectionError($message, $code = 0) + { + CommunicationException::handle( + new ConnectionException($this, "$message [{$this->getParameters()}]", $code) + ); + } + + /** + * Helper method to handle protocol errors. + * + * @param string $message Error message. + */ + protected function onProtocolError($message) + { + CommunicationException::handle( + new ProtocolException($this, "$message [{$this->getParameters()}]") + ); + } + + /** + * {@inheritdoc} + */ + public function getResource() + { + if (isset($this->resource)) { + return $this->resource; + } + + $this->connect(); + + return $this->resource; + } + + /** + * {@inheritdoc} + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * Gets an identifier for the connection. + * + * @return string + */ + protected function getIdentifier() + { + if ($this->parameters->scheme === 'unix') { + return $this->parameters->path; + } + + return "{$this->parameters->host}:{$this->parameters->port}"; + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + if (!isset($this->cachedId)) { + $this->cachedId = $this->getIdentifier(); + } + + return $this->cachedId; + } + + /** + * {@inheritdoc} + */ + public function __sleep() + { + return ['parameters', 'initCommands']; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/AggregateConnectionInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/AggregateConnectionInterface.php new file mode 100644 index 000000000..8864bba53 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/AggregateConnectionInterface.php @@ -0,0 +1,56 @@ +strategy = $strategy ?: new PredisStrategy(); + $this->distributor = $this->strategy->getDistributor(); + } + + /** + * {@inheritdoc} + */ + public function isConnected() + { + foreach ($this->pool as $connection) { + if ($connection->isConnected()) { + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function connect() + { + foreach ($this->pool as $connection) { + $connection->connect(); + } + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + foreach ($this->pool as $connection) { + $connection->disconnect(); + } + } + + /** + * {@inheritdoc} + */ + public function add(NodeConnectionInterface $connection) + { + $parameters = $connection->getParameters(); + + $this->pool[(string) $connection] = $connection; + + if (isset($parameters->alias)) { + $this->aliases[$parameters->alias] = $connection; + } + + $this->distributor->add($connection, $parameters->weight); + } + + /** + * {@inheritdoc} + */ + public function remove(NodeConnectionInterface $connection) + { + if (false !== $id = array_search($connection, $this->pool, true)) { + unset($this->pool[$id]); + $this->distributor->remove($connection); + + if ($this->aliases && $alias = $connection->getParameters()->alias) { + unset($this->aliases[$alias]); + } + + return true; + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function getConnectionByCommand(CommandInterface $command) + { + $slot = $this->strategy->getSlot($command); + + if (!isset($slot)) { + throw new NotSupportedException( + "Cannot use '{$command->getId()}' over clusters of connections." + ); + } + + return $this->distributor->getBySlot($slot); + } + + /** + * {@inheritdoc} + */ + public function getConnectionById($id) + { + return $this->pool[$id] ?? null; + } + + /** + * Returns a connection instance by its alias. + * + * @param string $alias Connection alias. + * + * @return NodeConnectionInterface|null + */ + public function getConnectionByAlias($alias) + { + return $this->aliases[$alias] ?? null; + } + + /** + * Retrieves a connection instance by slot. + * + * @param string $slot Slot name. + * + * @return NodeConnectionInterface|null + */ + public function getConnectionBySlot($slot) + { + return $this->distributor->getBySlot($slot); + } + + /** + * Retrieves a connection instance from the cluster using a key. + * + * @param string $key Key string. + * + * @return NodeConnectionInterface + */ + public function getConnectionByKey($key) + { + $hash = $this->strategy->getSlotByKey($key); + + return $this->distributor->getBySlot($hash); + } + + /** + * Returns the underlying command hash strategy used to hash commands by + * using keys found in their arguments. + * + * @return StrategyInterface + */ + public function getClusterStrategy() + { + return $this->strategy; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function count() + { + return count($this->pool); + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function getIterator() + { + return new ArrayIterator($this->pool); + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $this->getConnectionByCommand($command)->writeRequest($command); + } + + /** + * {@inheritdoc} + */ + public function readResponse(CommandInterface $command) + { + return $this->getConnectionByCommand($command)->readResponse($command); + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + return $this->getConnectionByCommand($command)->executeCommand($command); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Cluster/RedisCluster.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Cluster/RedisCluster.php new file mode 100644 index 000000000..e03769403 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Cluster/RedisCluster.php @@ -0,0 +1,672 @@ += 3.0.0). + * + * This connection backend offers smart support for redis-cluster by handling + * automatic slots map (re)generation upon -MOVED or -ASK responses returned by + * Redis when redirecting a client to a different node. + * + * The cluster can be pre-initialized using only a subset of the actual nodes in + * the cluster, Predis will do the rest by adjusting the slots map and creating + * the missing underlying connection instances on the fly. + * + * It is possible to pre-associate connections to a slots range with the "slots" + * parameter in the form "$first-$last". This can greatly reduce runtime node + * guessing and redirections. + * + * It is also possible to ask for the full and updated slots map directly to one + * of the nodes and optionally enable such a behaviour upon -MOVED redirections. + * Asking for the cluster configuration to Redis is actually done by issuing a + * CLUSTER SLOTS command to a random node in the pool. + */ +class RedisCluster implements ClusterInterface, IteratorAggregate, Countable +{ + private $useClusterSlots = true; + private $pool = []; + private $slots = []; + private $slotmap; + private $strategy; + private $connections; + private $retryLimit = 5; + private $retryInterval = 10; + + /** + * @param FactoryInterface $connections Optional connection factory. + * @param StrategyInterface $strategy Optional cluster strategy. + */ + public function __construct( + FactoryInterface $connections, + StrategyInterface $strategy = null + ) { + $this->connections = $connections; + $this->strategy = $strategy ?: new RedisClusterStrategy(); + $this->slotmap = new SlotMap(); + } + + /** + * Sets the maximum number of retries for commands upon server failure. + * + * -1 = unlimited retry attempts + * 0 = no retry attempts (fails immediately) + * n = fail only after n retry attempts + * + * @param int $retry Number of retry attempts. + */ + public function setRetryLimit($retry) + { + $this->retryLimit = (int) $retry; + } + + /** + * Sets the initial retry interval (milliseconds). + * + * @param int $retryInterval Milliseconds between retries. + */ + public function setRetryInterval($retryInterval) + { + $this->retryInterval = (int) $retryInterval; + } + + /** + * Returns the retry interval (milliseconds). + * + * @return int Milliseconds between retries. + */ + public function getRetryInterval() + { + return (int) $this->retryInterval; + } + + /** + * {@inheritdoc} + */ + public function isConnected() + { + foreach ($this->pool as $connection) { + if ($connection->isConnected()) { + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function connect() + { + if ($connection = $this->getRandomConnection()) { + $connection->connect(); + } + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + foreach ($this->pool as $connection) { + $connection->disconnect(); + } + } + + /** + * {@inheritdoc} + */ + public function add(NodeConnectionInterface $connection) + { + $this->pool[(string) $connection] = $connection; + $this->slotmap->reset(); + } + + /** + * {@inheritdoc} + */ + public function remove(NodeConnectionInterface $connection) + { + if (false !== $id = array_search($connection, $this->pool, true)) { + $this->slotmap->reset(); + $this->slots = array_diff($this->slots, [$connection]); + unset($this->pool[$id]); + + return true; + } + + return false; + } + + /** + * Removes a connection instance by using its identifier. + * + * @param string $connectionID Connection identifier. + * + * @return bool True if the connection was in the pool. + */ + public function removeById($connectionID) + { + if (isset($this->pool[$connectionID])) { + $this->slotmap->reset(); + $this->slots = array_diff($this->slots, [$connectionID]); + unset($this->pool[$connectionID]); + + return true; + } + + return false; + } + + /** + * Generates the current slots map by guessing the cluster configuration out + * of the connection parameters of the connections in the pool. + * + * Generation is based on the same algorithm used by Redis to generate the + * cluster, so it is most effective when all of the connections supplied on + * initialization have the "slots" parameter properly set accordingly to the + * current cluster configuration. + */ + public function buildSlotMap() + { + $this->slotmap->reset(); + + foreach ($this->pool as $connectionID => $connection) { + $parameters = $connection->getParameters(); + + if (!isset($parameters->slots)) { + continue; + } + + foreach (explode(',', $parameters->slots) as $slotRange) { + $slots = explode('-', $slotRange, 2); + + if (!isset($slots[1])) { + $slots[1] = $slots[0]; + } + + $this->slotmap->setSlots($slots[0], $slots[1], $connectionID); + } + } + } + + /** + * Queries the specified node of the cluster to fetch the updated slots map. + * + * When the connection fails, this method tries to execute the same command + * on a different connection picked at random from the pool of known nodes, + * up until the retry limit is reached. + * + * @param NodeConnectionInterface $connection Connection to a node of the cluster. + * + * @return mixed + */ + private function queryClusterNodeForSlotMap(NodeConnectionInterface $connection) + { + $retries = 0; + $retryAfter = $this->retryInterval; + $command = RawCommand::create('CLUSTER', 'SLOTS'); + + while ($retries <= $this->retryLimit) { + try { + $response = $connection->executeCommand($command); + break; + } catch (ConnectionException $exception) { + $connection = $exception->getConnection(); + $connection->disconnect(); + + $this->remove($connection); + + if ($retries === $this->retryLimit) { + throw $exception; + } + + if (!$connection = $this->getRandomConnection()) { + throw new ClientException('No connections left in the pool for `CLUSTER SLOTS`'); + } + + usleep($retryAfter * 1000); + $retryAfter = $retryAfter * 2; + ++$retries; + } + } + + return $response; + } + + /** + * Generates an updated slots map fetching the cluster configuration using + * the CLUSTER SLOTS command against the specified node or a random one from + * the pool. + * + * @param NodeConnectionInterface $connection Optional connection instance. + */ + public function askSlotMap(NodeConnectionInterface $connection = null) + { + if (!$connection && !$connection = $this->getRandomConnection()) { + return; + } + + $this->slotmap->reset(); + + $response = $this->queryClusterNodeForSlotMap($connection); + + foreach ($response as $slots) { + // We only support master servers for now, so we ignore subsequent + // elements in the $slots array identifying slaves. + [$start, $end, $master] = $slots; + + if ($master[0] === '') { + $this->slotmap->setSlots($start, $end, (string) $connection); + } else { + $this->slotmap->setSlots($start, $end, "{$master[0]}:{$master[1]}"); + } + } + } + + /** + * Guesses the correct node associated to a given slot using a precalculated + * slots map, falling back to the same logic used by Redis to initialize a + * cluster (best-effort). + * + * @param int $slot Slot index. + * + * @return string Connection ID. + */ + protected function guessNode($slot) + { + if (!$this->pool) { + throw new ClientException('No connections available in the pool'); + } + + if ($this->slotmap->isEmpty()) { + $this->buildSlotMap(); + } + + if ($node = $this->slotmap[$slot]) { + return $node; + } + + $count = count($this->pool); + $index = min((int) ($slot / (int) (16384 / $count)), $count - 1); + $nodes = array_keys($this->pool); + + return $nodes[$index]; + } + + /** + * Creates a new connection instance from the given connection ID. + * + * @param string $connectionID Identifier for the connection. + * + * @return NodeConnectionInterface + */ + protected function createConnection($connectionID) + { + $separator = strrpos($connectionID, ':'); + + return $this->connections->create([ + 'host' => substr($connectionID, 0, $separator), + 'port' => substr($connectionID, $separator + 1), + ]); + } + + /** + * {@inheritdoc} + */ + public function getConnectionByCommand(CommandInterface $command) + { + $slot = $this->strategy->getSlot($command); + + if (!isset($slot)) { + throw new NotSupportedException( + "Cannot use '{$command->getId()}' with redis-cluster." + ); + } + + if (isset($this->slots[$slot])) { + return $this->slots[$slot]; + } else { + return $this->getConnectionBySlot($slot); + } + } + + /** + * Returns the connection currently associated to a given slot. + * + * @param int $slot Slot index. + * + * @return NodeConnectionInterface + * @throws OutOfBoundsException + */ + public function getConnectionBySlot($slot) + { + if (!SlotMap::isValid($slot)) { + throw new OutOfBoundsException("Invalid slot [$slot]."); + } + + if (isset($this->slots[$slot])) { + return $this->slots[$slot]; + } + + $connectionID = $this->guessNode($slot); + + if (!$connection = $this->getConnectionById($connectionID)) { + $connection = $this->createConnection($connectionID); + $this->pool[$connectionID] = $connection; + } + + return $this->slots[$slot] = $connection; + } + + /** + * {@inheritdoc} + */ + public function getConnectionById($connectionID) + { + return $this->pool[$connectionID] ?? null; + } + + /** + * Returns a random connection from the pool. + * + * @return NodeConnectionInterface|null + */ + protected function getRandomConnection() + { + if (!$this->pool) { + return null; + } + + return $this->pool[array_rand($this->pool)]; + } + + /** + * Permanently associates the connection instance to a new slot. + * The connection is added to the connections pool if not yet included. + * + * @param NodeConnectionInterface $connection Connection instance. + * @param int $slot Target slot index. + */ + protected function move(NodeConnectionInterface $connection, $slot) + { + $this->pool[(string) $connection] = $connection; + $this->slots[(int) $slot] = $connection; + $this->slotmap[(int) $slot] = $connection; + } + + /** + * Handles -ERR responses returned by Redis. + * + * @param CommandInterface $command Command that generated the -ERR response. + * @param ErrorResponseInterface $error Redis error response object. + * + * @return mixed + */ + protected function onErrorResponse(CommandInterface $command, ErrorResponseInterface $error) + { + $details = explode(' ', $error->getMessage(), 2); + + switch ($details[0]) { + case 'MOVED': + return $this->onMovedResponse($command, $details[1]); + + case 'ASK': + return $this->onAskResponse($command, $details[1]); + + default: + return $error; + } + } + + /** + * Handles -MOVED responses by executing again the command against the node + * indicated by the Redis response. + * + * @param CommandInterface $command Command that generated the -MOVED response. + * @param string $details Parameters of the -MOVED response. + * + * @return mixed + */ + protected function onMovedResponse(CommandInterface $command, $details) + { + [$slot, $connectionID] = explode(' ', $details, 2); + + if (!$connection = $this->getConnectionById($connectionID)) { + $connection = $this->createConnection($connectionID); + } + + if ($this->useClusterSlots) { + $this->askSlotMap($connection); + } + + $this->move($connection, $slot); + + return $this->executeCommand($command); + } + + /** + * Handles -ASK responses by executing again the command against the node + * indicated by the Redis response. + * + * @param CommandInterface $command Command that generated the -ASK response. + * @param string $details Parameters of the -ASK response. + * + * @return mixed + */ + protected function onAskResponse(CommandInterface $command, $details) + { + [$slot, $connectionID] = explode(' ', $details, 2); + + if (!$connection = $this->getConnectionById($connectionID)) { + $connection = $this->createConnection($connectionID); + } + + $connection->executeCommand(RawCommand::create('ASKING')); + + return $connection->executeCommand($command); + } + + /** + * Ensures that a command is executed one more time on connection failure. + * + * The connection to the node that generated the error is evicted from the + * pool before trying to fetch an updated slots map from another node. If + * the new slots map points to an unreachable server the client gives up and + * throws the exception as the nodes participating in the cluster may still + * have to agree that something changed in the configuration of the cluster. + * + * @param CommandInterface $command Command instance. + * @param string $method Actual method. + * + * @return mixed + */ + private function retryCommandOnFailure(CommandInterface $command, $method) + { + $retries = 0; + $retryAfter = $this->retryInterval; + + while ($retries <= $this->retryLimit) { + try { + $response = $this->getConnectionByCommand($command)->$method($command); + + if ($response instanceof ErrorResponse) { + $message = $response->getMessage(); + + if (strpos($message, 'CLUSTERDOWN') !== false) { + throw new ServerException($message); + } + } + + break; + } catch (Throwable $exception) { + usleep($retryAfter * 1000); + $retryAfter = $retryAfter * 2; + + if ($exception instanceof ConnectionException) { + $connection = $exception->getConnection(); + + if ($connection) { + $connection->disconnect(); + $this->remove($connection); + } + } + + if ($retries === $this->retryLimit) { + throw $exception; + } + + if ($this->useClusterSlots) { + $this->askSlotMap(); + } + + ++$retries; + } + } + + return $response; + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $this->retryCommandOnFailure($command, __FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function readResponse(CommandInterface $command) + { + return $this->retryCommandOnFailure($command, __FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + $response = $this->retryCommandOnFailure($command, __FUNCTION__); + + if ($response instanceof ErrorResponseInterface) { + return $this->onErrorResponse($command, $response); + } + + return $response; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function count() + { + return count($this->pool); + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function getIterator() + { + if ($this->slotmap->isEmpty()) { + $this->useClusterSlots ? $this->askSlotMap() : $this->buildSlotMap(); + } + + $connections = []; + + foreach ($this->slotmap->getNodes() as $node) { + if (!$connection = $this->getConnectionById($node)) { + $this->add($connection = $this->createConnection($node)); + } + + $connections[] = $connection; + } + + return new ArrayIterator($connections); + } + + /** + * Returns the underlying slot map. + * + * @return SlotMap + */ + public function getSlotMap() + { + return $this->slotmap; + } + + /** + * Returns the underlying command hash strategy used to hash commands by + * using keys found in their arguments. + * + * @return StrategyInterface + */ + public function getClusterStrategy() + { + return $this->strategy; + } + + /** + * Returns the underlying connection factory used to create new connection + * instances to Redis nodes indicated by redis-cluster. + * + * @return FactoryInterface + */ + public function getConnectionFactory() + { + return $this->connections; + } + + /** + * Enables automatic fetching of the current slots map from one of the nodes + * using the CLUSTER SLOTS command. This option is enabled by default as + * asking the current slots map to Redis upon -MOVED responses may reduce + * overhead by eliminating the trial-and-error nature of the node guessing + * procedure, mostly when targeting many keys that would end up in a lot of + * redirections. + * + * The slots map can still be manually fetched using the askSlotMap() + * method whether or not this option is enabled. + * + * @param bool $value Enable or disable the use of CLUSTER SLOTS. + */ + public function useClusterSlots($value) + { + $this->useClusterSlots = (bool) $value; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/CompositeConnectionInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/CompositeConnectionInterface.php new file mode 100644 index 000000000..22b8c5f77 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/CompositeConnectionInterface.php @@ -0,0 +1,48 @@ +parameters = $this->assertParameters($parameters); + $this->protocol = $protocol ?: new TextProtocolProcessor(); + } + + /** + * {@inheritdoc} + */ + public function getProtocol() + { + return $this->protocol; + } + + /** + * {@inheritdoc} + */ + public function writeBuffer($buffer) + { + $this->write($buffer); + } + + /** + * {@inheritdoc} + */ + public function readBuffer($length) + { + if ($length <= 0) { + throw new InvalidArgumentException('Length parameter must be greater than 0.'); + } + + $value = ''; + $socket = $this->getResource(); + + do { + $chunk = fread($socket, $length); + + if ($chunk === false || $chunk === '') { + $this->onConnectionError('Error while reading bytes from the server.'); + } + + $value .= $chunk; + } while (($length -= strlen($chunk)) > 0); + + return $value; + } + + /** + * {@inheritdoc} + */ + public function readLine() + { + $value = ''; + $socket = $this->getResource(); + + do { + $chunk = fgets($socket); + + if ($chunk === false || $chunk === '') { + $this->onConnectionError('Error while reading line from the server.'); + } + + $value .= $chunk; + } while (substr($value, -2) !== "\r\n"); + + return substr($value, 0, -2); + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $this->protocol->write($this, $command); + } + + /** + * {@inheritdoc} + */ + public function read() + { + return $this->protocol->read($this); + } + + /** + * {@inheritdoc} + */ + public function __sleep() + { + return array_merge(parent::__sleep(), ['protocol']); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/ConnectionException.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/ConnectionException.php new file mode 100644 index 000000000..77e7a15a0 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/ConnectionException.php @@ -0,0 +1,22 @@ + 'Predis\Connection\StreamConnection', + 'unix' => 'Predis\Connection\StreamConnection', + 'tls' => 'Predis\Connection\StreamConnection', + 'redis' => 'Predis\Connection\StreamConnection', + 'rediss' => 'Predis\Connection\StreamConnection', + 'http' => 'Predis\Connection\WebdisConnection', + ]; + + /** + * Checks if the provided argument represents a valid connection class + * implementing Predis\Connection\NodeConnectionInterface. Optionally, + * callable objects are used for lazy initialization of connection objects. + * + * @param mixed $initializer FQN of a connection class or a callable for lazy initialization. + * + * @return mixed + * @throws InvalidArgumentException + */ + protected function checkInitializer($initializer) + { + if (is_callable($initializer)) { + return $initializer; + } + + $class = new ReflectionClass($initializer); + + if (!$class->isSubclassOf('Predis\Connection\NodeConnectionInterface')) { + throw new InvalidArgumentException( + 'A connection initializer must be a valid connection class or a callable object.' + ); + } + + return $initializer; + } + + /** + * {@inheritdoc} + */ + public function define($scheme, $initializer) + { + $this->schemes[$scheme] = $this->checkInitializer($initializer); + } + + /** + * {@inheritdoc} + */ + public function undefine($scheme) + { + unset($this->schemes[$scheme]); + } + + /** + * {@inheritdoc} + */ + public function create($parameters) + { + if (!$parameters instanceof ParametersInterface) { + $parameters = $this->createParameters($parameters); + } + + $scheme = $parameters->scheme; + + if (!isset($this->schemes[$scheme])) { + throw new InvalidArgumentException("Unknown connection scheme: '$scheme'."); + } + + $initializer = $this->schemes[$scheme]; + + if (is_callable($initializer)) { + $connection = call_user_func($initializer, $parameters, $this); + } else { + $connection = new $initializer($parameters); + $this->prepareConnection($connection); + } + + if (!$connection instanceof NodeConnectionInterface) { + throw new UnexpectedValueException( + 'Objects returned by connection initializers must implement ' . + "'Predis\Connection\NodeConnectionInterface'." + ); + } + + return $connection; + } + + /** + * Assigns a default set of parameters applied to new connections. + * + * The set of parameters passed to create a new connection have precedence + * over the default values set for the connection factory. + * + * @param array $parameters Set of connection parameters. + */ + public function setDefaultParameters(array $parameters) + { + $this->defaults = $parameters; + } + + /** + * Returns the default set of parameters applied to new connections. + * + * @return array + */ + public function getDefaultParameters() + { + return $this->defaults; + } + + /** + * Creates a connection parameters instance from the supplied argument. + * + * @param mixed $parameters Original connection parameters. + * + * @return ParametersInterface + */ + protected function createParameters($parameters) + { + if (is_string($parameters)) { + $parameters = Parameters::parse($parameters); + } else { + $parameters = $parameters ?: []; + } + + if ($this->defaults) { + $parameters += $this->defaults; + } + + return new Parameters($parameters); + } + + /** + * Prepares a connection instance after its initialization. + * + * @param NodeConnectionInterface $connection Connection instance. + */ + protected function prepareConnection(NodeConnectionInterface $connection) + { + $parameters = $connection->getParameters(); + + if (isset($parameters->password) && strlen($parameters->password)) { + $cmdAuthArgs = isset($parameters->username) && strlen($parameters->username) + ? [$parameters->username, $parameters->password] + : [$parameters->password]; + + $connection->addConnectCommand( + new RawCommand('AUTH', $cmdAuthArgs) + ); + } + + if (isset($parameters->database) && strlen($parameters->database)) { + $connection->addConnectCommand( + new RawCommand('SELECT', [$parameters->database]) + ); + } + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/FactoryInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/FactoryInterface.php new file mode 100644 index 000000000..24dc782a8 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/FactoryInterface.php @@ -0,0 +1,43 @@ + 'tcp', + 'host' => '127.0.0.1', + 'port' => 6379, + ]; + + /** + * Set of connection parameters already filtered + * for NULL or 0-length string values. + * + * @var array + */ + protected $parameters; + + /** + * @param array $parameters Named array of connection parameters. + */ + public function __construct(array $parameters = []) + { + $this->parameters = $this->filter($parameters + static::$defaults); + } + + /** + * Filters parameters removing entries with NULL or 0-length string values. + * + * @params array $parameters Array of parameters to be filtered + * + * @return array + */ + protected function filter(array $parameters) + { + return array_filter($parameters, function ($value) { + return $value !== null && $value !== ''; + }); + } + + /** + * Creates a new instance by supplying the initial parameters either in the + * form of an URI string or a named array. + * + * @param array|string $parameters Set of connection parameters. + * + * @return Parameters + */ + public static function create($parameters) + { + if (is_string($parameters)) { + $parameters = static::parse($parameters); + } + + return new static($parameters ?: []); + } + + /** + * Parses an URI string returning an array of connection parameters. + * + * When using the "redis" and "rediss" schemes the URI is parsed according + * to the rules defined by the provisional registration documents approved + * by IANA. If the URI has a password in its "user-information" part or a + * database number in the "path" part these values override the values of + * "password" and "database" if they are present in the "query" part. + * + * @see http://www.iana.org/assignments/uri-schemes/prov/redis + * @see http://www.iana.org/assignments/uri-schemes/prov/rediss + * + * @param string $uri URI string. + * + * @return array + * @throws InvalidArgumentException + */ + public static function parse($uri) + { + if (stripos($uri, 'unix://') === 0) { + // parse_url() can parse unix:/path/to/sock so we do not need the + // unix:///path/to/sock hack, we will support it anyway until 2.0. + $uri = str_ireplace('unix://', 'unix:', $uri); + } + + if (!$parsed = parse_url($uri)) { + throw new InvalidArgumentException("Invalid parameters URI: $uri"); + } + + if ( + isset($parsed['host']) + && false !== strpos($parsed['host'], '[') + && false !== strpos($parsed['host'], ']') + ) { + $parsed['host'] = substr($parsed['host'], 1, -1); + } + + if (isset($parsed['query'])) { + parse_str($parsed['query'], $queryarray); + unset($parsed['query']); + + $parsed = array_merge($parsed, $queryarray); + } + + if (stripos($uri, 'redis') === 0) { + if (isset($parsed['user'])) { + if (strlen($parsed['user'])) { + $parsed['username'] = $parsed['user']; + } + unset($parsed['user']); + } + + if (isset($parsed['pass'])) { + if (strlen($parsed['pass'])) { + $parsed['password'] = $parsed['pass']; + } + unset($parsed['pass']); + } + + if (isset($parsed['path']) && preg_match('/^\/(\d+)(\/.*)?/', $parsed['path'], $path)) { + $parsed['database'] = $path[1]; + + if (isset($path[2])) { + $parsed['path'] = $path[2]; + } else { + unset($parsed['path']); + } + } + } + + return $parsed; + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + return $this->parameters; + } + + /** + * {@inheritdoc} + */ + public function __get($parameter) + { + if (isset($this->parameters[$parameter])) { + return $this->parameters[$parameter]; + } + } + + /** + * {@inheritdoc} + */ + public function __isset($parameter) + { + return isset($this->parameters[$parameter]); + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + if ($this->scheme === 'unix') { + return "$this->scheme:$this->path"; + } + + if (filter_var($this->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + return "$this->scheme://[$this->host]:$this->port"; + } + + return "$this->scheme://$this->host:$this->port"; + } + + /** + * {@inheritdoc} + */ + public function __sleep() + { + return ['parameters']; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/ParametersInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/ParametersInterface.php new file mode 100644 index 000000000..25c7e1ae6 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/ParametersInterface.php @@ -0,0 +1,68 @@ +assertExtensions(); + + parent::__construct($parameters); + + $this->reader = $this->createReader(); + } + + /** + * Disconnects from the server and destroys the underlying resource and the + * protocol reader resource when PHP's garbage collector kicks in. + */ + public function __destruct() + { + parent::__destruct(); + + phpiredis_reader_destroy($this->reader); + } + + /** + * Checks if the socket and phpiredis extensions are loaded in PHP. + */ + protected function assertExtensions() + { + if (!extension_loaded('sockets')) { + throw new NotSupportedException( + 'The "sockets" extension is required by this connection backend.' + ); + } + + if (!extension_loaded('phpiredis')) { + throw new NotSupportedException( + 'The "phpiredis" extension is required by this connection backend.' + ); + } + } + + /** + * {@inheritdoc} + */ + protected function assertParameters(ParametersInterface $parameters) + { + switch ($parameters->scheme) { + case 'tcp': + case 'redis': + case 'unix': + break; + + default: + throw new InvalidArgumentException("Invalid scheme: '$parameters->scheme'."); + } + + if (isset($parameters->persistent)) { + throw new NotSupportedException( + 'Persistent connections are not supported by this connection backend.' + ); + } + + return $parameters; + } + + /** + * Creates a new instance of the protocol reader resource. + * + * @return resource + */ + private function createReader() + { + $reader = phpiredis_reader_create(); + + phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); + phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); + + return $reader; + } + + /** + * Returns the underlying protocol reader resource. + * + * @return resource + */ + protected function getReader() + { + return $this->reader; + } + + /** + * Returns the handler used by the protocol reader for inline responses. + * + * @return Closure + */ + protected function getStatusHandler() + { + static $statusHandler; + + if (!$statusHandler) { + $statusHandler = function ($payload) { + return StatusResponse::get($payload); + }; + } + + return $statusHandler; + } + + /** + * Returns the handler used by the protocol reader for error responses. + * + * @return Closure + */ + protected function getErrorHandler() + { + static $errorHandler; + + if (!$errorHandler) { + $errorHandler = function ($errorMessage) { + return new ErrorResponse($errorMessage); + }; + } + + return $errorHandler; + } + + /** + * Helper method used to throw exceptions on socket errors. + */ + private function emitSocketError() + { + $errno = socket_last_error(); + $errstr = socket_strerror($errno); + + $this->disconnect(); + + $this->onConnectionError(trim($errstr), $errno); + } + + /** + * Gets the address of an host from connection parameters. + * + * @param ParametersInterface $parameters Parameters used to initialize the connection. + * + * @return string + */ + protected static function getAddress(ParametersInterface $parameters) + { + if (filter_var($host = $parameters->host, FILTER_VALIDATE_IP)) { + return $host; + } + + if ($host === $address = gethostbyname($host)) { + return false; + } + + return $address; + } + + /** + * {@inheritdoc} + */ + protected function createResource() + { + $parameters = $this->parameters; + + if ($parameters->scheme === 'unix') { + $address = $parameters->path; + $domain = AF_UNIX; + $protocol = 0; + } else { + if (false === $address = self::getAddress($parameters)) { + $this->onConnectionError("Cannot resolve the address of '$parameters->host'."); + } + + $domain = filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ? AF_INET6 : AF_INET; + $protocol = SOL_TCP; + } + + if (false === $socket = @socket_create($domain, SOCK_STREAM, $protocol)) { + $this->emitSocketError(); + } + + $this->setSocketOptions($socket, $parameters); + $this->connectWithTimeout($socket, $address, $parameters); + + return $socket; + } + + /** + * Sets options on the socket resource from the connection parameters. + * + * @param resource $socket Socket resource. + * @param ParametersInterface $parameters Parameters used to initialize the connection. + */ + private function setSocketOptions($socket, ParametersInterface $parameters) + { + if ($parameters->scheme !== 'unix') { + if (!socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1)) { + $this->emitSocketError(); + } + + if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) { + $this->emitSocketError(); + } + } + + if (isset($parameters->read_write_timeout)) { + $rwtimeout = (float) $parameters->read_write_timeout; + $timeoutSec = floor($rwtimeout); + $timeoutUsec = ($rwtimeout - $timeoutSec) * 1000000; + + $timeout = [ + 'sec' => $timeoutSec, + 'usec' => $timeoutUsec, + ]; + + if (!socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout)) { + $this->emitSocketError(); + } + + if (!socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout)) { + $this->emitSocketError(); + } + } + } + + /** + * Opens the actual connection to the server with a timeout. + * + * @param resource $socket Socket resource. + * @param string $address IP address (DNS-resolved from hostname) + * @param ParametersInterface $parameters Parameters used to initialize the connection. + * + * @return void + */ + private function connectWithTimeout($socket, $address, ParametersInterface $parameters) + { + socket_set_nonblock($socket); + + if (@socket_connect($socket, $address, (int) $parameters->port) === false) { + $error = socket_last_error(); + + if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) { + $this->emitSocketError(); + } + } + + socket_set_block($socket); + + $null = null; + $selectable = [$socket]; + + $timeout = (isset($parameters->timeout) ? (float) $parameters->timeout : 5.0); + $timeoutSecs = floor($timeout); + $timeoutUSecs = ($timeout - $timeoutSecs) * 1000000; + + $selected = socket_select($selectable, $selectable, $null, $timeoutSecs, $timeoutUSecs); + + if ($selected === 2) { + $this->onConnectionError('Connection refused.', SOCKET_ECONNREFUSED); + } + + if ($selected === 0) { + $this->onConnectionError('Connection timed out.', SOCKET_ETIMEDOUT); + } + + if ($selected === false) { + $this->emitSocketError(); + } + } + + /** + * {@inheritdoc} + */ + public function connect() + { + if (parent::connect() && $this->initCommands) { + foreach ($this->initCommands as $command) { + $response = $this->executeCommand($command); + + if ($response instanceof ErrorResponseInterface) { + $this->onConnectionError("`{$command->getId()}` failed: {$response->getMessage()}", 0); + } + } + } + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + if ($this->isConnected()) { + phpiredis_reader_reset($this->reader); + socket_close($this->getResource()); + + parent::disconnect(); + } + } + + /** + * {@inheritdoc} + */ + protected function write($buffer) + { + $socket = $this->getResource(); + + while (($length = strlen($buffer)) > 0) { + $written = socket_write($socket, $buffer, $length); + + if ($length === $written) { + return; + } + + if ($written === false) { + $this->onConnectionError('Error while writing bytes to the server.'); + } + + $buffer = substr($buffer, $written); + } + } + + /** + * {@inheritdoc} + */ + public function read() + { + $socket = $this->getResource(); + $reader = $this->reader; + + while (PHPIREDIS_READER_STATE_INCOMPLETE === $state = phpiredis_reader_get_state($reader)) { + if (@socket_recv($socket, $buffer, 4096, 0) === false || $buffer === '' || $buffer === null) { + $this->emitSocketError(); + } + + phpiredis_reader_feed($reader, $buffer); + } + + if ($state === PHPIREDIS_READER_STATE_COMPLETE) { + return phpiredis_reader_get_reply($reader); + } else { + $this->onProtocolError(phpiredis_reader_get_error($reader)); + + return; + } + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $arguments = $command->getArguments(); + array_unshift($arguments, $command->getId()); + + $this->write(phpiredis_format_command($arguments)); + } + + /** + * {@inheritdoc} + */ + public function __wakeup() + { + $this->assertExtensions(); + $this->reader = $this->createReader(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/PhpiredisStreamConnection.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/PhpiredisStreamConnection.php new file mode 100644 index 000000000..e3dbfd8ad --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/PhpiredisStreamConnection.php @@ -0,0 +1,262 @@ +assertExtensions(); + + parent::__construct($parameters); + + $this->reader = $this->createReader(); + } + + /** + * {@inheritdoc} + */ + public function __destruct() + { + parent::__destruct(); + + phpiredis_reader_destroy($this->reader); + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + phpiredis_reader_reset($this->reader); + + parent::disconnect(); + } + + /** + * Checks if the phpiredis extension is loaded in PHP. + */ + private function assertExtensions() + { + if (!extension_loaded('phpiredis')) { + throw new NotSupportedException( + 'The "phpiredis" extension is required by this connection backend.' + ); + } + } + + /** + * {@inheritdoc} + */ + protected function assertParameters(ParametersInterface $parameters) + { + switch ($parameters->scheme) { + case 'tcp': + case 'redis': + case 'unix': + break; + + case 'tls': + case 'rediss': + throw new InvalidArgumentException('SSL encryption is not supported by this connection backend.'); + default: + throw new InvalidArgumentException("Invalid scheme: '$parameters->scheme'."); + } + + return $parameters; + } + + /** + * {@inheritdoc} + */ + protected function createStreamSocket(ParametersInterface $parameters, $address, $flags) + { + $socket = null; + $timeout = (isset($parameters->timeout) ? (float) $parameters->timeout : 5.0); + $context = stream_context_create(['socket' => ['tcp_nodelay' => (bool) $parameters->tcp_nodelay]]); + + if (!$resource = @stream_socket_client($address, $errno, $errstr, $timeout, $flags, $context)) { + $this->onConnectionError(trim($errstr), $errno); + } + + if (isset($parameters->read_write_timeout) && function_exists('socket_import_stream')) { + $rwtimeout = (float) $parameters->read_write_timeout; + $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; + + $timeout = [ + 'sec' => $timeoutSeconds = floor($rwtimeout), + 'usec' => ($rwtimeout - $timeoutSeconds) * 1000000, + ]; + + $socket = $socket ?: socket_import_stream($resource); + @socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout); + @socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout); + } + + if (isset($parameters->tcp_nodelay) && function_exists('socket_import_stream')) { + $socket = $socket ?: socket_import_stream($resource); + socket_set_option($socket, SOL_TCP, TCP_NODELAY, (int) $parameters->tcp_nodelay); + } + + return $resource; + } + + /** + * Creates a new instance of the protocol reader resource. + * + * @return resource + */ + private function createReader() + { + $reader = phpiredis_reader_create(); + + phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); + phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); + + return $reader; + } + + /** + * Returns the underlying protocol reader resource. + * + * @return resource + */ + protected function getReader() + { + return $this->reader; + } + + /** + * Returns the handler used by the protocol reader for inline responses. + * + * @return Closure + */ + protected function getStatusHandler() + { + static $statusHandler; + + if (!$statusHandler) { + $statusHandler = function ($payload) { + return StatusResponse::get($payload); + }; + } + + return $statusHandler; + } + + /** + * Returns the handler used by the protocol reader for error responses. + * + * @return Closure + */ + protected function getErrorHandler() + { + static $errorHandler; + + if (!$errorHandler) { + $errorHandler = function ($errorMessage) { + return new ErrorResponse($errorMessage); + }; + } + + return $errorHandler; + } + + /** + * {@inheritdoc} + */ + public function read() + { + $socket = $this->getResource(); + $reader = $this->reader; + + while (PHPIREDIS_READER_STATE_INCOMPLETE === $state = phpiredis_reader_get_state($reader)) { + $buffer = stream_socket_recvfrom($socket, 4096); + + if ($buffer === false || $buffer === '') { + $this->onConnectionError('Error while reading bytes from the server.'); + } + + phpiredis_reader_feed($reader, $buffer); + } + + if ($state === PHPIREDIS_READER_STATE_COMPLETE) { + return phpiredis_reader_get_reply($reader); + } else { + $this->onProtocolError(phpiredis_reader_get_error($reader)); + + return; + } + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $arguments = $command->getArguments(); + array_unshift($arguments, $command->getId()); + + $this->write(phpiredis_format_command($arguments)); + } + + /** + * {@inheritdoc} + */ + public function __wakeup() + { + $this->assertExtensions(); + $this->reader = $this->createReader(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Replication/MasterSlaveReplication.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Replication/MasterSlaveReplication.php new file mode 100644 index 000000000..9d57a5ac3 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Replication/MasterSlaveReplication.php @@ -0,0 +1,553 @@ +strategy = $strategy ?: new ReplicationStrategy(); + } + + /** + * Configures the automatic discovery of the replication configuration on failure. + * + * @param bool $value Enable or disable auto discovery. + */ + public function setAutoDiscovery($value) + { + if (!$this->connectionFactory) { + throw new ClientException('Automatic discovery requires a connection factory'); + } + + $this->autoDiscovery = (bool) $value; + } + + /** + * Sets the connection factory used to create the connections by the auto + * discovery procedure. + * + * @param FactoryInterface $connectionFactory Connection factory instance. + */ + public function setConnectionFactory(FactoryInterface $connectionFactory) + { + $this->connectionFactory = $connectionFactory; + } + + /** + * Resets the connection state. + */ + protected function reset() + { + $this->current = null; + } + + /** + * {@inheritdoc} + */ + public function add(NodeConnectionInterface $connection) + { + $parameters = $connection->getParameters(); + + if ('master' === $parameters->role) { + $this->master = $connection; + } else { + // everything else is considered a slvave. + $this->slaves[] = $connection; + } + + if (isset($parameters->alias)) { + $this->aliases[$parameters->alias] = $connection; + } + + $this->pool[(string) $connection] = $connection; + + $this->reset(); + } + + /** + * {@inheritdoc} + */ + public function remove(NodeConnectionInterface $connection) + { + if ($connection === $this->master) { + $this->master = null; + } elseif (false !== $id = array_search($connection, $this->slaves, true)) { + unset($this->slaves[$id]); + } else { + return false; + } + + unset($this->pool[(string) $connection]); + + if ($this->aliases && $alias = $connection->getParameters()->alias) { + unset($this->aliases[$alias]); + } + + $this->reset(); + + return true; + } + + /** + * {@inheritdoc} + */ + public function getConnectionByCommand(CommandInterface $command) + { + if (!$this->current) { + if ($this->strategy->isReadOperation($command) && $slave = $this->pickSlave()) { + $this->current = $slave; + } else { + $this->current = $this->getMasterOrDie(); + } + + return $this->current; + } + + if ($this->current === $master = $this->getMasterOrDie()) { + return $master; + } + + if (!$this->strategy->isReadOperation($command) || !$this->slaves) { + $this->current = $master; + } + + return $this->current; + } + + /** + * {@inheritdoc} + */ + public function getConnectionById($id) + { + return $this->pool[$id] ?? null; + } + + /** + * Returns a connection instance by its alias. + * + * @param string $alias Connection alias. + * + * @return NodeConnectionInterface|null + */ + public function getConnectionByAlias($alias) + { + return $this->aliases[$alias] ?? null; + } + + /** + * Returns a connection by its role. + * + * @param string $role Connection role (`master` or `slave`) + * + * @return NodeConnectionInterface|null + */ + public function getConnectionByRole($role) + { + if ($role === 'master') { + return $this->getMaster(); + } elseif ($role === 'slave') { + return $this->pickSlave(); + } + + return null; + } + + /** + * Switches the internal connection in use by the backend. + * + * @param NodeConnectionInterface $connection Connection instance in the pool. + */ + public function switchTo(NodeConnectionInterface $connection) + { + if ($connection && $connection === $this->current) { + return; + } + + if ($connection !== $this->master && !in_array($connection, $this->slaves, true)) { + throw new InvalidArgumentException('Invalid connection or connection not found.'); + } + + $this->current = $connection; + } + + /** + * {@inheritdoc} + */ + public function switchToMaster() + { + if (!$connection = $this->getConnectionByRole('master')) { + throw new InvalidArgumentException('Invalid connection or connection not found.'); + } + + $this->switchTo($connection); + } + + /** + * {@inheritdoc} + */ + public function switchToSlave() + { + if (!$connection = $this->getConnectionByRole('slave')) { + throw new InvalidArgumentException('Invalid connection or connection not found.'); + } + + $this->switchTo($connection); + } + + /** + * {@inheritdoc} + */ + public function getCurrent() + { + return $this->current; + } + + /** + * {@inheritdoc} + */ + public function getMaster() + { + return $this->master; + } + + /** + * Returns the connection associated to the master server. + * + * @return NodeConnectionInterface + */ + private function getMasterOrDie() + { + if (!$connection = $this->getMaster()) { + throw new MissingMasterException('No master server available for replication'); + } + + return $connection; + } + + /** + * {@inheritdoc} + */ + public function getSlaves() + { + return $this->slaves; + } + + /** + * Returns the underlying replication strategy. + * + * @return ReplicationStrategy + */ + public function getReplicationStrategy() + { + return $this->strategy; + } + + /** + * Returns a random slave. + * + * @return NodeConnectionInterface|null + */ + protected function pickSlave() + { + if (!$this->slaves) { + return null; + } + + return $this->slaves[array_rand($this->slaves)]; + } + + /** + * {@inheritdoc} + */ + public function isConnected() + { + return $this->current ? $this->current->isConnected() : false; + } + + /** + * {@inheritdoc} + */ + public function connect() + { + if (!$this->current) { + if (!$this->current = $this->pickSlave()) { + if (!$this->current = $this->getMaster()) { + throw new ClientException('No available connection for replication'); + } + } + } + + $this->current->connect(); + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + foreach ($this->pool as $connection) { + $connection->disconnect(); + } + } + + /** + * Handles response from INFO. + * + * @param string $response + * + * @return array + */ + private function handleInfoResponse($response) + { + $info = []; + + foreach (preg_split('/\r?\n/', $response) as $row) { + if (strpos($row, ':') === false) { + continue; + } + + [$k, $v] = explode(':', $row, 2); + $info[$k] = $v; + } + + return $info; + } + + /** + * Fetches the replication configuration from one of the servers. + */ + public function discover() + { + if (!$this->connectionFactory) { + throw new ClientException('Discovery requires a connection factory'); + } + + while (true) { + try { + if ($connection = $this->getMaster()) { + $this->discoverFromMaster($connection, $this->connectionFactory); + break; + } elseif ($connection = $this->pickSlave()) { + $this->discoverFromSlave($connection, $this->connectionFactory); + break; + } else { + throw new ClientException('No connection available for discovery'); + } + } catch (ConnectionException $exception) { + $this->remove($connection); + } + } + } + + /** + * Discovers the replication configuration by contacting the master node. + * + * @param NodeConnectionInterface $connection Connection to the master node. + * @param FactoryInterface $connectionFactory Connection factory instance. + */ + protected function discoverFromMaster(NodeConnectionInterface $connection, FactoryInterface $connectionFactory) + { + $response = $connection->executeCommand(RawCommand::create('INFO', 'REPLICATION')); + $replication = $this->handleInfoResponse($response); + + if ($replication['role'] !== 'master') { + throw new ClientException("Role mismatch (expected master, got slave) [$connection]"); + } + + $this->slaves = []; + + foreach ($replication as $k => $v) { + $parameters = null; + + if (strpos($k, 'slave') === 0 && preg_match('/ip=(?P.*),port=(?P\d+)/', $v, $parameters)) { + $slaveConnection = $connectionFactory->create([ + 'host' => $parameters['host'], + 'port' => $parameters['port'], + 'role' => 'slave', + ]); + + $this->add($slaveConnection); + } + } + } + + /** + * Discovers the replication configuration by contacting one of the slaves. + * + * @param NodeConnectionInterface $connection Connection to one of the slaves. + * @param FactoryInterface $connectionFactory Connection factory instance. + */ + protected function discoverFromSlave(NodeConnectionInterface $connection, FactoryInterface $connectionFactory) + { + $response = $connection->executeCommand(RawCommand::create('INFO', 'REPLICATION')); + $replication = $this->handleInfoResponse($response); + + if ($replication['role'] !== 'slave') { + throw new ClientException("Role mismatch (expected slave, got master) [$connection]"); + } + + $masterConnection = $connectionFactory->create([ + 'host' => $replication['master_host'], + 'port' => $replication['master_port'], + 'role' => 'master', + ]); + + $this->add($masterConnection); + + $this->discoverFromMaster($masterConnection, $connectionFactory); + } + + /** + * Retries the execution of a command upon slave failure. + * + * @param CommandInterface $command Command instance. + * @param string $method Actual method. + * + * @return mixed + */ + private function retryCommandOnFailure(CommandInterface $command, $method) + { + while (true) { + try { + $connection = $this->getConnectionByCommand($command); + $response = $connection->$method($command); + + if ($response instanceof ResponseErrorInterface && $response->getErrorType() === 'LOADING') { + throw new ConnectionException($connection, "Redis is loading the dataset in memory [$connection]"); + } + + break; + } catch (ConnectionException $exception) { + $connection = $exception->getConnection(); + $connection->disconnect(); + + if ($connection === $this->master && !$this->autoDiscovery) { + // Throw immediately when master connection is failing, even + // when the command represents a read-only operation, unless + // automatic discovery has been enabled. + throw $exception; + } else { + // Otherwise remove the failing slave and attempt to execute + // the command again on one of the remaining slaves... + $this->remove($connection); + } + + // ... that is, unless we have no more connections to use. + if (!$this->slaves && !$this->master) { + throw $exception; + } elseif ($this->autoDiscovery) { + $this->discover(); + } + } catch (MissingMasterException $exception) { + if ($this->autoDiscovery) { + $this->discover(); + } else { + throw $exception; + } + } + } + + return $response; + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $this->retryCommandOnFailure($command, __FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function readResponse(CommandInterface $command) + { + return $this->retryCommandOnFailure($command, __FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + return $this->retryCommandOnFailure($command, __FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function __sleep() + { + return ['master', 'slaves', 'pool', 'aliases', 'strategy']; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Replication/ReplicationInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Replication/ReplicationInterface.php new file mode 100644 index 000000000..14fd2499e --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/Replication/ReplicationInterface.php @@ -0,0 +1,53 @@ + + * @author Ville Mattila + */ +class SentinelReplication implements ReplicationInterface +{ + /** + * @var NodeConnectionInterface + */ + protected $master; + + /** + * @var NodeConnectionInterface[] + */ + protected $slaves = []; + + /** + * @var NodeConnectionInterface[] + */ + protected $pool = []; + + /** + * @var NodeConnectionInterface + */ + protected $current; + + /** + * @var string + */ + protected $service; + + /** + * @var ConnectionFactoryInterface + */ + protected $connectionFactory; + + /** + * @var ReplicationStrategy + */ + protected $strategy; + + /** + * @var NodeConnectionInterface[] + */ + protected $sentinels = []; + + /** + * @var int + */ + protected $sentinelIndex = 0; + + /** + * @var NodeConnectionInterface + */ + protected $sentinelConnection; + + /** + * @var float + */ + protected $sentinelTimeout = 0.100; + + /** + * Max number of automatic retries of commands upon server failure. + * + * -1 = unlimited retry attempts + * 0 = no retry attempts (fails immediately) + * n = fail only after n retry attempts + * + * @var int + */ + protected $retryLimit = 20; + + /** + * Time to wait in milliseconds before fetching a new configuration from one + * of the sentinel servers. + * + * @var int + */ + protected $retryWait = 1000; + + /** + * Flag for automatic fetching of available sentinels. + * + * @var bool + */ + protected $updateSentinels = false; + + /** + * @param string $service Name of the service for autodiscovery. + * @param array $sentinels Sentinel servers connection parameters. + * @param ConnectionFactoryInterface $connectionFactory Connection factory instance. + * @param ReplicationStrategy $strategy Replication strategy instance. + */ + public function __construct( + $service, + array $sentinels, + ConnectionFactoryInterface $connectionFactory, + ReplicationStrategy $strategy = null + ) { + $this->sentinels = $sentinels; + $this->service = $service; + $this->connectionFactory = $connectionFactory; + $this->strategy = $strategy ?: new ReplicationStrategy(); + } + + /** + * Sets a default timeout for connections to sentinels. + * + * When "timeout" is present in the connection parameters of sentinels, its + * value overrides the default sentinel timeout. + * + * @param float $timeout Timeout value. + */ + public function setSentinelTimeout($timeout) + { + $this->sentinelTimeout = (float) $timeout; + } + + /** + * Sets the maximum number of retries for commands upon server failure. + * + * -1 = unlimited retry attempts + * 0 = no retry attempts (fails immediately) + * n = fail only after n retry attempts + * + * @param int $retry Number of retry attempts. + */ + public function setRetryLimit($retry) + { + $this->retryLimit = (int) $retry; + } + + /** + * Sets the time to wait (in milliseconds) before fetching a new configuration + * from one of the sentinels. + * + * @param float $milliseconds Time to wait before the next attempt. + */ + public function setRetryWait($milliseconds) + { + $this->retryWait = (float) $milliseconds; + } + + /** + * Set automatic fetching of available sentinels. + * + * @param bool $update Enable or disable automatic updates. + */ + public function setUpdateSentinels($update) + { + $this->updateSentinels = (bool) $update; + } + + /** + * Resets the current connection. + */ + protected function reset() + { + $this->current = null; + } + + /** + * Wipes the current list of master and slaves nodes. + */ + protected function wipeServerList() + { + $this->reset(); + + $this->master = null; + $this->slaves = []; + $this->pool = []; + } + + /** + * {@inheritdoc} + */ + public function add(NodeConnectionInterface $connection) + { + $parameters = $connection->getParameters(); + $role = $parameters->role; + + if ('master' === $role) { + $this->master = $connection; + } elseif ('sentinel' === $role) { + $this->sentinels[] = $connection; + // sentinels are not considered part of the pool. + return; + } else { + // everything else is considered a slave. + $this->slaves[] = $connection; + } + + $this->pool[(string) $connection] = $connection; + + $this->reset(); + } + + /** + * {@inheritdoc} + */ + public function remove(NodeConnectionInterface $connection) + { + if ($connection === $this->master) { + $this->master = null; + } elseif (false !== $id = array_search($connection, $this->slaves, true)) { + unset($this->slaves[$id]); + } elseif (false !== $id = array_search($connection, $this->sentinels, true)) { + unset($this->sentinels[$id]); + + return true; + } else { + return false; + } + + unset($this->pool[(string) $connection]); + + $this->reset(); + + return true; + } + + /** + * Creates a new connection to a sentinel server. + * + * @return NodeConnectionInterface + */ + protected function createSentinelConnection($parameters) + { + if ($parameters instanceof NodeConnectionInterface) { + return $parameters; + } + + if (is_string($parameters)) { + $parameters = Parameters::parse($parameters); + } + + if (is_array($parameters)) { + // NOTE: sentinels do not accept AUTH and SELECT commands so we must + // explicitly set them to NULL to avoid problems when using default + // parameters set via client options. Actually AUTH is supported for + // sentinels starting with Redis 5 but we have to differentiate from + // sentinels passwords and nodes passwords, this will be implemented + // in a later release. + $parameters['database'] = null; + $parameters['username'] = null; + + // don't leak password from between configurations + // https://github.com/predis/predis/pull/807/#discussion_r985764770 + if (!isset($parameters['password'])) { + $parameters['password'] = null; + } + + if (!isset($parameters['timeout'])) { + $parameters['timeout'] = $this->sentinelTimeout; + } + } + + return $this->connectionFactory->create($parameters); + } + + /** + * Returns the current sentinel connection. + * + * If there is no active sentinel connection, a new connection is created. + * + * @return NodeConnectionInterface + */ + public function getSentinelConnection() + { + if (!$this->sentinelConnection) { + if ($this->sentinelIndex >= count($this->sentinels)) { + $this->sentinelIndex = 0; + throw new \Predis\ClientException('No sentinel server available for autodiscovery.'); + } + + $sentinel = $this->sentinels[$this->sentinelIndex]; + ++$this->sentinelIndex; + $this->sentinelConnection = $this->createSentinelConnection($sentinel); + } + + return $this->sentinelConnection; + } + + /** + * Fetches an updated list of sentinels from a sentinel. + */ + public function updateSentinels() + { + SENTINEL_QUERY: { + $sentinel = $this->getSentinelConnection(); + + try { + $payload = $sentinel->executeCommand( + RawCommand::create('SENTINEL', 'sentinels', $this->service) + ); + + $this->sentinels = []; + $this->sentinelIndex = 0; + // NOTE: sentinel server does not return itself, so we add it back. + $this->sentinels[] = $sentinel->getParameters()->toArray(); + + foreach ($payload as $sentinel) { + $this->sentinels[] = [ + 'host' => $sentinel[3], + 'port' => $sentinel[5], + 'role' => 'sentinel', + ]; + } + } catch (ConnectionException $exception) { + $this->sentinelConnection = null; + + goto SENTINEL_QUERY; + } + } + } + + /** + * Fetches the details for the master and slave servers from a sentinel. + */ + public function querySentinel() + { + $this->wipeServerList(); + + $this->updateSentinels(); + $this->getMaster(); + $this->getSlaves(); + } + + /** + * Handles error responses returned by redis-sentinel. + * + * @param NodeConnectionInterface $sentinel Connection to a sentinel server. + * @param ErrorResponseInterface $error Error response. + */ + private function handleSentinelErrorResponse(NodeConnectionInterface $sentinel, ErrorResponseInterface $error) + { + if ($error->getErrorType() === 'IDONTKNOW') { + throw new ConnectionException($sentinel, $error->getMessage()); + } else { + throw new ServerException($error->getMessage()); + } + } + + /** + * Fetches the details for the master server from a sentinel. + * + * @param NodeConnectionInterface $sentinel Connection to a sentinel server. + * @param string $service Name of the service. + * + * @return array + */ + protected function querySentinelForMaster(NodeConnectionInterface $sentinel, $service) + { + $payload = $sentinel->executeCommand( + RawCommand::create('SENTINEL', 'get-master-addr-by-name', $service) + ); + + if ($payload === null) { + throw new ServerException('ERR No such master with that name'); + } + + if ($payload instanceof ErrorResponseInterface) { + $this->handleSentinelErrorResponse($sentinel, $payload); + } + + return [ + 'host' => $payload[0], + 'port' => $payload[1], + 'role' => 'master', + ]; + } + + /** + * Fetches the details for the slave servers from a sentinel. + * + * @param NodeConnectionInterface $sentinel Connection to a sentinel server. + * @param string $service Name of the service. + * + * @return array + */ + protected function querySentinelForSlaves(NodeConnectionInterface $sentinel, $service) + { + $slaves = []; + + $payload = $sentinel->executeCommand( + RawCommand::create('SENTINEL', 'slaves', $service) + ); + + if ($payload instanceof ErrorResponseInterface) { + $this->handleSentinelErrorResponse($sentinel, $payload); + } + + foreach ($payload as $slave) { + $flags = explode(',', $slave[9]); + + if (array_intersect($flags, ['s_down', 'o_down', 'disconnected'])) { + continue; + } + + $slaves[] = [ + 'host' => $slave[3], + 'port' => $slave[5], + 'role' => 'slave', + ]; + } + + return $slaves; + } + + /** + * {@inheritdoc} + */ + public function getCurrent() + { + return $this->current; + } + + /** + * {@inheritdoc} + */ + public function getMaster() + { + if ($this->master) { + return $this->master; + } + + if ($this->updateSentinels) { + $this->updateSentinels(); + } + + SENTINEL_QUERY: { + $sentinel = $this->getSentinelConnection(); + + try { + $masterParameters = $this->querySentinelForMaster($sentinel, $this->service); + $masterConnection = $this->connectionFactory->create($masterParameters); + + $this->add($masterConnection); + } catch (ConnectionException $exception) { + $this->sentinelConnection = null; + + goto SENTINEL_QUERY; + } + } + + return $masterConnection; + } + + /** + * {@inheritdoc} + */ + public function getSlaves() + { + if ($this->slaves) { + return array_values($this->slaves); + } + + if ($this->updateSentinels) { + $this->updateSentinels(); + } + + SENTINEL_QUERY: { + $sentinel = $this->getSentinelConnection(); + + try { + $slavesParameters = $this->querySentinelForSlaves($sentinel, $this->service); + + foreach ($slavesParameters as $slaveParameters) { + $this->add($this->connectionFactory->create($slaveParameters)); + } + } catch (ConnectionException $exception) { + $this->sentinelConnection = null; + + goto SENTINEL_QUERY; + } + } + + return array_values($this->slaves); + } + + /** + * Returns a random slave. + * + * @return NodeConnectionInterface|null + */ + protected function pickSlave() + { + $slaves = $this->getSlaves(); + + return $slaves + ? $slaves[rand(1, count($slaves)) - 1] + : null; + } + + /** + * Returns the connection instance in charge for the given command. + * + * @param CommandInterface $command Command instance. + * + * @return NodeConnectionInterface + */ + private function getConnectionInternal(CommandInterface $command) + { + if (!$this->current) { + if ($this->strategy->isReadOperation($command) && $slave = $this->pickSlave()) { + $this->current = $slave; + } else { + $this->current = $this->getMaster(); + } + + return $this->current; + } + + if ($this->current === $this->master) { + return $this->current; + } + + if (!$this->strategy->isReadOperation($command)) { + $this->current = $this->getMaster(); + } + + return $this->current; + } + + /** + * Asserts that the specified connection matches an expected role. + * + * @param NodeConnectionInterface $connection Connection to a redis server. + * @param string $role Expected role of the server ("master", "slave" or "sentinel"). + * + * @throws RoleException|ConnectionException + */ + protected function assertConnectionRole(NodeConnectionInterface $connection, $role) + { + $role = strtolower($role); + $actualRole = $connection->executeCommand(RawCommand::create('ROLE')); + + if ($actualRole instanceof Error) { + throw new ConnectionException($connection, $actualRole->getMessage()); + } + + if ($role !== $actualRole[0]) { + throw new RoleException($connection, "Expected $role but got $actualRole[0] [$connection]"); + } + } + + /** + * {@inheritdoc} + */ + public function getConnectionByCommand(CommandInterface $command) + { + $connection = $this->getConnectionInternal($command); + + if (!$connection->isConnected()) { + // When we do not have any available slave in the pool we can expect + // read-only operations to hit the master server. + $expectedRole = $this->strategy->isReadOperation($command) && $this->slaves ? 'slave' : 'master'; + $this->assertConnectionRole($connection, $expectedRole); + } + + return $connection; + } + + /** + * {@inheritdoc} + */ + public function getConnectionById($id) + { + return $this->pool[$id] ?? null; + } + + /** + * Returns a connection by its role. + * + * @param string $role Connection role (`master`, `slave` or `sentinel`) + * + * @return NodeConnectionInterface|null + */ + public function getConnectionByRole($role) + { + if ($role === 'master') { + return $this->getMaster(); + } elseif ($role === 'slave') { + return $this->pickSlave(); + } elseif ($role === 'sentinel') { + return $this->getSentinelConnection(); + } else { + return null; + } + } + + /** + * Switches the internal connection in use by the backend. + * + * Sentinel connections are not considered as part of the pool, meaning that + * trying to switch to a sentinel will throw an exception. + * + * @param NodeConnectionInterface $connection Connection instance in the pool. + */ + public function switchTo(NodeConnectionInterface $connection) + { + if ($connection && $connection === $this->current) { + return; + } + + if ($connection !== $this->master && !in_array($connection, $this->slaves, true)) { + throw new InvalidArgumentException('Invalid connection or connection not found.'); + } + + $connection->connect(); + + if ($this->current) { + $this->current->disconnect(); + } + + $this->current = $connection; + } + + /** + * {@inheritdoc} + */ + public function switchToMaster() + { + $connection = $this->getConnectionByRole('master'); + $this->switchTo($connection); + } + + /** + * {@inheritdoc} + */ + public function switchToSlave() + { + $connection = $this->getConnectionByRole('slave'); + $this->switchTo($connection); + } + + /** + * {@inheritdoc} + */ + public function isConnected() + { + return $this->current ? $this->current->isConnected() : false; + } + + /** + * {@inheritdoc} + */ + public function connect() + { + if (!$this->current) { + if (!$this->current = $this->pickSlave()) { + $this->current = $this->getMaster(); + } + } + + $this->current->connect(); + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + foreach ($this->pool as $connection) { + $connection->disconnect(); + } + } + + /** + * Retries the execution of a command upon server failure after asking a new + * configuration to one of the sentinels. + * + * @param CommandInterface $command Command instance. + * @param string $method Actual method. + * + * @return mixed + */ + private function retryCommandOnFailure(CommandInterface $command, $method) + { + $retries = 0; + + while ($retries <= $this->retryLimit) { + try { + $response = $this->getConnectionByCommand($command)->$method($command); + break; + } catch (CommunicationException $exception) { + $this->wipeServerList(); + $exception->getConnection()->disconnect(); + + if ($retries === $this->retryLimit) { + throw $exception; + } + + usleep($this->retryWait * 1000); + + ++$retries; + } + } + + return $response; + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $this->retryCommandOnFailure($command, __FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function readResponse(CommandInterface $command) + { + return $this->retryCommandOnFailure($command, __FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + return $this->retryCommandOnFailure($command, __FUNCTION__); + } + + /** + * Returns the underlying replication strategy. + * + * @return ReplicationStrategy + */ + public function getReplicationStrategy() + { + return $this->strategy; + } + + /** + * {@inheritdoc} + */ + public function __sleep() + { + return [ + 'master', 'slaves', 'pool', 'service', 'sentinels', 'connectionFactory', 'strategy', + ]; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/StreamConnection.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/StreamConnection.php new file mode 100644 index 000000000..440253067 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/StreamConnection.php @@ -0,0 +1,369 @@ +parameters->persistent) && $this->parameters->persistent) { + return; + } + + $this->disconnect(); + } + + /** + * {@inheritdoc} + */ + protected function assertParameters(ParametersInterface $parameters) + { + switch ($parameters->scheme) { + case 'tcp': + case 'redis': + case 'unix': + case 'tls': + case 'rediss': + break; + + default: + throw new InvalidArgumentException("Invalid scheme: '$parameters->scheme'."); + } + + return $parameters; + } + + /** + * {@inheritdoc} + */ + protected function createResource() + { + switch ($this->parameters->scheme) { + case 'tcp': + case 'redis': + return $this->tcpStreamInitializer($this->parameters); + + case 'unix': + return $this->unixStreamInitializer($this->parameters); + + case 'tls': + case 'rediss': + return $this->tlsStreamInitializer($this->parameters); + + default: + throw new InvalidArgumentException("Invalid scheme: '{$this->parameters->scheme}'."); + } + } + + /** + * Creates a connected stream socket resource. + * + * @param ParametersInterface $parameters Connection parameters. + * @param string $address Address for stream_socket_client(). + * @param int $flags Flags for stream_socket_client(). + * + * @return resource + */ + protected function createStreamSocket(ParametersInterface $parameters, $address, $flags) + { + $timeout = (isset($parameters->timeout) ? (float) $parameters->timeout : 5.0); + $context = stream_context_create(['socket' => ['tcp_nodelay' => (bool) $parameters->tcp_nodelay]]); + + if (!$resource = @stream_socket_client($address, $errno, $errstr, $timeout, $flags, $context)) { + $this->onConnectionError(trim($errstr), $errno); + } + + if (isset($parameters->read_write_timeout)) { + $rwtimeout = (float) $parameters->read_write_timeout; + $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; + $timeoutSeconds = floor($rwtimeout); + $timeoutUSeconds = ($rwtimeout - $timeoutSeconds) * 1000000; + stream_set_timeout($resource, $timeoutSeconds, $timeoutUSeconds); + } + + return $resource; + } + + /** + * Initializes a TCP stream resource. + * + * @param ParametersInterface $parameters Initialization parameters for the connection. + * + * @return resource + */ + protected function tcpStreamInitializer(ParametersInterface $parameters) + { + if (!filter_var($parameters->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + $address = "tcp://$parameters->host:$parameters->port"; + } else { + $address = "tcp://[$parameters->host]:$parameters->port"; + } + + $flags = STREAM_CLIENT_CONNECT; + + if (isset($parameters->async_connect) && $parameters->async_connect) { + $flags |= STREAM_CLIENT_ASYNC_CONNECT; + } + + if (isset($parameters->persistent)) { + if (false !== $persistent = filter_var($parameters->persistent, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)) { + $flags |= STREAM_CLIENT_PERSISTENT; + + if ($persistent === null) { + $address = "{$address}/{$parameters->persistent}"; + } + } + } + + return $this->createStreamSocket($parameters, $address, $flags); + } + + /** + * Initializes a UNIX stream resource. + * + * @param ParametersInterface $parameters Initialization parameters for the connection. + * + * @return resource + */ + protected function unixStreamInitializer(ParametersInterface $parameters) + { + if (!isset($parameters->path)) { + throw new InvalidArgumentException('Missing UNIX domain socket path.'); + } + + $flags = STREAM_CLIENT_CONNECT; + + if (isset($parameters->persistent)) { + if (false !== $persistent = filter_var($parameters->persistent, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)) { + $flags |= STREAM_CLIENT_PERSISTENT; + + if ($persistent === null) { + throw new InvalidArgumentException( + 'Persistent connection IDs are not supported when using UNIX domain sockets.' + ); + } + } + } + + return $this->createStreamSocket($parameters, "unix://{$parameters->path}", $flags); + } + + /** + * Initializes a SSL-encrypted TCP stream resource. + * + * @param ParametersInterface $parameters Initialization parameters for the connection. + * + * @return resource + */ + protected function tlsStreamInitializer(ParametersInterface $parameters) + { + $resource = $this->tcpStreamInitializer($parameters); + $metadata = stream_get_meta_data($resource); + + // Detect if crypto mode is already enabled for this stream (PHP >= 7.0.0). + if (isset($metadata['crypto'])) { + return $resource; + } + + if (isset($parameters->ssl) && is_array($parameters->ssl)) { + $options = $parameters->ssl; + } else { + $options = []; + } + + if (!isset($options['crypto_type'])) { + $options['crypto_type'] = STREAM_CRYPTO_METHOD_TLS_CLIENT; + } + + if (!stream_context_set_option($resource, ['ssl' => $options])) { + $this->onConnectionError('Error while setting SSL context options'); + } + + if (!stream_socket_enable_crypto($resource, true, $options['crypto_type'])) { + $this->onConnectionError('Error while switching to encrypted communication'); + } + + return $resource; + } + + /** + * {@inheritdoc} + */ + public function connect() + { + if (parent::connect() && $this->initCommands) { + foreach ($this->initCommands as $command) { + $response = $this->executeCommand($command); + + if ($response instanceof ErrorResponseInterface) { + $this->onConnectionError("`{$command->getId()}` failed: {$response->getMessage()}", 0); + } + } + } + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + if ($this->isConnected()) { + fclose($this->getResource()); + parent::disconnect(); + } + } + + /** + * Performs a write operation over the stream of the buffer containing a + * command serialized with the Redis wire protocol. + * + * @param string $buffer Representation of a command in the Redis wire protocol. + */ + protected function write($buffer) + { + $socket = $this->getResource(); + + while (($length = strlen($buffer)) > 0) { + $written = is_resource($socket) ? @fwrite($socket, $buffer) : false; + + if ($length === $written) { + return; + } + + if ($written === false || $written === 0) { + $this->onConnectionError('Error while writing bytes to the server.'); + } + + $buffer = substr($buffer, $written); + } + } + + /** + * {@inheritdoc} + */ + public function read() + { + $socket = $this->getResource(); + $chunk = fgets($socket); + + if ($chunk === false || $chunk === '') { + $this->onConnectionError('Error while reading line from the server.'); + } + + $prefix = $chunk[0]; + $payload = substr($chunk, 1, -2); + + switch ($prefix) { + case '+': + return StatusResponse::get($payload); + + case '$': + $size = (int) $payload; + + if ($size === -1) { + return; + } + + $bulkData = ''; + $bytesLeft = ($size += 2); + + do { + $chunk = is_resource($socket) ? fread($socket, min($bytesLeft, 4096)) : false; + + if ($chunk === false || $chunk === '') { + $this->onConnectionError('Error while reading bytes from the server.'); + } + + $bulkData .= $chunk; + $bytesLeft = $size - strlen($bulkData); + } while ($bytesLeft > 0); + + return substr($bulkData, 0, -2); + + case '*': + $count = (int) $payload; + + if ($count === -1) { + return; + } + + $multibulk = []; + + for ($i = 0; $i < $count; ++$i) { + $multibulk[$i] = $this->read(); + } + + return $multibulk; + + case ':': + $integer = (int) $payload; + + return $integer == $payload ? $integer : $payload; + + case '-': + return new ErrorResponse($payload); + + default: + $this->onProtocolError("Unknown response prefix: '$prefix'."); + + return; + } + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $commandID = $command->getId(); + $arguments = $command->getArguments(); + + $cmdlen = strlen($commandID); + $reqlen = count($arguments) + 1; + + $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandID}\r\n"; + + foreach ($arguments as $argument) { + $arglen = strlen(strval($argument)); + $buffer .= "\${$arglen}\r\n{$argument}\r\n"; + } + + $this->write($buffer); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/WebdisConnection.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/WebdisConnection.php new file mode 100644 index 000000000..bd533783b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Connection/WebdisConnection.php @@ -0,0 +1,366 @@ +assertExtensions(); + + if ($parameters->scheme !== 'http') { + throw new InvalidArgumentException("Invalid scheme: '{$parameters->scheme}'."); + } + + $this->parameters = $parameters; + + $this->resource = $this->createCurl(); + $this->reader = $this->createReader(); + } + + /** + * Frees the underlying cURL and protocol reader resources when the garbage + * collector kicks in. + */ + public function __destruct() + { + curl_close($this->resource); + phpiredis_reader_destroy($this->reader); + } + + /** + * Helper method used to throw on unsupported methods. + * + * @param string $method Name of the unsupported method. + * + * @throws NotSupportedException + */ + private function throwNotSupportedException($method) + { + $class = __CLASS__; + throw new NotSupportedException("The method $class::$method() is not supported."); + } + + /** + * Checks if the cURL and phpiredis extensions are loaded in PHP. + */ + private function assertExtensions() + { + if (!extension_loaded('curl')) { + throw new NotSupportedException( + 'The "curl" extension is required by this connection backend.' + ); + } + + if (!extension_loaded('phpiredis')) { + throw new NotSupportedException( + 'The "phpiredis" extension is required by this connection backend.' + ); + } + } + + /** + * Initializes cURL. + * + * @return resource + */ + private function createCurl() + { + $parameters = $this->getParameters(); + $timeout = (isset($parameters->timeout) ? (float) $parameters->timeout : 5.0) * 1000; + + if (filter_var($host = $parameters->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + $host = "[$host]"; + } + + $options = [ + CURLOPT_FAILONERROR => true, + CURLOPT_CONNECTTIMEOUT_MS => $timeout, + CURLOPT_URL => "$parameters->scheme://$host:$parameters->port", + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_POST => true, + CURLOPT_WRITEFUNCTION => [$this, 'feedReader'], + ]; + + if (isset($parameters->user, $parameters->pass)) { + $options[CURLOPT_USERPWD] = "{$parameters->user}:{$parameters->pass}"; + } + + curl_setopt_array($resource = curl_init(), $options); + + return $resource; + } + + /** + * Initializes the phpiredis protocol reader. + * + * @return resource + */ + private function createReader() + { + $reader = phpiredis_reader_create(); + + phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); + phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); + + return $reader; + } + + /** + * Returns the handler used by the protocol reader for inline responses. + * + * @return Closure + */ + protected function getStatusHandler() + { + static $statusHandler; + + if (!$statusHandler) { + $statusHandler = function ($payload) { + return StatusResponse::get($payload); + }; + } + + return $statusHandler; + } + + /** + * Returns the handler used by the protocol reader for error responses. + * + * @return Closure + */ + protected function getErrorHandler() + { + static $errorHandler; + + if (!$errorHandler) { + $errorHandler = function ($errorMessage) { + return new ErrorResponse($errorMessage); + }; + } + + return $errorHandler; + } + + /** + * Feeds the phpredis reader resource with the data read from the network. + * + * @param resource $resource Reader resource. + * @param string $buffer Buffer of data read from a connection. + * + * @return int + */ + protected function feedReader($resource, $buffer) + { + phpiredis_reader_feed($this->reader, $buffer); + + return strlen($buffer); + } + + /** + * {@inheritdoc} + */ + public function connect() + { + // NOOP + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + // NOOP + } + + /** + * {@inheritdoc} + */ + public function isConnected() + { + return true; + } + + /** + * Checks if the specified command is supported by this connection class. + * + * @param CommandInterface $command Command instance. + * + * @return string + * @throws NotSupportedException + */ + protected function getCommandId(CommandInterface $command) + { + switch ($commandID = $command->getId()) { + case 'AUTH': + case 'SELECT': + case 'MULTI': + case 'EXEC': + case 'WATCH': + case 'UNWATCH': + case 'DISCARD': + case 'MONITOR': + throw new NotSupportedException("Command '$commandID' is not allowed by Webdis."); + default: + return $commandID; + } + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $this->throwNotSupportedException(__FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function readResponse(CommandInterface $command) + { + $this->throwNotSupportedException(__FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + $resource = $this->resource; + $commandId = $this->getCommandId($command); + + if ($arguments = $command->getArguments()) { + $arguments = implode('/', array_map('urlencode', $arguments)); + $serializedCommand = "$commandId/$arguments.raw"; + } else { + $serializedCommand = "$commandId.raw"; + } + + curl_setopt($resource, CURLOPT_POSTFIELDS, $serializedCommand); + + if (curl_exec($resource) === false) { + $error = trim(curl_error($resource)); + $errno = curl_errno($resource); + + throw new ConnectionException($this, "$error{$this->getParameters()}]", $errno); + } + + if (phpiredis_reader_get_state($this->reader) !== PHPIREDIS_READER_STATE_COMPLETE) { + throw new ProtocolException($this, phpiredis_reader_get_error($this->reader)); + } + + return phpiredis_reader_get_reply($this->reader); + } + + /** + * {@inheritdoc} + */ + public function getResource() + { + return $this->resource; + } + + /** + * {@inheritdoc} + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * {@inheritdoc} + */ + public function addConnectCommand(CommandInterface $command) + { + $this->throwNotSupportedException(__FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function read() + { + $this->throwNotSupportedException(__FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return "{$this->parameters->host}:{$this->parameters->port}"; + } + + /** + * {@inheritdoc} + */ + public function __sleep() + { + return ['parameters']; + } + + /** + * {@inheritdoc} + */ + public function __wakeup() + { + $this->assertExtensions(); + + $this->resource = $this->createCurl(); + $this->reader = $this->createReader(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Monitor/Consumer.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Monitor/Consumer.php new file mode 100644 index 000000000..eb46b049f --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Monitor/Consumer.php @@ -0,0 +1,179 @@ +assertClient($client); + + $this->client = $client; + + $this->start(); + } + + /** + * Automatically stops the consumer when the garbage collector kicks in. + */ + public function __destruct() + { + $this->stop(); + } + + /** + * Checks if the passed client instance satisfies the required conditions + * needed to initialize a monitor consumer. + * + * @param ClientInterface $client Client instance used by the consumer. + * + * @throws NotSupportedException + */ + private function assertClient(ClientInterface $client) + { + if ($client->getConnection() instanceof ClusterInterface) { + throw new NotSupportedException( + 'Cannot initialize a monitor consumer over cluster connections.' + ); + } + + if (!$client->getCommandFactory()->supports('MONITOR')) { + throw new NotSupportedException("'MONITOR' is not supported by the current command factory."); + } + } + + /** + * Initializes the consumer and sends the MONITOR command to the server. + */ + protected function start() + { + $this->client->executeCommand( + $this->client->createCommand('MONITOR') + ); + $this->valid = true; + } + + /** + * Stops the consumer. Internally this is done by disconnecting from server + * since there is no way to terminate the stream initialized by MONITOR. + */ + public function stop() + { + $this->client->disconnect(); + $this->valid = false; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function rewind() + { + // NOOP + } + + /** + * Returns the last message payload retrieved from the server. + * + * @return object + */ + #[ReturnTypeWillChange] + public function current() + { + return $this->getValue(); + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function key() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function next() + { + ++$this->position; + } + + /** + * Checks if the the consumer is still in a valid state to continue. + * + * @return bool + */ + #[ReturnTypeWillChange] + public function valid() + { + return $this->valid; + } + + /** + * Waits for a new message from the server generated by MONITOR and returns + * it when available. + * + * @return object + */ + private function getValue() + { + $database = 0; + $client = null; + $event = $this->client->getConnection()->read(); + + $callback = function ($matches) use (&$database, &$client) { + if (2 === $count = count($matches)) { + // Redis <= 2.4 + $database = (int) $matches[1]; + } + + if (4 === $count) { + // Redis >= 2.6 + $database = (int) $matches[2]; + $client = $matches[3]; + } + + return ' '; + }; + + $event = preg_replace_callback('/ \(db (\d+)\) | \[(\d+) (.*?)\] /', $callback, $event, 1); + @[$timestamp, $command, $arguments] = explode(' ', $event, 3); + + return (object) [ + 'timestamp' => (float) $timestamp, + 'database' => $database, + 'client' => $client, + 'command' => substr($command, 1, -1), + 'arguments' => $arguments, + ]; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/NotSupportedException.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/NotSupportedException.php new file mode 100644 index 000000000..037696b68 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/NotSupportedException.php @@ -0,0 +1,21 @@ +getCommandFactory()->supports('multi', 'exec', 'discard')) { + throw new ClientException( + "'MULTI', 'EXEC' and 'DISCARD' are not supported by the current command factory." + ); + } + + parent::__construct($client); + } + + /** + * {@inheritdoc} + */ + protected function getConnection() + { + $connection = $this->getClient()->getConnection(); + + if (!$connection instanceof NodeConnectionInterface) { + $class = __CLASS__; + + throw new ClientException("The class '$class' does not support aggregate connections."); + } + + return $connection; + } + + /** + * {@inheritdoc} + */ + protected function executePipeline(ConnectionInterface $connection, SplQueue $commands) + { + $commandFactory = $this->getClient()->getCommandFactory(); + $connection->executeCommand($commandFactory->create('multi')); + + foreach ($commands as $command) { + $connection->writeRequest($command); + } + + foreach ($commands as $command) { + $response = $connection->readResponse($command); + + if ($response instanceof ErrorResponseInterface) { + $connection->executeCommand($commandFactory->create('discard')); + throw new ServerException($response->getMessage()); + } + } + + $executed = $connection->executeCommand($commandFactory->create('exec')); + + if (!isset($executed)) { + throw new ClientException( + 'The underlying transaction has been aborted by the server.' + ); + } + + if (count($executed) !== count($commands)) { + $expected = count($commands); + $received = count($executed); + + throw new ClientException( + "Invalid number of responses [expected $expected, received $received]." + ); + } + + $responses = []; + $sizeOfPipe = count($commands); + $exceptions = $this->throwServerExceptions(); + + for ($i = 0; $i < $sizeOfPipe; ++$i) { + $command = $commands->dequeue(); + $response = $executed[$i]; + + if (!$response instanceof ResponseInterface) { + $responses[] = $command->parseResponse($response); + } elseif ($response instanceof ErrorResponseInterface && $exceptions) { + $this->exception($connection, $response); + } else { + $responses[] = $response; + } + + unset($executed[$i]); + } + + return $responses; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/ConnectionErrorProof.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/ConnectionErrorProof.php new file mode 100644 index 000000000..8f995cf07 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/ConnectionErrorProof.php @@ -0,0 +1,128 @@ +getClient()->getConnection(); + } + + /** + * {@inheritdoc} + */ + protected function executePipeline(ConnectionInterface $connection, SplQueue $commands) + { + if ($connection instanceof NodeConnectionInterface) { + return $this->executeSingleNode($connection, $commands); + } elseif ($connection instanceof ClusterInterface) { + return $this->executeCluster($connection, $commands); + } else { + $class = get_class($connection); + + throw new NotSupportedException("The connection class '$class' is not supported."); + } + } + + /** + * {@inheritdoc} + */ + protected function executeSingleNode(NodeConnectionInterface $connection, SplQueue $commands) + { + $responses = []; + $sizeOfPipe = count($commands); + + foreach ($commands as $command) { + try { + $connection->writeRequest($command); + } catch (CommunicationException $exception) { + return array_fill(0, $sizeOfPipe, $exception); + } + } + + for ($i = 0; $i < $sizeOfPipe; ++$i) { + $command = $commands->dequeue(); + + try { + $responses[$i] = $connection->readResponse($command); + } catch (CommunicationException $exception) { + $add = count($commands) - count($responses); + $responses = array_merge($responses, array_fill(0, $add, $exception)); + + break; + } + } + + return $responses; + } + + /** + * {@inheritdoc} + */ + protected function executeCluster(ClusterInterface $connection, SplQueue $commands) + { + $responses = []; + $sizeOfPipe = count($commands); + $exceptions = []; + + foreach ($commands as $command) { + $cmdConnection = $connection->getConnectionByCommand($command); + + if (isset($exceptions[spl_object_hash($cmdConnection)])) { + continue; + } + + try { + $cmdConnection->writeRequest($command); + } catch (CommunicationException $exception) { + $exceptions[spl_object_hash($cmdConnection)] = $exception; + } + } + + for ($i = 0; $i < $sizeOfPipe; ++$i) { + $command = $commands->dequeue(); + + $cmdConnection = $connection->getConnectionByCommand($command); + $connectionHash = spl_object_hash($cmdConnection); + + if (isset($exceptions[$connectionHash])) { + $responses[$i] = $exceptions[$connectionHash]; + continue; + } + + try { + $responses[$i] = $cmdConnection->readResponse($command); + } catch (CommunicationException $exception) { + $responses[$i] = $exception; + $exceptions[$connectionHash] = $exception; + } + } + + return $responses; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/FireAndForget.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/FireAndForget.php new file mode 100644 index 000000000..75ee88eb2 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/FireAndForget.php @@ -0,0 +1,36 @@ +isEmpty()) { + $connection->writeRequest($commands->dequeue()); + } + + $connection->disconnect(); + + return []; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/Pipeline.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/Pipeline.php new file mode 100644 index 000000000..3e1011f2b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Pipeline/Pipeline.php @@ -0,0 +1,248 @@ +client = $client; + $this->pipeline = new SplQueue(); + } + + /** + * Queues a command into the pipeline buffer. + * + * @param string $method Command ID. + * @param array $arguments Arguments for the command. + * + * @return $this + */ + public function __call($method, $arguments) + { + $command = $this->client->createCommand($method, $arguments); + $this->recordCommand($command); + + return $this; + } + + /** + * Queues a command instance into the pipeline buffer. + * + * @param CommandInterface $command Command to be queued in the buffer. + */ + protected function recordCommand(CommandInterface $command) + { + $this->pipeline->enqueue($command); + } + + /** + * Queues a command instance into the pipeline buffer. + * + * @param CommandInterface $command Command instance to be queued in the buffer. + * + * @return $this + */ + public function executeCommand(CommandInterface $command) + { + $this->recordCommand($command); + + return $this; + } + + /** + * Throws an exception on -ERR responses returned by Redis. + * + * @param ConnectionInterface $connection Redis connection that returned the error. + * @param ErrorResponseInterface $response Instance of the error response. + * + * @throws ServerException + */ + protected function exception(ConnectionInterface $connection, ErrorResponseInterface $response) + { + $connection->disconnect(); + $message = $response->getMessage(); + + throw new ServerException($message); + } + + /** + * Returns the underlying connection to be used by the pipeline. + * + * @return ConnectionInterface + */ + protected function getConnection() + { + $connection = $this->getClient()->getConnection(); + + if ($connection instanceof ReplicationInterface) { + $connection->switchToMaster(); + } + + return $connection; + } + + /** + * Implements the logic to flush the queued commands and read the responses + * from the current connection. + * + * @param ConnectionInterface $connection Current connection instance. + * @param SplQueue $commands Queued commands. + * + * @return array + */ + protected function executePipeline(ConnectionInterface $connection, SplQueue $commands) + { + foreach ($commands as $command) { + $connection->writeRequest($command); + } + + $responses = []; + $exceptions = $this->throwServerExceptions(); + + while (!$commands->isEmpty()) { + $command = $commands->dequeue(); + $response = $connection->readResponse($command); + + if (!$response instanceof ResponseInterface) { + $responses[] = $command->parseResponse($response); + } elseif ($response instanceof ErrorResponseInterface && $exceptions) { + $this->exception($connection, $response); + } else { + $responses[] = $response; + } + } + + return $responses; + } + + /** + * Flushes the buffer holding all of the commands queued so far. + * + * @param bool $send Specifies if the commands in the buffer should be sent to Redis. + * + * @return $this + */ + public function flushPipeline($send = true) + { + if ($send && !$this->pipeline->isEmpty()) { + $responses = $this->executePipeline($this->getConnection(), $this->pipeline); + $this->responses = array_merge($this->responses, $responses); + } else { + $this->pipeline = new SplQueue(); + } + + return $this; + } + + /** + * Marks the running status of the pipeline. + * + * @param bool $bool Sets the running status of the pipeline. + * + * @throws ClientException + */ + private function setRunning($bool) + { + if ($bool && $this->running) { + throw new ClientException('The current pipeline context is already being executed.'); + } + + $this->running = $bool; + } + + /** + * Handles the actual execution of the whole pipeline. + * + * @param mixed $callable Optional callback for execution. + * + * @return array + * @throws Exception + * @throws InvalidArgumentException + */ + public function execute($callable = null) + { + if ($callable && !is_callable($callable)) { + throw new InvalidArgumentException('The argument must be a callable object.'); + } + + $exception = null; + $this->setRunning(true); + + try { + if ($callable) { + call_user_func($callable, $this); + } + + $this->flushPipeline(); + } catch (Exception $exception) { + // NOOP + } + + $this->setRunning(false); + + if ($exception) { + throw $exception; + } + + return $this->responses; + } + + /** + * Returns if the pipeline should throw exceptions on server errors. + * + * @return bool + */ + protected function throwServerExceptions() + { + return (bool) $this->client->getOptions()->exceptions; + } + + /** + * Returns the underlying client instance used by the pipeline object. + * + * @return ClientInterface + */ + public function getClient() + { + return $this->client; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PredisException.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PredisException.php new file mode 100644 index 000000000..8e124225d --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PredisException.php @@ -0,0 +1,22 @@ +setRequestSerializer($serializer ?: new RequestSerializer()); + $this->setResponseReader($reader ?: new ResponseReader()); + } + + /** + * {@inheritdoc} + */ + public function write(CompositeConnectionInterface $connection, CommandInterface $command) + { + $connection->writeBuffer($this->serializer->serialize($command)); + } + + /** + * {@inheritdoc} + */ + public function read(CompositeConnectionInterface $connection) + { + return $this->reader->read($connection); + } + + /** + * Sets the request serializer used by the protocol processor. + * + * @param RequestSerializerInterface $serializer Request serializer. + */ + public function setRequestSerializer(RequestSerializerInterface $serializer) + { + $this->serializer = $serializer; + } + + /** + * Returns the request serializer used by the protocol processor. + * + * @return RequestSerializerInterface + */ + public function getRequestSerializer() + { + return $this->serializer; + } + + /** + * Sets the response reader used by the protocol processor. + * + * @param ResponseReaderInterface $reader Response reader. + */ + public function setResponseReader(ResponseReaderInterface $reader) + { + $this->reader = $reader; + } + + /** + * Returns the Response reader used by the protocol processor. + * + * @return ResponseReaderInterface + */ + public function getResponseReader() + { + return $this->reader; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/BulkResponse.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/BulkResponse.php new file mode 100644 index 000000000..961c01188 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/BulkResponse.php @@ -0,0 +1,54 @@ +getParameters()}]" + )); + } + + if ($length >= 0) { + return substr($connection->readBuffer($length + 2), 0, -2); + } + + if ($length == -1) { + return; + } + + CommunicationException::handle(new ProtocolException( + $connection, "Value '$payload' is not a valid length for a bulk response [{$connection->getParameters()}]" + )); + + return; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/ErrorResponse.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/ErrorResponse.php new file mode 100644 index 000000000..aa400a47b --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/ErrorResponse.php @@ -0,0 +1,33 @@ +getParameters()}]" + )); + } + + return; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/MultiBulkResponse.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/MultiBulkResponse.php new file mode 100644 index 000000000..d9c51425d --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/MultiBulkResponse.php @@ -0,0 +1,67 @@ +getParameters()}]" + )); + } + + if ($length === -1) { + return; + } + + $list = []; + + if ($length > 0) { + $handlersCache = []; + $reader = $connection->getProtocol()->getResponseReader(); + + for ($i = 0; $i < $length; ++$i) { + $header = $connection->readLine(); + $prefix = $header[0]; + + if (isset($handlersCache[$prefix])) { + $handler = $handlersCache[$prefix]; + } else { + $handler = $reader->getHandler($prefix); + $handlersCache[$prefix] = $handler; + } + + $list[$i] = $handler->handle($connection, substr($header, 1)); + } + } + + return $list; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/ResponseHandlerInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/ResponseHandlerInterface.php new file mode 100644 index 000000000..b1c90665a --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/Handler/ResponseHandlerInterface.php @@ -0,0 +1,32 @@ +getParameters()}]" + )); + } + + return new MultiBulkIterator($connection, $length); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/ProtocolProcessor.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/ProtocolProcessor.php new file mode 100644 index 000000000..02e0c5d58 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/ProtocolProcessor.php @@ -0,0 +1,120 @@ +mbiterable = false; + $this->serializer = new RequestSerializer(); + } + + /** + * {@inheritdoc} + */ + public function write(CompositeConnectionInterface $connection, CommandInterface $command) + { + $request = $this->serializer->serialize($command); + $connection->writeBuffer($request); + } + + /** + * {@inheritdoc} + */ + public function read(CompositeConnectionInterface $connection) + { + $chunk = $connection->readLine(); + $prefix = $chunk[0]; + $payload = substr($chunk, 1); + + switch ($prefix) { + case '+': + return new StatusResponse($payload); + + case '$': + $size = (int) $payload; + if ($size === -1) { + return; + } + + return substr($connection->readBuffer($size + 2), 0, -2); + + case '*': + $count = (int) $payload; + + if ($count === -1) { + return; + } + if ($this->mbiterable) { + return new MultiBulkIterator($connection, $count); + } + + $multibulk = []; + + for ($i = 0; $i < $count; ++$i) { + $multibulk[$i] = $this->read($connection); + } + + return $multibulk; + + case ':': + $integer = (int) $payload; + + return $integer == $payload ? $integer : $payload; + + case '-': + return new ErrorResponse($payload); + + default: + CommunicationException::handle(new ProtocolException( + $connection, "Unknown response prefix: '$prefix' [{$connection->getParameters()}]" + )); + + return; + } + } + + /** + * Enables or disables returning multibulk responses as specialized PHP + * iterators used to stream bulk elements of a multibulk response instead + * returning a plain array. + * + * Streamable multibulk responses are not globally supported by the + * abstractions built-in into Predis, such as transactions or pipelines. + * Use them with care! + * + * @param bool $value Enable or disable streamable multibulk responses. + */ + public function useIterableMultibulk($value) + { + $this->mbiterable = (bool) $value; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/RequestSerializer.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/RequestSerializer.php new file mode 100644 index 000000000..853bae03a --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/RequestSerializer.php @@ -0,0 +1,45 @@ +getId(); + $arguments = $command->getArguments(); + + $cmdlen = strlen($commandID); + $reqlen = count($arguments) + 1; + + $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandID}\r\n"; + + foreach ($arguments as $argument) { + $arglen = strlen($argument); + $buffer .= "\${$arglen}\r\n{$argument}\r\n"; + } + + return $buffer; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/ResponseReader.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/ResponseReader.php new file mode 100644 index 000000000..f49c96d26 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Protocol/Text/ResponseReader.php @@ -0,0 +1,110 @@ +handlers = $this->getDefaultHandlers(); + } + + /** + * Returns the default handlers for the supported type of responses. + * + * @return array + */ + protected function getDefaultHandlers() + { + return [ + '+' => new Handler\StatusResponse(), + '-' => new Handler\ErrorResponse(), + ':' => new Handler\IntegerResponse(), + '$' => new Handler\BulkResponse(), + '*' => new Handler\MultiBulkResponse(), + ]; + } + + /** + * Sets the handler for the specified prefix identifying the response type. + * + * @param string $prefix Identifier of the type of response. + * @param Handler\ResponseHandlerInterface $handler Response handler. + */ + public function setHandler($prefix, Handler\ResponseHandlerInterface $handler) + { + $this->handlers[$prefix] = $handler; + } + + /** + * Returns the response handler associated to a certain type of response. + * + * @param string $prefix Identifier of the type of response. + * + * @return Handler\ResponseHandlerInterface + */ + public function getHandler($prefix) + { + if (isset($this->handlers[$prefix])) { + return $this->handlers[$prefix]; + } + + return; + } + + /** + * {@inheritdoc} + */ + public function read(CompositeConnectionInterface $connection) + { + $header = $connection->readLine(); + + if ($header === '') { + $this->onProtocolError($connection, 'Unexpected empty response header'); + } + + $prefix = $header[0]; + + if (!isset($this->handlers[$prefix])) { + $this->onProtocolError($connection, "Unknown response prefix: '$prefix'"); + } + + return $this->handlers[$prefix]->handle($connection, substr($header, 1)); + } + + /** + * Handles protocol errors generated while reading responses from a + * connection. + * + * @param CompositeConnectionInterface $connection Redis connection that generated the error. + * @param string $message Error message. + */ + protected function onProtocolError(CompositeConnectionInterface $connection, $message) + { + CommunicationException::handle( + new ProtocolException($connection, "$message [{$connection->getParameters()}]") + ); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/AbstractConsumer.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/AbstractConsumer.php new file mode 100644 index 000000000..f764693df --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/AbstractConsumer.php @@ -0,0 +1,226 @@ +stop(true); + } + + /** + * Checks if the specified flag is valid based on the state of the consumer. + * + * @param int $value Flag. + * + * @return bool + */ + protected function isFlagSet($value) + { + return ($this->statusFlags & $value) === $value; + } + + /** + * Subscribes to the specified channels. + * + * @param string ...$channel One or more channel names. + */ + public function subscribe($channel /* , ... */) + { + $this->writeRequest(self::SUBSCRIBE, func_get_args()); + $this->statusFlags |= self::STATUS_SUBSCRIBED; + } + + /** + * Unsubscribes from the specified channels. + * + * @param string ...$channel One or more channel names. + */ + public function unsubscribe(...$channel) + { + $this->writeRequest(self::UNSUBSCRIBE, func_get_args()); + } + + /** + * Subscribes to the specified channels using a pattern. + * + * @param string ...$pattern One or more channel name patterns. + */ + public function psubscribe(...$pattern) + { + $this->writeRequest(self::PSUBSCRIBE, func_get_args()); + $this->statusFlags |= self::STATUS_PSUBSCRIBED; + } + + /** + * Unsubscribes from the specified channels using a pattern. + * + * @param string ...$pattern One or more channel name patterns. + */ + public function punsubscribe(...$pattern) + { + $this->writeRequest(self::PUNSUBSCRIBE, func_get_args()); + } + + /** + * PING the server with an optional payload that will be echoed as a + * PONG message in the pub/sub loop. + * + * @param string $payload Optional PING payload. + */ + public function ping($payload = null) + { + $this->writeRequest('PING', [$payload]); + } + + /** + * Closes the context by unsubscribing from all the subscribed channels. The + * context can be forcefully closed by dropping the underlying connection. + * + * @param bool $drop Indicates if the context should be closed by dropping the connection. + * + * @return bool Returns false when there are no pending messages. + */ + public function stop($drop = false) + { + if (!$this->valid()) { + return false; + } + + if ($drop) { + $this->invalidate(); + $this->disconnect(); + } else { + if ($this->isFlagSet(self::STATUS_SUBSCRIBED)) { + $this->unsubscribe(); + } + if ($this->isFlagSet(self::STATUS_PSUBSCRIBED)) { + $this->punsubscribe(); + } + } + + return !$drop; + } + + /** + * Closes the underlying connection when forcing a disconnection. + */ + abstract protected function disconnect(); + + /** + * Writes a Redis command on the underlying connection. + * + * @param string $method Command ID. + * @param array $arguments Arguments for the command. + */ + abstract protected function writeRequest($method, $arguments); + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function rewind() + { + // NOOP + } + + /** + * Returns the last message payload retrieved from the server and generated + * by one of the active subscriptions. + * + * @return array + */ + #[ReturnTypeWillChange] + public function current() + { + return $this->getValue(); + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function key() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function next() + { + if ($this->valid()) { + ++$this->position; + } + + return $this->position; + } + + /** + * Checks if the the consumer is still in a valid state to continue. + * + * @return bool + */ + #[ReturnTypeWillChange] + public function valid() + { + $isValid = $this->isFlagSet(self::STATUS_VALID); + $subscriptionFlags = self::STATUS_SUBSCRIBED | self::STATUS_PSUBSCRIBED; + $hasSubscriptions = ($this->statusFlags & $subscriptionFlags) > 0; + + return $isValid && $hasSubscriptions; + } + + /** + * Resets the state of the consumer. + */ + protected function invalidate() + { + $this->statusFlags = 0; // 0b0000; + } + + /** + * Waits for a new message from the server generated by one of the active + * subscriptions and returns it when available. + * + * @return array + */ + abstract protected function getValue(); +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/Consumer.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/Consumer.php new file mode 100644 index 000000000..253c33fd4 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/Consumer.php @@ -0,0 +1,157 @@ +checkCapabilities($client); + + $this->options = $options ?: []; + $this->client = $client; + + $this->genericSubscribeInit('subscribe'); + $this->genericSubscribeInit('psubscribe'); + } + + /** + * Returns the underlying client instance used by the pub/sub iterator. + * + * @return ClientInterface + */ + public function getClient() + { + return $this->client; + } + + /** + * Checks if the client instance satisfies the required conditions needed to + * initialize a PUB/SUB consumer. + * + * @param ClientInterface $client Client instance used by the consumer. + * + * @throws NotSupportedException + */ + private function checkCapabilities(ClientInterface $client) + { + if ($client->getConnection() instanceof ClusterInterface) { + throw new NotSupportedException( + 'Cannot initialize a PUB/SUB consumer over cluster connections.' + ); + } + + $commands = ['publish', 'subscribe', 'unsubscribe', 'psubscribe', 'punsubscribe']; + + if (!$client->getCommandFactory()->supports(...$commands)) { + throw new NotSupportedException( + 'PUB/SUB commands are not supported by the current command factory.' + ); + } + } + + /** + * This method shares the logic to handle both SUBSCRIBE and PSUBSCRIBE. + * + * @param string $subscribeAction Type of subscription. + */ + private function genericSubscribeInit($subscribeAction) + { + if (isset($this->options[$subscribeAction])) { + $this->$subscribeAction($this->options[$subscribeAction]); + } + } + + /** + * {@inheritdoc} + */ + protected function writeRequest($method, $arguments) + { + $this->client->getConnection()->writeRequest( + $this->client->createCommand($method, + Command::normalizeArguments($arguments) + ) + ); + } + + /** + * {@inheritdoc} + */ + protected function disconnect() + { + $this->client->disconnect(); + } + + /** + * {@inheritdoc} + */ + protected function getValue() + { + $response = $this->client->getConnection()->read(); + + switch ($response[0]) { + case self::SUBSCRIBE: + case self::UNSUBSCRIBE: + case self::PSUBSCRIBE: + case self::PUNSUBSCRIBE: + if ($response[2] === 0) { + $this->invalidate(); + } + // The missing break here is intentional as we must process + // subscriptions and unsubscriptions as standard messages. + // no break + + case self::MESSAGE: + return (object) [ + 'kind' => $response[0], + 'channel' => $response[1], + 'payload' => $response[2], + ]; + + case self::PMESSAGE: + return (object) [ + 'kind' => $response[0], + 'pattern' => $response[1], + 'channel' => $response[2], + 'payload' => $response[3], + ]; + + case self::PONG: + return (object) [ + 'kind' => $response[0], + 'payload' => $response[1], + ]; + + default: + throw new ClientException( + "Unknown message type '{$response[0]}' received in the PUB/SUB context." + ); + } + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/DispatcherLoop.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/DispatcherLoop.php new file mode 100644 index 000000000..b6f79cd3d --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/PubSub/DispatcherLoop.php @@ -0,0 +1,171 @@ +callbacks = []; + $this->pubsub = $pubsub; + } + + /** + * Checks if the passed argument is a valid callback. + * + * @param mixed $callable A callback. + * + * @throws InvalidArgumentException + */ + protected function assertCallback($callable) + { + if (!is_callable($callable)) { + throw new InvalidArgumentException('The given argument must be a callable object.'); + } + } + + /** + * Returns the underlying PUB / SUB context. + * + * @return Consumer + */ + public function getPubSubConsumer() + { + return $this->pubsub; + } + + /** + * Sets a callback that gets invoked upon new subscriptions. + * + * @param mixed $callable A callback. + */ + public function subscriptionCallback($callable = null) + { + if (isset($callable)) { + $this->assertCallback($callable); + } + + $this->subscriptionCallback = $callable; + } + + /** + * Sets a callback that gets invoked when a message is received on a + * channel that does not have an associated callback. + * + * @param mixed $callable A callback. + */ + public function defaultCallback($callable = null) + { + if (isset($callable)) { + $this->assertCallback($callable); + } + + $this->subscriptionCallback = $callable; + } + + /** + * Binds a callback to a channel. + * + * @param string $channel Channel name. + * @param callable $callback A callback. + */ + public function attachCallback($channel, $callback) + { + $callbackName = $this->getPrefixKeys() . $channel; + + $this->assertCallback($callback); + $this->callbacks[$callbackName] = $callback; + $this->pubsub->subscribe($channel); + } + + /** + * Stops listening to a channel and removes the associated callback. + * + * @param string $channel Redis channel. + */ + public function detachCallback($channel) + { + $callbackName = $this->getPrefixKeys() . $channel; + + if (isset($this->callbacks[$callbackName])) { + unset($this->callbacks[$callbackName]); + $this->pubsub->unsubscribe($channel); + } + } + + /** + * Starts the dispatcher loop. + */ + public function run() + { + foreach ($this->pubsub as $message) { + $kind = $message->kind; + + if ($kind !== Consumer::MESSAGE && $kind !== Consumer::PMESSAGE) { + if (isset($this->subscriptionCallback)) { + $callback = $this->subscriptionCallback; + call_user_func($callback, $message, $this); + } + + continue; + } + + if (isset($this->callbacks[$message->channel])) { + $callback = $this->callbacks[$message->channel]; + call_user_func($callback, $message->payload, $this); + } elseif (isset($this->defaultCallback)) { + $callback = $this->defaultCallback; + call_user_func($callback, $message, $this); + } + } + } + + /** + * Terminates the dispatcher loop. + */ + public function stop() + { + $this->pubsub->stop(); + } + + /** + * Return the prefix used for keys. + * + * @return string + */ + protected function getPrefixKeys() + { + $options = $this->pubsub->getClient()->getOptions(); + + if (isset($options->prefix)) { + return $options->prefix->getPrefix(); + } + + return ''; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Replication/MissingMasterException.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Replication/MissingMasterException.php new file mode 100644 index 000000000..d30c259d0 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Replication/MissingMasterException.php @@ -0,0 +1,22 @@ +disallowed = $this->getDisallowedOperations(); + $this->readonly = $this->getReadOnlyOperations(); + $this->readonlySHA1 = []; + } + + /** + * Returns if the specified command will perform a read-only operation + * on Redis or not. + * + * @param CommandInterface $command Command instance. + * + * @return bool + * @throws NotSupportedException + */ + public function isReadOperation(CommandInterface $command) + { + if (!$this->loadBalancing) { + return false; + } + + if (isset($this->disallowed[$id = $command->getId()])) { + throw new NotSupportedException( + "The command '$id' is not allowed in replication mode." + ); + } + + if (isset($this->readonly[$id])) { + if (true === $readonly = $this->readonly[$id]) { + return true; + } + + return call_user_func($readonly, $command); + } + + if (($eval = $id === 'EVAL') || $id === 'EVALSHA') { + $argument = $command->getArgument(0); + $sha1 = $eval ? sha1(strval($argument)) : $argument; + + if (isset($this->readonlySHA1[$sha1])) { + if (true === $readonly = $this->readonlySHA1[$sha1]) { + return true; + } + + return call_user_func($readonly, $command); + } + } + + return false; + } + + /** + * Returns if the specified command is not allowed for execution in a master + * / slave replication context. + * + * @param CommandInterface $command Command instance. + * + * @return bool + */ + public function isDisallowedOperation(CommandInterface $command) + { + return isset($this->disallowed[$command->getId()]); + } + + /** + * Checks if BITFIELD performs a read-only operation by looking for certain + * SET and INCRYBY modifiers in the arguments array of the command. + * + * @param CommandInterface $command Command instance. + * + * @return bool + */ + protected function isBitfieldReadOnly(CommandInterface $command) + { + $arguments = $command->getArguments(); + $argc = count($arguments); + + if ($argc >= 2) { + for ($i = 1; $i < $argc; ++$i) { + $argument = strtoupper($arguments[$i]); + if ($argument === 'SET' || $argument === 'INCRBY') { + return false; + } + } + } + + return true; + } + + /** + * Checks if a GEORADIUS command is a readable operation by parsing the + * arguments array of the specified command instance. + * + * @param CommandInterface $command Command instance. + * + * @return bool + */ + protected function isGeoradiusReadOnly(CommandInterface $command) + { + $arguments = $command->getArguments(); + $argc = count($arguments); + $startIndex = $command->getId() === 'GEORADIUS' ? 5 : 4; + + if ($argc > $startIndex) { + for ($i = $startIndex; $i < $argc; ++$i) { + $argument = strtoupper($arguments[$i]); + if ($argument === 'STORE' || $argument === 'STOREDIST') { + return false; + } + } + } + + return true; + } + + /** + * Marks a command as a read-only operation. + * + * When the behavior of a command can be decided only at runtime depending + * on its arguments, a callable object can be provided to dynamically check + * if the specified command performs a read or a write operation. + * + * @param string $commandID Command ID. + * @param mixed $readonly A boolean value or a callable object. + */ + public function setCommandReadOnly($commandID, $readonly = true) + { + $commandID = strtoupper($commandID); + + if ($readonly) { + $this->readonly[$commandID] = $readonly; + } else { + unset($this->readonly[$commandID]); + } + } + + /** + * Marks a Lua script for EVAL and EVALSHA as a read-only operation. When + * the behaviour of a script can be decided only at runtime depending on + * its arguments, a callable object can be provided to dynamically check + * if the passed instance of EVAL or EVALSHA performs write operations or + * not. + * + * @param string $script Body of the Lua script. + * @param mixed $readonly A boolean value or a callable object. + */ + public function setScriptReadOnly($script, $readonly = true) + { + $sha1 = sha1($script); + + if ($readonly) { + $this->readonlySHA1[$sha1] = $readonly; + } else { + unset($this->readonlySHA1[$sha1]); + } + } + + /** + * Returns the default list of disallowed commands. + * + * @return array + */ + protected function getDisallowedOperations() + { + return [ + 'SHUTDOWN' => true, + 'INFO' => true, + 'DBSIZE' => true, + 'LASTSAVE' => true, + 'CONFIG' => true, + 'MONITOR' => true, + 'SLAVEOF' => true, + 'SAVE' => true, + 'BGSAVE' => true, + 'BGREWRITEAOF' => true, + 'SLOWLOG' => true, + ]; + } + + /** + * Returns the default list of commands performing read-only operations. + * + * @return array + */ + protected function getReadOnlyOperations() + { + return [ + 'EXISTS' => true, + 'TYPE' => true, + 'KEYS' => true, + 'SCAN' => true, + 'RANDOMKEY' => true, + 'TTL' => true, + 'GET' => true, + 'MGET' => true, + 'SUBSTR' => true, + 'STRLEN' => true, + 'GETRANGE' => true, + 'GETBIT' => true, + 'LLEN' => true, + 'LRANGE' => true, + 'LINDEX' => true, + 'SCARD' => true, + 'SISMEMBER' => true, + 'SINTER' => true, + 'SUNION' => true, + 'SDIFF' => true, + 'SMEMBERS' => true, + 'SSCAN' => true, + 'SRANDMEMBER' => true, + 'ZRANGE' => true, + 'ZREVRANGE' => true, + 'ZRANGEBYSCORE' => true, + 'ZREVRANGEBYSCORE' => true, + 'ZCARD' => true, + 'ZSCORE' => true, + 'ZCOUNT' => true, + 'ZRANK' => true, + 'ZREVRANK' => true, + 'ZSCAN' => true, + 'ZLEXCOUNT' => true, + 'ZRANGEBYLEX' => true, + 'ZREVRANGEBYLEX' => true, + 'HGET' => true, + 'HMGET' => true, + 'HEXISTS' => true, + 'HLEN' => true, + 'HKEYS' => true, + 'HVALS' => true, + 'HGETALL' => true, + 'HSCAN' => true, + 'HSTRLEN' => true, + 'PING' => true, + 'AUTH' => true, + 'SELECT' => true, + 'ECHO' => true, + 'QUIT' => true, + 'OBJECT' => true, + 'BITCOUNT' => true, + 'BITPOS' => true, + 'TIME' => true, + 'PFCOUNT' => true, + 'BITFIELD' => [$this, 'isBitfieldReadOnly'], + 'GEOHASH' => true, + 'GEOPOS' => true, + 'GEODIST' => true, + 'GEORADIUS' => [$this, 'isGeoradiusReadOnly'], + 'GEORADIUSBYMEMBER' => [$this, 'isGeoradiusReadOnly'], + ]; + } + + /** + * Disables reads to slaves when using + * a replication topology. + * + * @return self + */ + public function disableLoadBalancing(): self + { + $this->loadBalancing = false; + + return $this; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Replication/RoleException.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Replication/RoleException.php new file mode 100644 index 000000000..968b7e2cd --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Replication/RoleException.php @@ -0,0 +1,23 @@ +message = $message; + } + + /** + * {@inheritdoc} + */ + public function getMessage() + { + return $this->message; + } + + /** + * {@inheritdoc} + */ + public function getErrorType() + { + [$errorType] = explode(' ', $this->getMessage(), 2); + + return $errorType; + } + + /** + * Converts the object to its string representation. + * + * @return string + */ + public function __toString() + { + return $this->getMessage(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/ErrorInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/ErrorInterface.php new file mode 100644 index 000000000..ac3bb16e8 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/ErrorInterface.php @@ -0,0 +1,34 @@ +connection = $connection; + $this->size = $size; + $this->position = 0; + $this->current = $size > 0 ? $this->getValue() : null; + } + + /** + * Handles the synchronization of the client with the Redis protocol when + * the garbage collector kicks in (e.g. when the iterator goes out of the + * scope of a foreach or it is unset). + */ + public function __destruct() + { + $this->drop(true); + } + + /** + * Drop queued elements that have not been read from the connection either + * by consuming the rest of the multibulk response or quickly by closing the + * underlying connection. + * + * @param bool $disconnect Consume the iterator or drop the connection. + */ + public function drop($disconnect = false) + { + if ($disconnect) { + if ($this->valid()) { + $this->position = $this->size; + $this->connection->disconnect(); + } + } else { + while ($this->valid()) { + $this->next(); + } + } + } + + /** + * Reads the next item of the multibulk response from the connection. + * + * @return mixed + */ + protected function getValue() + { + return $this->connection->read(); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Iterator/MultiBulkIterator.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Iterator/MultiBulkIterator.php new file mode 100644 index 000000000..cbc74a12f --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Iterator/MultiBulkIterator.php @@ -0,0 +1,112 @@ +current; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function key() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function next() + { + if (++$this->position < $this->size) { + $this->current = $this->getValue(); + } + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function valid() + { + return $this->position < $this->size; + } + + /** + * Returns the number of items comprising the whole multibulk response. + * + * This method should be used instead of iterator_count() to get the size of + * the current multibulk response since the former consumes the iteration to + * count the number of elements, but our iterators do not support rewinding. + * + * @return int + */ + #[ReturnTypeWillChange] + public function count() + { + return $this->size; + } + + /** + * Returns the current position of the iterator. + * + * @return int + */ + public function getPosition() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + abstract protected function getValue(); +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Iterator/MultiBulkTuple.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Iterator/MultiBulkTuple.php new file mode 100644 index 000000000..77019aa8c --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Iterator/MultiBulkTuple.php @@ -0,0 +1,95 @@ + $value pairs. + */ +class MultiBulkTuple extends MultiBulk implements OuterIterator +{ + private $iterator; + + /** + * @param MultiBulk $iterator Inner multibulk response iterator. + */ + public function __construct(MultiBulk $iterator) + { + $this->checkPreconditions($iterator); + + $this->size = count($iterator) / 2; + $this->iterator = $iterator; + $this->position = $iterator->getPosition(); + $this->current = $this->size > 0 ? $this->getValue() : null; + } + + /** + * Checks for valid preconditions. + * + * @param MultiBulk $iterator Inner multibulk response iterator. + * + * @throws InvalidArgumentException + * @throws UnexpectedValueException + */ + protected function checkPreconditions(MultiBulk $iterator) + { + if ($iterator->getPosition() !== 0) { + throw new InvalidArgumentException( + 'Cannot initialize a tuple iterator using an already initiated iterator.' + ); + } + + if (($size = count($iterator)) % 2 !== 0) { + throw new UnexpectedValueException('Invalid response size for a tuple iterator.'); + } + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function getInnerIterator() + { + return $this->iterator; + } + + /** + * {@inheritdoc} + */ + public function __destruct() + { + $this->iterator->drop(true); + } + + /** + * {@inheritdoc} + */ + protected function getValue() + { + $k = $this->iterator->current(); + $this->iterator->next(); + + $v = $this->iterator->current(); + $this->iterator->next(); + + return [$k, $v]; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/ResponseInterface.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/ResponseInterface.php new file mode 100644 index 000000000..d2f682806 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/ResponseInterface.php @@ -0,0 +1,20 @@ +getMessage(), 2); + + return $errorType; + } + + /** + * Converts the exception to an instance of Predis\Response\Error. + * + * @return Error + */ + public function toErrorResponse() + { + return new Error($this->getMessage()); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Status.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Status.php new file mode 100644 index 000000000..80cab9300 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Response/Status.php @@ -0,0 +1,78 @@ +payload = $payload; + } + + /** + * Converts the response object to its string representation. + * + * @return string + */ + public function __toString() + { + return $this->payload; + } + + /** + * Returns the payload of status response. + * + * @return string + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Returns an instance of a status response object. + * + * Common status responses such as OK or QUEUED are cached in order to lower + * the global memory usage especially when using pipelines. + * + * @param string $payload Status response payload. + * + * @return self + */ + public static function get($payload) + { + switch ($payload) { + case 'OK': + case 'QUEUED': + if (isset(self::$$payload)) { + return self::$$payload; + } + + return self::$$payload = new self($payload); + + default: + return new self($payload); + } + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Session/Handler.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Session/Handler.php new file mode 100644 index 000000000..2e22a1819 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Session/Handler.php @@ -0,0 +1,139 @@ +client = $client; + + if (isset($options['gc_maxlifetime'])) { + $this->ttl = (int) $options['gc_maxlifetime']; + } else { + $this->ttl = ini_get('session.gc_maxlifetime'); + } + } + + /** + * Registers this instance as the current session handler. + */ + public function register() + { + session_set_save_handler($this, true); + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function open($save_path, $session_id) + { + // NOOP + return true; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function close() + { + // NOOP + return true; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function gc($maxlifetime) + { + // NOOP + return true; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function read($session_id) + { + if ($data = $this->client->get($session_id)) { + return $data; + } + + return ''; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function write($session_id, $session_data) + { + $this->client->setex($session_id, $this->ttl, $session_data); + + return true; + } + + /** + * {@inheritdoc} + */ + #[ReturnTypeWillChange] + public function destroy($session_id) + { + $this->client->del($session_id); + + return true; + } + + /** + * Returns the underlying client instance. + * + * @return ClientInterface + */ + public function getClient() + { + return $this->client; + } + + /** + * Returns the session max lifetime value. + * + * @return int + */ + public function getMaxLifeTime() + { + return $this->ttl; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/AbortedMultiExecException.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/AbortedMultiExecException.php new file mode 100644 index 000000000..75fc0bb07 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/AbortedMultiExecException.php @@ -0,0 +1,45 @@ +transaction = $transaction; + } + + /** + * Returns the transaction that generated the exception. + * + * @return MultiExec + */ + public function getTransaction() + { + return $this->transaction; + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/MultiExec.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/MultiExec.php new file mode 100644 index 000000000..1f99d2a93 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/MultiExec.php @@ -0,0 +1,458 @@ +assertClient($client); + + $this->client = $client; + $this->state = new MultiExecState(); + + $this->configure($client, $options ?: []); + $this->reset(); + } + + /** + * Checks if the passed client instance satisfies the required conditions + * needed to initialize the transaction object. + * + * @param ClientInterface $client Client instance used by the transaction object. + * + * @throws NotSupportedException + */ + private function assertClient(ClientInterface $client) + { + if ($client->getConnection() instanceof ClusterInterface) { + throw new NotSupportedException( + 'Cannot initialize a MULTI/EXEC transaction over cluster connections.' + ); + } + + if (!$client->getCommandFactory()->supports('MULTI', 'EXEC', 'DISCARD')) { + throw new NotSupportedException( + 'MULTI, EXEC and DISCARD are not supported by the current command factory.' + ); + } + } + + /** + * Configures the transaction using the provided options. + * + * @param ClientInterface $client Underlying client instance. + * @param array $options Array of options for the transaction. + **/ + protected function configure(ClientInterface $client, array $options) + { + if (isset($options['exceptions'])) { + $this->exceptions = (bool) $options['exceptions']; + } else { + $this->exceptions = $client->getOptions()->exceptions; + } + + if (isset($options['cas'])) { + $this->modeCAS = (bool) $options['cas']; + } + + if (isset($options['watch']) && $keys = $options['watch']) { + $this->watchKeys = $keys; + } + + if (isset($options['retry'])) { + $this->attempts = (int) $options['retry']; + } + } + + /** + * Resets the state of the transaction. + */ + protected function reset() + { + $this->state->reset(); + $this->commands = new SplQueue(); + } + + /** + * Initializes the transaction context. + */ + protected function initialize() + { + if ($this->state->isInitialized()) { + return; + } + + if ($this->modeCAS) { + $this->state->flag(MultiExecState::CAS); + } + + if ($this->watchKeys) { + $this->watch($this->watchKeys); + } + + $cas = $this->state->isCAS(); + $discarded = $this->state->isDiscarded(); + + if (!$cas || ($cas && $discarded)) { + $this->call('MULTI'); + + if ($discarded) { + $this->state->unflag(MultiExecState::CAS); + } + } + + $this->state->unflag(MultiExecState::DISCARDED); + $this->state->flag(MultiExecState::INITIALIZED); + } + + /** + * Dynamically invokes a Redis command with the specified arguments. + * + * @param string $method Command ID. + * @param array $arguments Arguments for the command. + * + * @return mixed + */ + public function __call($method, $arguments) + { + return $this->executeCommand( + $this->client->createCommand($method, $arguments) + ); + } + + /** + * Executes a Redis command bypassing the transaction logic. + * + * @param string $commandID Command ID. + * @param array $arguments Arguments for the command. + * + * @return mixed + * @throws ServerException + */ + protected function call($commandID, array $arguments = []) + { + $response = $this->client->executeCommand( + $this->client->createCommand($commandID, $arguments) + ); + + if ($response instanceof ErrorResponseInterface) { + throw new ServerException($response->getMessage()); + } + + return $response; + } + + /** + * Executes the specified Redis command. + * + * @param CommandInterface $command Command instance. + * + * @return $this|mixed + * @throws AbortedMultiExecException + * @throws CommunicationException + */ + public function executeCommand(CommandInterface $command) + { + $this->initialize(); + + if ($this->state->isCAS()) { + return $this->client->executeCommand($command); + } + + $response = $this->client->getConnection()->executeCommand($command); + + if ($response instanceof StatusResponse && $response == 'QUEUED') { + $this->commands->enqueue($command); + } elseif ($response instanceof ErrorResponseInterface) { + throw new AbortedMultiExecException($this, $response->getMessage()); + } else { + $this->onProtocolError('The server did not return a +QUEUED status response.'); + } + + return $this; + } + + /** + * Executes WATCH against one or more keys. + * + * @param string|array $keys One or more keys. + * + * @return mixed + * @throws NotSupportedException + * @throws ClientException + */ + public function watch($keys) + { + if (!$this->client->getCommandFactory()->supports('WATCH')) { + throw new NotSupportedException('WATCH is not supported by the current command factory.'); + } + + if ($this->state->isWatchAllowed()) { + throw new ClientException('Sending WATCH after MULTI is not allowed.'); + } + + $response = $this->call('WATCH', is_array($keys) ? $keys : [$keys]); + $this->state->flag(MultiExecState::WATCH); + + return $response; + } + + /** + * Finalizes the transaction by executing MULTI on the server. + * + * @return MultiExec + */ + public function multi() + { + if ($this->state->check(MultiExecState::INITIALIZED | MultiExecState::CAS)) { + $this->state->unflag(MultiExecState::CAS); + $this->call('MULTI'); + } else { + $this->initialize(); + } + + return $this; + } + + /** + * Executes UNWATCH. + * + * @return MultiExec + * @throws NotSupportedException + */ + public function unwatch() + { + if (!$this->client->getCommandFactory()->supports('UNWATCH')) { + throw new NotSupportedException( + 'UNWATCH is not supported by the current command factory.' + ); + } + + $this->state->unflag(MultiExecState::WATCH); + $this->__call('UNWATCH', []); + + return $this; + } + + /** + * Resets the transaction by UNWATCH-ing the keys that are being WATCHed and + * DISCARD-ing pending commands that have been already sent to the server. + * + * @return MultiExec + */ + public function discard() + { + if ($this->state->isInitialized()) { + $this->call($this->state->isCAS() ? 'UNWATCH' : 'DISCARD'); + + $this->reset(); + $this->state->flag(MultiExecState::DISCARDED); + } + + return $this; + } + + /** + * Executes the whole transaction. + * + * @return mixed + */ + public function exec() + { + return $this->execute(); + } + + /** + * Checks the state of the transaction before execution. + * + * @param mixed $callable Callback for execution. + * + * @throws InvalidArgumentException + * @throws ClientException + */ + private function checkBeforeExecution($callable) + { + if ($this->state->isExecuting()) { + throw new ClientException( + 'Cannot invoke "execute" or "exec" inside an active transaction context.' + ); + } + + if ($callable) { + if (!is_callable($callable)) { + throw new InvalidArgumentException('The argument must be a callable object.'); + } + + if (!$this->commands->isEmpty()) { + $this->discard(); + + throw new ClientException( + 'Cannot execute a transaction block after using fluent interface.' + ); + } + } elseif ($this->attempts) { + $this->discard(); + + throw new ClientException( + 'Automatic retries are supported only when a callable block is provided.' + ); + } + } + + /** + * Handles the actual execution of the whole transaction. + * + * @param mixed $callable Optional callback for execution. + * + * @return array + * @throws CommunicationException + * @throws AbortedMultiExecException + * @throws ServerException + */ + public function execute($callable = null) + { + $this->checkBeforeExecution($callable); + + $execResponse = null; + $attempts = $this->attempts; + + do { + if ($callable) { + $this->executeTransactionBlock($callable); + } + + if ($this->commands->isEmpty()) { + if ($this->state->isWatching()) { + $this->discard(); + } + + return; + } + + $execResponse = $this->call('EXEC'); + + if ($execResponse === null) { + if ($attempts === 0) { + throw new AbortedMultiExecException( + $this, 'The current transaction has been aborted by the server.' + ); + } + + $this->reset(); + + continue; + } + + break; + } while ($attempts-- > 0); + + $response = []; + $commands = $this->commands; + $size = count($execResponse); + + if ($size !== count($commands)) { + $this->onProtocolError('EXEC returned an unexpected number of response items.'); + } + + for ($i = 0; $i < $size; ++$i) { + $cmdResponse = $execResponse[$i]; + + if ($cmdResponse instanceof ErrorResponseInterface && $this->exceptions) { + throw new ServerException($cmdResponse->getMessage()); + } + + $response[$i] = $commands->dequeue()->parseResponse($cmdResponse); + } + + return $response; + } + + /** + * Passes the current transaction object to a callable block for execution. + * + * @param mixed $callable Callback. + * + * @throws CommunicationException + * @throws ServerException + */ + protected function executeTransactionBlock($callable) + { + $exception = null; + $this->state->flag(MultiExecState::INSIDEBLOCK); + + try { + call_user_func($callable, $this); + } catch (CommunicationException $exception) { + // NOOP + } catch (ServerException $exception) { + // NOOP + } catch (Exception $exception) { + $this->discard(); + } + + $this->state->unflag(MultiExecState::INSIDEBLOCK); + + if ($exception) { + throw $exception; + } + } + + /** + * Helper method for protocol errors encountered inside the transaction. + * + * @param string $message Error message. + */ + private function onProtocolError($message) + { + // Since a MULTI/EXEC block cannot be initialized when using aggregate + // connections we can safely assume that Predis\Client::getConnection() + // will return a Predis\Connection\NodeConnectionInterface instance. + CommunicationException::handle(new ProtocolException( + $this->client->getConnection(), $message + )); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/MultiExecState.php b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/MultiExecState.php new file mode 100644 index 000000000..c9be15c87 --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/predis/predis/src/Transaction/MultiExecState.php @@ -0,0 +1,162 @@ +flags = 0; + } + + /** + * Sets the internal state flags. + * + * @param int $flags Set of flags + */ + public function set($flags) + { + $this->flags = $flags; + } + + /** + * Gets the internal state flags. + * + * @return int + */ + public function get() + { + return $this->flags; + } + + /** + * Sets one or more flags. + * + * @param int $flags Set of flags + */ + public function flag($flags) + { + $this->flags |= $flags; + } + + /** + * Resets one or more flags. + * + * @param int $flags Set of flags + */ + public function unflag($flags) + { + $this->flags &= ~$flags; + } + + /** + * Returns if the specified flag or set of flags is set. + * + * @param int $flags Flag + * + * @return bool + */ + public function check($flags) + { + return ($this->flags & $flags) === $flags; + } + + /** + * Resets the state of a transaction. + */ + public function reset() + { + $this->flags = 0; + } + + /** + * Returns the state of the RESET flag. + * + * @return bool + */ + public function isReset() + { + return $this->flags === 0; + } + + /** + * Returns the state of the INITIALIZED flag. + * + * @return bool + */ + public function isInitialized() + { + return $this->check(self::INITIALIZED); + } + + /** + * Returns the state of the INSIDEBLOCK flag. + * + * @return bool + */ + public function isExecuting() + { + return $this->check(self::INSIDEBLOCK); + } + + /** + * Returns the state of the CAS flag. + * + * @return bool + */ + public function isCAS() + { + return $this->check(self::CAS); + } + + /** + * Returns if WATCH is allowed in the current state. + * + * @return bool + */ + public function isWatchAllowed() + { + return $this->check(self::INITIALIZED) && !$this->check(self::CAS); + } + + /** + * Returns the state of the WATCH flag. + * + * @return bool + */ + public function isWatching() + { + return $this->check(self::WATCH); + } + + /** + * Returns the state of the DISCARDED flag. + * + * @return bool + */ + public function isDiscarded() + { + return $this->check(self::DISCARDED); + } +} diff --git a/wp-content/plugins/redis-cache/dependencies/vendor/predis/predis/autoload.php b/wp-content/plugins/redis-cache/dependencies/vendor/predis/predis/autoload.php new file mode 100644 index 000000000..35340fe8f --- /dev/null +++ b/wp-content/plugins/redis-cache/dependencies/vendor/predis/predis/autoload.php @@ -0,0 +1,8 @@ +prefixes[ $prefix ] ) ) { + $this->prefixes[ $prefix ] = []; + } + + if ( $prepend ) { + array_unshift( $this->prefixes[ $prefix ], $base_dir ); + } else { + array_push( $this->prefixes[ $prefix ], $base_dir ); + } + } + + /** + * Loads the class file for a given class name. + * + * @since 2.0.0 + * @param string $class The fully-qualified class name. + * @return string|null The mapped file name on success, or null on failure. + */ + public function load_class( $class ) { + $prefix = $class; + + while ( false !== ( $pos = strrpos( $prefix, '\\' ) ) ) { // phpcs:ignore + $prefix = substr( $class, 0, $pos + 1 ); + + $relative_class = substr( $class, $pos + 1 ); + + $mapped_file = $this->load_mapped_file( $prefix, $relative_class ); + if ( $mapped_file ) { + return $mapped_file; + } + + $prefix = rtrim( $prefix, '\\' ); + } + + return null; + } + + /** + * Load the mapped file for a namespace prefix and relative class. + * + * @since 2.0.0 + * @param string $prefix The namespace prefix. + * @param string $relative_class The relative class name. + * @return string|null Null if no mapped file can be loaded, or + * the name of the loaded mapped file. + */ + private function load_mapped_file( $prefix, $relative_class ) { + if ( false === isset( $this->prefixes[ $prefix ] ) ) { + return null; + } + + foreach ( $this->prefixes[ $prefix ] as $base_dir ) { + $relative_class = strtolower( $relative_class ); + $relative_class = strtr( $relative_class, '_', '-' ); + + $file = $base_dir + . str_replace( '\\', '/', $relative_class ) + . '.php'; + + if ( $this->class_file_prefix ) { + $pos = strrpos( $file, '/' ); + $filename = $this->class_file_prefix . substr( $file, $pos + 1 ); + $file = substr_replace( $file, $filename, $pos + 1 ); + } + + if ( $this->require_file( $file ) ) { + return $file; + } + } + + return null; + } + + /** + * If a file exists, require it from the file system. + * + * @since 2.0.0 + * @param string $file The file to require. + * @return bool True if the file exists, false if not. + */ + private function require_file( $file ) { + if ( file_exists( $file ) ) { + require $file; + return true; + } + return false; + } +} diff --git a/wp-content/plugins/redis-cache/includes/class-metrics.php b/wp-content/plugins/redis-cache/includes/class-metrics.php new file mode 100644 index 000000000..29bdaf37d --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/class-metrics.php @@ -0,0 +1,276 @@ +get_redis_status() + && method_exists( $wp_object_cache, 'info' ) + && method_exists( $wp_object_cache, 'redis_instance' ); + } + + /** + * Retrieves metrics max time + * + * @return int + */ + public static function max_time() { + if ( defined( 'WP_REDIS_METRICS_MAX_TIME' ) ) { + return (int) WP_REDIS_METRICS_MAX_TIME; + } + + return HOUR_IN_SECONDS; + } + + /** + * Records metrics and adds them to redis + * + * @return void + */ + public static function record() { + if ( ! self::is_active() ) { + return; + } + + $metrics = new self(); + $metrics->collect(); + $metrics->save(); + } + + /** + * Collect metrics from object cache instance. + */ + public function collect() { + global $wp_object_cache; + + $info = $wp_object_cache->info(); + + $this->id = substr( md5( uniqid( strval( mt_rand() ), true ) ), 12 ); + $this->hits = $info->hits; + $this->misses = $info->misses; + $this->ratio = $info->ratio; + $this->bytes = $info->bytes; + $this->time = round( $info->time, 5 ); + $this->calls = $info->calls; + $this->timestamp = time(); + } + + /** + * Retrieves metrics from redis + * + * @param int $seconds Number of seconds of the oldest entry to retrieve. + * @return Metrics[] + */ + public static function get( $seconds = null ) { + global $wp_object_cache; + + if ( ! self::is_active() ) { + return []; + } + + if ( null === $seconds ) { + $seconds = self::max_time(); + } + + try { + $raw_metrics = $wp_object_cache->redis_instance()->zrangebyscore( + $wp_object_cache->build_key( 'metrics', 'redis-cache' ), + time() - $seconds, + time() - MINUTE_IN_SECONDS, + [ 'withscores' => true ] + ); + } catch ( Exception $exception ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + error_log( $exception ); + + return []; + } + + $metrics = []; + $prefix = sprintf( 'O:%d:"%s', strlen( self::class ), self::class ); + + foreach ( $raw_metrics as $serialized => $timestamp ) { + // Compatibility: Ignore all non serialized entries as they were used by prior versions. + if ( strpos( $serialized, $prefix ) !== 0 ) { + continue; + } + + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_unserialize + $metrics[] = unserialize( $serialized ); + } + + return $metrics; + } + + /** + * Saves the current metrics to redis + * + * @return void + */ + public function save() { + global $wp_object_cache; + + try { + $wp_object_cache->redis_instance()->zadd( + $wp_object_cache->build_key( 'metrics', 'redis-cache' ), + $this->timestamp, + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize + serialize( $this ) + ); + } catch ( Exception $exception ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + error_log( $exception ); + } + } + + /** + * Removes recorded metrics after an hour + * + * @return void + */ + public static function discard() { + global $wp_object_cache; + + if ( ! self::is_active() ) { + return; + } + + try { + $wp_object_cache->redis_instance()->zremrangebyscore( + $wp_object_cache->build_key( 'metrics', 'redis-cache' ), + 0, + time() - self::max_time() + ); + } catch ( Exception $exception ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + error_log( $exception ); + } + } + + /** + * Counts the recorded metrics + * + * @return int + */ + public static function count() { + global $wp_object_cache; + + if ( ! self::is_active() ) { + return 0; + } + + try { + return $wp_object_cache->redis_instance()->zcount( + $wp_object_cache->build_key( 'metrics', 'redis-cache' ), + '-inf', + '+inf' + ); + } catch ( Exception $exception ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + error_log( $exception ); + return 0; + } + } + +} diff --git a/wp-content/plugins/redis-cache/includes/class-plugin.php b/wp-content/plugins/redis-cache/includes/class-plugin.php new file mode 100644 index 000000000..0fee1938e --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/class-plugin.php @@ -0,0 +1,1628 @@ +page = 'settings.php?page=redis-cache'; + $this->screen = 'settings_page_redis-cache-network'; + } else { + $this->page = 'options-general.php?page=redis-cache'; + $this->screen = 'settings_page_redis-cache'; + } + + Metrics::init(); + + $this->add_actions_and_filters(); + } + + /** + * Adds all necessary hooks + * + * @return void + */ + public function add_actions_and_filters() { + add_action( 'deactivate_plugin', [ $this, 'on_deactivation' ] ); + add_action( 'admin_init', [ $this, 'maybe_update_dropin' ] ); + add_action( 'admin_init', [ $this, 'maybe_redirect' ] ); + add_action( 'init', [ $this, 'init' ] ); + + add_action( is_multisite() ? 'network_admin_menu' : 'admin_menu', [ $this, 'add_admin_menu_page' ] ); + + add_action( 'admin_notices', [ $this, 'show_admin_notices' ] ); + add_action( 'network_admin_notices', [ $this, 'show_admin_notices' ] ); + + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_styles' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_scripts' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_redis_metrics' ] ); + + add_action( 'admin_bar_menu', [ $this, 'render_admin_bar' ], 998 ); + + add_action( 'load-settings_page_redis-cache', [ $this, 'do_admin_actions' ] ); + + add_action( 'wp_dashboard_setup', [ $this, 'setup_dashboard_widget' ] ); + add_action( 'wp_network_dashboard_setup', [ $this, 'setup_dashboard_widget' ] ); + + add_action( 'wp_ajax_roc_dismiss_notice', [ $this, 'ajax_dismiss_notice' ] ); + add_action( 'wp_ajax_roc_flush_cache', [ $this, 'ajax_flush_cache' ] ); + + add_filter( 'gettext_redis-cache', [ $this, 'get_text' ], 10, 2 ); + + add_filter( 'plugin_row_meta', [ $this, 'add_plugin_row_meta' ], 10, 2 ); + add_filter( sprintf( '%splugin_action_links_%s', is_multisite() ? 'network_admin_' : '', WP_REDIS_BASENAME ), [ $this, 'add_plugin_actions_links' ] ); + + add_action( 'wp_head', [ $this, 'register_shutdown_hooks' ] ); + + add_filter( 'qm/collectors', [ $this, 'register_qm_collector' ], 25 ); + add_filter( 'qm/outputter/html', [ $this, 'register_qm_output' ] ); + + add_filter( 'perflab_disable_object_cache_dropin', '__return_true' ); + add_filter( 'w3tc_config_item_objectcache.enabled', '__return_false' ); + add_action( 'litespeed_init', [ $this, 'litespeed_disable_objectcache' ] ); + } + + /** + * Callback of the `init` hook. + * + * @return void + */ + public function init() { + if ( is_admin() && ! wp_next_scheduled( 'rediscache_discard_metrics' ) ) { + wp_schedule_event( time(), 'hourly', 'rediscache_discard_metrics' ); + } + } + + /** + * Adds a submenu page to "Settings" + * + * @return void + */ + public function add_admin_menu_page() { + add_submenu_page( + is_multisite() ? 'settings.php' : 'options-general.php', + __( 'Redis Object Cache', 'redis-cache' ), + __( 'Redis', 'redis-cache' ), + $this->manage_redis_capability(), + 'redis-cache', + [ $this, 'show_admin_page' ] + ); + } + + /** + * Displays the settings page + * + * @return void + */ + public function show_admin_page() { + // Request filesystem credentials? + if ( isset( $_GET['_wpnonce'], $_GET['action'] ) ) { + $action = sanitize_key( $_GET['action'] ); + $nonce = sanitize_key( $_GET['_wpnonce'] ); + + foreach ( $this->actions as $name ) { + // Nonce verification. + if ( $action === $name && wp_verify_nonce( $nonce, $action ) ) { + $url = $this->action_link( $action ); + + if ( $this->initialize_filesystem( $url ) === false ) { + return; // Request filesystem credentials. + } + } + } + } + + if ( wp_next_scheduled( 'redis_gather_metrics' ) ) { + wp_clear_scheduled_hook( 'redis_gather_metrics' ); + } + + UI::register_tab( + 'overview', + __( 'Overview', 'redis-cache' ), + [ 'default' => true ] + ); + + UI::register_tab( + 'metrics', + __( 'Metrics', 'redis-cache' ), + [ 'disabled' => ! Metrics::is_enabled() ] + ); + + UI::register_tab( + 'diagnostics', + __( 'Diagnostics', 'redis-cache' ) + ); + + // Show the admin page. + require_once WP_REDIS_PLUGIN_PATH . '/includes/ui/settings.php'; + } + + /** + * Adds the dashboard metrics widget + * + * @return void + */ + public function setup_dashboard_widget() { + if ( ! $this->current_user_can_manage_redis() ) { + return; + } + + if ( ! Metrics::is_enabled() ) { + return; + } + + wp_add_dashboard_widget( + 'dashboard_rediscache', + __( 'Redis Object Cache', 'redis-cache' ), + [ $this, 'show_dashboard_widget' ], + null, + null, + 'normal', + 'high' + ); + } + + /** + * Displays the dashboard widget + * + * @return void + */ + public function show_dashboard_widget() { + require_once WP_REDIS_PLUGIN_PATH . '/includes/ui/widget.php'; + } + + /** + * Adds the settings page to the plugin action links on the plugin page + * + * @param string[] $links The current plugin action links. + * @return string[] + */ + public function add_plugin_actions_links( $links ) { + $settings = sprintf( + '%s', + network_admin_url( $this->page ), + esc_html__( 'Settings', 'redis-cache' ) + ); + + return array_merge( [ $settings ], $links ); + } + + /** + * Ensure Author URI has UTM parameters. + * + * @param string $translation Translated text. + * @param string $text Text to translate. + * @return string + */ + public function get_text( $translation, $text ) { + if ( $text === 'https://objectcache.pro' ) { + return $this->link_to_ocp( 'author', false ); + } + + return $translation; + } + + /** + * Adds plugin meta links on the plugin page + * + * @param string[] $plugin_meta An array of the plugin's metadata. + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + * @return string[] An array of the plugin's metadata. + */ + public function add_plugin_row_meta( array $plugin_meta, $plugin_file ) { + if ( strpos( $plugin_file, 'redis-cache.php' ) === false ) { + return $plugin_meta; + } + + if ( self::acceleratewp_install() ) { + return $plugin_meta; + } + + $plugin_meta[] = sprintf( + '%2$s', + $this->link_to_ocp( 'meta-row' ), + esc_html_x( 'Upgrade to Pro', 'verb', 'redis-cache' ) + ); + + return $plugin_meta; + } + + /** + * Returns the link to Object Cache Pro. + * + * @param string $medium + * @param bool $as_html + * @return string + */ + public function link_to_ocp($medium, $as_html = true){ + $ref = 'oss'; + + if ( self::acceleratewp_install( true ) ) { + $ref = 'oss-cl'; + } + + $url = "https://objectcache.pro/?ref={$ref}&utm_source=wp-plugin&utm_medium={$medium}"; + + return $as_html ? str_replace('&', '&', $url) : $url; + } + + /** + * Enqueues admin style resources + * + * @return void + */ + public function enqueue_admin_styles() { + $screen = get_current_screen(); + + if ( ! isset( $screen->id ) ) { + return; + } + + $screens = [ + $this->screen, + 'dashboard', + 'dashboard-network', + ]; + + if ( ! in_array( $screen->id, $screens, true ) ) { + return; + } + + wp_enqueue_style( + 'redis-cache', + trailingslashit( WP_REDIS_PLUGIN_DIR ) . 'assets/css/admin.css', + [], + WP_REDIS_VERSION + ); + } + + /** + * Enqueues admin script resources + * + * @return void + */ + public function enqueue_admin_scripts() { + $screen = get_current_screen(); + + if ( ! isset( $screen->id ) ) { + return; + } + + $screens = [ + $this->screen, + 'dashboard', + 'dashboard-network', + 'edit-shop_order', + 'edit-product', + 'woocommerce_page_wc-admin', + ]; + + if ( ! in_array( $screen->id, $screens, true ) ) { + return; + } + + $clipboard = file_exists( ABSPATH . WPINC . '/js/clipboard.min.js' ); + + wp_enqueue_script( + 'redis-cache', + plugins_url( 'assets/js/admin.js', WP_REDIS_FILE ), + array_merge( [ 'jquery', 'underscore' ], $clipboard ? [ 'clipboard' ] : [] ), + WP_REDIS_VERSION, + true + ); + + wp_localize_script( + 'redis-cache', + 'rediscache', + [ + 'jQuery' => 'jQuery', + 'disable_pro' => $screen->id !== $this->screen + || ( defined( 'WP_REDIS_DISABLE_BANNERS' ) && WP_REDIS_DISABLE_BANNERS ) + || self::acceleratewp_install(), + 'l10n' => [ + 'time' => __( 'Time', 'redis-cache' ), + 'bytes' => __( 'Bytes', 'redis-cache' ), + 'ratio' => __( 'Ratio', 'redis-cache' ), + 'calls' => __( 'Calls', 'redis-cache' ), + 'no_data' => __( 'Not enough data collected, yet.', 'redis-cache' ), + 'no_cache' => __( 'Enable object cache to collect data.', 'redis-cache' ), + 'pro' => 'Object Cache Pro', + ], + ] + ); + } + + /** + * Enqueues scripts to display recorded metrics + * + * @return void + */ + public function enqueue_redis_metrics() { + if ( ! Metrics::is_enabled() ) { + return; + } + + $screen = get_current_screen(); + + if ( ! isset( $screen->id ) ) { + return; + } + + if ( ! in_array( $screen->id, [ $this->screen, 'dashboard', 'dashboard-network' ], true ) ) { + return; + } + + wp_enqueue_script( + 'redis-cache-charts', + plugins_url( 'assets/js/apexcharts.min.js', WP_REDIS_FILE ), + [], + WP_REDIS_VERSION, + true + ); + + if ( ! $this->get_redis_status() ) { + return; + } + + $min_time = $screen->id === $this->screen + ? Metrics::max_time() + : MINUTE_IN_SECONDS * 30; + + $metrics = Metrics::get( $min_time ); + + wp_localize_script( 'redis-cache', 'rediscache_metrics', $metrics ); + } + + /** + * Registers a new cache collector for the Query Monitor plugin + * + * @param array $collectors Array of currently registered collectors. + * @return array + */ + public function register_qm_collector( array $collectors ) { + $collectors['cache'] = new QM_Collector(); + + return $collectors; + } + + /** + * Registers a new cache output using our collector for the Query Monitor plugin + * + * @param array $output Array of current QM_Output handlers. + * @return array + */ + public function register_qm_output( $output ) { + $collector = \QM_Collectors::get( 'cache' ); + + if ( + $collector instanceof QM_Collector && + method_exists( 'QM_Output_Html', 'before_non_tabular_output' ) + ) { + $output['cache'] = new QM_Output( $collector ); + } + + return $output; + } + + /** + * Checks if the `object-cache.php` drop-in exists + * + * @return bool + */ + public function object_cache_dropin_exists() { + return file_exists( WP_CONTENT_DIR . '/object-cache.php' ); + } + + /** + * Validates the `object-cache.php` drop-in + * + * @return bool + */ + public function validate_object_cache_dropin() { + if ( ! $this->object_cache_dropin_exists() ) { + return false; + } + + $dropin = get_plugin_data( WP_CONTENT_DIR . '/object-cache.php' ); + $plugin = get_plugin_data( WP_REDIS_PLUGIN_PATH . '/includes/object-cache.php' ); + + /** + * Filters the drop-in validation state + * + * @since 2.0.16 + * @param bool $state The validation state of the drop-in. + * @param string $dropin The `PluginURI` of the drop-in. + * @param string $plugin The `PluginURI` of the plugin. + */ + return apply_filters( + 'redis_cache_validate_dropin', + $dropin['PluginURI'] === $plugin['PluginURI'], + $dropin['PluginURI'], + $plugin['PluginURI'] + ); + } + + /** + * Checks if the `object-cache.php` drop-in is outdated + * + * @return bool + */ + public function object_cache_dropin_outdated() { + if ( ! $this->object_cache_dropin_exists() ) { + return false; + } + + $dropin = get_plugin_data( WP_CONTENT_DIR . '/object-cache.php' ); + $plugin = get_plugin_data( WP_REDIS_PLUGIN_PATH . '/includes/object-cache.php' ); + + if ( $dropin['PluginURI'] === $plugin['PluginURI'] ) { + return version_compare( $dropin['Version'], $plugin['Version'], '<' ); + } + + return false; + } + + /** + * Retrieves the current human-readable status + * + * @return string + */ + public function get_status() { + global $wp_object_cache; + + if ( defined( 'WP_REDIS_DISABLED' ) && WP_REDIS_DISABLED ) { + return __( 'Disabled', 'redis-cache' ); + } + + if ( ! $this->object_cache_dropin_exists() ) { + return __( 'Not enabled', 'redis-cache' ); + } + + if ( $this->object_cache_dropin_outdated() ) { + return __( 'Drop-in is outdated', 'redis-cache' ); + } + + if ( ! $this->validate_object_cache_dropin() ) { + return __( 'Drop-in is invalid', 'redis-cache' ); + } + + if ( method_exists( $wp_object_cache, 'redis_status' ) ) { + return $wp_object_cache->redis_status() + ? __( 'Connected', 'redis-cache' ) + : __( 'Not connected', 'redis-cache' ); + } + + return __( 'Unknown', 'redis-cache' ); + } + + /** + * Retrieves the Redis connection status + * + * @return bool|null Boolean Redis connection status if available, null otherwise. + */ + public function get_redis_status() { + global $wp_object_cache; + + if ( defined( 'WP_REDIS_DISABLED' ) && WP_REDIS_DISABLED ) { + return null; + } + + if ( $this->object_cache_dropin_outdated() ) { + return null; + } + + if ( ! $this->validate_object_cache_dropin() ) { + return null; + } + + if ( ! method_exists( $wp_object_cache, 'redis_status' ) ) { + return null; + } + + return $wp_object_cache->redis_status(); + } + + /** + * Check whether we can connect to Redis via Predis. + * + * @return bool|string + */ + public function check_redis_connection() { + try { + $predis = new Predis(); + $predis->connect(); + } catch ( Exception $error ) { + return $error->getMessage(); + } + + return true; + } + + /** + * Returns the redis version if possible + * + * @see WP_Object_Cache::redis_version() + * @return null|string + */ + public function get_redis_version() { + global $wp_object_cache; + + if ( defined( 'WP_REDIS_DISABLED' ) && WP_REDIS_DISABLED ) { + return null; + } + + if ( ! $this->validate_object_cache_dropin() || ! method_exists( $wp_object_cache, 'redis_version' ) ) { + return null; + } + + return $wp_object_cache->redis_version(); + } + + /** + * Returns the currently used redis client (if any) + * + * @return null|string + */ + public function get_redis_client_name() { + global $wp_object_cache; + + if ( isset( $wp_object_cache->diagnostics[ 'client' ] ) ) { + return $wp_object_cache->diagnostics[ 'client' ]; + } + + if ( ! defined( 'WP_REDIS_CLIENT' ) ) { + return null; + } + + return WP_REDIS_CLIENT; + } + + /** + * Fetches the redis diagnostics data + * + * @return null|array + */ + public function get_diagnostics() { + global $wp_object_cache; + + if ( ! $this->validate_object_cache_dropin() || ! property_exists( $wp_object_cache, 'diagnostics' ) ) { + return null; + } + + return $wp_object_cache->diagnostics; + } + + /** + * Retrieves the redis prefix + * + * @return null|mixed + */ + public function get_redis_prefix() { + return defined( 'WP_REDIS_PREFIX' ) ? WP_REDIS_PREFIX : null; + } + + /** + * Retrieves the redis maximum time to live + * + * @return null|mixed + */ + public function get_redis_maxttl() { + return defined( 'WP_REDIS_MAXTTL' ) ? WP_REDIS_MAXTTL : null; + } + + /** + * Displays admin notices + * + * @return void + */ + public function show_admin_notices() { + $this->pro_notice(); + $this->wc_pro_notice(); + + // Only show admin notices to users with the right capability. + if ( ! $this->current_user_can_manage_redis() ) { + return; + } + + // Do not display the dropin message if you want + if ( defined( 'WP_REDIS_DISABLE_DROPIN_BANNERS' ) && WP_REDIS_DISABLE_DROPIN_BANNERS ) { + return; + } + + if ( defined( 'RedisCachePro\Version' ) || defined( 'ObjectCachePro\Version' ) ) { + return; + } + + if ( $this->object_cache_dropin_exists() ) { + if ( $this->validate_object_cache_dropin() ) { + if ( $this->object_cache_dropin_outdated() ) { + $message = sprintf( + // translators: %s = Action link to update the drop-in. + __( 'The Redis object cache drop-in is outdated. Please update the drop-in.', 'redis-cache' ), + $this->action_link( 'update-dropin' ) + ); + } + } else { + $message = sprintf( + // translators: %s = Link to settings page. + __( 'A foreign object cache drop-in was found. To use Redis for object caching, please enable the drop-in.', 'redis-cache' ), + esc_url( network_admin_url( $this->page ) ) + ); + } + + if ( isset( $message ) ) { + printf( '
%s
', wp_kses_post( $message ) ); + } + } + } + + /** + * Display the admin bar menu item. + * + * @param \WP_Admin_Bar $wp_admin_bar + * + * @return void + */ + public function render_admin_bar( $wp_admin_bar ) { + if ( defined( 'WP_REDIS_DISABLE_ADMINBAR' ) && WP_REDIS_DISABLE_ADMINBAR ) { + return; + } + + if ( ! $this->current_user_can_manage_redis() ) { + return; + } + + $nodeTitle = __( 'Object Cache', 'redis-cache' ); + + $style = preg_replace( '/\s+/', ' ', $this->admin_bar_style() ); + $script = preg_replace( '/\s+/', ' ', $this->admin_bar_script() ); + $html = "\n{$style}\n{$script}\n"; + + $redis_status = $this->get_redis_status(); + + $wp_admin_bar->add_node([ + 'id' => 'redis-cache', + 'title' => $nodeTitle, + 'meta' => [ + 'html' => $html, + 'class' => $redis_status === false ? 'redis-cache-error' : '', + ], + ]); + + if ( $redis_status ) { + $wp_admin_bar->add_node([ + 'parent' => 'redis-cache', + 'id' => 'redis-cache-flush', + 'title' => __( 'Flush Cache', 'redis-cache' ), + 'href' => $this->action_link( 'flush-cache' ), + ]); + } + + $wp_admin_bar->add_node([ + 'parent' => 'redis-cache', + 'id' => 'redis-cache-metrics', + 'title' => __( 'Settings', 'redis-cache' ), + 'href' => network_admin_url( $this->page ), + ]); + + $wp_admin_bar->add_group( + [ + 'id' => 'redis-cache-info', + 'parent' => 'redis-cache', + 'meta' => [ + 'class' => 'ab-sub-secondary', + ], + ] + ); + + $value = $this->get_status(); + // translators: %s = The status of the Redis connection. + $title = sprintf( __( 'Status: %s', 'redis-cache' ), $value ); + + if ( $redis_status ) { + global $wp_object_cache; + + $info = $wp_object_cache->info(); + $hits = number_format_i18n( $info->hits ); + $misses = number_format_i18n( $info->misses ); + $size = size_format( $info->bytes ); + + $value = sprintf( + '%s%%  %s/%s  %s', + $info->ratio, + $hits, + $misses, + $size + ); + + $title = sprintf( + // translators: 1: Hit ratio, 2: Hits, 3: Misses. 4: Human-readable size of cache. + __( '(Current page) Hit Ratio: %1$s%%, Hits %2$s, Misses: %3$s, Size: %4$s', 'redis-cache' ), + $info->ratio, + $hits, + $misses, + $size + ); + } + + $wp_admin_bar->add_node([ + 'parent' => 'redis-cache-info', + 'id' => 'redis-cache-info-details', + 'title' => $value, + 'href' => $redis_status && Metrics::is_enabled() ? network_admin_url( $this->page . '#metrics' ) : '', + 'meta' => [ + 'title' => $title, + ], + ]); + } + + /** + * Returns the admin-bar +HTML; + } + + /** + * Returns the admin-bar +HTML; + } + + /** + * Executes admin actions + * + * @return void + */ + public function do_admin_actions() { + global $wp_filesystem; + + if ( isset( $_GET['_wpnonce'], $_GET['action'] ) ) { + $action = sanitize_key( $_GET['action'] ); + $nonce = sanitize_key( $_GET['_wpnonce'] ); + + // Nonce verification. + foreach ( $this->actions as $name ) { + if ( $action === $name && ! wp_verify_nonce( $nonce, $action ) ) { + return; + } + } + + if ( in_array( $action, $this->actions, true ) ) { + $url = $this->action_link( $action ); + + if ( $action === 'flush-cache' ) { + wp_cache_flush() + ? add_settings_error( + 'redis-cache', + 'flush', + __( 'Object cache flushed.', 'redis-cache' ), + 'updated' + ) + : add_settings_error( + 'redis-cache', + 'flush', + __( 'Object cache could not be flushed.', 'redis-cache' ), + 'error' + ); + } + + // do we have filesystem credentials? + if ( $this->initialize_filesystem( $url, true ) ) { + + if ( $action === 'enable-cache' ) { + $result = $wp_filesystem->copy( + WP_REDIS_PLUGIN_PATH . '/includes/object-cache.php', + WP_CONTENT_DIR . '/object-cache.php', + true, + FS_CHMOD_FILE + ); + + if ( $result ) { + (new Predis)->flush(); + } + + /** + * Fires on cache enable event + * + * @since 1.3.5 + * @param bool $result Whether the filesystem event (copy of the `object-cache.php` file) was successful. + */ + do_action( 'redis_object_cache_enable', $result ); + + $result + ? add_settings_error( + 'redis-cache', + 'dropin', + __( 'Object cache enabled.', 'redis-cache' ), + 'updated' + ) + : add_settings_error( + 'redis-cache', + 'dropin', + __( 'Object cache could not be enabled.', 'redis-cache' ), + 'error' + ); + } + + if ( $action === 'disable-cache' ) { + $result = $wp_filesystem->delete( WP_CONTENT_DIR . '/object-cache.php' ); + + if ( $result ) { + (new Predis)->flush(); + } + + /** + * Fires on cache enable event + * + * @since 1.3.5 + * @param bool $result Whether the filesystem event (deletion of the `object-cache.php` file) was successful. + */ + do_action( 'redis_object_cache_disable', $result ); + + $result + ? add_settings_error( + 'redis-cache', + 'dropin', + __( 'Object cache disabled.', 'redis-cache' ), + 'updated' + ) + : add_settings_error( + 'redis-cache', + 'dropin', + __( 'Object cache could not be disabled.', 'redis-cache' ), + 'error' + ); + } + + if ( $action === 'update-dropin' ) { + $result = $wp_filesystem->copy( + WP_REDIS_PLUGIN_PATH . '/includes/object-cache.php', + WP_CONTENT_DIR . '/object-cache.php', + true, + FS_CHMOD_FILE + ); + + /** + * Fires on cache enable event + * + * @since 1.3.5 + * @param bool $result Whether the filesystem event (copy of the `object-cache.php` file) was successful. + */ + do_action( 'redis_object_cache_update_dropin', $result ); + + $result + ? add_settings_error( + 'redis-cache', + 'dropin', + __( 'Updated object cache drop-in and enabled Redis object cache.', 'redis-cache' ), + 'updated' + ) + : add_settings_error( + 'redis-cache', + 'dropin', + __( 'Object cache drop-in could not be updated.', 'redis-cache' ), + 'error' + ); + } + } + + $messages = get_settings_errors( 'redis-cache' ); + + if ( count( $messages ) !== 0 ) { + set_transient( 'settings_errors', $messages, 30 ); + + wp_safe_redirect( + network_admin_url( add_query_arg( 'settings-updated', 1, $this->page ) ) + ); + exit; + } + } + } + } + + /** + * Dismisses the admin notice for the current user + * + * @return void + */ + public function ajax_dismiss_notice() { + if ( isset( $_POST['notice'] ) ) { + check_ajax_referer( 'roc_dismiss_notice' ); + + $notice = sprintf( + 'roc_dismissed_%s', + sanitize_key( $_POST['notice'] ) + ); + + update_user_meta( get_current_user_id(), $notice, '1' ); + } + + wp_die(); + } + + /** + * Flushes object cache + * + * @return void + */ + public function ajax_flush_cache() { + if ( ! wp_verify_nonce( $_POST['nonce'] ) ) { + $message = 'Invalid Nonce.'; + } else if ( wp_cache_flush() ) { + $message = 'Object cache flushed.'; + } else { + $message = 'Object cache could not be flushed.'; + } + + wp_die( __( $message , 'redis-cache' ) ); + } + + /** + * Displays a redis cache pro admin notice + * + * @return void + */ + public function pro_notice() { + $screen = get_current_screen(); + + if ( ! isset( $screen->id ) ) { + return; + } + + if ( $screen->id === $this->screen && ( defined( 'RedisCachePro\Version' ) || defined( 'ObjectCachePro\Version' ) ) ) { + printf( + '

%s

', + wp_kses_post( + sprintf( + // translators: %s = Action link to update the drop-in. + __( 'The Object Cache Pro plugin appears to be installed and should be used. You can safely uninstall Redis Object Cache.', 'redis-cache' ), + esc_url( network_admin_url( 'plugins.php?plugin_status=all&s=redis%20object%20cache' ) ) + ) + ) + ); + + return; + } + + if ( defined( 'RedisCachePro\Version' ) || defined( 'ObjectCachePro\Version' ) ) { + return; + } + + if ( defined( 'WP_REDIS_DISABLE_BANNERS' ) && WP_REDIS_DISABLE_BANNERS ) { + return; + } + + if ( ! in_array( $screen->id, [ 'dashboard', 'dashboard-network' ], true ) ) { + return; + } + + if ( ! $this->current_user_can_manage_redis() ) { + return; + } + + if ( intval( get_user_meta( get_current_user_id(), 'roc_dismissed_pro_release_notice', true ) ) === 1 ) { + return; + } + + printf( + '

%s %s

', + esc_attr( wp_create_nonce( 'roc_dismiss_notice' ) ), + esc_html__( 'Object Cache Pro!', 'redis-cache' ), + sprintf( + // translators: %s = Link to the plugin setting screen. + wp_kses_post( __( 'A business class object cache backend. Truly reliable, highly-optimized and fully customizable, with a dedicated engineer when you most need it. Learn more »', 'redis-cache' ) ), + esc_url( network_admin_url( $this->page ) ) + ) + ); + } + + /** + * Displays a redis cache pro admin notice specifically for WooCommerce + * + * @return void + */ + public function wc_pro_notice() { + if ( defined( 'RedisCachePro\Version' ) || defined( 'ObjectCachePro\Version' ) ) { + return; + } + + if ( defined( 'WP_REDIS_DISABLE_BANNERS' ) && WP_REDIS_DISABLE_BANNERS ) { + return; + } + + if ( ! class_exists( 'WooCommerce' ) ) { + return; + } + + $screen = get_current_screen(); + + if ( ! isset( $screen->id ) ) { + return; + } + + if ( ! in_array( $screen->id, [ 'edit-shop_order', 'edit-product', 'woocommerce_page_wc-admin' ], true ) ) { + return; + } + + if ( ! $this->current_user_can_manage_redis() ) { + return; + } + + if ( intval( get_user_meta( get_current_user_id(), 'roc_dismissed_wc_pro_notice', true ) ) === 1 ) { + return; + } + + printf( + '

%s

%s

', + esc_attr( wp_create_nonce( 'roc_dismiss_notice' ) ), + esc_html__( 'Object Cache Pro + WooCommerce = ❤️', 'redis-cache' ), + sprintf( + // translators: %s = Link to the plugin's settings screen. + wp_kses_post( __( 'Object Cache Pro is a business class object cache that’s highly-optimized for WooCommerce to provide true reliability, peace of mind and faster load times for your store. Learn more »', 'redis-cache' ) ), + esc_url( network_admin_url( $this->page ) ) + ) + ); + } + + /** + * Registers all hooks associated with the shutdown hook + * + * @return void + */ + public function register_shutdown_hooks() { + if ( ! defined( 'WP_REDIS_DISABLE_COMMENT' ) || ! WP_REDIS_DISABLE_COMMENT ) { + add_action( 'shutdown', [ $this, 'maybe_print_comment' ], 0 ); + } + } + + /** + * Displays the redis cache html comment + * + * @return void + */ + public function maybe_print_comment() { + /** @var \WP_Object_Cache $wp_object_cache */ + global $wp_object_cache; + + if ( + ( defined( 'WP_CLI' ) && WP_CLI ) || + ( defined( 'DOING_CRON' ) && DOING_CRON ) || + ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || + ( defined( 'REST_REQUEST' ) && REST_REQUEST ) || + ( defined( 'JSON_REQUEST' ) && JSON_REQUEST ) || + ( defined( 'IFRAME_REQUEST' ) && IFRAME_REQUEST ) || + ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) || + ( defined( 'WC_API_REQUEST' ) && WC_API_REQUEST ) + ) { + return; + } + + if ( function_exists( 'wp_is_json_request' ) && wp_is_json_request() ) { + return; + } + + if ( + ! isset( $wp_object_cache->cache, $wp_object_cache->diagnostics ) || + ! is_array( $wp_object_cache->cache ) + ) { + return; + } + + if ($this->incompatible_content_type()) { + return; + } + + $message = sprintf( + 'Performance optimized by Redis Object Cache. Learn more: %s', + 'https://wprediscache.com' + ); + + if ( ! WP_DEBUG_DISPLAY ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + printf( "\n\n", $message ); + + return; + } + + $bytes = strlen( serialize( $wp_object_cache->cache ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize + + $debug = sprintf( + // translators: %1$d = number of objects. %2$s = human-readable size of cache. %3$s = name of the used client. + __( 'Retrieved %1$d objects (%2$s) from Redis using %3$s.', 'redis-cache' ), + $wp_object_cache->cache_hits, + function_exists( 'size_format' ) ? size_format( $bytes ) : "{$bytes} bytes", + $wp_object_cache->diagnostics['client'] + ); + + printf( + "\n", + $message, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + esc_html( $debug ) + ); + } + + /** + * Whether incompatible content type headers were sent. + * + * @return bool + */ + protected function incompatible_content_type() { + $jsonContentType = static function ($headers) { + foreach ($headers as $header => $value) { + if (stripos((string) $header, 'content-type') === false) { + continue; + } + + if (stripos((string) $value, '/json') === false) { + continue; + } + + return true; + } + + return false; + }; + + if (function_exists('headers_list')) { + $headers = []; + + foreach (headers_list() as $header) { + [$name, $value] = explode(':', $header); + $headers[$name] = $value; + } + + if ($jsonContentType($headers)) { + return true; + } + } + + if (function_exists('apache_response_headers')) { + if ($headers = apache_response_headers()) { + return $jsonContentType($headers); + } + } + + return false; + } + + /** + * Initializes the WP filesystem API to be ready for use + * + * @param string $url The URL to post the form to. + * @param bool $silent Whether to ask the user for credentials if necessary or not. + * @return bool + */ + public function initialize_filesystem( $url, $silent = false ) { + if ( $silent ) { + ob_start(); + } + + $credentials = request_filesystem_credentials( $url ); + + if ( false === $credentials ) { + if ( $silent ) { + ob_end_clean(); + } + + return false; + } + + if ( ! WP_Filesystem( $credentials ) ) { + request_filesystem_credentials( $url ); + + if ( $silent ) { + ob_end_clean(); + } + + return false; + } + + return true; + } + + /** + * Determines whether object cache file modifications are allowed. + * + * @return bool + */ + function is_file_mod_allowed() { + return apply_filters( + 'file_mod_allowed', + ! defined( 'DISALLOW_FILE_MODS' ) || ! DISALLOW_FILE_MODS, + 'object_cache_dropin' + ); + } + + /** + * Test if we can write in the WP_CONTENT_DIR and modify the `object-cache.php` drop-in + * + * @return true|WP_Error + */ + public function test_filesystem_writing() { + /** @var \WP_Filesystem_Base $wp_filesystem */ + global $wp_filesystem; + + if ( ! $this->is_file_mod_allowed() ) { + return new WP_Error( 'disallowed', __( 'File modifications are not allowed.', 'redis-cache' ) ); + } + + if ( ! $this->initialize_filesystem( '', true ) ) { + return new WP_Error( 'fs', __( 'Could not initialize filesystem.', 'redis-cache' ) ); + } + + $dropin_check = ! defined( 'WP_REDIS_DISABLE_DROPIN_CHECK' ) || ! WP_REDIS_DISABLE_DROPIN_CHECK; + + if ( ! $dropin_check ) { + if ( ! $wp_filesystem->exists( WP_CONTENT_DIR . '/object-cache.php' ) ) { + return true; + } + + if ( ! $wp_filesystem->is_writable( WP_CONTENT_DIR . '/object-cache.php' ) ) { + return new WP_Error( 'writable', __( 'Object cache drop-in is not writable.', 'redis-cache' ) ); + } + + return true; + } + + $cachefile = WP_REDIS_PLUGIN_PATH . '/includes/object-cache.php'; + $testfile = WP_CONTENT_DIR . '/object-cache.tmp'; + + if ( ! $wp_filesystem->exists( $cachefile ) ) { + return new WP_Error( 'exists', __( 'Object cache file doesn’t exist.', 'redis-cache' ) ); + } + + if ( $wp_filesystem->exists( $testfile ) ) { + if ( ! $wp_filesystem->delete( $testfile ) ) { + return new WP_Error( 'delete', __( 'Test file exists, but couldn’t be deleted.', 'redis-cache' ) ); + } + } + + if ( ! $wp_filesystem->is_writable( WP_CONTENT_DIR ) ) { + return new WP_Error( 'writable', __( 'Content directory is not writable.', 'redis-cache' ) ); + } + + if ( ! $wp_filesystem->copy( $cachefile, $testfile, true, FS_CHMOD_FILE ) ) { + return new WP_Error( 'copy', __( 'Failed to copy test file.', 'redis-cache' ) ); + } + + if ( ! $wp_filesystem->exists( $testfile ) ) { + return new WP_Error( 'exists', __( 'Copied test file doesn’t exist.', 'redis-cache' ) ); + } + + $meta = get_file_data( $testfile, [ 'Version' => 'Version' ] ); + + if ( $meta['Version'] !== WP_REDIS_VERSION ) { + return new WP_Error( 'version', __( 'Couldn’t verify test file contents.', 'redis-cache' ) ); + } + + if ( ! $wp_filesystem->delete( $testfile ) ) { + return new WP_Error( 'delete', __( 'Copied test file couldn’t be deleted.', 'redis-cache' ) ); + } + + return true; + } + + /** + * Calls the drop-in update method if necessary + * + * @return void + */ + public function maybe_update_dropin() { + if ( defined( 'WP_REDIS_DISABLE_DROPIN_AUTOUPDATE' ) && WP_REDIS_DISABLE_DROPIN_AUTOUPDATE ) { + return; + } + + if ( $this->object_cache_dropin_outdated() ) { + add_action( 'shutdown', [ $this, 'update_dropin' ] ); + } + } + + /** + * Redirects to the plugin settings if the plugin was just activated + * + * @return void + */ + public function maybe_redirect() { + if ( ! get_transient( '_rediscache_activation_redirect' ) ) { + return; + } + + if ( ! $this->current_user_can_manage_redis() ) { + return; + } + + delete_transient( '_rediscache_activation_redirect' ); + + wp_safe_redirect( network_admin_url( $this->page ) ); + } + + /** + * Updates the `object-cache.php` drop-in + * + * @return void + */ + public function update_dropin() { + global $wp_filesystem; + + if ( ! $this->validate_object_cache_dropin() ) { + return; + } + + if ( $this->initialize_filesystem( '', true ) ) { + $result = $wp_filesystem->copy( + WP_REDIS_PLUGIN_PATH . '/includes/object-cache.php', + WP_CONTENT_DIR . '/object-cache.php', + true, + FS_CHMOD_FILE + ); + + /** + * Fires on cache enable event + * + * @since 1.3.5 + * @param bool $result Whether the filesystem event (copy of the `object-cache.php` file) was successful. + */ + do_action( 'redis_object_cache_update_dropin', $result ); + } + } + + /** + * Plugin activation hook + * + * @return void + */ + public static function on_activation() { + set_transient( '_rediscache_activation_redirect', 1, 30 ); + } + + /** + * Plugin deactivation hook + * + * @param string $plugin Plugin basename. + * @return void + */ + public function on_deactivation( $plugin ) { + global $wp_filesystem; + + ob_start(); + + if ( $plugin === WP_REDIS_BASENAME ) { + $timestamp = wp_next_scheduled( 'rediscache_discard_metrics' ); + + if ( $timestamp ) { + wp_unschedule_event( $timestamp, 'rediscache_discard_metrics' ); + } + + (new Predis)->flush(); + + if ( $this->validate_object_cache_dropin() && $this->initialize_filesystem( '', true ) ) { + $wp_filesystem->delete( WP_CONTENT_DIR . '/object-cache.php' ); + } + } + + ob_end_clean(); + } + + /** + * Helper method to retrieve a nonced plugin action link + * + * @param string $action The action to be executed once the link is followed. + * @return string + */ + public function action_link( $action ) { + if ( ! in_array( $action, $this->actions, true ) ) { + return ''; + } + + return wp_nonce_url( + network_admin_url( add_query_arg( 'action', $action, $this->page ) ), + $action + ); + } + + /** + * Obscure `password` URL parameter. + * + * @param string $url + * @return string + */ + public function obscure_url_secrets( $url ) { + return preg_replace( + '/password=[^&]+/', + 'password=*****', + (string) $url + ); + } + + /** + * The capability required to manage Redis. + * + * @return string + */ + public function manage_redis_capability() { + if ( defined( 'WP_REDIS_MANAGER_CAPABILITY' ) && WP_REDIS_MANAGER_CAPABILITY ) { + return WP_REDIS_MANAGER_CAPABILITY; + } + + $capability = is_multisite() ? 'manage_network_options' : 'manage_options'; + + /** + * Filters the capability used to determine if a user can manage Redis. + * + * @since 2.6.0 + * @param string $capability The default capability to determine if the user can manage cache. + */ + return apply_filters( 'redis_cache_manager_capability', $capability ); + } + + /** + * Does the current user have the capability to manage Redis? + * + * @return bool + */ + public function current_user_can_manage_redis() { + return current_user_can( $this->manage_redis_capability() ); + } + + /** + * Prevent LiteSpeed Cache from overwriting the `object-cache.php` drop-in. + * + * @return void + */ + public function litespeed_disable_objectcache() { + if ( isset( $_POST['LSCWP_CTRL'], $_POST['LSCWP_NONCE'], $_POST['object'] ) ) { + $_POST['object'] = '0'; + } + } + + /** + * Returns `true` if the plugin was installed by AccelerateWP from CloudLinux. + * + * @param bool $ignore_banner_constant + * @return bool + */ + public static function acceleratewp_install( $ignore_banner_constant = false ) { + $path = defined( 'WP_REDIS_PATH' ) ? WP_REDIS_PATH : null; + $scheme = defined( 'WP_REDIS_SCHEME' ) ? WP_REDIS_SCHEME : null; + + if ( $scheme === 'unix' && strpos( (string) $path, '.clwpos/redis.sock' ) !== false ) { + if ( $ignore_banner_constant ) { + return true; + } else { + return defined( 'WP_REDIS_DISABLE_BANNERS' ) && WP_REDIS_DISABLE_BANNERS; + } + } + + return false; + } +} diff --git a/wp-content/plugins/redis-cache/includes/class-predis.php b/wp-content/plugins/redis-cache/includes/class-predis.php new file mode 100644 index 000000000..9fbe687c4 --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/class-predis.php @@ -0,0 +1,237 @@ + 'tcp', + 'host' => '127.0.0.1', + 'port' => 6379, + 'database' => 0, + 'timeout' => 1, + 'read_timeout' => $read_timeout ?? 1, + ]; + + $settings = [ + 'scheme', + 'host', + 'port', + 'path', + 'password', + 'database', + 'timeout', + 'read_timeout', + ]; + + foreach ( $settings as $setting ) { + $constant = sprintf( 'WP_REDIS_%s', strtoupper( $setting ) ); + + if ( defined( $constant ) ) { + $parameters[ $setting ] = constant( $constant ); + } + } + + if ( isset( $parameters['password'] ) && $parameters['password'] === '' ) { + unset( $parameters['password'] ); + } + + if ( defined( 'WP_REDIS_SHARDS' ) ) { + $servers = WP_REDIS_SHARDS; + $parameters['shards'] = $servers; + } elseif ( defined( 'WP_REDIS_SENTINEL' ) ) { + $servers = WP_REDIS_SERVERS; + $parameters['servers'] = $servers; + $options['replication'] = 'sentinel'; + $options['service'] = WP_REDIS_SENTINEL; + } elseif ( defined( 'WP_REDIS_SERVERS' ) ) { + $servers = WP_REDIS_SERVERS; + $parameters['servers'] = $servers; + $options['replication'] = 'predis'; + } elseif ( defined( 'WP_REDIS_CLUSTER' ) ) { + $servers = $this->build_cluster_connection_array(); + $parameters['cluster'] = $servers; + $options['cluster'] = 'redis'; + } + + if ( strcasecmp( 'unix', $parameters['scheme'] ) === 0 ) { + unset( $parameters['host'], $parameters['port'] ); + } + + if ( isset( $parameters['read_timeout'] ) && $parameters['read_timeout'] ) { + $parameters['read_write_timeout'] = $parameters['read_timeout']; + } + + foreach ( [ 'WP_REDIS_SERVERS', 'WP_REDIS_SHARDS', 'WP_REDIS_CLUSTER' ] as $constant ) { + if ( defined( $constant ) ) { + if ( $parameters['database'] ) { + $options['parameters']['database'] = $parameters['database']; + } + + if ( isset( $parameters['password'] ) ) { + if ( is_array( $parameters['password'] ) ) { + $options['parameters']['username'] = WP_REDIS_PASSWORD[0]; + $options['parameters']['password'] = WP_REDIS_PASSWORD[1]; + } else { + $options['parameters']['password'] = WP_REDIS_PASSWORD; + } + } + } + } + + if ( isset( $parameters['password'] ) ) { + if ( is_array( $parameters['password'] ) ) { + $parameters['username'] = array_shift( $parameters['password'] ); + $parameters['password'] = implode( '', $parameters['password'] ); + } + + if ( defined( 'WP_REDIS_USERNAME' ) ) { + $parameters['username'] = WP_REDIS_USERNAME; + } + } + + if ( defined( 'WP_REDIS_SSL_CONTEXT' ) && ! empty( WP_REDIS_SSL_CONTEXT ) ) { + $parameters['ssl'] = WP_REDIS_SSL_CONTEXT; + } + + $this->redis = new \Predis\Client( $servers ?: $parameters, $options ); + $this->redis->connect(); + } + + /** + * Flushes the entire Redis database using the `WP_REDIS_FLUSH_TIMEOUT`. + * + * @param bool $throw_exception Whether to throw exception on error. + * @return bool + */ + public function flush( $throw_exception = false ) { + if ( is_null( $this->redis ) ) { + $flush_timeout = defined( 'WP_REDIS_FLUSH_TIMEOUT' ) + ? intval( WP_REDIS_FLUSH_TIMEOUT ) + : 5; + try { + $this->connect( $flush_timeout ); + } catch ( Exception $exception ) { + if ( $throw_exception ) { + throw $exception; + } + + return false; + } + + if ( is_null( $this->redis ) ) { + return false; + } + } + + if ( defined( 'WP_REDIS_CLUSTER' ) ) { + try { + foreach ( $this->redis->getIterator() as $master ) { + $master->flushdb(); + } + } catch ( Exception $exception ) { + if ( $throw_exception ) { + throw $exception; + } + + return false; + } + + return true; + } + + try { + $this->redis->flushdb(); + } catch ( Exception $exception ) { + if ( $throw_exception ) { + throw $exception; + } + + return false; + } + + return true; + } + + /** + * Flushes the entire Redis database using the `WP_REDIS_FLUSH_TIMEOUT` + * and will throw an exception if anything goes wrong. + * + * @return bool + */ + public function flushOrFail() { + return $this->flush( true ); + } + + /** + * Builds a clean connection array out of redis clusters array. + * + * @return array + */ + protected function build_cluster_connection_array() { + $cluster = array_values( WP_REDIS_CLUSTER ); + + foreach ( $cluster as $key => $server ) { + $components = parse_url( $server ); + + if ( ! empty( $components['scheme'] ) ) { + $scheme = $components['scheme']; + } elseif ( defined( 'WP_REDIS_SCHEME' ) ) { + $scheme = WP_REDIS_SCHEME; + } else { + $scheme = null; + } + + if ( isset( $scheme ) ) { + $cluster[ $key ] = sprintf( + '%s://%s:%d', + $scheme, + $components['host'], + $components['port'] + ); + } else { + $cluster[ $key ] = sprintf( + '%s:%d', + $components['host'], + $components['port'] + ); + } + } + + return $cluster; + } +} diff --git a/wp-content/plugins/redis-cache/includes/class-qm-collector.php b/wp-content/plugins/redis-cache/includes/class-qm-collector.php new file mode 100644 index 000000000..d9ec5d7d5 --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/class-qm-collector.php @@ -0,0 +1,141 @@ +process_defaults(); + + $roc = Plugin::instance(); + + $this->data['status'] = $roc->get_status(); + $this->data['has_dropin'] = $roc->object_cache_dropin_exists(); + $this->data['valid_dropin'] = $roc->validate_object_cache_dropin(); + + if ( ! method_exists( $wp_object_cache, 'info' ) ) { + return; + } + + $info = $wp_object_cache->info(); + + $this->data['hits'] = $info->hits; + $this->data['misses'] = $info->misses; + $this->data['ratio'] = $info->ratio; + $this->data['bytes'] = $info->bytes; + + $this->data['errors'] = $info->errors; + $this->data['meta'] = $info->meta; + + if ( defined( 'WP_REDIS_DISABLED' ) && WP_REDIS_DISABLED ) { + $this->data['meta'][ __( 'Disabled', 'redis-cache' ) ] = __( 'Yes', 'redis-cache' ); + } + + $this->data['groups'] = [ + 'global' => $info->groups->global, + 'non_persistent' => $info->groups->non_persistent, + 'unflushable' => $info->groups->unflushable, + ]; + + // These are used by Query Monitor + $this->data['cache_hit_percentage'] = $info->ratio; + + if ( $this->data instanceof QM_Data_Cache ) { + $this->data->stats['cache_hits'] = $info->hits; + $this->data->stats['cache_misses'] = $info->misses; + } else { + $this->data['stats']['cache_hits'] = $info->hits; + $this->data['stats']['cache_misses'] = $info->misses; + } + } + + /** + * Sets collector defaults + * + * @return void + */ + public function process_defaults() { + $this->data['hits'] = 0; + $this->data['misses'] = 0; + $this->data['ratio'] = 0; + $this->data['bytes'] = 0; + + $this->data['cache_hit_percentage'] = 0; + + $this->data['object_cache_extensions'] = []; + $this->data['opcode_cache_extensions'] = []; + + if ( function_exists( 'extension_loaded' ) ) { + $this->data['object_cache_extensions'] = array_map( + 'extension_loaded', + [ + 'APCu' => 'apcu', + 'Redis' => 'redis', + 'Relay' => 'relay', + 'Memcache' => 'memcache', + 'Memcached' => 'memcached', + ] + ); + + $this->data['opcode_cache_extensions'] = array_map( + 'extension_loaded', + [ + 'APC' => 'APC', + 'Zend OPcache' => 'Zend OPcache', + ] + ); + } + + $this->data['has_object_cache'] = (bool) wp_using_ext_object_cache(); + $this->data['has_opcode_cache'] = array_filter( $this->data['opcode_cache_extensions'] ) ? true : false; + + $this->data['display_hit_rate_warning'] = false; + $this->data['ext_object_cache'] = $this->data['has_object_cache']; + } +} diff --git a/wp-content/plugins/redis-cache/includes/class-qm-output.php b/wp-content/plugins/redis-cache/includes/class-qm-output.php new file mode 100644 index 000000000..366879a0d --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/class-qm-output.php @@ -0,0 +1,122 @@ +collector->get_data(); + + $title = $data['ratio'] + ? sprintf( '%s (%s%%)', $this->name(), $data['ratio'] ) + : $this->name(); + + $args = [ + 'title' => esc_html( $title ), + ]; + + if ( empty( $data['status'] ) ) { + $args['meta']['classname'] = 'qm-alert'; + } + + if ( ! empty( $data['errors'] ) ) { + $args['meta']['classname'] = 'qm-warning'; + } + + $menu[ $this->collector->id() ] = $this->menu( $args ); + + return $menu; + } + + /** + * Adds a menu item in the panel navigation menu in Query Monitor's output. + * + * @param array $menu Array of menus. + */ + public function panel_menu( array $menu ) { + $ids = array_keys( $menu ); + $request = array_search( 'qm-request', $ids, true ); + $position = false === $request ? count( $menu ) : $request; + + $item = [ + $this->collector->id() => $this->menu( [ 'title' => $this->name() ] ), + ]; + + return array_merge( + array_slice( $menu, 0, $position ), + $item, + array_slice( $menu, $position ) + ); + } + + /** + * Renders the output + * + * @return void + */ + public function output() { + $data = $this->collector->get_data(); + + if ( ! $data['has_dropin'] ) { + $this->before_non_tabular_output(); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $this->build_notice( + esc_html__( 'The Redis Object Cache drop-in is not installed. Use WP CLI or go to "Settings -> Redis" to enable drop-in.', 'redis-cache' ) + ); + $this->after_non_tabular_output(); + + return; + } + + if ( ! $data['valid_dropin'] ) { + $this->before_non_tabular_output(); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $this->build_notice( + esc_html__( 'WordPress is using a foreign object cache drop-in and Redis Object Cache is not being used. Use WP CLI or go to "Settings -> Redis" to enable drop-in.', 'redis-cache' ) + ); + $this->after_non_tabular_output(); + + return; + } + + require_once WP_REDIS_PLUGIN_PATH . '/includes/ui/query-monitor.php'; + } +} diff --git a/wp-content/plugins/redis-cache/includes/class-ui.php b/wp-content/plugins/redis-cache/includes/class-ui.php new file mode 100644 index 000000000..b251dccea --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/class-ui.php @@ -0,0 +1,45 @@ +object_cache_dropin_exists() ) { + + if ( $plugin->validate_object_cache_dropin() ) { + WP_CLI::line( __( 'Redis object cache already enabled.', 'redis-cache' ) ); + } else { + WP_CLI::error( __( 'A foreign object cache drop-in was found. To use Redis for object caching, run: `wp redis update-dropin`.', 'redis-cache' ) ); + } + } else { + $flush = $this->flush_redis(); + + if ( is_string( $flush ) ) { + // translators: %s = The Redis connection error message. + WP_CLI::error( sprintf( __( "Object cache could not be enabled. Redis server is unreachable: %s", 'redis-cache' ), $flush ) ); + } + + WP_Filesystem(); + + $copy = $wp_filesystem->copy( + WP_REDIS_PLUGIN_PATH . '/includes/object-cache.php', + WP_CONTENT_DIR . '/object-cache.php', + true, + FS_CHMOD_FILE + ); + + if ( $copy ) { + WP_CLI::success( __( 'Object cache enabled.', 'redis-cache' ) ); + } else { + WP_CLI::error( __( 'Object cache could not be enabled.', 'redis-cache' ) ); + } + } + + } + + /** + * Disables the Redis object cache. + * + * Default behavior is to delete the object cache drop-in, + * unless an unknown object cache drop-in is present. + * + * ## EXAMPLES + * + * wp redis disable + */ + public function disable() { + + global $wp_filesystem; + + $plugin = Plugin::instance(); + + if ( ! $plugin->object_cache_dropin_exists() ) { + + WP_CLI::error( __( 'No object cache drop-in found.', 'redis-cache' ) ); + + } else { + + if ( ! $plugin->validate_object_cache_dropin() ) { + + WP_CLI::error( __( 'A foreign object cache drop-in was found. To use Redis for object caching, run: `wp redis update-dropin`.', 'redis-cache' ) ); + + } else { + + WP_Filesystem(); + + if ( $wp_filesystem->delete( WP_CONTENT_DIR . '/object-cache.php' ) ) { + $this->flush_redis(); + + WP_CLI::success( __( 'Object cache disabled.', 'redis-cache' ) ); + } else { + WP_CLI::error( __( 'Object cache could not be disabled.', 'redis-cache' ) ); + } + } + } + + } + + /** + * Updates the Redis object cache drop-in. + * + * Default behavior is to overwrite any existing object cache drop-in. + * + * ## EXAMPLES + * + * wp redis update-dropin + * + * @subcommand update-dropin + */ + public function update_dropin() { + + global $wp_filesystem; + + WP_Filesystem(); + + $copy = $wp_filesystem->copy( + WP_REDIS_PLUGIN_PATH . '/includes/object-cache.php', + WP_CONTENT_DIR . '/object-cache.php', + true, + FS_CHMOD_FILE + ); + + if ( $copy ) { + $flush = $this->flush_redis(); + + if ( is_string( $flush ) ) { + // translators: %s = The Redis connection error message. + WP_CLI::error( sprintf( __( "Object cache drop-in could not be updated. Redis server is unreachable: %s", 'redis-cache' ), $flush ) ); + } + + WP_CLI::success( __( 'Updated object cache drop-in and enabled Redis object cache.', 'redis-cache' ) ); + } else { + WP_CLI::error( __( 'Object cache drop-in could not be updated.', 'redis-cache' ) ); + } + + } + + /** + * Flush the Redis cache via Predis. + * + * @return bool|string + */ + protected function flush_redis() { + try { + return (new Predis)->flushOrFail(); + } catch ( Exception $exception ) { + error_log( $exception ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + + return $exception->getMessage(); + } + } +} diff --git a/wp-content/plugins/redis-cache/includes/diagnostics.php b/wp-content/plugins/redis-cache/includes/diagnostics.php new file mode 100644 index 000000000..c73069d9c --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/diagnostics.php @@ -0,0 +1,166 @@ +test_filesystem_writing(); +$dropin = $roc->validate_object_cache_dropin(); +$disabled = defined( 'WP_REDIS_DISABLED' ) && WP_REDIS_DISABLED; + +$info['Status'] = $roc->get_status(); +$info['Client'] = $roc->get_redis_client_name(); + +$info['Drop-in'] = $roc->object_cache_dropin_exists() + ? ( $dropin ? 'Valid' : 'Invalid' ) + : 'Not installed'; + +$info['Disabled'] = $disabled ? 'Yes' : 'No'; + +if ( $dropin && ! $disabled ) { + $info[ 'Ping' ] = $wp_object_cache->diagnostics['ping'] ?? false; + + try { + $cache = new WP_Object_Cache( false ); + } catch ( Exception $exception ) { + $info[ 'Connection Exception' ] = sprintf( '%s (%s)', $exception->getMessage(), get_class( $exception ) ); + } + + $errors = is_array( $wp_object_cache->errors ) ? $wp_object_cache->errors : []; + $info[ 'Errors' ] = wp_json_encode( array_values( $errors ), JSON_PRETTY_PRINT ); +} + +$info['PhpRedis'] = class_exists( 'Redis' ) ? phpversion( 'redis' ) : 'Not loaded'; +$info['Relay'] = class_exists( 'Relay\Relay' ) ? phpversion( 'relay' ) : 'Not loaded'; +$info['Predis'] = class_exists( 'Predis\Client' ) ? Predis\Client::VERSION : 'Not loaded'; +$info['Credis'] = class_exists( 'Credis_Client' ) ? 'v1.14.0' : 'Not loaded'; + +if ( defined( 'PHP_VERSION' ) ) { + $info['PHP Version'] = PHP_VERSION; +} + +if ( defined( 'HHVM_VERSION' ) ) { + $info['HHVM Version'] = HHVM_VERSION; +} + +$info['Plugin Version'] = WP_REDIS_VERSION; +$info['Redis Version'] = $roc->get_redis_version() ?: 'Unknown'; + +$info['Multisite'] = is_multisite() ? 'Yes' : 'No'; + +$info['Metrics'] = \Rhubarb\RedisCache\Metrics::is_active() ? 'Enabled' : 'Disabled'; +$info['Metrics recorded'] = wp_json_encode( \Rhubarb\RedisCache\Metrics::count() ); + +$info['Filesystem'] = is_wp_error( $filesystem ) ? $filesystem->get_error_message() : 'Writable'; + +if ( $dropin && ! $disabled ) { + $info['Global Prefix'] = wp_json_encode( $wp_object_cache->global_prefix ); + $info['Blog Prefix'] = wp_json_encode( $wp_object_cache->blog_prefix ); + $info['Timeout'] = $wp_object_cache->diagnostics['timeout'] ?? false; + $info['Read Timeout'] = $wp_object_cache->diagnostics['read_timeout'] ?? false; + $info['Retry Interval'] = $wp_object_cache->diagnostics['retry_interval'] ?? false; +} + +$constants = [ + 'WP_REDIS_DISABLED', + 'WP_REDIS_CLIENT', + 'WP_REDIS_SCHEME', + 'WP_REDIS_SSL_CONTEXT', + 'WP_REDIS_PATH', + 'WP_REDIS_HOST', + 'WP_REDIS_PORT', + 'WP_REDIS_DATABASE', + 'WP_REDIS_TIMEOUT', + 'WP_REDIS_READ_TIMEOUT', + 'WP_REDIS_RETRY_INTERVAL', + 'WP_REDIS_SERVERS', + 'WP_REDIS_CLUSTER', + 'WP_REDIS_SHARDS', + 'WP_REDIS_SENTINEL', + 'WP_REDIS_IGBINARY', + 'WP_REDIS_MAXTTL', + 'WP_REDIS_PREFIX', + 'WP_CACHE_KEY_SALT', + 'WP_REDIS_PLUGIN_PATH', + 'WP_REDIS_METRICS_MAX_TIME', + 'WP_REDIS_GLOBAL_GROUPS', + 'WP_REDIS_IGNORED_GROUPS', + 'WP_REDIS_UNFLUSHABLE_GROUPS', + 'WP_REDIS_SELECTIVE_FLUSH', +]; + +foreach ( $constants as $constant ) { + if ( defined( $constant ) ) { + $info[ $constant ] = wp_json_encode( + constant( $constant ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT + ); + } +} + +if ( defined( 'WP_REDIS_PASSWORD' ) ) { + /** @var string|array|null $password */ + $password = WP_REDIS_PASSWORD; + + if ( is_array( $password ) ) { + if ( isset( $password[1] ) && '' !== $password[1] ) { + $password[1] = str_repeat( '•', 8 ); + } + + $info['WP_REDIS_PASSWORD'] = wp_json_encode( $password, JSON_UNESCAPED_UNICODE ); + } elseif ( is_string( $password ) && '' !== $password ) { + $info['WP_REDIS_PASSWORD'] = str_repeat( '•', 8 ); + } +} + +if ( isset( $info['WP_REDIS_SERVERS'] ) ) { + $info['WP_REDIS_SERVERS'] = $roc->obscure_url_secrets( $info['WP_REDIS_SERVERS'] ); +} + +if ( $dropin && ! $disabled ) { + $info['Global Groups'] = wp_json_encode( + array_values( $wp_object_cache->global_groups ?? [] ), + JSON_PRETTY_PRINT + ); + + $info['Ignored Groups'] = wp_json_encode( + array_values( $wp_object_cache->ignored_groups ?? [] ), + JSON_PRETTY_PRINT + ); + + $info['Unflushable Groups'] = wp_json_encode( + array_values( $wp_object_cache->unflushable_groups ?? [] ), + JSON_PRETTY_PRINT + ); + + $info['Groups Types'] = wp_json_encode( + $wp_object_cache->group_type ?? null, + JSON_PRETTY_PRINT + ); +} + +$dropins = []; + +foreach ( get_dropins() as $file => $details ) { + $dropins[ $file ] = sprintf( '%s v%s by %s', $details['Name'], $details['Version'], $details['Author'] ); +} + +$info['Drop-ins'] = wp_json_encode( + array_values( $dropins ), + JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE +); + +foreach ( $info as $name => $value ) { + if ( defined( 'WP_CLI' ) && WP_CLI ) { + WP_CLI::line( "{$name}: $value" ); + } else { + echo esc_html( "{$name}: {$value}\r\n" ); + } +} diff --git a/wp-content/plugins/redis-cache/includes/object-cache.php b/wp-content/plugins/redis-cache/includes/object-cache.php new file mode 100644 index 000000000..b2a631d32 --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/object-cache.php @@ -0,0 +1,3085 @@ +add( $key, $value, $group, $expiration ); +} + +/** + * Adds multiple values to the cache in one call. + * + * @param array $data Array of keys and values to be set. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if cache key and group already exist. + */ +function wp_cache_add_multiple( array $data, $group = '', $expire = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->add_multiple( $data, $group, $expire ); +} + +/** + * Closes the cache. + * + * This function has ceased to do anything since WordPress 2.5. The + * functionality was removed along with the rest of the persistent cache. This + * does not mean that plugins can't implement this function when they need to + * make sure that the cache is cleaned up after WordPress no longer needs it. + * + * @return bool Always returns True + */ +function wp_cache_close() { + return true; +} + +/** + * Decrement a numeric item's value. + * + * @param string $key The key under which to store the value. + * @param int $offset The amount by which to decrement the item's value. + * @param string $group The group value appended to the $key. + * + * @return int|bool Returns item's new value on success or FALSE on failure. + */ +function wp_cache_decr( $key, $offset = 1, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->decrement( $key, $offset, $group ); +} + +/** + * Remove the item from the cache. + * + * @param string $key The key under which to store the value. + * @param string $group The group value appended to the $key. + * @param int $time The amount of time the server will wait to delete the item in seconds. + * + * @return bool Returns TRUE on success or FALSE on failure. + */ +function wp_cache_delete( $key, $group = '', $time = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->delete( $key, $group, $time ); +} + +/** + * Deletes multiple values from the cache in one call. + * + * @param array $keys Array of keys under which the cache to deleted. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if the contents were not deleted. + */ +function wp_cache_delete_multiple( array $keys, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->delete_multiple( $keys, $group ); +} + +/** + * Invalidate all items in the cache. If `WP_REDIS_SELECTIVE_FLUSH` is `true`, + * only keys prefixed with the `WP_REDIS_PREFIX` are flushed. + * + * @return bool Returns TRUE on success or FALSE on failure. + */ +function wp_cache_flush() { + global $wp_object_cache; + + return $wp_object_cache->flush(); +} + +/** + * Removes all cache items in a group. + * + * @param string $group Name of group to remove from cache. + * @return true Returns TRUE on success or FALSE on failure. + */ +function wp_cache_flush_group( $group ) +{ + global $wp_object_cache; + + return $wp_object_cache->flush_group( $group ); +} + +/** + * Removes all cache items from the in-memory runtime cache. + * + * @return bool True on success, false on failure. + */ +function wp_cache_flush_runtime() { + global $wp_object_cache; + + return $wp_object_cache->flush_runtime(); +} + +/** + * Retrieve object from cache. + * + * Gets an object from cache based on $key and $group. + * + * @param string $key The key under which to store the value. + * @param string $group The group value appended to the $key. + * @param bool $force Optional. Whether to force an update of the local cache from the persistent + * cache. Default false. + * @param bool $found Optional. Whether the key was found in the cache. Disambiguates a return of false, + * a storable value. Passed by reference. Default null. + * + * @return bool|mixed Cached object value. + */ +function wp_cache_get( $key, $group = '', $force = false, &$found = null ) { + global $wp_object_cache; + + return $wp_object_cache->get( $key, $group, $force, $found ); +} + +/** + * Retrieves multiple values from the cache in one call. + * + * @param array $keys Array of keys under which the cache contents are stored. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param bool $force Optional. Whether to force an update of the local cache + * from the persistent cache. Default false. + * @return array Array of values organized into groups. + */ +function wp_cache_get_multiple( $keys, $group = '', $force = false ) { + global $wp_object_cache; + + return $wp_object_cache->get_multiple( $keys, $group, $force ); +} + +/** + * Increment a numeric item's value. + * + * @param string $key The key under which to store the value. + * @param int $offset The amount by which to increment the item's value. + * @param string $group The group value appended to the $key. + * + * @return int|bool Returns item's new value on success or FALSE on failure. + */ +function wp_cache_incr( $key, $offset = 1, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->increment( $key, $offset, $group ); +} + +/** + * Sets up Object Cache Global and assigns it. + * + * @return void + */ +function wp_cache_init() { + global $wp_object_cache; + + if ( ! defined( 'WP_REDIS_PREFIX' ) && getenv( 'WP_REDIS_PREFIX' ) ) { + define( 'WP_REDIS_PREFIX', getenv( 'WP_REDIS_PREFIX' ) ); + } + + if ( ! defined( 'WP_REDIS_SELECTIVE_FLUSH' ) && getenv( 'WP_REDIS_SELECTIVE_FLUSH' ) ) { + define( 'WP_REDIS_SELECTIVE_FLUSH', (bool) getenv( 'WP_REDIS_SELECTIVE_FLUSH' ) ); + } + + // Backwards compatibility: map `WP_CACHE_KEY_SALT` constant to `WP_REDIS_PREFIX`. + if ( defined( 'WP_CACHE_KEY_SALT' ) && ! defined( 'WP_REDIS_PREFIX' ) ) { + define( 'WP_REDIS_PREFIX', WP_CACHE_KEY_SALT ); + } + + // Set unique prefix for sites hosted on Cloudways + if ( ! defined( 'WP_REDIS_PREFIX' ) && isset( $_SERVER['cw_allowed_ip'] ) ) { + define( 'WP_REDIS_PREFIX', getenv( 'HTTP_X_APP_USER' ) ); + } + + if ( ! ( $wp_object_cache instanceof WP_Object_Cache ) ) { + $fail_gracefully = defined( 'WP_REDIS_GRACEFUL' ) && WP_REDIS_GRACEFUL; + + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited + $wp_object_cache = new WP_Object_Cache( $fail_gracefully ); + } +} + +/** + * Replaces a value in cache. + * + * This method is similar to "add"; however, is does not successfully set a value if + * the object's key is not already set in cache. + * + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * + * @return bool Returns TRUE on success or FALSE on failure. + */ +function wp_cache_replace( $key, $value, $group = '', $expiration = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->replace( $key, $value, $group, $expiration ); +} + +/** + * Sets a value in cache. + * + * The value is set whether or not this key already exists in Redis. + * + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * + * @return bool Returns TRUE on success or FALSE on failure. + */ +function wp_cache_set( $key, $value, $group = '', $expiration = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->set( $key, $value, $group, $expiration ); +} + +/** + * Sets multiple values to the cache in one call. + * + * @param array $data Array of keys and values to be set. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false on failure. + */ +function wp_cache_set_multiple( array $data, $group = '', $expire = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->set_multiple( $data, $group, $expire ); +} + +/** + * Switch the internal blog id. + * + * This changes the blog id used to create keys in blog specific groups. + * + * @param int $_blog_id The blog ID. + * + * @return bool + */ +function wp_cache_switch_to_blog( $_blog_id ) { + global $wp_object_cache; + + return $wp_object_cache->switch_to_blog( $_blog_id ); +} + +/** + * Adds a group or set of groups to the list of Redis groups. + * + * @param string|array $groups A group or an array of groups to add. + * + * @return void + */ +function wp_cache_add_global_groups( $groups ) { + global $wp_object_cache; + + $wp_object_cache->add_global_groups( $groups ); +} + +/** + * Adds a group or set of groups to the list of non-Redis groups. + * + * @param string|array $groups A group or an array of groups to add. + * + * @return void + */ +function wp_cache_add_non_persistent_groups( $groups ) { + global $wp_object_cache; + + $wp_object_cache->add_non_persistent_groups( $groups ); +} + +/** + * Object cache class definition + */ +class WP_Object_Cache { + /** + * The Redis client. + * + * @var mixed + */ + private $redis; + + /** + * The Redis server version. + * + * @var null|string + */ + private $redis_version = null; + + /** + * Track if Redis is available. + * + * @var bool + */ + private $redis_connected = false; + + /** + * Check to fail gracefully or throw an exception. + * + * @var bool + */ + private $fail_gracefully = true; + + /** + * Holds the non-Redis objects. + * + * @var array + */ + public $cache = []; + + /** + * Holds the diagnostics values. + * + * @var array + */ + public $diagnostics = null; + + /** + * Holds the error messages. + * + * @var array + */ + public $errors = []; + + /** + * List of global groups. + * + * @var array + */ + public $global_groups = [ + 'blog-details', + 'blog-id-cache', + 'blog-lookup', + 'global-posts', + 'networks', + 'rss', + 'sites', + 'site-details', + 'site-lookup', + 'site-options', + 'site-transient', + 'users', + 'useremail', + 'userlogins', + 'usermeta', + 'user_meta', + 'userslugs', + ]; + + /** + * List of groups that will not be flushed. + * + * @var array + */ + public $unflushable_groups = []; + + /** + * List of groups not saved to Redis. + * + * @var array + */ + public $ignored_groups = []; + + /** + * List of groups and their types. + * + * @var array + */ + public $group_type = []; + + /** + * Prefix used for global groups. + * + * @var string + */ + public $global_prefix = ''; + + /** + * Prefix used for non-global groups. + * + * @var int + */ + public $blog_prefix = 0; + + /** + * Track how many requests were found in cache. + * + * @var int + */ + public $cache_hits = 0; + + /** + * Track how may requests were not cached. + * + * @var int + */ + public $cache_misses = 0; + + /** + * The amount of Redis commands made. + * + * @var int + */ + public $cache_calls = 0; + + /** + * The amount of microseconds (μs) waited for Redis commands. + * + * @var float + */ + public $cache_time = 0; + + /** + * Instantiate the Redis class. + * + * @param bool $fail_gracefully Handles and logs errors if true throws exceptions otherwise. + */ + public function __construct( $fail_gracefully = false ) { + global $blog_id, $table_prefix; + + $this->fail_gracefully = $fail_gracefully; + + if ( defined( 'WP_REDIS_GLOBAL_GROUPS' ) && is_array( WP_REDIS_GLOBAL_GROUPS ) ) { + $this->global_groups = array_map( [ $this, 'sanitize_key_part' ], WP_REDIS_GLOBAL_GROUPS ); + } + + $this->global_groups[] = 'redis-cache'; + + if ( defined( 'WP_REDIS_IGNORED_GROUPS' ) && is_array( WP_REDIS_IGNORED_GROUPS ) ) { + $this->ignored_groups = array_map( [ $this, 'sanitize_key_part' ], WP_REDIS_IGNORED_GROUPS ); + } + + if ( defined( 'WP_REDIS_UNFLUSHABLE_GROUPS' ) && is_array( WP_REDIS_UNFLUSHABLE_GROUPS ) ) { + $this->unflushable_groups = array_map( [ $this, 'sanitize_key_part' ], WP_REDIS_UNFLUSHABLE_GROUPS ); + } + + $this->cache_group_types(); + + if ( function_exists( '_doing_it_wrong' ) ) { + if ( defined( 'WP_REDIS_TRACE' ) && WP_REDIS_TRACE ) { + _doing_it_wrong( __FUNCTION__ , 'Tracing feature was removed.' , '2.1.2' ); + } + } + + $client = $this->determine_client(); + $parameters = $this->build_parameters(); + + try { + switch ( $client ) { + case 'hhvm': + $this->connect_using_hhvm( $parameters ); + break; + case 'phpredis': + $this->connect_using_phpredis( $parameters ); + break; + case 'relay': + $this->connect_using_relay( $parameters ); + break; + case 'credis': + $this->connect_using_credis( $parameters ); + break; + case 'predis': + default: + $this->connect_using_predis( $parameters ); + break; + } + + if ( defined( 'WP_REDIS_CLUSTER' ) ) { + $connectionId = is_string( WP_REDIS_CLUSTER ) + ? WP_REDIS_CLUSTER + : current( $this->build_cluster_connection_array() ); + + $this->diagnostics[ 'ping' ] = $client === 'predis' + ? $this->redis->getClientBy( 'id', $connectionId )->ping() + : $this->redis->ping( $connectionId ); + } else { + $this->diagnostics[ 'ping' ] = $this->redis->ping(); + } + + $this->fetch_info(); + + $this->redis_connected = true; + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + } + + // Assign global and blog prefixes for use with keys. + if ( function_exists( 'is_multisite' ) ) { + $this->global_prefix = is_multisite() ? '' : $table_prefix; + $this->blog_prefix = is_multisite() ? $blog_id : $table_prefix; + } + } + + /** + * Set group type array + * + * @return void + */ + protected function cache_group_types() { + foreach ( $this->global_groups as $group ) { + $this->group_type[ $group ] = 'global'; + } + + foreach ( $this->unflushable_groups as $group ) { + $this->group_type[ $group ] = 'unflushable'; + } + + foreach ( $this->ignored_groups as $group ) { + $this->group_type[ $group ] = 'ignored'; + } + } + + /** + * Determine the Redis client. + * + * @return string + */ + protected function determine_client() { + $client = 'predis'; + + if ( class_exists( 'Redis' ) ) { + $client = defined( 'HHVM_VERSION' ) ? 'hhvm' : 'phpredis'; + } + + if ( defined( 'WP_REDIS_CLIENT' ) ) { + $client = (string) WP_REDIS_CLIENT; + $client = str_replace( 'pecl', 'phpredis', $client ); + } + + return trim( strtolower( $client ) ); + } + + /** + * Build the connection parameters from config constants. + * + * @return array + */ + protected function build_parameters() { + $parameters = [ + 'scheme' => 'tcp', + 'host' => '127.0.0.1', + 'port' => 6379, + 'database' => 0, + 'timeout' => 1, + 'read_timeout' => 1, + 'retry_interval' => null, + 'persistent' => false, + ]; + + $settings = [ + 'scheme', + 'host', + 'port', + 'path', + 'password', + 'database', + 'timeout', + 'read_timeout', + 'retry_interval', + ]; + + foreach ( $settings as $setting ) { + $constant = sprintf( 'WP_REDIS_%s', strtoupper( $setting ) ); + + if ( defined( $constant ) ) { + $parameters[ $setting ] = constant( $constant ); + } + } + + if ( isset( $parameters[ 'password' ] ) && $parameters[ 'password' ] === '' ) { + unset( $parameters[ 'password' ] ); + } + + $this->diagnostics[ 'timeout' ] = $parameters[ 'timeout' ]; + $this->diagnostics[ 'read_timeout' ] = $parameters[ 'read_timeout' ]; + $this->diagnostics[ 'retry_interval' ] = $parameters[ 'retry_interval' ]; + + return $parameters; + } + + /** + * Connect to Redis using the PhpRedis (PECL) extension. + * + * @param array $parameters Connection parameters built by the `build_parameters` method. + * @return void + */ + protected function connect_using_phpredis( $parameters ) { + $version = phpversion( 'redis' ); + + $this->diagnostics[ 'client' ] = sprintf( 'PhpRedis (v%s)', $version ); + + if ( defined( 'WP_REDIS_SHARDS' ) ) { + $this->redis = new RedisArray( array_values( WP_REDIS_SHARDS ) ); + + $this->diagnostics[ 'shards' ] = WP_REDIS_SHARDS; + } elseif ( defined( 'WP_REDIS_CLUSTER' ) ) { + if ( is_string( WP_REDIS_CLUSTER ) ) { + $this->redis = new RedisCluster( WP_REDIS_CLUSTER ); + } else { + $args = [ + 'cluster' => $this->build_cluster_connection_array(), + 'timeout' => $parameters['timeout'], + 'read_timeout' => $parameters['read_timeout'], + 'persistent' => $parameters['persistent'], + ]; + + if ( isset( $parameters['password'] ) && version_compare( $version, '4.3.0', '>=' ) ) { + $args['password'] = $parameters['password']; + } + + if ( version_compare( $version, '5.3.0', '>=' ) && defined( 'WP_REDIS_SSL_CONTEXT' ) && ! empty( WP_REDIS_SSL_CONTEXT ) ) { + if ( ! array_key_exists( 'password', $args ) ) { + $args['password'] = null; + } + + $args['ssl'] = WP_REDIS_SSL_CONTEXT; + } + + $this->redis = new RedisCluster( null, ...array_values( $args ) ); + $this->diagnostics += $args; + } + } else { + $this->redis = new Redis(); + + $args = [ + 'host' => $parameters['host'], + 'port' => $parameters['port'], + 'timeout' => $parameters['timeout'], + '', + 'retry_interval' => (int) $parameters['retry_interval'], + ]; + + if ( version_compare( $version, '3.1.3', '>=' ) ) { + $args['read_timeout'] = $parameters['read_timeout']; + } + + if ( strcasecmp( 'tls', $parameters['scheme'] ) === 0 ) { + $args['host'] = sprintf( + '%s://%s', + $parameters['scheme'], + str_replace( 'tls://', '', $parameters['host'] ) + ); + + if ( version_compare( $version, '5.3.0', '>=' ) && defined( 'WP_REDIS_SSL_CONTEXT' ) && ! empty( WP_REDIS_SSL_CONTEXT ) ) { + $args['others']['stream'] = WP_REDIS_SSL_CONTEXT; + } + } + + if ( strcasecmp( 'unix', $parameters['scheme'] ) === 0 ) { + $args['host'] = $parameters['path']; + $args['port'] = -1; + } + + call_user_func_array( [ $this->redis, 'connect' ], array_values( $args ) ); + + if ( isset( $parameters['password'] ) ) { + $args['password'] = $parameters['password']; + $this->redis->auth( $parameters['password'] ); + } + + if ( isset( $parameters['database'] ) ) { + if ( ctype_digit( (string) $parameters['database'] ) ) { + $parameters['database'] = (int) $parameters['database']; + } + + $args['database'] = $parameters['database']; + + if ( $parameters['database'] ) { + $this->redis->select( $parameters['database'] ); + } + } + + $this->diagnostics += $args; + } + + if ( defined( 'WP_REDIS_SERIALIZER' ) && ! empty( WP_REDIS_SERIALIZER ) ) { + $this->redis->setOption( Redis::OPT_SERIALIZER, WP_REDIS_SERIALIZER ); + + if ( function_exists( '_doing_it_wrong' ) ) { + _doing_it_wrong( __FUNCTION__ , 'The `WP_REDIS_SERIALIZER` configuration constant has been deprecated, use `WP_REDIS_IGBINARY` instead.', '2.3.1' ); + } + } + } + + /** + * Connect to Redis using the Relay extension. + * + * @param array $parameters Connection parameters built by the `build_parameters` method. + * @return void + */ + protected function connect_using_relay( $parameters ) { + $version = phpversion( 'relay' ); + + $this->diagnostics[ 'client' ] = sprintf( 'Relay (v%s)', $version ); + + if ( defined( 'WP_REDIS_SHARDS' ) ) { + throw new Exception('Relay does not support sharding.'); + } elseif ( defined( 'WP_REDIS_CLUSTER' ) ) { + throw new Exception('Relay does not cluster connections.'); + } else { + $this->redis = new Relay\Relay; + + $args = [ + 'host' => $parameters['host'], + 'port' => $parameters['port'], + 'timeout' => $parameters['timeout'], + '', + 'retry_interval' => (int) $parameters['retry_interval'], + ]; + + $args['read_timeout'] = $parameters['read_timeout']; + + if ( strcasecmp( 'tls', $parameters['scheme'] ) === 0 ) { + $args['host'] = sprintf( + '%s://%s', + $parameters['scheme'], + str_replace( 'tls://', '', $parameters['host'] ) + ); + + if ( defined( 'WP_REDIS_SSL_CONTEXT' ) && ! empty( WP_REDIS_SSL_CONTEXT ) ) { + $args['others']['stream'] = WP_REDIS_SSL_CONTEXT; + } + } + + if ( strcasecmp( 'unix', $parameters['scheme'] ) === 0 ) { + $args['host'] = $parameters['path']; + $args['port'] = -1; + } + + call_user_func_array( [ $this->redis, 'connect' ], array_values( $args ) ); + + if ( isset( $parameters['password'] ) ) { + $args['password'] = $parameters['password']; + $this->redis->auth( $parameters['password'] ); + } + + if ( isset( $parameters['database'] ) ) { + if ( ctype_digit( (string) $parameters['database'] ) ) { + $parameters['database'] = (int) $parameters['database']; + } + + $args['database'] = $parameters['database']; + + if ( $parameters['database'] ) { + $this->redis->select( $parameters['database'] ); + } + } + + $this->diagnostics += $args; + } + + if ( defined( 'WP_REDIS_SERIALIZER' ) && ! empty( WP_REDIS_SERIALIZER ) ) { + $this->redis->setOption( Relay\Relay::OPT_SERIALIZER, WP_REDIS_SERIALIZER ); + + if ( function_exists( '_doing_it_wrong' ) ) { + _doing_it_wrong( __FUNCTION__ , 'The `WP_REDIS_SERIALIZER` configuration constant has been deprecated, use `WP_REDIS_IGBINARY` instead.', '2.3.1' ); + } + } + } + + /** + * Connect to Redis using the Predis library. + * + * @param array $parameters Connection parameters built by the `build_parameters` method. + * @throws \Exception If the Predis library was not found or is unreadable. + * @return void + */ + protected function connect_using_predis( $parameters ) { + $client = 'Predis'; + + // Load bundled Predis library. + if ( ! class_exists( 'Predis\Client' ) ) { + $predis = '/dependencies/predis/predis/autoload.php'; + + $pluginDir = defined( 'WP_PLUGIN_DIR' ) ? WP_PLUGIN_DIR . '/redis-cache' : null; + $contentDir = defined( 'WP_CONTENT_DIR' ) ? WP_CONTENT_DIR . '/plugins/redis-cache' : null; + $pluginPath = defined( 'WP_REDIS_PLUGIN_PATH' ) ? WP_REDIS_PLUGIN_PATH : null; + + if ( $pluginDir && is_readable( $pluginDir . $predis ) ) { + require_once $pluginDir . $predis; + } elseif ( $contentDir && is_readable( $contentDir . $predis ) ) { + require_once $contentDir . $predis; + } elseif ( $pluginPath && is_readable( $pluginPath . $predis ) ) { + require_once $pluginPath . $predis; + } else { + throw new Exception( + 'Predis library not found. Re-install Redis Cache plugin or delete the object-cache.php.' + ); + } + } + + $servers = false; + $options = []; + + if ( defined( 'WP_REDIS_SHARDS' ) ) { + $servers = WP_REDIS_SHARDS; + $parameters['shards'] = $servers; + } elseif ( defined( 'WP_REDIS_SENTINEL' ) ) { + $servers = WP_REDIS_SERVERS; + $parameters['servers'] = $servers; + $options['replication'] = 'sentinel'; + $options['service'] = WP_REDIS_SENTINEL; + } elseif ( defined( 'WP_REDIS_SERVERS' ) ) { + $servers = WP_REDIS_SERVERS; + $parameters['servers'] = $servers; + $options['replication'] = 'predis'; + } elseif ( defined( 'WP_REDIS_CLUSTER' ) ) { + $servers = $this->build_cluster_connection_array(); + $parameters['cluster'] = $servers; + $options['cluster'] = 'redis'; + } + + if ( strcasecmp( 'unix', $parameters['scheme'] ) === 0 ) { + unset($parameters['host'], $parameters['port']); + } + + if ( isset( $parameters['read_timeout'] ) && $parameters['read_timeout'] ) { + $parameters['read_write_timeout'] = $parameters['read_timeout']; + } + + foreach ( [ 'WP_REDIS_SERVERS', 'WP_REDIS_SHARDS', 'WP_REDIS_CLUSTER' ] as $constant ) { + if ( defined( $constant ) ) { + if ( $parameters['database'] ) { + $options['parameters']['database'] = $parameters['database']; + } + + if ( isset( $parameters['password'] ) ) { + if ( is_array( $parameters['password'] ) ) { + $options['parameters']['username'] = WP_REDIS_PASSWORD[0]; + $options['parameters']['password'] = WP_REDIS_PASSWORD[1]; + } else { + $options['parameters']['password'] = WP_REDIS_PASSWORD; + } + } + } + } + + if ( isset( $parameters['password'] ) ) { + if ( is_array( $parameters['password'] ) ) { + $parameters['username'] = array_shift( $parameters['password'] ); + $parameters['password'] = implode( '', $parameters['password'] ); + } + + if ( defined( 'WP_REDIS_USERNAME' ) ) { + $parameters['username'] = WP_REDIS_USERNAME; + } + } + + if ( defined( 'WP_REDIS_SSL_CONTEXT' ) && ! empty( WP_REDIS_SSL_CONTEXT ) ) { + $parameters['ssl'] = WP_REDIS_SSL_CONTEXT; + } + + $this->redis = new Predis\Client( $servers ?: $parameters, $options ); + $this->redis->connect(); + + $this->diagnostics = array_merge( + [ 'client' => sprintf( '%s (v%s)', $client, Predis\Client::VERSION ) ], + $parameters, + $options + ); + } + + /** + * Connect to Redis using the Credis library. + * + * @param array $parameters Connection parameters built by the `build_parameters` method. + * @throws \Exception If the Credis library was not found or is unreadable. + * @throws \Exception If redis sharding should be configured as Credis does not support sharding. + * @throws \Exception If more than one seninel is configured as Credis does not support multiple sentinel servers. + * @return void + */ + protected function connect_using_credis( $parameters ) { + _doing_it_wrong( __FUNCTION__ , 'Credis support will be removed in future versions.' , '2.0.26' ); + + $client = 'Credis'; + + $creds_path = sprintf( + '%s/redis-cache/dependencies/colinmollenhour/credis/', + defined( 'WP_PLUGIN_DIR' ) ? WP_PLUGIN_DIR : WP_CONTENT_DIR . '/plugins' + ); + + $to_load = []; + + if ( ! class_exists( 'Credis_Client' ) ) { + $to_load[] = 'Client.php'; + } + + $has_shards = defined( 'WP_REDIS_SHARDS' ); + $has_sentinel = defined( 'WP_REDIS_SENTINEL' ); + $has_servers = defined( 'WP_REDIS_SERVERS' ); + $has_cluster = defined( 'WP_REDIS_CLUSTER' ); + + if ( ( $has_shards || $has_sentinel || $has_servers || $has_cluster ) && ! class_exists( 'Credis_Cluster' ) ) { + $to_load[] = 'Cluster.php'; + + if ( defined( 'WP_REDIS_SENTINEL' ) && ! class_exists( 'Credis_Sentinel' ) ) { + $to_load[] = 'Sentinel.php'; + } + } + + foreach ( $to_load as $sub_path ) { + $path = $creds_path . $sub_path; + + if ( file_exists( $path ) ) { + require_once $path; + } else { + throw new Exception( + 'Credis library not found. Re-install Redis Cache plugin or delete object-cache.php.' + ); + } + } + + if ( defined( 'WP_REDIS_SHARDS' ) ) { + throw new Exception( + 'Sharding not supported by bundled Credis library. Please review your Redis Cache configuration.' + ); + } + + if ( defined( 'WP_REDIS_SENTINEL' ) ) { + if ( is_array( WP_REDIS_SERVERS ) && count( WP_REDIS_SERVERS ) > 1 ) { + throw new Exception( + 'Multiple sentinel servers are not supported by the bundled Credis library. Please review your Redis Cache configuration.' + ); + } + + $connection_string = array_values( WP_REDIS_SERVERS )[0]; + $sentinel = new Credis_Sentinel( new Credis_Client( $connection_string ) ); + $this->redis = $sentinel->getCluster( WP_REDIS_SENTINEL ); + $args['servers'] = WP_REDIS_SERVERS; + } elseif ( defined( 'WP_REDIS_CLUSTER' ) || defined( 'WP_REDIS_SERVERS' ) ) { + $parameters['db'] = $parameters['database']; + + $is_cluster = defined( 'WP_REDIS_CLUSTER' ); + $clients = $is_cluster ? WP_REDIS_CLUSTER : WP_REDIS_SERVERS; + + foreach ( $clients as $index => $connection_string ) { + // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url + $url_components = parse_url( $connection_string ); + + if ( isset( $url_components['query'] ) ) { + parse_str( $url_components['query'], $add_params ); + } + + if ( ! $is_cluster && isset( $add_params['alias'] ) ) { + $add_params['master'] = 'master' === $add_params['alias']; + } + + $add_params['host'] = $url_components['host']; + $add_params['port'] = $url_components['port']; + + if ( ! isset( $add_params['alias'] ) ) { + $add_params['alias'] = "redis-$index"; + } + + $clients[ $index ] = array_merge( $parameters, $add_params ); + + unset($add_params); + } + + $this->redis = new Credis_Cluster( $clients ); + + foreach ( $clients as $index => $_client ) { + $connection_string = "{$_client['scheme']}://{$_client['host']}:{$_client['port']}"; + unset( $_client['scheme'], $_client['host'], $_client['port'] ); + + $params = array_filter( $_client ); + + if ( $params ) { + $connection_string .= '?' . http_build_query( $params, '', '&' ); + } + + $clients[ $index ] = $connection_string; + } + + $args['servers'] = $clients; + } else { + $args = [ + 'host' => $parameters['scheme'] === 'unix' ? $parameters['path'] : $parameters['host'], + 'port' => $parameters['port'], + 'timeout' => $parameters['timeout'], + 'persistent' => '', + 'database' => $parameters['database'], + 'password' => isset( $parameters['password'] ) ? $parameters['password'] : null, + ]; + + $this->redis = new Credis_Client( ...array_values( $args ) ); + } + + // Don't use PhpRedis if it is available. + $this->redis->forceStandalone(); + + $this->redis->connect(); + + if ( $parameters['read_timeout'] ) { + $args['read_timeout'] = $parameters['read_timeout']; + $this->redis->setReadTimeout( $parameters['read_timeout'] ); + } + + $this->diagnostics = array_merge( + [ 'client' => sprintf( '%s (v%s)', $client, Credis_Client::VERSION ) ], + $args + ); + } + + /** + * Connect to Redis using HHVM's Redis extension. + * + * @param array $parameters Connection parameters built by the `build_parameters` method. + * @return void + */ + protected function connect_using_hhvm( $parameters ) { + _doing_it_wrong( __FUNCTION__ , 'HHVM support will be removed in future versions.' , '2.0.26' ); + + $this->redis = new Redis(); + + // Adjust host and port if the scheme is `unix`. + if ( strcasecmp( 'unix', $parameters['scheme'] ) === 0 ) { + $parameters['host'] = 'unix://' . $parameters['path']; + $parameters['port'] = 0; + } + + $this->redis->connect( + $parameters['host'], + $parameters['port'], + $parameters['timeout'], + null, + $parameters['retry_interval'] + ); + + if ( $parameters['read_timeout'] ) { + $this->redis->setOption( Redis::OPT_READ_TIMEOUT, $parameters['read_timeout'] ); + } + + if ( isset( $parameters['password'] ) ) { + $this->redis->auth( $parameters['password'] ); + } + + if ( isset( $parameters['database'] ) ) { + if ( ctype_digit( (string) $parameters['database'] ) ) { + $parameters['database'] = (int) $parameters['database']; + } + + if ( $parameters['database'] ) { + $this->redis->select( $parameters['database'] ); + } + } + + $this->diagnostics = array_merge( + [ 'client' => sprintf( 'HHVM Extension (v%s)', HHVM_VERSION ) ], + $parameters + ); + } + + /** + * Fetches Redis `INFO` mostly for server version. + * + * @return void + */ + public function fetch_info() { + if ( defined( 'WP_REDIS_CLUSTER' ) ) { + $connectionId = is_string( WP_REDIS_CLUSTER ) + ? 'SERVER' + : current( $this->build_cluster_connection_array() ); + + $info = $this->is_predis() + ? $this->redis->getClientBy( 'id', $connectionId )->info() + : $this->redis->info( $connectionId ); + } else { + if ( $this->is_predis() ) { + $connection = $this->redis->getConnection(); + if ( $connection instanceof Predis\Connection\Replication\ReplicationInterface ) { + $connection->switchToMaster(); + } + } + + $info = $this->redis->info(); + } + + if ( isset( $info['redis_version'] ) ) { + $this->redis_version = $info['redis_version']; + } elseif ( isset( $info['Server']['redis_version'] ) ) { + $this->redis_version = $info['Server']['redis_version']; + } + } + + /** + * Is Redis available? + * + * @return bool + */ + public function redis_status() { + return (bool) $this->redis_connected; + } + + /** + * Returns the Redis instance. + * + * @return mixed + */ + public function redis_instance() { + return $this->redis; + } + + /** + * Returns the Redis server version. + * + * @return null|string + */ + public function redis_version() { + return $this->redis_version; + } + + /** + * Adds a value to cache. + * + * If the specified key already exists, the value is not stored and the function + * returns false. + * + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * @return bool Returns TRUE on success or FALSE on failure. + */ + public function add( $key, $value, $group = 'default', $expiration = 0 ) { + return $this->add_or_replace( true, $key, $value, $group, $expiration ); + } + + /** + * Adds multiple values to the cache in one call. + * + * @param array $data Array of keys and values to be added. + * @param string $group Optional. Where the cache contents are grouped. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if cache key and group already exist. + */ + public function add_multiple( array $data, $group = 'default', $expire = 0 ) { + if ( function_exists( 'wp_suspend_cache_addition' ) && wp_suspend_cache_addition() ) { + return array_combine( array_keys( $data ), array_fill( 0, count( $data ), false ) ); + } + + if ( + $this->redis_status() && + method_exists( $this->redis, 'pipeline' ) && + ! $this->is_ignored_group( $group ) + ) { + return $this->add_multiple_at_once( $data, $group, $expire ); + } + + $values = []; + + foreach ( $data as $key => $value ) { + $values[ $key ] = $this->add( $key, $value, $group, $expire ); + } + + return $values; + } + + /** + * Adds multiple values to the cache in one call. + * + * @param array $data Array of keys and values to be added. + * @param string $group Optional. Where the cache contents are grouped. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if cache key and group already exist. + */ + protected function add_multiple_at_once( array $data, $group = 'default', $expire = 0 ) { + $keys = array_keys( $data ); + + $san_group = $this->sanitize_key_part( $group ); + + $tx = $this->redis->pipeline(); + + $orig_exp = $expire; + $expire = $this->validate_expiration( $expire ); + $derived_keys = []; + + foreach ( $data as $key => $value ) { + /** + * Filters the cache expiration time + * + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param string $key The cache key. + * @param string $group The cache group. + * @param mixed $orig_exp The original expiration value before validation. + */ + $expire = apply_filters( 'redis_cache_expiration', $expire, $key, $group, $orig_exp ); + + $san_key = $this->sanitize_key_part( $key ); + $derived_key = $derived_keys[ $key ] = $this->fast_build_key( $san_key, $san_group ); + + $args = [ $derived_key, $this->maybe_serialize( $value ) ]; + + if ( $this->is_predis() ) { + $args[] = 'nx'; + + if ( $expire ) { + $args[] = 'ex'; + $args[] = $expire; + } + } else { + if ( $expire ) { + $args[] = [ 'nx', 'ex' => $expire ]; + } else { + $args[] = [ 'nx' ]; + } + } + + $tx->set( ...$args ); + } + + try { + $start_time = microtime( true ); + + $method = $this->is_predis() ? 'execute' : 'exec'; + + $results = array_map( function ( $response ) { + return (bool) $this->parse_redis_response( $response ); + }, $tx->{$method}() ?: [] ); + + if ( count( $results ) !== count( $keys ) ) { + $tx->discard(); + + return array_fill_keys( $keys, false ); + } + + $results = array_combine( $keys, $results ); + + foreach ( $results as $key => $result ) { + if ( $result ) { + $this->add_to_internal_cache( $derived_keys[ $key ], $data[ $key ] ); + } + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return array_combine( $keys, array_fill( 0, count( $keys ), false ) ); + } + + return $results; + } + + /** + * Replace a value in the cache. + * + * If the specified key doesn't exist, the value is not stored and the function + * returns false. + * + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * @return bool Returns TRUE on success or FALSE on failure. + */ + public function replace( $key, $value, $group = 'default', $expiration = 0 ) { + return $this->add_or_replace( false, $key, $value, $group, $expiration ); + } + + /** + * Add or replace a value in the cache. + * + * Add does not set the value if the key exists; replace does not replace if the value doesn't exist. + * + * @param bool $add True if should only add if value doesn't exist, false to only add when value already exists. + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * @return bool Returns TRUE on success or FALSE on failure. + */ + protected function add_or_replace( $add, $key, $value, $group = 'default', $expiration = 0 ) { + $cache_addition_suspended = function_exists( 'wp_suspend_cache_addition' ) && wp_suspend_cache_addition(); + + if ( $add && $cache_addition_suspended ) { + return false; + } + + $result = true; + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + // Save if group not excluded and redis is up. + if ( ! $this->is_ignored_group( $san_group ) && $this->redis_status() ) { + try { + $orig_exp = $expiration; + $expiration = $this->validate_expiration( $expiration ); + + /** + * Filters the cache expiration time + * + * @since 1.4.2 + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param string $key The cache key. + * @param string $group The cache group. + * @param mixed $orig_exp The original expiration value before validation. + */ + $expiration = apply_filters( 'redis_cache_expiration', $expiration, $key, $group, $orig_exp ); + $start_time = microtime( true ); + + if ( $add ) { + $args = [ $derived_key, $this->maybe_serialize( $value ) ]; + + if ( $this->is_predis() ) { + $args[] = 'nx'; + + if ( $expiration ) { + $args[] = 'ex'; + $args[] = $expiration; + } + } else { + if ( $expiration ) { + $args[] = [ + 'nx', + 'ex' => $expiration, + ]; + } else { + $args[] = [ 'nx' ]; + } + } + + $result = $this->parse_redis_response( + $this->redis->set( ...$args ) + ); + + if ( ! $result ) { + return false; + } + } elseif ( $expiration ) { + $result = $this->parse_redis_response( $this->redis->setex( $derived_key, $expiration, $this->maybe_serialize( $value ) ) ); + } else { + $result = $this->parse_redis_response( $this->redis->set( $derived_key, $this->maybe_serialize( $value ) ) ); + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + } + + $exists = array_key_exists( $derived_key, $this->cache ); + + if ( (bool) $add === $exists ) { + return false; + } + + if ( $result ) { + $this->add_to_internal_cache( $derived_key, $value ); + } + + return $result; + } + + /** + * Remove the item from the cache. + * + * @param string $key The key under which to store the value. + * @param string $group The group value appended to the $key. + * @return bool Returns TRUE on success or FALSE on failure. + */ + public function delete( $key, $group = 'default', $deprecated = false ) { + $result = false; + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + if ( array_key_exists( $derived_key, $this->cache ) ) { + unset( $this->cache[ $derived_key ] ); + $result = true; + } + + $start_time = microtime( true ); + + if ( $this->redis_status() && ! $this->is_ignored_group( $san_group ) ) { + try { + $result = $this->parse_redis_response( $this->redis->del( $derived_key ) ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + + if ( function_exists( 'do_action' ) ) { + /** + * Fires on every cache key deletion + * + * @since 1.3.3 + * @param string $key The cache key. + * @param string $group The group value appended to the $key. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_delete', $key, $group, $execute_time ); + } + + return (bool) $result; + } + + /** + * Deletes multiple values from the cache in one call. + * + * @param array $keys Array of keys to be deleted. + * @param string $group Optional. Where the cache contents are grouped. + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if the contents were not deleted. + */ + public function delete_multiple( array $keys, $group = 'default' ) { + if ( + $this->redis_status() && + method_exists( $this->redis, 'pipeline' ) && + ! $this->is_ignored_group( $group ) + ) { + return $this->delete_multiple_at_once( $keys, $group ); + } + + $values = []; + + foreach ( $keys as $key ) { + $values[ $key ] = $this->delete( $key, $group ); + } + + return $values; + } + + /** + * Deletes multiple values from the cache in one call. + * + * @param array $keys Array of keys to be deleted. + * @param string $group Optional. Where the cache contents are grouped. + * @return bool[] Array of return values, grouped by key. Each value is either + * true on success, or false if the contents were not deleted. + */ + protected function delete_multiple_at_once( array $keys, $group = 'default' ) { + $start_time = microtime( true ); + + try { + $tx = $this->redis->pipeline(); + + foreach ( $keys as $key ) { + $derived_key = $this->build_key( (string) $key, $group ); + + $tx->del( $derived_key ); + + unset( $this->cache[ $derived_key ] ); + } + + $method = $this->is_predis() ? 'execute' : 'exec'; + + $results = array_map( function ( $response ) { + return (bool) $this->parse_redis_response( $response ); + }, $tx->{$method}() ?: [] ); + + if ( count( $results ) !== count( $keys ) ) { + $tx->discard(); + + return array_fill_keys( $keys, false ); + } + + $execute_time = microtime( true ) - $start_time; + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return array_combine( $keys, array_fill( 0, count( $keys ), false ) ); + } + + if ( function_exists( 'do_action' ) ) { + foreach ( $keys as $key ) { + /** + * Fires on every cache key deletion + * + * @since 1.3.3 + * @param string $key The cache key. + * @param string $group The group value appended to the $key. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_delete', $key, $group, $execute_time ); + } + } + + return array_combine( $keys, $results ); + } + + /** + * Removes all cache items from the in-memory runtime cache. + * + * @return bool True on success, false on failure. + */ + public function flush_runtime() { + $this->cache = []; + + return true; + } + + /** + * Executes Lua flush script. + * + * @return array|false Returns array on success, false on failure + */ + protected function execute_lua_script( $script ) { + $results = []; + + if ( defined( 'WP_REDIS_CLUSTER' ) ) { + return $this->execute_lua_script_on_cluster( $script ); + } + + $flushTimeout = defined( 'WP_REDIS_FLUSH_TIMEOUT' ) ? WP_REDIS_FLUSH_TIMEOUT : 5; + + if ( $this->is_predis() ) { + $connection = $this->redis->getConnection(); + + if ($connection instanceof Predis\Connection\Replication\ReplicationInterface) { + $connection = $connection->getMaster(); + } + + $timeout = $connection->getParameters()->read_write_timeout ?? ini_get( 'default_socket_timeout' ); + stream_set_timeout( $connection->getResource(), $flushTimeout ); + } else { + $timeout = $this->redis->getOption( Redis::OPT_READ_TIMEOUT ); + $this->redis->setOption( Redis::OPT_READ_TIMEOUT, $flushTimeout ); + } + + try { + $results[] = $this->parse_redis_response( $script() ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + $results = false; + } + + if ( $this->is_predis() ) { + stream_set_timeout( $connection->getResource(), $timeout ); // @phpstan-ignore variable.undefined + } else { + $this->redis->setOption( Redis::OPT_READ_TIMEOUT, $timeout ); + } + + return $results; + } + + /** + * Executes Lua flush script on Redis cluster. + * + * @return array|false Returns array on success, false on failure + */ + protected function execute_lua_script_on_cluster( $script ) { + $results = []; + $redis = $this->redis; + $flushTimeout = defined( 'WP_REDIS_FLUSH_TIMEOUT' ) ? WP_REDIS_FLUSH_TIMEOUT : 5; + + if ( $this->is_predis() ) { + foreach ( $this->redis->getIterator() as $master ) { + $timeout = $master->getConnection()->getParameters()->read_write_timeout ?? ini_get( 'default_socket_timeout' ); + stream_set_timeout( $master->getConnection()->getResource(), $flushTimeout ); + + $this->redis = $master; + $results[] = $this->parse_redis_response( $script() ); + + stream_set_timeout($master->getConnection()->getResource(), $timeout); + } + } else { + try { + foreach ( $this->redis->_masters() as $master ) { + $this->redis = new Redis(); + $this->redis->connect( $master[0], $master[1], 0, null, 0, $flushTimeout ); + + $results[] = $this->parse_redis_response( $script() ); + } + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + $this->redis = $redis; + + return false; + } + } + + $this->redis = $redis; + + return $results; + } + + /** + * Invalidate all items in the cache. If `WP_REDIS_SELECTIVE_FLUSH` is `true`, + * only keys prefixed with the `WP_REDIS_PREFIX` are flushed. + * + * @return bool True on success, false on failure. + */ + public function flush() { + $results = []; + $this->cache = []; + + if ( $this->redis_status() ) { + $salt = defined( 'WP_REDIS_PREFIX' ) ? trim( WP_REDIS_PREFIX ) : null; + $selective = defined( 'WP_REDIS_SELECTIVE_FLUSH' ) ? WP_REDIS_SELECTIVE_FLUSH : null; + + $start_time = microtime( true ); + + if ( $salt && $selective ) { + $script = $this->get_flush_closure( $salt ); + $results = $this->execute_lua_script( $script ); + + if ( empty( $results ) ) { + return false; + } + } else { + if ( defined( 'WP_REDIS_CLUSTER' ) ) { + try { + if ( $this->is_predis() ) { + foreach ( $this->redis->getIterator() as $master ) { + $results[] = $this->parse_redis_response( $master->flushdb() ); + } + } else { + foreach ( $this->redis->_masters() as $master ) { + $results[] = $this->parse_redis_response( $this->redis->flushdb( $master ) ); + } + } + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + } else { + try { + $results[] = $this->parse_redis_response( $this->redis->flushdb() ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + } + } + + if ( function_exists( 'do_action' ) ) { + $execute_time = microtime( true ) - $start_time; + + /** + * Fires on every cache flush + * + * @since 1.3.5 + * @param null|array $results Array of flush results. + * @param int $deprecated Unused. Default 0. + * @param bool $seletive Whether a selective flush took place. + * @param string $salt The defined key prefix. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_flush', $results, 0, $selective, $salt, $execute_time ); + } + } + + if ( empty( $results ) ) { + return false; + } + + foreach ( $results as $result ) { + if ( ! $result ) { + return false; + } + } + + return true; + } + + /** + * Removes all cache items in a group. + * + * @param string $group Name of group to remove from cache. + * @return bool Returns TRUE on success or FALSE on failure. + */ + public function flush_group( $group ) { + if ( defined( 'WP_REDIS_DISABLE_GROUP_FLUSH' ) && WP_REDIS_DISABLE_GROUP_FLUSH ) { + return $this->flush(); + } + + $san_group = $this->sanitize_key_part( $group ); + + if ( is_multisite() && ! $this->is_global_group( $san_group ) ) { + $salt = str_replace( "{$this->blog_prefix}:{$san_group}", "*:{$san_group}", $this->fast_build_key( '*', $san_group ) ); + } else { + $salt = $this->fast_build_key( '*', $san_group ); + } + + foreach ( $this->cache as $key => $value ) { + if ( strpos( $key, "{$san_group}:" ) === 0 || strpos( $key, ":{$san_group}:" ) !== false ) { + unset( $this->cache[ $key ] ); + } + } + + if ( in_array( $san_group, $this->unflushable_groups ) ) { + return false; + } + + if ( ! $this->redis_status() ) { + return false; + } + + $start_time = microtime( true ); + $script = $this->lua_flush_closure( $salt, false ); + $results = $this->execute_lua_script( $script ); + + if ( empty( $results ) ) { + return false; + } + + if ( function_exists( 'do_action' ) ) { + $execute_time = microtime( true ) - $start_time; + + /** + * Fires on every group cache flush + * + * @param null|array $results Array of flush results. + * @param string $salt The defined key prefix. + * @param float $execute_time Execution time for the request in seconds. + * @since 2.2.3 + */ + do_action( 'redis_object_cache_flush_group', $results, $salt, $execute_time ); + } + + foreach ( $results as $result ) { + if ( ! $result ) { + return false; + } + } + + return true; + } + + /** + * Returns a closure to flush selectively. + * + * @param string $salt The salt to be used to differentiate. + * @return callable Generated callable executing the lua script. + */ + protected function get_flush_closure( $salt ) { + if ( $this->unflushable_groups ) { + return $this->lua_flush_extended_closure( $salt ); + } else { + return $this->lua_flush_closure( $salt ); + } + } + + /** + * Quotes a string for usage in the `glob` function + * + * @param string $string The string to quote. + * @return string + */ + protected function glob_quote( $string ) { + $characters = [ '*', '+', '?', '!', '{', '}', '[', ']', '(', ')', '|', '@' ]; + + return str_replace( + $characters, + array_map( + function ( $character ) { + return "[{$character}]"; + }, + $characters + ), + $string + ); + } + + /** + * Returns a closure ready to be called to flush selectively ignoring unflushable groups. + * + * @param string $salt The salt to be used to differentiate. + * @param bool $escape ... + * @return callable Generated callable executing the lua script. + */ + protected function lua_flush_closure( $salt, $escape = true ) { + $salt = $escape ? $this->glob_quote( $salt ) : $salt; + + return function () use ( $salt ) { + $script = <<redis_version) && version_compare( $this->redis_version, '5', '<' ) && version_compare( $this->redis_version, '3.2', '>=' ) ) { + $script = 'redis.replicate_commands()' . "\n" . $script; + } + + $args = $this->is_predis() ? [ $script, 0 ] : [ $script ]; + + return call_user_func_array( [ $this->redis, 'eval' ], $args ); + }; + } + + /** + * Returns a closure ready to be called to flush selectively. + * + * @param string $salt The salt to be used to differentiate. + * @return callable Generated callable executing the lua script. + */ + protected function lua_flush_extended_closure( $salt ) { + $salt = $this->glob_quote( $salt ); + + return function () use ( $salt ) { + $salt_length = strlen( $salt ); + + $unflushable = array_map( + function ( $group ) { + return ":{$group}:"; + }, + $this->unflushable_groups + ); + + $script = <<redis_version) && version_compare( $this->redis_version, '5', '<' ) && version_compare( $this->redis_version, '3.2', '>=' ) ) { + $script = 'redis.replicate_commands()' . "\n" . $script; + } + + $args = $this->is_predis() + ? array_merge( [ $script, count( $unflushable ) ], $unflushable ) + : [ $script, $unflushable, count( $unflushable ) ]; + + return call_user_func_array( [ $this->redis, 'eval' ], $args ); + }; + } + + /** + * Retrieve object from cache. + * + * Gets an object from cache based on $key and $group. + * + * @param string $key The key under which to store the value. + * @param string $group The group value appended to the $key. + * @param bool $force Optional. Whether to force a refetch rather than relying on the local + * cache. Default false. + * @param bool $found Optional. Whether the key was found in the cache. Disambiguates a return of + * false, a storable value. Passed by reference. Default null. + * @return bool|mixed Cached object value. + */ + public function get( $key, $group = 'default', $force = false, &$found = null ) { + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + if ( array_key_exists( $derived_key, $this->cache ) && ! $force ) { + $found = true; + $this->cache_hits++; + $value = $this->get_from_internal_cache( $derived_key ); + + return $value; + } elseif ( $this->is_ignored_group( $group ) || ! $this->redis_status() ) { + $found = false; + $this->cache_misses++; + + return false; + } + + $start_time = microtime( true ); + + try { + $result = $this->redis->get( $derived_key ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + + if ( $result === null || $result === false ) { + $found = false; + $this->cache_misses++; + + return false; + } else { + $found = true; + $this->cache_hits++; + $value = $this->maybe_unserialize( $result ); + } + + $this->add_to_internal_cache( $derived_key, $value ); + + if ( function_exists( 'do_action' ) ) { + /** + * Fires on every cache get request + * + * @since 1.2.2 + * @param mixed $value Value of the cache entry. + * @param string $key The cache key. + * @param string $group The group value appended to the $key. + * @param bool $force Whether a forced refetch has taken place rather than relying on the local cache. + * @param bool $found Whether the key was found in the cache. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_get', $key, $value, $group, $force, $found, $execute_time ); + } + + if ( function_exists( 'apply_filters' ) && function_exists( 'has_filter' ) ) { + if ( has_filter( 'redis_object_cache_get_value' ) ) { + /** + * Filters the return value + * + * @since 1.4.2 + * @param mixed $value Value of the cache entry. + * @param string $key The cache key. + * @param string $group The group value appended to the $key. + * @param bool $force Whether a forced refetch has taken place rather than relying on the local cache. + * @param bool $found Whether the key was found in the cache. + */ + return apply_filters( 'redis_object_cache_get_value', $value, $key, $group, $force, $found ); + } + } + + return $value; + } + + /** + * Retrieves multiple values from the cache in one call. + * + * @param array $keys Array of keys under which the cache contents are stored. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param bool $force Optional. Whether to force an update of the local cache + * from the persistent cache. Default false. + * @return array|false Array of values organized into groups. + */ + public function get_multiple( $keys, $group = 'default', $force = false ) { + if ( ! is_array( $keys ) ) { + return false; + } + + $cache = []; + $derived_keys = []; + $start_time = microtime( true ); + + $san_group = $this->sanitize_key_part( $group ); + + foreach ( $keys as $key ) { + $san_key = $this->sanitize_key_part( $key ); + $derived_keys[ $key ] = $this->fast_build_key( $san_key, $san_group ); + } + + if ( $this->is_ignored_group( $group ) || ! $this->redis_status() ) { + foreach ( $keys as $key ) { + $value = $this->get_from_internal_cache( $derived_keys[ $key ] ); + $cache[ $key ] = $value; + + if ($value === false) { + $this->cache_misses++; + } else { + $this->cache_hits++; + } + } + + return $cache; + } + + if ( ! $force ) { + foreach ( $keys as $key ) { + $value = $this->get_from_internal_cache( $derived_keys[ $key ] ); + + if ( $value === false ) { + $this->cache_misses++; + + } else { + $cache[ $key ] = $value; + $this->cache_hits++; + } + } + } + + $remaining_keys = array_filter( + $keys, + function ( $key ) use ( $cache ) { + return ! array_key_exists( $key, $cache ); + } + ); + + if ( empty( $remaining_keys ) ) { + return $cache; + } + + $start_time = microtime( true ); + $results = []; + + $remaining_ids = array_map( + function ( $key ) use ( $derived_keys ) { + return $derived_keys[ $key ]; + }, + $remaining_keys + ); + + try { + $results = array_combine( + $remaining_keys, + $this->redis->mget( $remaining_ids ) + ?: array_fill( 0, count( $remaining_ids ), false ) + ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + $results = array_combine( + $remaining_keys, + array_fill( 0, count( $remaining_ids ), false ) + ); + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + + foreach ( $results as $key => $value ) { + if ( $value === null || $value === false ) { + $cache[ $key ] = false; + $this->cache_misses++; + } else { + $cache[ $key ] = $this->maybe_unserialize( $value ); + $this->add_to_internal_cache( $derived_keys[ $key ], $cache[ $key ] ); + $this->cache_hits++; + } + } + + if ( function_exists( 'do_action' ) ) { + /** + * Fires on every cache get multiple request + * + * @since 2.0.6 + * @param array $keys Array of keys under which the cache contents are stored. + * @param array $cache Cache items. + * @param string $group The group value appended to the $key. + * @param bool $force Whether a forced refetch has taken place rather than relying on the local cache. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_get_multiple', $keys, $cache, $group, $force, $execute_time ); + } + + if ( function_exists( 'apply_filters' ) && function_exists( 'has_filter' ) ) { + if ( has_filter( 'redis_object_cache_get_value' ) ) { + foreach ( $cache as $key => $value ) { + /** + * Filters the return value + * + * @since 1.4.2 + * @param mixed $value Value of the cache entry. + * @param string $key The cache key. + * @param string $group The group value appended to the $key. + * @param bool $force Whether a forced refetch has taken place rather than relying on the local cache. + */ + $cache[ $key ] = apply_filters( 'redis_object_cache_get_value', $value, $key, $group, $force ); + } + } + } + + return $cache; + } + + /** + * Sets a value in cache. + * + * The value is set whether or not this key already exists in Redis. + * + * @param string $key The key under which to store the value. + * @param mixed $value The value to store. + * @param string $group The group value appended to the $key. + * @param int $expiration The expiration time, defaults to 0. + * @return bool Returns TRUE on success or FALSE on failure. + */ + public function set( $key, $value, $group = 'default', $expiration = 0 ) { + $result = true; + $start_time = microtime( true ); + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + // Save if group not excluded from redis and redis is up. + if ( ! $this->is_ignored_group( $group ) && $this->redis_status() ) { + $orig_exp = $expiration; + $expiration = $this->validate_expiration( $expiration ); + + /** + * Filters the cache expiration time + * + * @since 1.4.2 + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param string $key The cache key. + * @param string $group The cache group. + * @param mixed $orig_exp The original expiration value before validation. + */ + $expiration = apply_filters( 'redis_cache_expiration', $expiration, $key, $group, $orig_exp ); + + try { + if ( $expiration ) { + $result = $this->parse_redis_response( $this->redis->setex( $derived_key, $expiration, $this->maybe_serialize( $value ) ) ); + } else { + $result = $this->parse_redis_response( $this->redis->set( $derived_key, $this->maybe_serialize( $value ) ) ); + } + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + + $execute_time = microtime( true ) - $start_time; + $this->cache_calls++; + $this->cache_time += $execute_time; + } + + // If the set was successful, or we didn't go to redis. + if ( $result ) { + $this->add_to_internal_cache( $derived_key, $value ); + } + + if ( function_exists( 'do_action' ) ) { + $execute_time = microtime( true ) - $start_time; + + /** + * Fires on every cache set + * + * @since 1.2.2 + * @param string $key The cache key. + * @param mixed $value Value of the cache entry. + * @param string $group The group value appended to the $key. + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_set', $key, $value, $group, $expiration, $execute_time ); + } + + return $result; + } + + /** + * Sets multiple values to the cache in one call. + * + * @param array $data Array of key and value to be set. + * @param string $group Optional. Where the cache contents are grouped. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is always true. + */ + public function set_multiple( array $data, $group = 'default', $expire = 0 ) { + if ( + $this->redis_status() && + method_exists( $this->redis, 'pipeline' ) && + ! $this->is_ignored_group( $group ) + ) { + return $this->set_multiple_at_once( $data, $group, $expire ); + } + + $values = []; + + foreach ( $data as $key => $value ) { + $values[ $key ] = $this->set( $key, $value, $group, $expire ); + } + + return $values; + } + + /** + * Sets multiple values to the cache in one call. + * + * @param array $data Array of key and value to be set. + * @param string $group Optional. Where the cache contents are grouped. + * @param int $expiration Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool[] Array of return values, grouped by key. Each value is always true. + */ + protected function set_multiple_at_once( array $data, $group = 'default', $expiration = 0 ) { + $start_time = microtime( true ); + + $san_group = $this->sanitize_key_part( $group ); + $derived_keys = []; + + $orig_exp = $expiration; + $expiration = $this->validate_expiration( $expiration ); + $expirations = []; + + $tx = $this->redis->pipeline(); + $keys = array_keys( $data ); + + foreach ( $data as $key => $value ) { + $san_key = $this->sanitize_key_part( $key ); + $derived_key = $derived_keys[ $key ] = $this->fast_build_key( $san_key, $san_group ); + + /** + * Filters the cache expiration time + * + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param string $key The cache key. + * @param string $group The cache group. + * @param mixed $orig_exp The original expiration value before validation. + */ + $expiration = $expirations[ $key ] = apply_filters( 'redis_cache_expiration', $expiration, $key, $group, $orig_exp ); + + if ( $expiration ) { + $tx->setex( $derived_key, $expiration, $this->maybe_serialize( $value ) ); + } else { + $tx->set( $derived_key, $this->maybe_serialize( $value ) ); + } + } + + try { + $method = $this->is_predis() ? 'execute' : 'exec'; + + $results = array_map( function ( $response ) { + return (bool) $this->parse_redis_response( $response ); + }, $tx->{$method}() ?: [] ); + + if ( count( $results ) !== count( $keys ) ) { + $tx->discard(); + + return array_fill_keys( $keys, false ); + } + + $results = array_combine( $keys, $results ); + + foreach ( $results as $key => $result ) { + if ( $result ) { + $this->add_to_internal_cache( $derived_keys[ $key ], $data[ $key ] ); + } + } + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return array_combine( $keys, array_fill( 0, count( $keys ), false ) ); + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls++; + $this->cache_time += $execute_time; + + if ( function_exists( 'do_action' ) ) { + foreach ( $data as $key => $value ) { + /** + * Fires on every cache set + * + * @param string $key The cache key. + * @param mixed $value Value of the cache entry. + * @param string $group The group value appended to the $key. + * @param int $expiration The time in seconds the entry expires. 0 for no expiry. + * @param float $execute_time Execution time for the request in seconds. + */ + do_action( 'redis_object_cache_set', $key, $value, $group, $expirations[ $key ], $execute_time ); + } + } + + return $results; + } + + /** + * Increment a Redis counter by the amount specified + * + * @param string $key The key name. + * @param int $offset Optional. The increment. Defaults to 1. + * @param string $group Optional. The key group. Default is 'default'. + * @return int|bool + */ + public function increment( $key, $offset = 1, $group = 'default' ) { + $offset = (int) $offset; + $start_time = microtime( true ); + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + // If group is a non-Redis group, save to internal cache, not Redis. + if ( $this->is_ignored_group( $group ) || ! $this->redis_status() ) { + $value = $this->get_from_internal_cache( $derived_key ); + $value += $offset; + $this->add_to_internal_cache( $derived_key, $value ); + + return $value; + } + + try { + $result = $this->parse_redis_response( $this->redis->incrBy( $derived_key, $offset ) ); + + $this->add_to_internal_cache( $derived_key, (int) $this->redis->get( $derived_key ) ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls += 2; + $this->cache_time += $execute_time; + + return $result; + } + + /** + * Alias of `increment()`. + * + * @see self::increment() + * @param string $key The key name. + * @param int $offset Optional. The increment. Defaults to 1. + * @param string $group Optional. The key group. Default is 'default'. + * @return int|bool + */ + public function incr( $key, $offset = 1, $group = 'default' ) { + return $this->increment( $key, $offset, $group ); + } + + /** + * Decrement a Redis counter by the amount specified + * + * @param string $key The key name. + * @param int $offset Optional. The decrement. Defaults to 1. + * @param string $group Optional. The key group. Default is 'default'. + * @return int|bool + */ + public function decrement( $key, $offset = 1, $group = 'default' ) { + $offset = (int) $offset; + $start_time = microtime( true ); + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + $derived_key = $this->fast_build_key( $san_key, $san_group ); + + // If group is a non-Redis group, save to internal cache, not Redis. + if ( $this->is_ignored_group( $group ) || ! $this->redis_status() ) { + $value = $this->get_from_internal_cache( $derived_key ); + $value -= $offset; + $this->add_to_internal_cache( $derived_key, $value ); + + return $value; + } + + try { + $result = $this->parse_redis_response( $this->redis->decrBy( $derived_key, $offset ) ); + + $this->add_to_internal_cache( $derived_key, (int) $this->redis->get( $derived_key ) ); + } catch ( Exception $exception ) { + $this->handle_exception( $exception ); + + return false; + } + + $execute_time = microtime( true ) - $start_time; + + $this->cache_calls += 2; + $this->cache_time += $execute_time; + + return $result; + } + + /** + * Alias of `decrement()`. + * + * @see self::decrement() + * @param string $key The key name. + * @param int $offset Optional. The decrement. Defaults to 1. + * @param string $group Optional. The key group. Default is 'default'. + * @return int|bool + */ + public function decr( $key, $offset = 1, $group = 'default' ) { + return $this->decrement( $key, $offset, $group ); + } + + /** + * Render data about current cache requests + * Used by the Debug bar plugin + * + * @return void + */ + public function stats() { + ?> +

+ Redis Status: + redis_status() ? 'Connected' : 'Not connected'; ?> +
+ Redis Client: + diagnostics['client'] ?: 'Unknown'; ?> +
+ Cache Hits: + cache_hits; ?> +
+ Cache Misses: + cache_misses; ?> +
+ Cache Size: + cache ) ) / 1024, 2 ); ?> KB +

+ cache_hits + $this->cache_misses; + + $bytes = array_map( + function ( $keys ) { + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize + return strlen( serialize( $keys ) ); + }, + $this->cache + ); + + return (object) [ + 'hits' => $this->cache_hits, + 'misses' => $this->cache_misses, + 'ratio' => $total > 0 ? round( $this->cache_hits / ( $total / 100 ), 1 ) : 100, + 'bytes' => array_sum( $bytes ), + 'time' => $this->cache_time, + 'calls' => $this->cache_calls, + 'groups' => (object) [ + 'global' => $this->global_groups, + 'non_persistent' => $this->ignored_groups, + 'unflushable' => $this->unflushable_groups, + ], + 'errors' => empty( $this->errors ) ? null : $this->errors, + 'meta' => [ + 'Client' => $this->diagnostics['client'] ?? 'Unknown', + 'Redis Version' => $this->redis_version, + ], + ]; + } + + /** + * Builds a key for the cached object using the prefix, group and key. + * + * @param string $key The key under which to store the value, pre-sanitized. + * @param string $group The group value appended to the $key, pre-sanitized. + * + * @return string + */ + public function build_key( $key, $group = 'default' ) { + if ( empty( $group ) ) { + $group = 'default'; + } + + $san_key = $this->sanitize_key_part( $key ); + $san_group = $this->sanitize_key_part( $group ); + + return $this->fast_build_key($san_key, $san_group); + } + + /** + * Builds a key for the cached object using the prefix, group and key. + * + * @param string $key The key under which to store the value, pre-sanitized. + * @param string $group The group value appended to the $key, pre-sanitized. + * + * @return string + */ + public function fast_build_key( $key, $group = 'default' ) { + if ( empty( $group ) ) { + $group = 'default'; + } + + $salt = defined( 'WP_REDIS_PREFIX' ) ? trim( WP_REDIS_PREFIX ) : ''; + + $prefix = $this->is_global_group( $group ) ? $this->global_prefix : $this->blog_prefix; + $prefix = trim( $prefix, '_-:$' ); + + return "{$salt}{$prefix}:{$group}:{$key}"; + } + + /** + * Replaces the set group separator by another one + * + * @param string $part The string to sanitize. + * @return string Sanitized string. + */ + protected function sanitize_key_part( $part ) { + return is_string( $part ) ? str_replace( ':', '-', $part ) : $part; + } + + /** + * Checks if the given group is part the ignored group array + * + * @param string $group Name of the group to check, pre-sanitized. + * @return bool + */ + protected function is_ignored_group( $group ) { + return $this->is_group_of_type( $group, 'ignored' ); + } + + /** + * Checks if the given group is part the global group array + * + * @param string $group Name of the group to check, pre-sanitized. + * @return bool + */ + protected function is_global_group( $group ) { + return $this->is_group_of_type( $group, 'global' ); + } + + /** + * Checks if the given group is part the unflushable group array + * + * @param string $group Name of the group to check, pre-sanitized. + * @return bool + */ + protected function is_unflushable_group( $group ) { + return $this->is_group_of_type( $group, 'unflushable' ); + } + + /** + * Checks the type of the given group + * + * @param string $group Name of the group to check, pre-sanitized. + * @param string $type Type of the group to check. + * @return bool + */ + private function is_group_of_type( $group, $type ) { + return isset( $this->group_type[ $group ] ) + && $this->group_type[ $group ] == $type; + } + + /** + * Convert Redis responses into something meaningful + * + * @param mixed $response Response sent from the redis instance. + * @return mixed + */ + protected function parse_redis_response( $response ) { + if ( is_bool( $response ) ) { + return $response; + } + + if ( is_numeric( $response ) ) { + return $response; + } + + if ( is_object( $response ) && method_exists( $response, 'getPayload' ) ) { + return $response->getPayload() === 'OK'; + } + + return false; + } + + /** + * Simple wrapper for saving object to the internal cache. + * + * @param string $derived_key Key to save value under. + * @param mixed $value Object value. + */ + public function add_to_internal_cache( $derived_key, $value ) { + if ( is_object( $value ) ) { + $value = clone $value; + } + + $this->cache[ $derived_key ] = $value; + } + + /** + * Get a value specifically from the internal, run-time cache, not Redis. + * + * @param int|string $derived_key Key value. + * + * @return bool|mixed Value on success; false on failure. + */ + public function get_from_internal_cache( $derived_key ) { + if ( ! array_key_exists( $derived_key, $this->cache ) ) { + return false; + } + + if ( is_object( $this->cache[ $derived_key ] ) ) { + return clone $this->cache[ $derived_key ]; + } + + return $this->cache[ $derived_key ]; + } + + /** + * In multisite, switch blog prefix when switching blogs + * + * @param int $_blog_id Blog ID. + * @return bool + */ + public function switch_to_blog( $_blog_id ) { + if ( ! function_exists( 'is_multisite' ) || ! is_multisite() ) { + return false; + } + + $this->blog_prefix = (int) $_blog_id; + + return true; + } + + /** + * Sets the list of global groups. + * + * @param array $groups List of groups that are global. + */ + public function add_global_groups( $groups ) { + $groups = (array) $groups; + + if ( $this->redis_status() ) { + $this->global_groups = array_unique( array_merge( $this->global_groups, $groups ) ); + } else { + $this->ignored_groups = array_unique( array_merge( $this->ignored_groups, $groups ) ); + } + + $this->cache_group_types(); + } + + /** + * Sets the list of groups not to be cached by Redis. + * + * @param array $groups List of groups that are to be ignored. + */ + public function add_non_persistent_groups( $groups ) { + /** + * Filters list of groups to be added to {@see self::$ignored_groups} + * + * @since 2.1.7 + * @param string[] $groups List of groups to be ignored. + */ + $groups = apply_filters( 'redis_cache_add_non_persistent_groups', (array) $groups ); + + $this->ignored_groups = array_unique( array_merge( $this->ignored_groups, $groups ) ); + $this->cache_group_types(); + } + + /** + * Sets the list of groups not to flushed cached. + * + * @param array $groups List of groups that are unflushable. + */ + public function add_unflushable_groups( $groups ) { + $groups = (array) $groups; + + $this->unflushable_groups = array_unique( array_merge( $this->unflushable_groups, $groups ) ); + $this->cache_group_types(); + } + + /** + * Wrapper to validate the cache keys expiration value + * + * @param mixed $expiration Incoming expiration value (whatever it is). + */ + protected function validate_expiration( $expiration ) { + $expiration = is_int( $expiration ) || ctype_digit( (string) $expiration ) ? (int) $expiration : 0; + + if ( defined( 'WP_REDIS_MAXTTL' ) ) { + $max = (int) WP_REDIS_MAXTTL; + + if ( $expiration === 0 || $expiration > $max ) { + $expiration = $max; + } + } + + return $expiration; + } + + /** + * Unserialize value only if it was serialized. + * + * @param string $original Maybe unserialized original, if is needed. + * @return mixed Unserialized data can be any type. + */ + protected function maybe_unserialize( $original ) { + if ( defined( 'WP_REDIS_SERIALIZER' ) && ! empty( WP_REDIS_SERIALIZER ) ) { + return $original; + } + + if ( defined( 'WP_REDIS_IGBINARY' ) && WP_REDIS_IGBINARY && function_exists( 'igbinary_unserialize' ) ) { + return igbinary_unserialize( $original ); + } + + // Don't attempt to unserialize data that wasn't serialized going in. + if ( $this->is_serialized( $original ) ) { + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.PHP.DiscouragedPHPFunctions.serialize_unserialize + $value = @unserialize( $original ); + + return is_object( $value ) ? clone $value : $value; + } + + return $original; + } + + /** + * Serialize data, if needed. + * + * @param mixed $data Data that might be serialized. + * @return mixed A scalar data + */ + protected function maybe_serialize( $data ) { + if ( is_object( $data ) ) { + $data = clone $data; + } + + if ( defined( 'WP_REDIS_SERIALIZER' ) && ! empty( WP_REDIS_SERIALIZER ) ) { + return $data; + } + + if ( defined( 'WP_REDIS_IGBINARY' ) && WP_REDIS_IGBINARY && function_exists( 'igbinary_serialize' ) ) { + return igbinary_serialize( $data ); + } + + if ( is_array( $data ) || is_object( $data ) ) { + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize + return serialize( $data ); + } + + if ( $this->is_serialized( $data, false ) ) { + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize + return serialize( $data ); + } + + return $data; + } + + /** + * Check value to find if it was serialized. + * + * If $data is not an string, then returned value will always be false. + * Serialized data is always a string. + * + * @param string $data Value to check to see if was serialized. + * @param bool $strict Optional. Whether to be strict about the end of the string. Default true. + * @return bool False if not serialized and true if it was. + */ + protected function is_serialized( $data, $strict = true ) { + // if it isn't a string, it isn't serialized. + if ( ! is_string( $data ) ) { + return false; + } + + $data = trim( $data ); + + if ( 'N;' === $data ) { + return true; + } + + if ( strlen( $data ) < 4 ) { + return false; + } + + if ( ':' !== $data[1] ) { + return false; + } + + if ( $strict ) { + $lastc = substr( $data, -1 ); + + if ( ';' !== $lastc && '}' !== $lastc ) { + return false; + } + } else { + $semicolon = strpos( $data, ';' ); + $brace = strpos( $data, '}' ); + + // Either ; or } must exist. + if ( false === $semicolon && false === $brace ) { + return false; + } + + // But neither must be in the first X characters. + if ( false !== $semicolon && $semicolon < 3 ) { + return false; + } + + if ( false !== $brace && $brace < 4 ) { + return false; + } + } + $token = $data[0]; + + switch ( $token ) { + case 's': + if ( $strict ) { + if ( '"' !== substr( $data, -2, 1 ) ) { + return false; + } + } elseif ( false === strpos( $data, '"' ) ) { + return false; + } + // Or else fall through. + // No break! + case 'a': + case 'O': + return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data ); + case 'b': + case 'i': + case 'd': + $end = $strict ? '$' : ''; + + return (bool) preg_match( "/^{$token}:[0-9.E-]+;$end/", $data ); + } + + return false; + } + + /** + * Handle the redis failure gracefully or throw an exception. + * + * @param \Exception $exception Exception thrown. + * @throws \Exception If `fail_gracefully` flag is set to a falsy value. + * @return void + */ + protected function handle_exception( $exception ) { + $this->redis_connected = false; + + // When Redis is unavailable, fall back to the internal cache by forcing all groups to be "no redis" groups. + $this->ignored_groups = array_unique( array_merge( $this->ignored_groups, $this->global_groups ) ); + + error_log( $exception ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + + if ( function_exists( 'do_action' ) ) { + /** + * Fires when an object cache related error occurs. + * + * @since 1.5.0 + * @param \Exception $exception The exception. + * @param string $message The exception message. + */ + do_action( 'redis_object_cache_error', $exception, $exception->getMessage() ); + } + + if ( ! $this->fail_gracefully ) { + $this->show_error_and_die( $exception ); + } + + $this->errors[] = $exception->getMessage(); + } + + /** + * Show Redis connection error screen, or load custom `/redis-error.php`. + * + * @return void + */ + protected function show_error_and_die( Exception $exception ) { + wp_load_translations_early(); + + $domain = 'redis-cache'; + $locale = defined( 'WPLANG' ) ? WPLANG : 'en_US'; + $mofile = WP_LANG_DIR . "/plugins/{$domain}-{$locale}.mo"; + + if ( load_textdomain( $domain, $mofile, $locale ) === false ) { + add_filter( 'pre_determine_locale', function () { + return defined( 'WPLANG' ) ? WPLANG : 'en_US'; + } ); + + add_filter( 'pre_get_language_files_from_path', '__return_empty_array' ); + } + + // Load custom Redis error template, if present. + if ( file_exists( WP_CONTENT_DIR . '/redis-error.php' ) ) { + require_once WP_CONTENT_DIR . '/redis-error.php'; + die(); + } + + $verbose = wp_installing() + || defined( 'WP_ADMIN' ) + || ( defined( 'WP_DEBUG' ) && WP_DEBUG ); + + $message = '

' . __( 'Error establishing a Redis connection', 'redis-cache' ) . "

\n"; + + if ( $verbose ) { + $message .= "

" . $exception->getMessage() . "

\n"; + + $message .= '

' . sprintf( + // translators: %s = Formatted wp-config.php file name. + __( 'WordPress is unable to establish a connection to Redis. This means that the connection information in your %s file are incorrect, or that the Redis server is not reachable.', 'redis-cache' ), + 'wp-config.php' + ) . "

\n"; + + $message .= "
    \n"; + $message .= '
  • ' . __( 'Is the correct Redis host and port set?', 'redis-cache' ) . "
  • \n"; + $message .= '
  • ' . __( 'Is the Redis server running?', 'redis-cache' ) . "
  • \n"; + $message .= "
\n"; + + $message .= '

' . sprintf( + // translators: %s = Link to installation instructions. + __( 'If you need help, please read the installation instructions.', 'redis-cache' ), + 'https://github.com/rhubarbgroup/redis-cache/blob/develop/INSTALL.md' + ) . "

\n"; + } + + $message .= '

' . sprintf( + // translators: %1$s = Formatted object-cache.php file name, %2$s = Formatted wp-content directory name. + __( 'To disable Redis, delete the %1$s file in the %2$s directory.', 'redis-cache' ), + 'object-cache.php', + '/wp-content/' + ) . "

\n"; + + wp_die( $message ); + } + + /** + * Builds a clean connection array out of redis clusters array. + * + * @return array + */ + protected function build_cluster_connection_array() { + $cluster = array_values( WP_REDIS_CLUSTER ); + + foreach ( $cluster as $key => $server ) { + $components = parse_url( $server ); + + if ( ! empty( $components['scheme'] ) ) { + $scheme = $components['scheme']; + } elseif ( defined( 'WP_REDIS_SCHEME' ) ) { + $scheme = WP_REDIS_SCHEME; + } else { + $scheme = null; + } + + if ( isset( $scheme ) ) { + $cluster[ $key ] = sprintf( + '%s://%s:%d', + $scheme, + $components['host'], + $components['port'] + ); + } else { + $cluster[ $key ] = sprintf( + '%s:%d', + $components['host'], + $components['port'] + ); + } + } + + return $cluster; + } + + /** + * Check whether Predis client is in use. + * + * @return bool + */ + protected function is_predis() { + return $this->redis instanceof Predis\Client; + } + + /** + * Allows access to private properties for backwards compatibility. + * + * @param string $name Name of the property. + * @return mixed + */ + public function __get( $name ) { + return isset( $this->{$name} ) ? $this->{$name} : null; + } +} + +endif; +// phpcs:enable Generic.WhiteSpace.ScopeIndent.IncorrectExact, Generic.WhiteSpace.ScopeIndent.Incorrect diff --git a/wp-content/plugins/redis-cache/includes/ui/class-tab.php b/wp-content/plugins/redis-cache/includes/ui/class-tab.php new file mode 100644 index 000000000..af621c417 --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/ui/class-tab.php @@ -0,0 +1,259 @@ + $slug, + 'label' => $label, + 'file' => WP_REDIS_PLUGIN_PATH . "/includes/ui/tabs/{$slug}.php", + ] + ); + + foreach ( $args ?: [] as $property => $value ) { + if ( property_exists( $this, $property ) ) { + $this->{$property} = $value; + } else { + $this->custom[ $property ] = $value; + } + } + } + + /** + * Getter for tab slug + * + * @return string + */ + public function slug() { + return $this->slug; + } + + /** + * Getter for tab label + * + * @return string + */ + public function label() { + return $this->label; + } + + /** + * Getter for tab file + * + * @return string + */ + public function file() { + return $this->file; + } + + /** + * Getter for tab disabled state + * + * @return bool + */ + public function is_disabled() { + return $this->disabled; + } + + /** + * Getter for tab default state + * + * @return bool + */ + public function is_default() { + return $this->default; + } + + /** + * Getter for tab custom data + * + * @param string $key Custom data key. + * @return mixed + */ + public function custom( $key ) { + if ( ! isset( $this->custom[ $key ] ) ) { + return null; + } + + return $this->custom[ $key ]; + } + + /** + * Disabled notice for tab + * + * @return string + */ + public function disabled_notice() { + return sprintf( + // translators: %s = Tab label. + __( '%s are disabled for this site.', 'redis-cache' ), + $this->label + ); + } + + /** + * Displays the tab template + * + * @return void + */ + public function display() { + $roc = Plugin::instance(); + + include $this->file; + } + + /** + * Returns the tab nav id attribute + * + * @return string + */ + public function nav_id() { + $nav_id = "{$this->slug}-tab"; + + /** + * Filters the tab's nav id + * + * @since 2.0.12 + * @param string $nav_id The id attribute of the current tab's nav element. + * @param Tab $instance The current tab. + */ + return apply_filters( 'roc_tab_nav_id', $nav_id, $this ); + } + + /** + * Returns the tab nav css classes + * + * @return string + */ + public function nav_classes() { + $classes = [ + 'nav-tab', + ]; + + if ( $this->default ) { + $classes[] = 'nav-tab-active'; + } + + if ( $this->disabled ) { + $classes[] = 'nav-tab-disabled'; + } + + /** + * Filters the current tab's nav element css classes + * + * @since 2.0.12 + * @param array $classes Array of css classes. + * @param Tab $instance The current tab. + */ + return implode( ' ', apply_filters( 'roc_tab_nav_classes', $classes, $this ) ); + } + + /** + * Returns the tab id attribute + * + * @return string + */ + public function id() { + $tab_id = "{$this->slug}-pane"; + + /** + * Filters the tab's id + * + * @since 2.0.12 + * @param string $tab_id The id attribute of the current tab element. + * @param Tab $instance The current tab. + */ + return apply_filters( 'roc_tab_id', $tab_id, $this ); + } + + /** + * Returns the tab css classes + * + * @return string + */ + public function classes() { + $classes = [ + 'tab-pane', + "tab-pane-{$this->slug}", + ]; + + if ( $this->default ) { + $classes[] = 'active'; + } + + /** + * Filters the current tab's css classes + * + * @since 2.0.12 + * @param array $classes Array of css classes. + * @param Tab $instance The current tab. + */ + return implode( ' ', apply_filters( 'roc_tab_classes', $classes, $this ) ); + } + +} diff --git a/wp-content/plugins/redis-cache/includes/ui/query-monitor.php b/wp-content/plugins/redis-cache/includes/ui/query-monitor.php new file mode 100644 index 000000000..9dd1efaa2 --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/ui/query-monitor.php @@ -0,0 +1,133 @@ + $data + */ + +// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped +echo $this->before_non_tabular_output(); +?> + +
+

+

+
+ +
+

+

%

+
+ +
+

+

+
+ +
+

+

+
+ +
+

+

+
+ + + + +
+ +
+

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

+ +
    + +
  • + +
  • + +
+
+ + + +
+

+ +
    + +
  • + +
  • + +
+
+ + + +
+

+ +
    + +
  • + +
  • + +
+
+ + + +
+

+ + + + $value ) : ?> + + + + + + +
+
+ + +after_non_tabular_output(); diff --git a/wp-content/plugins/redis-cache/includes/ui/settings.php b/wp-content/plugins/redis-cache/includes/ui/settings.php new file mode 100644 index 000000000..c3d7f8436 --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/ui/settings.php @@ -0,0 +1,164 @@ + +
+ +

+ +

+ + + +
+ +
+ + + +
+ + is_disabled() ) : ?> +
+ display(); ?> +
+ + +
+ +
+ + + +
+ +
diff --git a/wp-content/plugins/redis-cache/includes/ui/tabs/diagnostics.php b/wp-content/plugins/redis-cache/includes/ui/tabs/diagnostics.php new file mode 100644 index 000000000..68cacbb7a --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/ui/tabs/diagnostics.php @@ -0,0 +1,23 @@ + + +
+
+
+ +

+ + + + +

diff --git a/wp-content/plugins/redis-cache/includes/ui/tabs/metrics.php b/wp-content/plugins/redis-cache/includes/ui/tabs/metrics.php new file mode 100644 index 000000000..d66b5d629 --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/ui/tabs/metrics.php @@ -0,0 +1,39 @@ + + +
+ + + +
+ +
diff --git a/wp-content/plugins/redis-cache/includes/ui/tabs/overview.php b/wp-content/plugins/redis-cache/includes/ui/tabs/overview.php new file mode 100644 index 000000000..e3a316b78 --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/ui/tabs/overview.php @@ -0,0 +1,300 @@ +get_redis_status(); +$redis_client = $roc->get_redis_client_name(); +$redis_prefix = $roc->get_redis_prefix(); +$redis_maxttl = $roc->get_redis_maxttl(); +$redis_version = $roc->get_redis_version(); +$redis_connection = $roc->check_redis_connection(); +$filesystem_allowed = $roc->is_file_mod_allowed(); +$filesystem_writable = $roc->test_filesystem_writing(); + +$diagnostics = $roc->get_diagnostics(); + +?> + + +
+

+ + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + get_status() ); ?> + + + + + get_status() ); ?> + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +

+ +

+ +
+ + + +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 ) : ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
    + +
  • + +
+
+
    + +
  • + +
+
+
    + +
  • obscure_url_secrets( $node ) ); ?>
  • + +
+
+ •••••••• +
+ + + +
+ + + +
+ + + +
+ + + +

+ + get_redis_status() ) : ?> + + +   + + + validate_object_cache_dropin() ) : ?> + + + + + + + + + + + + + + + + + +

diff --git a/wp-content/plugins/redis-cache/includes/ui/widget.php b/wp-content/plugins/redis-cache/includes/ui/widget.php new file mode 100644 index 000000000..2d2a25c9c --- /dev/null +++ b/wp-content/plugins/redis-cache/includes/ui/widget.php @@ -0,0 +1,45 @@ + +
+ + + +
+ +
diff --git a/wp-content/plugins/redis-cache/languages/redis-cache.pot b/wp-content/plugins/redis-cache/languages/redis-cache.pot new file mode 100644 index 000000000..ee377d790 --- /dev/null +++ b/wp-content/plugins/redis-cache/languages/redis-cache.pot @@ -0,0 +1,604 @@ +# Copyright (C) 2024 Till Krüss +# This file is distributed under the GPLv3. +msgid "" +msgstr "" +"Project-Id-Version: Redis Object Cache 2.5.4\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/redis-cache\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2024-10-15T17:40:24+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"X-Generator: WP-CLI 2.11.0\n" +"X-Domain: redis-cache\n" + +#. Plugin Name of the plugin +#: redis-cache.php +#: includes/class-plugin.php:149 +#: includes/class-plugin.php:221 +#: includes/ui/settings.php:19 +msgid "Redis Object Cache" +msgstr "" + +#. Plugin URI of the plugin +#: redis-cache.php +msgid "https://wordpress.org/plugins/redis-cache/" +msgstr "" + +#. Description of the plugin +#: redis-cache.php +msgid "A persistent object cache backend powered by Redis. Supports Predis, PhpRedis, Relay, replication, sentinels, clustering and WP-CLI." +msgstr "" + +#. Author of the plugin +#: redis-cache.php +msgid "Till Krüss" +msgstr "" + +#. Author URI of the plugin +#: redis-cache.php +msgid "https://objectcache.pro" +msgstr "" + +#: includes/class-plugin.php:150 +msgid "Redis" +msgstr "" + +#: includes/class-plugin.php:186 +msgid "Overview" +msgstr "" + +#: includes/class-plugin.php:192 +msgid "Metrics" +msgstr "" + +#: includes/class-plugin.php:198 +msgid "Diagnostics" +msgstr "" + +#: includes/class-plugin.php:249 +#: includes/class-plugin.php:769 +#: includes/ui/widget.php:38 +msgid "Settings" +msgstr "" + +#: includes/class-plugin.php:289 +msgctxt "verb" +msgid "Upgrade to Pro" +msgstr "" + +#: includes/class-plugin.php:388 +#: includes/ui/tabs/metrics.php:17 +#: includes/ui/widget.php:18 +msgid "Time" +msgstr "" + +#: includes/class-plugin.php:389 +#: includes/ui/tabs/metrics.php:22 +#: includes/ui/widget.php:23 +msgid "Bytes" +msgstr "" + +#: includes/class-plugin.php:390 +#: includes/ui/tabs/metrics.php:27 +#: includes/ui/widget.php:28 +msgid "Ratio" +msgstr "" + +#: includes/class-plugin.php:391 +#: includes/ui/tabs/metrics.php:32 +#: includes/ui/widget.php:33 +msgid "Calls" +msgstr "" + +#: includes/class-plugin.php:392 +msgid "Not enough data collected, yet." +msgstr "" + +#: includes/class-plugin.php:393 +msgid "Enable object cache to collect data." +msgstr "" + +#: includes/class-plugin.php:539 +#: includes/class-qm-collector.php:77 +#: includes/ui/tabs/overview.php:59 +msgid "Disabled" +msgstr "" + +#: includes/class-plugin.php:543 +msgid "Not enabled" +msgstr "" + +#: includes/class-plugin.php:547 +msgid "Drop-in is outdated" +msgstr "" + +#: includes/class-plugin.php:551 +msgid "Drop-in is invalid" +msgstr "" + +#: includes/class-plugin.php:556 +msgid "Connected" +msgstr "" + +#: includes/class-plugin.php:557 +msgid "Not connected" +msgstr "" + +#: includes/class-plugin.php:560 +#: includes/ui/tabs/overview.php:266 +msgid "Unknown" +msgstr "" + +#. translators: %s = Action link to update the drop-in. +#: includes/class-plugin.php:706 +msgid "The Redis object cache drop-in is outdated. Please update the drop-in." +msgstr "" + +#. translators: %s = Link to settings page. +#: includes/class-plugin.php:713 +msgid "A foreign object cache drop-in was found. To use Redis for object caching, please enable the drop-in." +msgstr "" + +#: includes/class-plugin.php:740 +#: includes/class-qm-collector.php:34 +#: includes/class-qm-output.php:37 +msgid "Object Cache" +msgstr "" + +#: includes/class-plugin.php:761 +#: includes/ui/tabs/overview.php:278 +msgid "Flush Cache" +msgstr "" + +#. translators: %s = The status of the Redis connection. +#: includes/class-plugin.php:785 +msgid "Status: %s" +msgstr "" + +#. translators: 1: Hit ratio, 2: Hits, 3: Misses. 4: Human-readable size of cache. +#: includes/class-plugin.php:805 +msgid "(Current page) Hit Ratio: %1$s%%, Hits %2$s, Misses: %3$s, Size: %4$s" +msgstr "" + +#: includes/class-plugin.php:852 +msgid "Flushing cache..." +msgstr "" + +#: includes/class-plugin.php:928 +msgid "Object cache flushed." +msgstr "" + +#: includes/class-plugin.php:934 +msgid "Object cache could not be flushed." +msgstr "" + +#: includes/class-plugin.php:966 +#: includes/cli/class-commands.php:80 +msgid "Object cache enabled." +msgstr "" + +#: includes/class-plugin.php:972 +#: includes/cli/class-commands.php:82 +msgid "Object cache could not be enabled." +msgstr "" + +#: includes/class-plugin.php:996 +#: includes/cli/class-commands.php:121 +msgid "Object cache disabled." +msgstr "" + +#: includes/class-plugin.php:1002 +#: includes/cli/class-commands.php:123 +msgid "Object cache could not be disabled." +msgstr "" + +#: includes/class-plugin.php:1027 +#: includes/cli/class-commands.php:162 +msgid "Updated object cache drop-in and enabled Redis object cache." +msgstr "" + +#: includes/class-plugin.php:1033 +#: includes/cli/class-commands.php:164 +msgid "Object cache drop-in could not be updated." +msgstr "" + +#. translators: %s = Action link to update the drop-in. +#: includes/class-plugin.php:1108 +msgid "The Object Cache Pro plugin appears to be installed and should be used. You can safely uninstall Redis Object Cache." +msgstr "" + +#: includes/class-plugin.php:1140 +msgid "Object Cache Pro!" +msgstr "" + +#. translators: %s = Link to the plugin setting screen. +#: includes/class-plugin.php:1143 +msgid "A business class object cache backend. Truly reliable, highly-optimized and fully customizable, with a dedicated engineer when you most need it. Learn more »" +msgstr "" + +#: includes/class-plugin.php:1188 +msgid "Object Cache Pro + WooCommerce = ❤️" +msgstr "" + +#. translators: %s = Link to the plugin's settings screen. +#: includes/class-plugin.php:1191 +msgid "Object Cache Pro is a business class object cache that’s highly-optimized for WooCommerce to provide true reliability, peace of mind and faster load times for your store. Learn more »" +msgstr "" + +#. translators: %1$d = number of objects. %2$s = human-readable size of cache. %3$s = name of the used client. +#: includes/class-plugin.php:1261 +msgid "Retrieved %1$d objects (%2$s) from Redis using %3$s." +msgstr "" + +#: includes/class-plugin.php:1376 +msgid "File modifications are not allowed." +msgstr "" + +#: includes/class-plugin.php:1380 +msgid "Could not initialize filesystem." +msgstr "" + +#: includes/class-plugin.php:1391 +msgid "Object cache drop-in is not writable." +msgstr "" + +#: includes/class-plugin.php:1401 +msgid "Object cache file doesn’t exist." +msgstr "" + +#: includes/class-plugin.php:1406 +msgid "Test file exists, but couldn’t be deleted." +msgstr "" + +#: includes/class-plugin.php:1411 +msgid "Content directory is not writable." +msgstr "" + +#: includes/class-plugin.php:1415 +msgid "Failed to copy test file." +msgstr "" + +#: includes/class-plugin.php:1419 +msgid "Copied test file doesn’t exist." +msgstr "" + +#: includes/class-plugin.php:1425 +msgid "Couldn’t verify test file contents." +msgstr "" + +#: includes/class-plugin.php:1429 +msgid "Copied test file couldn’t be deleted." +msgstr "" + +#: includes/class-qm-collector.php:77 +msgid "Yes" +msgstr "" + +#: includes/class-qm-output.php:102 +msgid "The Redis Object Cache drop-in is not installed. Use WP CLI or go to \"Settings -> Redis\" to enable drop-in." +msgstr "" + +#: includes/class-qm-output.php:113 +msgid "WordPress is using a foreign object cache drop-in and Redis Object Cache is not being used. Use WP CLI or go to \"Settings -> Redis\" to enable drop-in." +msgstr "" + +#: includes/cli/class-commands.php:58 +msgid "Redis object cache already enabled." +msgstr "" + +#: includes/cli/class-commands.php:60 +#: includes/cli/class-commands.php:112 +msgid "A foreign object cache drop-in was found. To use Redis for object caching, run: `wp redis update-dropin`." +msgstr "" + +#. translators: %s = The Redis connection error message. +#: includes/cli/class-commands.php:67 +msgid "Object cache could not be enabled. Redis server is unreachable: %s" +msgstr "" + +#: includes/cli/class-commands.php:106 +msgid "No object cache drop-in found." +msgstr "" + +#. translators: %s = The Redis connection error message. +#: includes/cli/class-commands.php:159 +msgid "Object cache drop-in could not be updated. Redis server is unreachable: %s" +msgstr "" + +#: includes/object-cache.php:2993 +msgid "Error establishing a Redis connection" +msgstr "" + +#. translators: %s = Formatted wp-config.php file name. +#: includes/object-cache.php:3000 +msgid "WordPress is unable to establish a connection to Redis. This means that the connection information in your %s file are incorrect, or that the Redis server is not reachable." +msgstr "" + +#: includes/object-cache.php:3005 +msgid "Is the correct Redis host and port set?" +msgstr "" + +#: includes/object-cache.php:3006 +msgid "Is the Redis server running?" +msgstr "" + +#. translators: %s = Link to installation instructions. +#: includes/object-cache.php:3011 +msgid "If you need help, please read the installation instructions." +msgstr "" + +#. translators: %1$s = Formatted object-cache.php file name, %2$s = Formatted wp-content directory name. +#: includes/object-cache.php:3018 +msgid "To disable Redis, delete the %1$s file in the %2$s directory." +msgstr "" + +#. translators: %s = Tab label. +#: includes/ui/class-tab.php:154 +msgid "%s are disabled for this site." +msgstr "" + +#: includes/ui/query-monitor.php:20 +msgid "Status" +msgstr "" + +#: includes/ui/query-monitor.php:25 +msgid "Hit Ratio" +msgstr "" + +#: includes/ui/query-monitor.php:30 +msgid "Hits" +msgstr "" + +#: includes/ui/query-monitor.php:35 +msgid "Misses" +msgstr "" + +#: includes/ui/query-monitor.php:40 +msgid "Size" +msgstr "" + +#: includes/ui/query-monitor.php:50 +msgid "Errors" +msgstr "" + +#: includes/ui/query-monitor.php:73 +msgid "Global Groups" +msgstr "" + +#: includes/ui/query-monitor.php:87 +msgid "Non-persistent Groups" +msgstr "" + +#: includes/ui/query-monitor.php:101 +msgid "Unflushable Groups" +msgstr "" + +#: includes/ui/query-monitor.php:115 +msgid "Metadata" +msgstr "" + +#: includes/ui/settings.php:71 +msgid "Resources" +msgstr "" + +#: includes/ui/settings.php:79 +msgid "Need more performance and reliability?" +msgstr "" + +#. translators: %s = Object Cache Pro. +#: includes/ui/settings.php:83 +msgid "Check out %s" +msgstr "" + +#: includes/ui/settings.php:87 +msgid "A business class object cache backend. Truly reliable, highly-optimized and fully customizable, with a dedicated engineer when you most need it." +msgstr "" + +#: includes/ui/settings.php:90 +msgid "Rewritten for raw performance" +msgstr "" + +#: includes/ui/settings.php:91 +msgid "100% WordPress API compliant" +msgstr "" + +#: includes/ui/settings.php:92 +msgid "Faster serialization and compression" +msgstr "" + +#: includes/ui/settings.php:93 +msgid "Easy debugging & logging" +msgstr "" + +#: includes/ui/settings.php:94 +msgid "Cache prefetching and analytics" +msgstr "" + +#: includes/ui/settings.php:95 +msgid "Fully unit tested (100% code coverage)" +msgstr "" + +#: includes/ui/settings.php:96 +msgid "Secure connections with TLS" +msgstr "" + +#: includes/ui/settings.php:97 +msgid "Health checks via WordPress & WP CLI" +msgstr "" + +#: includes/ui/settings.php:98 +msgid "Optimized for WooCommerce, Jetpack & Yoast SEO" +msgstr "" + +#: includes/ui/settings.php:102 +msgid "Learn more" +msgstr "" + +#: includes/ui/settings.php:116 +msgid "Your site meets the system requirements for the Pro version." +msgstr "" + +#: includes/ui/settings.php:123 +msgid "Your site does not meet the requirements for the Pro version:" +msgstr "" + +#. translators: %s = PHP Version. +#: includes/ui/settings.php:132 +msgid "The current version of PHP (%s) is too old. PHP 7.2 or newer is required." +msgstr "" + +#: includes/ui/settings.php:141 +msgid "The PhpRedis extension is not installed." +msgstr "" + +#. translators: %s = Version of the PhpRedis extension. +#: includes/ui/settings.php:148 +msgid "The current version of the PhpRedis extension (%s) is too old. PhpRedis 3.1.1 or newer is required." +msgstr "" + +#: includes/ui/tabs/diagnostics.php:19 +msgid "Copy diagnostics to clipboard" +msgstr "" + +#: includes/ui/tabs/metrics.php:16 +#: includes/ui/widget.php:17 +msgid "The total amount of time (in milliseconds) it took Redis to return cache data." +msgstr "" + +#: includes/ui/tabs/metrics.php:21 +#: includes/ui/widget.php:22 +msgid "The total amount of bytes that was retrieved from Redis." +msgstr "" + +#: includes/ui/tabs/metrics.php:26 +#: includes/ui/widget.php:27 +msgid "The hit/miss ratio of cache data that was already cached." +msgstr "" + +#: includes/ui/tabs/metrics.php:31 +#: includes/ui/widget.php:32 +msgid "The total amount of commands sent to Redis." +msgstr "" + +#: includes/ui/tabs/overview.php:27 +msgid "Redis is unreachable:" +msgstr "" + +#: includes/ui/tabs/overview.php:36 +msgid "Status:" +msgstr "" + +#: includes/ui/tabs/overview.php:53 +msgid "Filesystem:" +msgstr "" + +#: includes/ui/tabs/overview.php:64 +msgid "Not writeable" +msgstr "" + +#: includes/ui/tabs/overview.php:70 +msgid "Writeable" +msgstr "" + +#: includes/ui/tabs/overview.php:77 +msgid "Redis:" +msgstr "" + +#: includes/ui/tabs/overview.php:82 +msgid "Reachable" +msgstr "" + +#: includes/ui/tabs/overview.php:87 +msgid "Unreachable" +msgstr "" + +#: includes/ui/tabs/overview.php:95 +msgid "Key Prefix:" +msgstr "" + +#: includes/ui/tabs/overview.php:104 +msgid "Max. TTL:" +msgstr "" + +#: includes/ui/tabs/overview.php:110 +msgid "This doesn’t appear to be a valid number." +msgstr "" + +#: includes/ui/tabs/overview.php:122 +msgid "Connection" +msgstr "" + +#: includes/ui/tabs/overview.php:129 +msgid "Client:" +msgstr "" + +#: includes/ui/tabs/overview.php:138 +msgid "Host:" +msgstr "" + +#: includes/ui/tabs/overview.php:145 +msgid "Cluster:" +msgstr "" + +#: includes/ui/tabs/overview.php:158 +msgid "Shards:" +msgstr "" + +#: includes/ui/tabs/overview.php:171 +msgid "Servers:" +msgstr "" + +#: includes/ui/tabs/overview.php:184 +msgid "Port:" +msgstr "" + +#: includes/ui/tabs/overview.php:191 +msgid "Username:" +msgstr "" + +#: includes/ui/tabs/overview.php:198 +msgid "Password:" +msgstr "" + +#: includes/ui/tabs/overview.php:207 +msgid "Database:" +msgstr "" + +#: includes/ui/tabs/overview.php:214 +msgid "Connection Timeout:" +msgstr "" + +#. translators: %s = Redis connection/read timeout in seconds. +#: includes/ui/tabs/overview.php:220 +#: includes/ui/tabs/overview.php:237 +msgid "%ss" +msgstr "" + +#: includes/ui/tabs/overview.php:231 +msgid "Read Timeout:" +msgstr "" + +#: includes/ui/tabs/overview.php:248 +msgid "Retry Interval:" +msgstr "" + +#. translators: %s = Redis retry interval in milliseconds. +#: includes/ui/tabs/overview.php:254 +msgid "%sms" +msgstr "" + +#: includes/ui/tabs/overview.php:265 +msgid "Redis Version:" +msgstr "" + +#: includes/ui/tabs/overview.php:285 +msgid "Disable Object Cache" +msgstr "" + +#: includes/ui/tabs/overview.php:291 +#: includes/ui/tabs/overview.php:295 +msgid "Enable Object Cache" +msgstr "" diff --git a/wp-content/plugins/redis-cache/readme.txt b/wp-content/plugins/redis-cache/readme.txt new file mode 100644 index 000000000..6f6fc7e8d --- /dev/null +++ b/wp-content/plugins/redis-cache/readme.txt @@ -0,0 +1,707 @@ +=== Redis Object Cache === +Contributors: tillkruess +Donate link: https://github.com/sponsors/tillkruss +Tags: redis, object cache, caching, performance, relay +Requires at least: 4.6 +Tested up to: 6.6 +Requires PHP: 7.2 +Stable tag: 2.5.4 +License: GPLv3 +License URI: https://www.gnu.org/licenses/gpl-3.0.html + +A persistent object cache backend powered by Redis®¹. Supports Predis, PhpRedis, Relay, replication, sentinels, clustering and WP-CLI. + + +== Description == + +A persistent object cache backend powered by Redis®¹. Supports [Predis](https://github.com/predis/predis/), [PhpRedis (PECL)](https://github.com/phpredis/phpredis), [Relay](https://relaycache.com), replication, sentinels, clustering and [WP-CLI](https://wp-cli.org/). + +To adjust the connection parameters, prefix cache keys or configure replication/clustering, see the [configuration options](https://github.com/rhubarbgroup/redis-cache/#configuration). + += Object Cache Pro = + +A **business class** Redis®¹ object cache backend. Truly reliable, highly optimized, fully customizable and with a dedicated engineer when you most need it. + +* Rewritten for raw performance +* 100% WordPress API compliant +* Faster serialization and compression +* Easy debugging & logging +* Cache prefetching and analytics +* Fully unit tested (100% code coverage) +* Secure connections with TLS +* Health checks via WordPress & WP CLI +* Optimized for WooCommerce, Jetpack & Yoast SEO + +Learn more about [Object Cache Pro](https://objectcache.pro/?ref=oss&utm_source=wp-plugin&utm_medium=readme). + +¹ Redis is a registered trademark of Redis Ltd. Any rights therein are reserved to Redis Ltd. Any use by Redis Object Cache is for referential purposes only and does not indicate any sponsorship, endorsement or affiliation between Redis and Redis Object Cache. + +== Installation == + +For detailed installation instructions, please read the extensive [installation instructions](https://github.com/rhubarbgroup/redis-cache/blob/develop/INSTALL.md). + +== Troubleshooting == + +Answers to common questions and troubleshooting of common errors can be found in the [FAQ](https://github.com/rhubarbgroup/redis-cache/blob/develop/FAQ.md). Reading these is always faster than waiting for a response in the support forums. + +== Configuration == + +The plugin comes with vast set of [configuration options](https://github.com/rhubarbgroup/redis-cache/#configuration) and [connection examples](https://github.com/rhubarbgroup/redis-cache/#connections). Advanced users may consult [Scaling and replication](https://github.com/rhubarbgroup/redis-cache/blob/develop/README.md#scaling) + +== WP CLI commands == + +Redis Object Cache has various WP CLI commands, for more information run `wp help redis` after installing the plugin. + +== Screenshots == + +1. Plugin settings, connected to a single Redis server. +2. Plugin settings, displaying recent response time metrics. +3. Plugin settings, showing diagnostic information. +4. Dashboard widget, displaying recent response time metrics. + +== Changelog == + += 2.5.4 = + +- Respect `WP_REDIS_SCHEME` for Cluster connections +- Fixed issue with Predis and `SentinelReplication` connection +- Fixed double-slash in `admin.css` URL + += 2.5.3 = + +- Added `WP_REDIS_DISABLE_GROUP_FLUSH` constant +- Added `redis_cache_manager_capability` filter and `WP_REDIS_MANAGER_CAPABILITY` constant +- Added `WP_REDIS_SSL_CONTEXT` support for PhpRedis cluster connections +- Fixed several issues with Predis and cluster/replicated connection +- Fixed another rare fatal error in `show_error_and_die()` + += 2.5.2 = + +- Respect `WP_REDIS_FLUSH_TIMEOUT` in Lua flush scripts +- Improve `DISALLOW_FILE_MODS` support +- Reverted behavioral change to `sanitize_key_part()` +- Fixed rare fatal error in `show_error_and_die()` (again) + += 2.5.1 = + +- Added timeouts to diagnostics +- Support rare PHP installations without `sockets` extension +- Fixed rare fatal error in `show_error_and_die()` +- Fixed deprecation notice warning in `sanitize_key_part()` + +== Changelog == + += 2.5.0 = + +- Require WordPress 4.6 or newer +- Load text-domain only when needed +- Added `WP_REDIS_DISABLE_DROPIN_CHECK` constant +- Respect `file_mod_allowed` filter and `DISALLOW_FILE_MODS` constant +- Renamed `.redis-write-test.tmp` test file to `object-cache.tmp` +- Call `redis_object_cache_error` action before `wp_die()` +- Allow `WP_REDIS_PLUGIN_PATH` to be defined elsewhere +- Added experimental flush timeout (defaults to `5` seconds) +- Dropped unnecessary default ignored groups + += 2.4.4 = + +- Improved handling of unexpected transaction results + += 2.4.3 = + +- Fixed PHP `<=7.2` syntax error +- Fixed loading error-page translations + += 2.4.2 = + +- Made admin-bar script more robust +- Improved recovery instructions on `redis-error.php` +- Improved CloudLinux detection +- Localization improvements +- Prevent W3 Total Cache and LiteSpeed Cache from overwriting drop-in +- Fixed ACL username support when using Predis and array syntax + += 2.4.1 = + +- Fix PHP `<=7.2` syntax error + += 2.4.0 = + +- Flush cache when toggling the object cache +- Show a custom error message when Redis is unreachable +- Don't allow object cache to be enabled when Redis is unreachable +- Deprecated risky `WP_REDIS_SERIALIZER` configuration constant, use `WP_REDIS_IGBINARY` instead +- Support `WP_REDIS_USERNAME` when using Predis +- Show cache hit ratio decimal points in Admin Bar node +- Obscure secrets when displaying `WP_REDIS_SERVERS` +- Improved CloudLinux's Accelerate WP compatibility +- Admin bar cache flush now uses AJAX + += 2.3.0 = + +- Show dashboard widget only to admins +- Added Admin Bar node (disable using `WP_REDIS_DISABLE_ADMINBAR`) +- Added `WP_REDIS_SSL_CONTEXT` configuration constant +- Throw errors when connection error occurs +- Added support for usernames when using Predis +- Added support for loading Predis from `WP_REDIS_PLUGIN_PATH` +- Made Predis unix socket connections stricter +- Fixed rare group flushing bug +- Fixed cluster ping when using Predis +- Updated Predis to v2.1.2 +- Improved documentation + += 2.2.4 = + +- Register `wp redis` CLI command late +- Don't compete with Object Cache Pro for `wp redis` command +- Prevent Perflab from overwriting the object cache drop-in +- Updated Predis to v2.1.1 +- Avoid type error when transaction fails +- Check for incompatible content type headers + += 2.2.3 = + +- Added `wp_cache_flush_group()` support +- Updated Credis to v1.14.0 +- Drop `$delay` parameter from `wp_cache_flush()` +- Prevent rare error in diagnostics when reading connection errors + += 2.2.2 = + +- Use `QM_Data_Cache` instead of `QM_Data` +- Fixed `WP_Error` use statement non-compound name warning + += 2.2.1 = + +- Added WordPress 6.1 `wp_cache_supports()` function +- Updated Predis to v2.0.3 +- Avoid early `microtime()` calls in `WP_Object_Cache::get()` +- Support Query Monitor's new `QM_Data` class +- Throw exception of pipeline returns unexpected results + += 2.2.0 = + +- Added `redis_cache_add_non_persistent_groups` filter +- Fixed `wp_add_dashboard_widget` parameters +- Fixed `WP_REDIS_SERVERS` replication issue with Predis v2.0 +- Fixed `WP_REDIS_CLUSTER` string support +- Fixed issue when `MGET` fails in `get_multiple()` call +- Fixed several warnings in the event of pipeline failures + += 2.1.6 = + +- Fixed SVN discrepancies + += 2.1.5 = + +- Fixed `is_predis()` call + += 2.1.4 = + +- Added `is_predis()` helper + += 2.1.3 = + +- Fixed bug in `wp_cache_add_multiple()` and `wp_cache_set_multiple()` + += 2.1.2 = + +- Fixed and improved `wp_cache_*_multiple()` logic +- Call `redis_object_cache_set` action in `wp_cache_set_multiple()` +- Call `redis_object_cache_delete` action in `wp_cache_delete_multiple()` +- Check if raw group name is ignored, not sanitized name +- Removed tracing + += 2.1.1 = + +- Bumped PHP requirement to 7.2 +- Renamed `WP_REDIS_DIR` to `WP_REDIS_PLUGIN_DIR` +- Fixed rare fatal error in diagnostics +- Allow Predis v1.1 Composer installs +- Support using `WP_REDIS_CLUSTER` string + += 2.1.0 = + +- Bumped PHP requirement to 7.0 +- Deprecated Credis and HHVM clients +- Updated Predis to v2.0.0 +- Updated Credis to v1.13.1 +- Improved cluster readability in diagnostics +- Improved connecting to clusters +- Fixed pinging clusters after connecting +- Fixed several bugs in `connect_using_credis()` + += 2.0.26 = + +- Fixed a bug in `wp_cache_delete_multiple()` when using Predis +- Fixed a bug in `wp_cache_add_multiple()` when cache addition is suspended + += 2.0.25 = + +- Removed broken `wp_cache_add_multiple()` function + += 2.0.24 = + +- Improve metrics label/tooltip formatting +- Fix metrics chart not rendering +- Updated Predis to v1.1.10 +- Updated Credis to v1.13.0 +- Support `composer/installers` v1 and v2 +- Link to settings page when foreign drop-in was found +- Added `wp_cache_flush_runtime()` function +- Added `wp_cache_add_multiple()` function +- Added `wp_cache_delete_multiple()` function + += 2.0.23 = + +- Added support for [Relay](https://relaycache.com) +- Minor UX fixes and improvements +- Fixed PHP 8.1 deprecation notice +- Updated ApexCharts to v3.31.0 + += 2.0.22 = + +- PHP 8.1 compatibility fixes +- Upgraded to Predis v1.1.9 +- Added settings link to widget +- Overhauled diagnostics pane +- Updated ApexCharts to v3.30.0 +- Redirect to plugin settings after activation +- Fixed wrong path to `diagnostics.php` file +- Fixed chart overflow in settings tab +- Fixed Predis cluster ping +- Avoid warning when content folder is not writeable + += 2.0.21 = + +- Added metrics diagnostics +- Added `WP_Object_Cache::decr()` alias +- Moved `diagnostics.php` file + += 2.0.20 = + +- Fix wp.org release + += 2.0.19 = + +- Make metric identifier unique +- Set unique prefix for sites hosted on Cloudways +- Don't print HTML debug comment when `WP_CLI` is `true` + += 2.0.18 = + +- Added `redis_object_cache_trace` action and `WP_REDIS_TRACE` constant +- Updated ApexCharts to v3.26.0 +- Fixed and issue with `WP_REDIS_DISABLE_METRICS` + += 2.0.17 = + +- Code cleanup +- Fixed missing metrics +- Fixed filesystem test + += 2.0.16 = + +- Updated Credis to v1.11.4 +- Fixed drop-in notice styling +- Moved metrics into dedicated class +- Added `redis_cache_validate_dropin` filter +- Use `WP_DEBUG_DISPLAY` (instead of `WP_DEBUG`) constant to display debug information +- Fixed rare error in `wp_cache_get_multiple()` +- Removed `intval()` usage + += 2.0.15 = + +- Reverted `build_key()` changes due to issues in multisite environments + += 2.0.14 = + +- Made Object Cache Pro card translatable +- Added `WP_REDIS_SERIALIZER` to diagnostics +- Improved speed of `build_key()` +- Support settings `WP_REDIS_PREFIX` and `WP_REDIS_SELECTIVE_FLUSH` via environment variable +- Added `WP_REDIS_METRICS_MAX_TIME` to adjust stored metrics timeframe +- Delay loading of text domain and schedule until `init` hook +- Upgraded bundled Predis library to v1.1.6 +- Prevent variable referencing issue in `connect_using_credis()` + += 2.0.13 = + +- Updated bundled Predis library to v1.1.4 +- Made `redis-cache` a global group for improved metrics on multisite +- Switched to short array syntax +- Added `@since` tags to all hooks +- Use `parse_url()` instead of `wp_parse_url()` in drop-in +- Fixed plugin instance variable name in `wp redis status` + += 2.0.12 = + +- Fixed bytes metrics calculation +- Fixed an issue with non-standard Predis configurations +- Improve WordPress Coding Standards + += 2.0.11 = + +- Fixed an issue in `wp_cache_get_multiple()` when using Predis +- Prevent undefined index notice in diagnostics + += 2.0.10 = + +- Fixed unserializing values in `wp_cache_get_multiple()` + += 2.0.9 = + +- Highlight current metric type using color +- Show "Metrics" tab when metrics are disabled +- Refactored connection and Redis status logic +- Updated Predis to v1.1.2 +- Remove Predis deprecation notice +- Fixed fetching derived keys in `wp_cache_get_multiple()` + += 2.0.8 = + +- Fixed tabs not working in 2.0.6 and 2.0.7 due to WP.org SVN issue + += 2.0.7 = + +- Fixed issue with `wp_cache_get_multiple()` + += 2.0.6 = + +- Added experimental filesystem test to diagnostics +- Refactored settings tab logic (fixed jumping, too) +- Fixed issues with `wp_cache_get_multiple()` +- Return boolean from `wp_cache_delete()` +- Use `redis-cache` as JS event namespace +- Hide Pro line in widget when banners are disabled +- Renamed `redis_object_cache_get_multi` action to `redis_object_cache_get_multiple` + += 2.0.5 = + +Version 2.0 is a significant rewrite of the plugin. Please read the v2.0.0 release notes. + +- Fixed multisite action buttons not working +- Removed outdated PHP 5.4 warning +- Added `read_timeout` support to Credis +- Display connection parameters when using Credis +- Added wiki link to Predis upgrade notice + += 2.0.4 = + +- Attempt to reliably update the dropin when it's outdated +- Show ACL username on settings screen +- Show full diagnostics with `wp redis status` +- Always set `FS_CHMOD_FILE` when copying the `object-cache.php` +- Don't encode bullets in password diagnostics +- Call `redis_object_cache_update_dropin` during dropin update + += 2.0.3 = + +- Hide "Metrics" tab when metrics are disabled +- Fixed `admin.js` not loading in multisite environments +- Avoid fatal error when interacting with metrics but Redis went away +- Added `WP_Object_Cache::__get()` for backwards compatibility + += 2.0.2 = + +- Updated POT file and comments for translators + += 2.0.1 = + +- Support older versions of Query Monitor +- Made "Dropin" status more helpful +- Hide Redis version in settings when it isn't available +- Collapsed dependency paths using `composer-custom-directory-installer` package +- Prevent `QM_Collector` conflicts with other plugins +- Prevent metric issues when cache is not available +- Fixed "Settings" link in plugin list +- Fixed `WP_REDIS_DISABLED` logic + += 2.0.0 = + +Version 2.0 is a significant rewrite. The plugin now requires PHP 5.6, just like WordPress 5.2 does. + +The GitHub and Composer repository was moved from `tillkruss/redis-cache` to `rhubarbgroup/redis-cache`. + +On multisite networks, be sure to "Network Activate" the plugin after upgrading to v2.x. + +- Require PHP 5.6 +- Plugin is now "network-only" +- Switch to WPCS for code standards +- Overhauled the settings screen +- Added object cache metrics (on dashboard widget and settings) +- Added support for Query Monitor +- Added `Rhubarb\RedisCache` namespace to all files +- Added support for WP 5.5's new `wp_cache_get_multi()` function +- Added `redis_object_cache()` function to retrieve plugin instance +- Added dropin warnings to network dashboard +- Added support for setting Sentinel database numbers +- Support Redis 6 ACL username and password authentication +- Support overwriting existing dropin on setting screen +- Use singleton pattern to instantiate plugin +- Use Composer to install and load Predis +- Update object cache dropin during plugin update +- Use separate methods to connect with all clients +- Removed `CUSTOM_USER_TABLE` and `CUSTOM_USER_META_TABLE` weirdness +- Added `themes` as ignored group +- Changed default connection and read timeout to 1 second +- Prevent race condition in `add_or_replace()` +- Renamed `WP_CACHE_KEY_SALT` to `WP_REDIS_PREFIX` for clarity +- Replaced "slave" terminology with "replica" +- Only `SELECT` database when it's not `0` + += 1.6.1 = + +- Fixed issue with footer comment showing during AJAX requests + += 1.6.0 = + +- Improved group name sanitization (thanks @naxvog) +- Prevent fatal error when replacing foreign dropin +- Added HTML footer comment with optional debug information +- Removed prefix suggestions + +_The HTML footer comment only prints debug information when `WP_DEBUG` is enabled. To disable the comment entirely, set the `WP_REDIS_DISABLE_COMMENT` constant to `true`._ + += 1.5.9 = + +- Fixed missing `$info` variable assignment in constructor +- Fixed MaxTTL warning condition +- Switched to using default button styles + += 1.5.8 = + +- Added warning message about invalid MaxTTL +- Added warning about unmaintained Predis library +- Added suggestion about shorter, human-readable prefixes +- Added Redis Cache Pro compatibility to settings +- Fixed flushing the cache when the prefix contains special characters +- Fixed calling Redis `INFO` when using clusters +- Cleaned up the settings a little bit + += 1.5.7 = + +- Added support for PhpRedis TLS connections +- Added support for timeout, read timeout and password when using PhpRedis cluster +- Fixed issue with `INFO` command +- Fixed object cloning when setting cache keys + += 1.5.6 = + +- Added object cloning to in-memory cache +- Fixed PHP notice related to `read_timeout` parameter + += 1.5.5 = + +Please flush the object cache after updating the drop to v1.5.5 to avoid dead keys filling up Redis memory. + +- Removed lowercasing keys +- Remove scheduled metrics event +- Fixed Redis version call when using replication + += 1.5.4 = + +- Removed metrics + += 1.5.3 = + +- Fixed: Call to undefined function `get_plugin_data()` +- Fixed: Call to undefined method `WP_Object_Cache::redis_version()` + += 1.5.2 = + +- Added Redis version to diagnostics +- Added `WP_REDIS_DISABLE_BANNERS` constant to disable promotions +- Fixed an issue with `redis.replicate_commands()` + += 1.5.1 = + +This plugin turned 5 years today (Nov 14th) and its only fitting to release the business edition today as well. +[Object Cache Pro](https://objectcache.pro/) is a truly reliable, highly optimized and easy to debug rewrite of this plugin for SMBs. + +- Added execution times to actions +- Added `WP_REDIS_VERSION` constant +- Fixed PhpRedis v3 compatibility +- Fixed an issue with selective flushing +- Fixed an issue with `mb_*` functions not existing +- Replaced Email Address Encoder card with Redis Cache Pro card +- Gather version metrics for better decision making + += 1.5.0 = + +Since Predis isn't maintained any longer, it's highly recommended to switch over to PhpRedis (the Redis PECL extension). + +- Improved Redis key name builder +- Added support for PhpRedis serializers +- Added `redis_object_cache_error` action +- Added timeout, read-timeout and retry configuration +- Added unflushable groups (defaults to `['userlogins']`) +- Fixed passwords not showing in server list + += 1.4.3 = + +- Require PHP 5.4 or newer +- Use pretty print in diagnostics +- Throw exception if Redis library is missing +- Fixed cache not flushing for some users +- Fixed admin issues when `WP_REDIS_DISABLED` is `false` + += 1.4.2 = + +- Added graceful Redis failures and `WP_REDIS_GRACEFUL` constant +- Improved cluster support +- Added `redis_cache_expiration` filter +- Renamed `redis_object_cache_get` filter to `redis_object_cache_get_value` + += 1.4.1 = + +- Fixed potential fatal error related to `wp_suspend_cache_addition()` + += 1.4.0 = + +- Added support for igbinary +- Added support for `wp_suspend_cache_addition()` + += 1.3.9 = + +- Fixed `WP_REDIS_SHARDS` not showing up in server list +- Fixed `WP_REDIS_SHARDS` not working when using PECL extension +- Removed `WP_REDIS_SCHEME` and `WP_REDIS_PATH` leftovers + += 1.3.8 = + +- Switched from single file Predis version to full library + += 1.3.7 = + +- Revert back to single file Predis version + += 1.3.6 = + +- Added support for Redis Sentinel +- Added support for sharing +- Switched to PHAR version of Predis +- Improved diagnostics +- Added `WP_REDIS_SELECTIVE_FLUSH` +- Added `$fail_gracefully` parameter to `WP_Object_Cache::__construct()` +- Always enforce `WP_REDIS_MAXTTL` +- Pass `$selective` and `$salt` to `redis_object_cache_flush` action +- Don’t set `WP_CACHE_KEY_SALT` constant + += 1.3.5 = + +- Added basic diagnostics to admin interface +- Added `WP_REDIS_DISABLED` constant to disable cache at runtime +- Prevent "Invalid plugin header" error +- Return integer from `increment()` and `decrement()` methods +- Prevent object cache from being instantiated more than once +- Always separate cache key `prefix` and `group` by semicolon +- Improved performance of `build_key()` +- Only apply `redis_object_cache_get` filter if callbacks have been registered +- Fixed `add_or_replace()` to only set cache key if it doesn't exist +- Added `redis_object_cache_flush` action +- Added `redis_object_cache_enable` action +- Added `redis_object_cache_disable` action +- Added `redis_object_cache_update_dropin` action + += 1.3.4 = + +- Added WP-CLI support +- Show host and port unless scheme is unix +- Updated default global and ignored groups +- Do a cache flush when activating, deactivating and uninstalling + += 1.3.3 = + +- Updated Predis to `v1.1.1` +- Added `redis_instance()` method +- Added `incr()` method alias for Batcache compatibility +- Added `WP_REDIS_GLOBAL_GROUPS` and `WP_REDIS_IGNORED_GROUPS` constant +- Added `redis_object_cache_delete` action +- Use `WP_PLUGIN_DIR` with `WP_CONTENT_DIR` as fallback +- Set password when using a cluster or replication +- Show Redis client in `stats()` +- Change visibility of `$cache` to public +- Use old array syntax, just in case + += 1.3.2 = + +- Make sure `$result` is not `false` in `WP_Object_Cache::get()` + += 1.3.1 = + +- Fixed connection issue + += 1.3 = + +- New admin interface +- Added support for `wp_cache_get()`'s `$force` and `$found` parameter +- Added support for clustering and replication with Predis + += 1.2.3 = + +- UI improvements + += 1.2.2 = + +- Added `redis_object_cache_set` action +- Added `redis_object_cache_get` action and filter +- Prevented duplicated admin status messages +- Load bundled Predis library only if necessary +- Load bundled Predis library using `WP_CONTENT_DIR` constant +- Updated `stats()` method output to be uniform with WordPress + += 1.2.1 = + +- Added `composer.json` +- Added deactivation and uninstall hooks to delete `object-cache.php` +- Added local serialization functions for better `advanced-cache.php` support +- Updated bundled Predis version to `1.0.3` +- Updated heading structure to be semantic + += 1.2 = + +- Added Multisite support +- Moved admin menu under _Settings_ menu +- Fixed PHP notice in `get_redis_client_name()` + += 1.1.1 = + +- Call `select()` and optionally `auth()` if HHVM extension is used + += 1.1 = + +- Added support for HHVM's Redis extension +- Added support for PECL Redis extension +- Added `WP_REDIS_CLIENT` constant, to set preferred Redis client +- Added `WP_REDIS_MAXTTL` constant, to force expiration of cache keys +- Improved `add_or_replace()`, `get()`, `set()` and `delete()` methods +- Improved admin screen styles +- Removed all internationalization/localization from drop-in + += 1.0.2 = + +- Added "Flush Cache" button +- Added support for UNIX domain sockets +- Improved cache object retrieval performance significantly +- Updated bundled Predis library to version `1.0.1` + += 1.0.1 = + +- Load plugin translations +- Hide global admin notices from non-admin users +- Prevent direct file access to `redis-cache.php` and `admin-page.php` +- Colorize "Disable Object Cache" button +- Call `Predis\Client->connect()` to avoid potential uncaught `Predis\Connection\ConnectionException` + += 1.0 = + +- Initial release + + +== Upgrade Notice == + += 2.4.0 = + +Version 2.4.0 includes several stability and QoL improvements. diff --git a/wp-content/plugins/redis-cache/redis-cache.php b/wp-content/plugins/redis-cache/redis-cache.php new file mode 100644 index 000000000..5708954ee --- /dev/null +++ b/wp-content/plugins/redis-cache/redis-cache.php @@ -0,0 +1,65 @@ + 'Version' ] ); + +define( 'WP_REDIS_VERSION', $meta['Version'] ); + +require_once WP_REDIS_PLUGIN_PATH . '/includes/class-autoloader.php'; + +$autoloader = new Rhubarb\RedisCache\Autoloader(); +$autoloader->register(); +$autoloader->add_namespace( 'Rhubarb\RedisCache', WP_REDIS_PLUGIN_PATH . '/includes' ); + +if ( defined( 'WP_CLI' ) && WP_CLI && ! defined( 'RedisCachePro\Version' ) && ! defined( 'ObjectCachePro\Version' ) ) { + add_action( + 'plugins_loaded', + function () { + WP_CLI::add_command( 'redis', Rhubarb\RedisCache\CLI\Commands::class ); + } + ); +} + +register_activation_hook( + WP_REDIS_FILE, + [ Rhubarb\RedisCache\Plugin::class, 'on_activation' ] +); + +Rhubarb\RedisCache\Plugin::instance(); + +if ( ! function_exists( 'redis_object_cache' ) ) { + /** + * Returns the plugin instance. + * + * @return Rhubarb\RedisCache\Plugin + */ + function redis_object_cache() { + return Rhubarb\RedisCache\Plugin::instance(); + } +} diff --git a/wp-content/uploads/2025/06/image-2.png b/wp-content/uploads/2025/06/image-2.png new file mode 100644 index 0000000000000000000000000000000000000000..073f1a3734a1a281d3f47108574569c007bffc7f GIT binary patch literal 2914197 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

dAS=n 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 z

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

Ad0nNs94~it@%Vxy;hi7 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�%7mEWSMW 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

9zLPhi?jgS6`bLCA^c!u^F6O~ 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

8qM!I?ZlCG?;%Og=O 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 ~gwA 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 z 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%0Ar3L@cx@>2ve8YP|8x^CQi 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