Full Code of KitePig/FatRat-Collect for AI

master 1a1dd0bb3cbb cached
446 files
2.6 MB
718.1k tokens
3494 symbols
1 requests
Download .txt
Showing preview only (2,916K chars total). Download the full file or copy to clipboard to get everything.
Repository: KitePig/FatRat-Collect
Branch: master
Commit: 1a1dd0bb3cbb
Files: 446
Total size: 2.6 MB

Directory structure:
gitextract_djfl1zo2/

├── .gitignore
├── LICENSE
├── README.md
├── composer.json
├── fatratcollect.php
├── includes/
│   ├── fatrat-apierror.php
│   ├── fatrat-data-detail.php
│   ├── fatrat-data.php
│   ├── fatrat-debugging.php
│   ├── fatrat-kit.php
│   ├── fatrat-options-add-edit.php
│   ├── fatrat-options.php
│   ├── fatrat-spider.php
│   └── fatrat-validation.php
├── public/
│   ├── css/
│   │   ├── bootstrap.css
│   │   └── fatrat.css
│   └── js/
│       ├── bootstrap.js
│       └── fatrat.js
├── readme.txt
├── src/
│   ├── Controller/
│   │   └── TaskController.php
│   ├── Helpers/
│   │   ├── helpers.php
│   │   └── helpers2.php
│   └── Service/
│       ├── AbsoluteUrl.php
│       ├── DownloadImage.php
│       └── GetTransCoding.php
├── vendor/
│   ├── autoload.php
│   ├── cache/
│   │   ├── adapter-common/
│   │   │   ├── AbstractCachePool.php
│   │   │   ├── CacheItem.php
│   │   │   ├── Changelog.md
│   │   │   ├── Exception/
│   │   │   │   ├── CacheException.php
│   │   │   │   ├── CachePoolException.php
│   │   │   │   └── InvalidArgumentException.php
│   │   │   ├── HasExpirationTimestampInterface.php
│   │   │   ├── JsonBinaryArmoring.php
│   │   │   ├── LICENSE
│   │   │   ├── PhpCacheItem.php
│   │   │   ├── PhpCachePool.php
│   │   │   ├── README.md
│   │   │   ├── TagSupportWithArray.php
│   │   │   └── composer.json
│   │   └── filesystem-adapter/
│   │       ├── Changelog.md
│   │       ├── FilesystemCachePool.php
│   │       ├── LICENSE
│   │       ├── README.md
│   │       └── composer.json
│   ├── clue/
│   │   └── socket-raw/
│   │       ├── .github/
│   │       │   ├── FUNDING.yml
│   │       │   └── workflows/
│   │       │       └── ci.yml
│   │       ├── CHANGELOG.md
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── composer.json
│   │       └── src/
│   │           ├── Exception.php
│   │           ├── Factory.php
│   │           └── Socket.php
│   ├── composer/
│   │   ├── ClassLoader.php
│   │   ├── InstalledVersions.php
│   │   ├── LICENSE
│   │   ├── autoload_classmap.php
│   │   ├── autoload_files.php
│   │   ├── autoload_namespaces.php
│   │   ├── autoload_psr4.php
│   │   ├── autoload_real.php
│   │   ├── autoload_static.php
│   │   ├── installed.json
│   │   └── installed.php
│   ├── guzzlehttp/
│   │   ├── guzzle/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── UPGRADING.md
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── BodySummarizer.php
│   │   │       ├── BodySummarizerInterface.php
│   │   │       ├── Client.php
│   │   │       ├── ClientInterface.php
│   │   │       ├── ClientTrait.php
│   │   │       ├── Cookie/
│   │   │       │   ├── CookieJar.php
│   │   │       │   ├── CookieJarInterface.php
│   │   │       │   ├── FileCookieJar.php
│   │   │       │   ├── SessionCookieJar.php
│   │   │       │   └── SetCookie.php
│   │   │       ├── Exception/
│   │   │       │   ├── BadResponseException.php
│   │   │       │   ├── ClientException.php
│   │   │       │   ├── ConnectException.php
│   │   │       │   ├── GuzzleException.php
│   │   │       │   ├── InvalidArgumentException.php
│   │   │       │   ├── RequestException.php
│   │   │       │   ├── ServerException.php
│   │   │       │   ├── TooManyRedirectsException.php
│   │   │       │   └── TransferException.php
│   │   │       ├── Handler/
│   │   │       │   ├── CurlFactory.php
│   │   │       │   ├── CurlFactoryInterface.php
│   │   │       │   ├── CurlHandler.php
│   │   │       │   ├── CurlMultiHandler.php
│   │   │       │   ├── EasyHandle.php
│   │   │       │   ├── HeaderProcessor.php
│   │   │       │   ├── MockHandler.php
│   │   │       │   ├── Proxy.php
│   │   │       │   └── StreamHandler.php
│   │   │       ├── HandlerStack.php
│   │   │       ├── MessageFormatter.php
│   │   │       ├── MessageFormatterInterface.php
│   │   │       ├── Middleware.php
│   │   │       ├── Pool.php
│   │   │       ├── PrepareBodyMiddleware.php
│   │   │       ├── RedirectMiddleware.php
│   │   │       ├── RequestOptions.php
│   │   │       ├── RetryMiddleware.php
│   │   │       ├── TransferStats.php
│   │   │       ├── Utils.php
│   │   │       ├── functions.php
│   │   │       └── functions_include.php
│   │   ├── promises/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE
│   │   │   ├── Makefile
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── AggregateException.php
│   │   │       ├── CancellationException.php
│   │   │       ├── Coroutine.php
│   │   │       ├── Create.php
│   │   │       ├── Each.php
│   │   │       ├── EachPromise.php
│   │   │       ├── FulfilledPromise.php
│   │   │       ├── Is.php
│   │   │       ├── Promise.php
│   │   │       ├── PromiseInterface.php
│   │   │       ├── PromisorInterface.php
│   │   │       ├── RejectedPromise.php
│   │   │       ├── RejectionException.php
│   │   │       ├── TaskQueue.php
│   │   │       ├── TaskQueueInterface.php
│   │   │       ├── Utils.php
│   │   │       ├── functions.php
│   │   │       └── functions_include.php
│   │   └── psr7/
│   │       ├── CHANGELOG.md
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── composer.json
│   │       ├── src/
│   │       │   ├── AppendStream.php
│   │       │   ├── BufferStream.php
│   │       │   ├── CachingStream.php
│   │       │   ├── DroppingStream.php
│   │       │   ├── Exception/
│   │       │   │   └── MalformedUriException.php
│   │       │   ├── FnStream.php
│   │       │   ├── Header.php
│   │       │   ├── HttpFactory.php
│   │       │   ├── InflateStream.php
│   │       │   ├── LazyOpenStream.php
│   │       │   ├── LimitStream.php
│   │       │   ├── Message.php
│   │       │   ├── MessageTrait.php
│   │       │   ├── MimeType.php
│   │       │   ├── MultipartStream.php
│   │       │   ├── NoSeekStream.php
│   │       │   ├── PumpStream.php
│   │       │   ├── Query.php
│   │       │   ├── Request.php
│   │       │   ├── Response.php
│   │       │   ├── Rfc7230.php
│   │       │   ├── ServerRequest.php
│   │       │   ├── Stream.php
│   │       │   ├── StreamDecoratorTrait.php
│   │       │   ├── StreamWrapper.php
│   │       │   ├── UploadedFile.php
│   │       │   ├── Uri.php
│   │       │   ├── UriNormalizer.php
│   │       │   ├── UriResolver.php
│   │       │   └── Utils.php
│   │       └── vendor-bin/
│   │           ├── php-cs-fixer/
│   │           │   └── composer.json
│   │           ├── phpstan/
│   │           │   └── composer.json
│   │           └── psalm/
│   │               └── composer.json
│   ├── jaeger/
│   │   └── phpquery-single/
│   │       ├── README.md
│   │       ├── composer.json
│   │       └── phpQuery.php
│   ├── league/
│   │   ├── flysystem/
│   │   │   ├── CODE_OF_CONDUCT.md
│   │   │   ├── LICENSE
│   │   │   ├── SECURITY.md
│   │   │   ├── composer.json
│   │   │   ├── deprecations.md
│   │   │   └── src/
│   │   │       ├── Adapter/
│   │   │       │   ├── AbstractAdapter.php
│   │   │       │   ├── AbstractFtpAdapter.php
│   │   │       │   ├── CanOverwriteFiles.php
│   │   │       │   ├── Ftp.php
│   │   │       │   ├── Ftpd.php
│   │   │       │   ├── Local.php
│   │   │       │   ├── NullAdapter.php
│   │   │       │   ├── Polyfill/
│   │   │       │   │   ├── NotSupportingVisibilityTrait.php
│   │   │       │   │   ├── StreamedCopyTrait.php
│   │   │       │   │   ├── StreamedReadingTrait.php
│   │   │       │   │   ├── StreamedTrait.php
│   │   │       │   │   └── StreamedWritingTrait.php
│   │   │       │   └── SynologyFtp.php
│   │   │       ├── AdapterInterface.php
│   │   │       ├── Config.php
│   │   │       ├── ConfigAwareTrait.php
│   │   │       ├── ConnectionErrorException.php
│   │   │       ├── ConnectionRuntimeException.php
│   │   │       ├── CorruptedPathDetected.php
│   │   │       ├── Directory.php
│   │   │       ├── Exception.php
│   │   │       ├── File.php
│   │   │       ├── FileExistsException.php
│   │   │       ├── FileNotFoundException.php
│   │   │       ├── Filesystem.php
│   │   │       ├── FilesystemException.php
│   │   │       ├── FilesystemInterface.php
│   │   │       ├── FilesystemNotFoundException.php
│   │   │       ├── Handler.php
│   │   │       ├── InvalidRootException.php
│   │   │       ├── MountManager.php
│   │   │       ├── NotSupportedException.php
│   │   │       ├── Plugin/
│   │   │       │   ├── AbstractPlugin.php
│   │   │       │   ├── EmptyDir.php
│   │   │       │   ├── ForcedCopy.php
│   │   │       │   ├── ForcedRename.php
│   │   │       │   ├── GetWithMetadata.php
│   │   │       │   ├── ListFiles.php
│   │   │       │   ├── ListPaths.php
│   │   │       │   ├── ListWith.php
│   │   │       │   ├── PluggableTrait.php
│   │   │       │   └── PluginNotFoundException.php
│   │   │       ├── PluginInterface.php
│   │   │       ├── ReadInterface.php
│   │   │       ├── RootViolationException.php
│   │   │       ├── SafeStorage.php
│   │   │       ├── UnreadableFileException.php
│   │   │       ├── Util/
│   │   │       │   ├── ContentListingFormatter.php
│   │   │       │   ├── MimeType.php
│   │   │       │   └── StreamHasher.php
│   │   │       └── Util.php
│   │   └── mime-type-detection/
│   │       ├── CHANGELOG.md
│   │       ├── LICENSE
│   │       ├── composer.json
│   │       └── src/
│   │           ├── EmptyExtensionToMimeTypeMap.php
│   │           ├── ExtensionMimeTypeDetector.php
│   │           ├── ExtensionToMimeTypeMap.php
│   │           ├── FinfoMimeTypeDetector.php
│   │           ├── GeneratedExtensionToMimeTypeMap.php
│   │           ├── MimeTypeDetector.php
│   │           └── OverridingExtensionToMimeTypeMap.php
│   ├── psr/
│   │   ├── cache/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE.txt
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── CacheException.php
│   │   │       ├── CacheItemInterface.php
│   │   │       ├── CacheItemPoolInterface.php
│   │   │       └── InvalidArgumentException.php
│   │   ├── http-client/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── ClientExceptionInterface.php
│   │   │       ├── ClientInterface.php
│   │   │       ├── NetworkExceptionInterface.php
│   │   │       └── RequestExceptionInterface.php
│   │   ├── http-message/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── MessageInterface.php
│   │   │       ├── RequestInterface.php
│   │   │       ├── ResponseInterface.php
│   │   │       ├── ServerRequestInterface.php
│   │   │       ├── StreamInterface.php
│   │   │       ├── UploadedFileInterface.php
│   │   │       └── UriInterface.php
│   │   ├── log/
│   │   │   ├── LICENSE
│   │   │   ├── Psr/
│   │   │   │   └── Log/
│   │   │   │       ├── AbstractLogger.php
│   │   │   │       ├── InvalidArgumentException.php
│   │   │   │       ├── LogLevel.php
│   │   │   │       ├── LoggerAwareInterface.php
│   │   │   │       ├── LoggerAwareTrait.php
│   │   │   │       ├── LoggerInterface.php
│   │   │   │       ├── LoggerTrait.php
│   │   │   │       ├── NullLogger.php
│   │   │   │       └── Test/
│   │   │   │           ├── DummyTest.php
│   │   │   │           ├── LoggerInterfaceTest.php
│   │   │   │           └── TestLogger.php
│   │   │   ├── README.md
│   │   │   └── composer.json
│   │   └── simple-cache/
│   │       ├── .editorconfig
│   │       ├── LICENSE.md
│   │       ├── README.md
│   │       ├── composer.json
│   │       └── src/
│   │           ├── CacheException.php
│   │           ├── CacheInterface.php
│   │           └── InvalidArgumentException.php
│   ├── ralouphie/
│   │   └── getallheaders/
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── composer.json
│   │       └── src/
│   │           └── getallheaders.php
│   ├── symfony/
│   │   ├── polyfill-mbstring/
│   │   │   ├── LICENSE
│   │   │   ├── Mbstring.php
│   │   │   ├── README.md
│   │   │   ├── Resources/
│   │   │   │   └── unidata/
│   │   │   │       ├── lowerCase.php
│   │   │   │       ├── titleCaseRegexp.php
│   │   │   │       └── upperCase.php
│   │   │   ├── bootstrap.php
│   │   │   ├── bootstrap80.php
│   │   │   └── composer.json
│   │   ├── polyfill-php80/
│   │   │   ├── LICENSE
│   │   │   ├── Php80.php
│   │   │   ├── PhpToken.php
│   │   │   ├── README.md
│   │   │   ├── Resources/
│   │   │   │   └── stubs/
│   │   │   │       ├── Attribute.php
│   │   │   │       ├── PhpToken.php
│   │   │   │       ├── Stringable.php
│   │   │   │       ├── UnhandledMatchError.php
│   │   │   │       └── ValueError.php
│   │   │   ├── bootstrap.php
│   │   │   └── composer.json
│   │   ├── process/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── Exception/
│   │   │   │   ├── ExceptionInterface.php
│   │   │   │   ├── InvalidArgumentException.php
│   │   │   │   ├── LogicException.php
│   │   │   │   ├── ProcessFailedException.php
│   │   │   │   ├── ProcessSignaledException.php
│   │   │   │   ├── ProcessTimedOutException.php
│   │   │   │   └── RuntimeException.php
│   │   │   ├── ExecutableFinder.php
│   │   │   ├── InputStream.php
│   │   │   ├── LICENSE
│   │   │   ├── PhpExecutableFinder.php
│   │   │   ├── PhpProcess.php
│   │   │   ├── Pipes/
│   │   │   │   ├── AbstractPipes.php
│   │   │   │   ├── PipesInterface.php
│   │   │   │   ├── UnixPipes.php
│   │   │   │   └── WindowsPipes.php
│   │   │   ├── Process.php
│   │   │   ├── ProcessUtils.php
│   │   │   ├── README.md
│   │   │   └── composer.json
│   │   └── var-dumper/
│   │       ├── CHANGELOG.md
│   │       ├── Caster/
│   │       │   ├── AmqpCaster.php
│   │       │   ├── ArgsStub.php
│   │       │   ├── Caster.php
│   │       │   ├── ClassStub.php
│   │       │   ├── ConstStub.php
│   │       │   ├── CutArrayStub.php
│   │       │   ├── CutStub.php
│   │       │   ├── DOMCaster.php
│   │       │   ├── DateCaster.php
│   │       │   ├── DoctrineCaster.php
│   │       │   ├── DsCaster.php
│   │       │   ├── DsPairStub.php
│   │       │   ├── EnumStub.php
│   │       │   ├── ExceptionCaster.php
│   │       │   ├── FiberCaster.php
│   │       │   ├── FrameStub.php
│   │       │   ├── GmpCaster.php
│   │       │   ├── ImagineCaster.php
│   │       │   ├── ImgStub.php
│   │       │   ├── IntlCaster.php
│   │       │   ├── LinkStub.php
│   │       │   ├── MemcachedCaster.php
│   │       │   ├── MysqliCaster.php
│   │       │   ├── PdoCaster.php
│   │       │   ├── PgSqlCaster.php
│   │       │   ├── ProxyManagerCaster.php
│   │       │   ├── RdKafkaCaster.php
│   │       │   ├── RedisCaster.php
│   │       │   ├── ReflectionCaster.php
│   │       │   ├── ResourceCaster.php
│   │       │   ├── SplCaster.php
│   │       │   ├── StubCaster.php
│   │       │   ├── SymfonyCaster.php
│   │       │   ├── TraceStub.php
│   │       │   ├── UuidCaster.php
│   │       │   ├── XmlReaderCaster.php
│   │       │   └── XmlResourceCaster.php
│   │       ├── Cloner/
│   │       │   ├── AbstractCloner.php
│   │       │   ├── ClonerInterface.php
│   │       │   ├── Cursor.php
│   │       │   ├── Data.php
│   │       │   ├── DumperInterface.php
│   │       │   ├── Stub.php
│   │       │   └── VarCloner.php
│   │       ├── Command/
│   │       │   ├── Descriptor/
│   │       │   │   ├── CliDescriptor.php
│   │       │   │   ├── DumpDescriptorInterface.php
│   │       │   │   └── HtmlDescriptor.php
│   │       │   └── ServerDumpCommand.php
│   │       ├── Dumper/
│   │       │   ├── AbstractDumper.php
│   │       │   ├── CliDumper.php
│   │       │   ├── ContextProvider/
│   │       │   │   ├── CliContextProvider.php
│   │       │   │   ├── ContextProviderInterface.php
│   │       │   │   ├── RequestContextProvider.php
│   │       │   │   └── SourceContextProvider.php
│   │       │   ├── ContextualizedDumper.php
│   │       │   ├── DataDumperInterface.php
│   │       │   ├── HtmlDumper.php
│   │       │   └── ServerDumper.php
│   │       ├── Exception/
│   │       │   └── ThrowingCasterException.php
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── bin/
│   │       │   │   └── var-dump-server
│   │       │   ├── css/
│   │       │   │   └── htmlDescriptor.css
│   │       │   ├── functions/
│   │       │   │   └── dump.php
│   │       │   └── js/
│   │       │       └── htmlDescriptor.js
│   │       ├── Server/
│   │       │   ├── Connection.php
│   │       │   └── DumpServer.php
│   │       ├── Test/
│   │       │   └── VarDumperTestTrait.php
│   │       ├── VarDumper.php
│   │       └── composer.json
│   ├── tightenco/
│   │   └── collect/
│   │       ├── .github/
│   │       │   └── workflows/
│   │       │       └── run-tests.yml
│   │       ├── branch-commit-push.sh
│   │       ├── composer.json
│   │       └── src/
│   │           └── Collect/
│   │               ├── Contracts/
│   │               │   └── Support/
│   │               │       ├── Arrayable.php
│   │               │       ├── CanBeEscapedWhenCastToString.php
│   │               │       ├── Htmlable.php
│   │               │       └── Jsonable.php
│   │               └── Support/
│   │                   ├── Arr.php
│   │                   ├── Collection.php
│   │                   ├── Enumerable.php
│   │                   ├── HigherOrderCollectionProxy.php
│   │                   ├── HigherOrderWhenProxy.php
│   │                   ├── LazyCollection.php
│   │                   ├── Traits/
│   │                   │   ├── EnumeratesValues.php
│   │                   │   ├── Macroable.php
│   │                   │   └── Tappable.php
│   │                   ├── alias.php
│   │                   └── helpers.php
│   └── vierbergenlars/
│       └── php-semver/
│           ├── .travis.yml
│           ├── README.md
│           ├── bin/
│           │   ├── semver
│           │   └── update-versions
│           ├── composer.json
│           ├── definitions
│           ├── license.md
│           ├── phpunit.xml.dist
│           ├── src/
│           │   └── vierbergenlars/
│           │       ├── LibJs/
│           │       │   ├── JObject.php
│           │       │   ├── JSArray.php
│           │       │   ├── JString.php
│           │       │   ├── RegExp.php
│           │       │   └── Util.php
│           │       └── SemVer/
│           │           ├── SemVerException.php
│           │           ├── expression.php
│           │           ├── internal.php
│           │           └── version.php
│           └── tests/
│               ├── RegressionTest.php
│               ├── SemVerTest.php
│               └── VersionTest.php
└── views/
    ├── csrf.php
    ├── frc-spider.php
    ├── release-type.php
    └── todo.html

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
/node_modules
.DS_Store


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 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 <https://www.gnu.org/licenses/>.

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:

    <program>  Copyright (C) <year>  <name of author>
    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
<https://www.gnu.org/licenses/>.

  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
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: README.md
================================================
<p align="center">
  <img width="150" src="logo.png" alt="胖鼠采集">
  <br>
  <br>
</p>

### <a href="https://www.fatrat.cn">胖鼠采集</a> WordPress优秀开源采集插件
- 微信公众号文章采集 - 强大的Jquery可以处理各种版权信息, 纵享丝滑.
- 微信公众号历史文章采集 - 采集公众号所有的历史文章.
- 登陆网站采集 - 采集网站登录后的内容.
- 简书文章采集 - 强大的Jquery可以处理内容各种图片, 柔顺到底.
- 知乎问答采集 - 强大的Jquery可以处理各种你不想要的东西, 一键爽歪歪.
- (独家主打) 列表采集,历史采集 <a href="https://www.fatrat.cn/docs/v2/list-paging-collection" target="_blank">视频文字教程</a>- 只需轻轻一点. 数不清的文章就来了.
- (独家主打) 详情页面文章采集 - 任何网站十秒搞定
- (独家主打) <a href="https://www.fatrat.cn/docs/v2/list-paging-collection" target="_blank">分页爬取</a> - 历史数据, 也不放过. 一网打尽
- (胖鼠主打) 自动采集 - 一键启动不放过每一份数据.
- (胖鼠主打) 自动发布 - 您省心省力好帮手.
- (独家主打) 调试模式 - 新建规则好帮手, 采集结果好伙伴.
- (独家主打) 体验例子 - 一键体验胖鼠.
- (主打主打) 文章自动添加, <a href="https://www.fatrat.cn/docs/v2/dynamic-content" target="_blank">动态内容</a>, <a href="https://www.fatrat.cn/docs/v2/auto-tags" target="_blank">自动标签</a>, 标签内链, 优化SEO.
- (胖鼠采集) 文章滤重 - 支持.
- (胖鼠采集) 自动特色图片 - 支持.
- (胖鼠采集) 采集图片加入媒体库 - 支持.
- (胖鼠采集) 数据处理 - 完美支持Html Jquery
- (胖鼠采集) 内容关键字过滤替换 伪原创 - 支持.
- (胖鼠采集) 自定义采集任何可见网站 - 完美支持.
- (胖鼠采集) 自定义文章图片链接类型 - 支持.
- (重磅重磅) 胖鼠采集完全基于Wordpress, 安装即用, 开源作品
- (声明声明) 如你的PHP版本小于PHP71, 请移步胖鼠采集的Github下载使用胖鼠v5版本 分支名: based_php_5.6
- (声明声明) 胖鼠采集初衷为参考学习交流; 请大家遵纪守法. 抵制违法犯罪, 作者不承担任何法律风险.
- (声明声明) 胖鼠采集开源可供您查阅代码, 或者二次开发使用供您使用, 但不可修改源码后用于商业行为.
- ...

## 安装
- 在插件中搜索 <strong><a href="https://wordpress.org/plugins/fat-rat-collect/">胖鼠采集</a></strong> 安装即可
- 将插件文件上传到/wp-content/plugins/目录 即可
- PHP版本小于PHP71, 请移步胖鼠采集的Github下载使用胖鼠v5版本 分支名: based_php_5.6
- 推荐环境
- PHP7.2 或 PHP7.3
- MYSQL5.7 或 MYSQL5.6

## 系统分为五大块.
- 胖鼠强大的爬虫中心
- 支撑胖鼠的配置中心
- 发布文章的数据桶
- 调试中心debugging
- 工具箱特色小工具

## 作者留言
- 安装后可一键导入演示例子, 大家可以照葫芦画瓢.
- 胖鼠采集 1群: 454049736(已满)
- 胖鼠采集 2群: 846069514(已满)
- 胖鼠采集 3群: (已满)
- 胖鼠采集 4群: waxx-xxswnb 添加胖鼠微信
- 疑问:为什么会上传vendor目录,答:wordpress插件是不能composer install

## Star History

<a href="https://www.star-history.com/?repos=KitePig%2FFatRat-Collect&type=date&legend=top-left">
 <picture>
   <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=KitePig/FatRat-Collect&type=date&theme=dark&legend=top-left" />
   <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=KitePig/FatRat-Collect&type=date&legend=top-left" />
   <img alt="Star History Chart" src="https://api.star-history.com/chart?repos=KitePig/FatRat-Collect&type=date&legend=top-left" />
 </picture>
</a>


================================================
FILE: composer.json
================================================
{
    "require": {
        "jaeger/querylist": "^4.2",
        "jaeger/querylist-puppeteer": "^4.0",
        "tightenco/collect": "8.78.0",
        "ext-json": "*"
    },
    "require-dev": {
        "symfony/var-dumper": "^5.0"
    },
    "autoload": {
        "files": [
            "src/Helpers/helpers.php",
            "src/Helpers/helpers2.php",
            "src/Controller/TaskController.php",
            "includes/fatrat-apierror.php",
            "includes/fatrat-spider.php",
            "includes/fatrat-options.php",
            "includes/fatrat-options-add-edit.php",
            "includes/fatrat-data.php",
            "includes/fatrat-data-detail.php",
            "includes/fatrat-validation.php",
            "includes/fatrat-kit.php",
            "includes/fatrat-debugging.php"
        ]
    }
}


================================================
FILE: fatratcollect.php
================================================
<?php
/**
 * Plugin Name: Fat Rat Collect
 * Plugin URI: https://www.fatrat.cn
 * Description: 胖鼠采集(Fat Rat Collect) 是一款可以帮助你批量采集文章数据的开源插件,采集含括微信采集、公众号历史采集、登陆网站采集、简书采集、知乎采集、列表采集、详情采集。完美支持自动采集、自动发布文章。图片本地化、关键字替换、自动标签、动态内容、等其他黑科技。是您建站好帮手!如果你还会一点Html JQuery知识。那就太棒了。
 * Version: 2.7.5
 * Author: Fat Rat
 * Author URI: https://www.fatrat.cn/about
 * Disclaimer: Use at your own risk. No warranty expressed or implied is provided.
 * Text Domain: fat-rat-collect
 * License: GPL3
 */

// If this file is called directly, abort.
if (!defined('WPINC')) {
    die;
}

global $frc_db_version;
$frc_db_version = '2.7.1';

/**
 * Fire up Composer's autoloader
 */
require (__DIR__ . '/vendor/autoload.php');

/**
 * Install
 */
function frc_plugin_install(){
    global $wpdb;
    global $frc_db_version;

    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

    $table_post      = $wpdb->prefix . 'frc_post';
    $table_options   = $wpdb->prefix . 'frc_options';
    $charset_collate = $wpdb->get_charset_collate();

    $sql =
        "CREATE TABLE IF NOT EXISTS $table_options(
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `collect_name` varchar(30) NOT NULL DEFAULT '',
          `collect_describe` varchar(200) NOT NULL DEFAULT '',
          `collect_type` varchar(20) NOT NULL DEFAULT '',
          `collect_list_url` varchar(191) NOT NULL DEFAULT '',
          `collect_list_url_paging` varchar(191) NOT NULL DEFAULT '',
          `collect_list_range` varchar(191) NOT NULL DEFAULT '',
          `collect_list_rules` varchar(1000) NOT NULL DEFAULT '',
          `collect_content_range` varchar(191) NOT NULL DEFAULT '',
          `collect_content_rules` varchar(1000) NOT NULL DEFAULT '',
          `collect_charset` varchar(20) NOT NULL DEFAULT 'utf-8',
          `collect_cookie` varchar(5000) NOT NULL DEFAULT '',
          `collect_image_download` tinyint(10) NOT NULL DEFAULT '1',
          `collect_image_path` tinyint(2) NOT NULL DEFAULT '1',
          `collect_image_attribute` varchar(20) NOT NULL DEFAULT 'src',
          `collect_rendering` tinyint(2) NOT NULL DEFAULT '1',
          `collect_remove_head` tinyint(2) NOT NULL DEFAULT '1',
          `collect_auto_collect` tinyint(2) NOT NULL DEFAULT '2',
          `collect_auto_release` tinyint(2) NOT NULL DEFAULT '2',
          `collect_release` varchar(191) NOT NULL DEFAULT '{}',
          `collect_keywords_replace_rule` mediumtext NOT NULL,
          `collect_custom_content` mediumtext NOT NULL,
          `collect_keywords` text NOT NULL DEFAULT '',
          `created_at` timestamp NULL DEFAULT NULL,
          `updated_at` timestamp NULL DEFAULT NULL,
          PRIMARY KEY (`id`)
        )	$charset_collate; ";
    dbDelta( $sql );

    $sql =
        "CREATE TABLE IF NOT EXISTS $table_post(
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `option_id` int(11) NOT NULL,
            `status` tinyint(5) NOT NULL DEFAULT '1',
            `title` varchar(120) NOT NULL DEFAULT '',
            `cover` varchar(191) NOT NULL DEFAULT '',
            `content` mediumtext NOT NULL,
            `link` varchar(191) NOT NULL DEFAULT '',
            `post_id` int(11) NOT NULL DEFAULT '0',
            `message` varchar(191) NOT NULL DEFAULT '',
            `created_at` timestamp NULL DEFAULT NULL,
            `updated_at` timestamp NULL DEFAULT NULL,
            PRIMARY KEY (`id`),
            KEY `option_id` (`option_id`),
            KEY `status` (`status`),
            UNIQUE KEY `link` (`link`)
        )	$charset_collate; ";
    dbDelta( $sql );

    add_option( 'frc_db_version', $frc_db_version );
    add_option( 'frc_install_time', time() );
}
register_activation_hook( __FILE__, 'frc_plugin_install' );

/**
 * Update
 */
function frc_plugin_update() {
    global $frc_db_version;

    if ( get_option( 'frc_db_version' ) != $frc_db_version ) {
        global $wpdb;
        $wpdb->show_errors();

        frcAddColumn('collect_keywords', 'text NOT NULL DEFAULT "" AFTER `collect_custom_content`', 'option');
        frcChangeColumn('MODIFY COLUMN `collect_list_rules` varchar(1000) not null default ""','option');
        frcChangeColumn('MODIFY COLUMN `collect_content_rules` varchar(1000) not null default ""','option');
        frcAddColumn('collect_cookie', 'varchar(5000) NOT NULL DEFAULT "" AFTER `collect_charset`', 'option');
        if (!get_option('frc_mysql_upgrade')){
            $former_table_options = $wpdb->prefix . 'fr_options';
            $res = $wpdb->get_results("SHOW TABLES LIKE '%{$former_table_options}%'");
            if (!empty($res)){
                update_option('frc_mysql_upgrade', '1');
                return ['code' => FRC_ApiError::SUCCESS, 'msg' => '配置表升级完成.'];
            } else {
                $former_table_post = $wpdb->prefix . 'fr_post';
                $res = $wpdb->get_results("SHOW TABLES LIKE '%{$former_table_post}%'");
                if (!empty($res)){
                    add_option('frc_mysql_upgrade', '2');
                } else {
                    add_option('frc_mysql_upgrade', 'upgrade complete');
                }
            }

            $config = json_encode(['switch' => 'shutdown', 'created_at' => current_time('mysql'), 'updated_at' => current_time('mysql')]);
            if (get_option(FRC_Validation::FRC_VALIDATION_FEATURED_PICTURE)){
                update_option(FRC_Validation::FRC_VALIDATION_FEATURED_PICTURE, $config);
            }
            if (get_option(FRC_Validation::FRC_VALIDATION_DYNAMIC_FIELDS)){
                update_option(FRC_Validation::FRC_VALIDATION_DYNAMIC_FIELDS, $config);
            }
            if (get_option(FRC_Validation::FRC_VALIDATION_AUTO_TAGS)){
                update_option(FRC_Validation::FRC_VALIDATION_AUTO_TAGS, $config);
            }
        }

        frc_plugin_install();
    }

    update_option('frc_db_version', $frc_db_version);
}
add_action( 'plugins_loaded', 'frc_plugin_update' );

/**
 * Style && Script
 */
function frc_loading_assets( $hook ) {
    global $frc_db_version;
    $allowed_pages = array(
        'frc-collect',
        'frc-spider',
        'frc-options',
        'frc-data',
        'frc-options-add-edit',
        'frc-kit',
        'frc-data-detail',
        'frc-debugging'
    );

    if (in_array(strstr($hook,"frc-"), $allowed_pages)) {
        // css
        wp_register_style('fat-rat-bootstrap-css', plugins_url('public/css/bootstrap.min.css', __FILE__));
        wp_enqueue_style('fat-rat-bootstrap-css');
        wp_register_style('fat-rat-css', plugins_url('public/css/fatrat.css', __FILE__));
        wp_enqueue_style('fat-rat-css');

        // js
        wp_register_script('fat-rat-bootstrap-js', plugins_url('public/js/bootstrap.min.js', __FILE__));
        wp_enqueue_script('fat-rat-bootstrap-js');
        wp_register_script('fat-rat-js', plugins_url('public/js/fatrat.js', __FILE__), array('jquery'), $frc_db_version, true);
        wp_enqueue_script('fat-rat-js');
    }
}
add_action( 'admin_enqueue_scripts', 'frc_loading_assets' );

/**
 * Menu
 */
function frc_loading_menu()
{
    add_menu_page(
        __('胖鼠采集', 'Fat Rat Collect'),
        __('胖鼠采集', 'Fat Rat Collect'),
        'manage_options',
        'frc-collect',
        'frc_spider',
        plugins_url('images/', __FILE__) . 'fat-rat.png'
    );

    add_submenu_page(
        'frc-collect',
        __('采集中心', 'Fat Rat Collect'),
        __('采集中心', 'Fat Rat Collect'),
        'manage_options',
        'frc-spider',
        'frc_spider'
    );

    add_submenu_page(
        'frc-collect',
        __('配置中心', 'Fat Rat Collect'),
        __('配置中心', 'Fat Rat Collect'),
        'manage_options',
        'frc-options',
        'frc_options'
    );

    add_submenu_page(
        'frc-collect',
        __('数据桶中心', 'Fat Rat Collect'),
        __('数据桶中心', 'Fat Rat Collect'),
        'manage_options',
        'frc-data',
        'frc_data_list'
    );

    add_submenu_page(
        'frc-collect',
        __('添加/修改(配置)', 'Fat Rat Collect'),
        __('添加/修改(配置)', 'Fat Rat Collect'),
        'manage_options',
        'frc-options-add-edit',
        'frc_options_add_edit'
    );

    add_submenu_page(
        'frc-collect',
        __('Debugging', 'Fat Rat Collect'),
        __('Debugging', 'Fat Rat Collect'),
        'manage_options',
        'frc-debugging',
        'frc_debugging'
    );

    add_submenu_page(
        '',
        __('数据列表', 'Fat Rat Collect'),
        __('数据列表', 'Fat Rat Collect'),
        'manage_options',
        'frc-data-detail',
        'frc_data_detail'
    );

    add_submenu_page(
        'frc-collect',
        __('胖鼠工具箱', 'Fat Rat Collect'),
        __('胖鼠工具箱', 'Fat Rat Collect'),
        'manage_options',
        'frc-kit',
        'frc_kit'
    );

//    add_submenu_page(
//        'frc-collect',
//        __('任务中心', 'Fat Rat Collect'),
//        __('任务中心', 'Fat Rat Collect'),
//        'manage_options',
//        'frc-tasks',
//        function (){
//            (new TaskController())->view();
//        }
//    );

    remove_submenu_page('frc-collect', 'frc-collect');
//    remove_submenu_page('frc-collect', 'frc-data-detail');
}
add_action('admin_menu', 'frc_loading_menu');

if (!function_exists('frc_write_log')){
    function frc_write_log($string, $file_name = '')
    {
        if (is_array($string)){
            $string = json_encode($string);
        }
        $time = current_time('timestamp');
        $file_name = 'frc.log'.'-'.date('Ymd').($file_name!=''?'-'.$file_name:'');
        $content = sprintf('[%s] %s '."\n", date('Y-m-d H:i:s', $time), $string);
        file_put_contents(plugin_dir_path( __FILE__ ).'logs/'.$file_name, $content,FILE_APPEND);
    }
}
/**
 * Require ..
 * 开发者您好,您可修改源码自行使用
 * 但请不要修改胖鼠采集代码后用于其他组织/商业行为
 */
//require_once( plugin_dir_path( __FILE__ ) . 'includes/fatrat-apierror.php' );
//require_once( plugin_dir_path( __FILE__ ) . 'includes/fatrat-spider.php' );
//require_once( plugin_dir_path( __FILE__ ) . 'includes/fatrat-options.php' );
//require_once( plugin_dir_path( __FILE__ ) . 'includes/fatrat-options-add-edit.php' );
//require_once( plugin_dir_path( __FILE__ ) . 'includes/fatrat-data.php' );
//require_once( plugin_dir_path( __FILE__ ) . 'includes/fatrat-data-detail.php' );
//require_once( plugin_dir_path( __FILE__ ) . 'includes/fatrat-validation.php' );
//require_once( plugin_dir_path( __FILE__ ) . 'includes/fatrat-kit.php' );
//require_once( plugin_dir_path( __FILE__ ) . 'includes/fatrat-debugging.php' );

add_action( 'wp_ajax_frc_interface', function (){
    $s_time = microtime(true);
    if(version_compare(PHP_VERSION,'7.1.0', '<')){
        wp_send_json(['code' => 5003, 'msg' => '鼠友你好, 胖鼠采集目前要求php版本 > 7.1, 检测到你当前PHP版本为'.phpversion().'. 建议升级php版本, 或者请去胖鼠采集的Github下载使用胖鼠v5.6版本 分支名: based_php_5.6!']);
        wp_die();
    }
    $interface_type = frc_sanitize_text('interface_type', null);
    if (empty($interface_type)){
        wp_send_json(['code' => 5004, 'msg' => 'interface type not found error!']);
        wp_die();
    }

    $action_func = frc_sanitize_text('action_func');
    if (empty($action_func)){
        wp_send_json(['code' => 5001, 'msg' => 'Parameter error!']);
        wp_die();
    }

    if(get_option('fat_rat_collect_api_code') === "4"."03"){
        (new FRC_Validation())->validation_correction();
        (new FRC_Validation())->report_permissions();
        sleep(5);
        wp_send_json(['code' => 5005, 'msg' => FRC_Validation::FRC_HINT_K]);
        wp_die();
    }

    $action_csrf = frc_sanitize_text('csrf');
	if (empty($action_csrf)){
		wp_send_json(['code' => 5007, 'msg' => '安全校验失败!请强制刷新页面缓存,如异常持续请联系作者。']);
		wp_die();
	}
    if(!current_user_can( 'manage_options' ) || !wp_verify_nonce($action_csrf)){
        wp_send_json(['code' => 5006, 'msg' => FRC_Validation::FRC_HINT_M]);
        wp_die();
    }

    $result = null;
    if ($interface_type == '1'){
        $action_func = 'grab_'.$action_func;
        $model = new FRC_Spider();
    } elseif($interface_type == '2'){
        $action_func = 'interface_'.$action_func;
        $model = new FRC_Options();
    } elseif($interface_type == '3'){
        $action_func = 'data_'.$action_func;
        $model = new FRC_Data();
    } elseif($interface_type == '4'){
        $action_func = 'validation_'.$action_func;
        $model = new FRC_Validation();
    } else {
        $model = null;
    }

    method_exists($model, $action_func) && $result = $model->$action_func();
    if ($result != null){
        $result['cost'] = round(microtime(true ) - $s_time, 2).'秒';
        wp_send_json($result);
        wp_die();
    }
    wp_send_json(['code' => 5002, 'result' => $result, 'msg' => 'Action there is no func! or Func is error!']);
    wp_die();
});

/**
 * add cron operating time
 * @return array
 */
function frc_more_schedules() {
    return array(
        'fifteenminutes' => array('interval' => 900, 'display' => '每隔十五分钟'),
        'halfhour' => array('interval' => 1800, 'display' => '每隔半小时'),
        'twohourly' => array('interval' => 7200, 'display' => '每隔两小时'),
        'threehours' => array('interval' => 10800, 'display' => '每隔三小时'),
        'fourhourly' => array('interval' => 14400, 'display' => '每隔四小时'),
        'eighthourly' => array('interval' => 28800, 'display' => '每隔八小时'),
    );
}
add_filter('cron_schedules', 'frc_more_schedules');

function frc_spider_timing_task()
{
    return (new FRC_Spider())->timing_spider();
}

if ($frc_cron_spider = get_option('frc_cron_spider')){
    if (!wp_next_scheduled('frc_cron_spider_hook')) {
        wp_schedule_event(time(), $frc_cron_spider, 'frc_cron_spider_hook');
    }
    add_action('frc_cron_spider_hook', 'frc_spider_timing_task');
} else {
    wp_clear_scheduled_hook('frc_cron_spider_hook');
}

if ($frc_cron_release = get_option('frc_cron_release')){
    if (!wp_next_scheduled('frc_cron_release_hook')) {
        wp_schedule_event(time(), $frc_cron_release, 'frc_cron_release_hook');
    }

    add_action('frc_cron_release_hook', 'frc_cron_release_task');
    function frc_cron_release_task()
    {
        return (new FRC_Data())->data_automatic_release();
    }
} else {
    wp_clear_scheduled_hook('frc_cron_release_hook');
}

/**
 * Uninstall
 */
function frc_plugin_uninstall() {
    global $wpdb;
    $table_o_post     = $wpdb->prefix . 'fr_post';
    $table_o_options  = $wpdb->prefix . 'fr_options';
    $wpdb->query( "DROP TABLE IF EXISTS $table_o_options" );
    $wpdb->query( "DROP TABLE IF EXISTS $table_o_post" );

    delete_option( 'frc_db_version' );
    delete_option( 'frc_mysql_upgrade_progress' );

    foreach (FRC_Validation::FRC_VALIDATION_ABILITY_MAP as $value){
        delete_option( $value[0] );
    }

    $table_post     = $wpdb->prefix . 'frc_post';
    $table_options  = $wpdb->prefix . 'frc_options';

    $wpdb->query( "DROP TABLE IF EXISTS $table_options" );
    $wpdb->query( "DROP TABLE IF EXISTS $table_post" );

}
register_uninstall_hook(__FILE__, 'frc_plugin_uninstall');

================================================
FILE: includes/fatrat-apierror.php
================================================
<?php
/**
 * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.
 * 胖鼠采集 WordPress最好用的采集插件.
 * 如果你觉得这个项目还不错.可以去Github上 Star 关注我.
 * 您可使用胖鼠采集自行二次开发满足您的个性化需求.
 * 请不要Copy, Rename. OR 修改源代码进行售卖获利.
 * Github: https://github.com/fbtopcn/fatratcollect
 * @Author: fbtopcn
 * @CreateTime: 2018年12月30日 02:24
 */

/**
 * Class FRC_ApiError
 * 有空再整把
 */
class FRC_ApiError
{
    // TODO 只用了 SUCCESS FAIL

    /**
     * 业务常量
     */
    const BUTTON_DISABLED     = ['微信', '简书', '知乎'];
    const FRC_TIPS     = [
        '小提示: 写采集规则的时候, 如果页面最后一个div是广告,你可以这么写 -div:last 即可删除内容中最后一个 div 删除第一个 -div:first 同样适用于其他标签哦 =_=!',
        '小提示: 列表采集 是通过列表页拿到一批详情的地址, 然后批量采集详情页面数据。详情采集是直接采集文章详情页面喔 =_=!',
        '小提示: 大家可在胖鼠Q群联系作者, 提出更好的胖鼠改进计划, 好思路有奖喔 =_=!',
        '小提示: 规则配置页采集区域? 是指你具体要采集这个页面的哪一块内容, 你要采集的内容必须包含在采集区域内哦 =_=!',
        '小提示: 规则详情配置为什么没有采集地址这一栏? 答:因为详情配置是单篇文章配置, 把采集地址拎出来更有效帮助你批量采集哦 =_=!',
        '小提示: 使用DEBUG的时候, 大家一定要把 Link Title Content 三个字段全部debug成功之后再保存哦, 有助于提高成功率 =_=!',
    ];

    /**
     * 基本错误类型
     */
    const SUCCESS       = 200;
    const FAIL          = 0;
    const ERR_PARAM     = -100;
    const ERR_TOKEN     = -180;

    /**
     * Validation
     * @var array
     */
    const CHECK_SERVER_FAIL = -4000;
    const KEYWORD_CHECK_FAIL = -4001;
    const NO_PERMISSION = -4002;


    private static $_errMsg = [
        // 基础错误
        self::SUCCESS       => ['成功', 'success'],
        self::FAIL          => ['失败', 'fail'],
        self::ERR_PARAM     => ['参数错误', 'parameter is error'],
        self::ERR_TOKEN     => ['Token错误', 'token error'],

        // Validation
        self::CHECK_SERVER_FAIL => ['验证服务器异常', 'check server is error'],
        self::KEYWORD_CHECK_FAIL => ['口令错误', 'keyword is error'],
        self::NO_PERMISSION => ['没有许可', 'you no permission'],
    ];


    public static function msg($errno, $lang = 'en')
    {
        $lang = 'zh' === $lang ? 0 : 1;
        return self::$_errMsg[$errno][$lang];
    }

}


================================================
FILE: includes/fatrat-data-detail.php
================================================
<?php

/**
 * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.
 * 胖鼠采集 WordPress最好用的采集插件.
 * 如果你觉得这个项目还不错.可以去Github上 Star 关注我.
 * 您可使用胖鼠采集自行二次开发满足您的个性化需求.
 * 请不要Copy, Rename. OR 修改源代码进行售卖获利.
 * Github: https://github.com/fbtopcn/fatratcollect
 * @Author: fbtopcn
 * @CreateTime: 2018年12月30日 02:24
 */

class FRC_Data
{
    protected $wpdb;
    protected $table_post;

    public function __construct()
    {
        global $wpdb;
        $this->wpdb = $wpdb;
        $this->table_post = $wpdb->prefix . 'frc_post';

    }

    public function id($id){
        return $this->wpdb->get_row(
            $this->wpdb->prepare("select * from $this->table_post where `id` =  %d", $id),
            ARRAY_A
        );
    }

    public function getDataByOption($option_id, $count = 1, $sort = 'ASC'){
	    $sort = strtoupper($sort) == 'ASC' ? 'ASC' : 'DESC';
        return $this->wpdb->get_results(
            $this->wpdb->prepare("select * from $this->table_post where `option_id` = %d AND `status` = 2  ORDER BY `id` $sort LIMIT %d", $option_id, $count),
            ARRAY_A
        );
    }

    public function getWaitDataByOption($option_id, $count = 1, $sort = 'ASC'){
        $sort = strtoupper($sort) == 'ASC' ? 'ASC' : 'DESC';
        return $this->wpdb->get_results(
            $this->wpdb->prepare("select * from $this->table_post where `option_id` = %d AND `status` = 1  ORDER BY `id` $sort LIMIT %d", $option_id, $count),
            ARRAY_A
        );
    }



    public function data_paging($page_number = 1, $per_page = 10, $customvar = 'total') {
        $sql = "SELECT * FROM $this->table_post";

        if (!empty($_REQUEST['option_id'])) {
            $sql = $this->wpdb->prepare("$sql where option_id = %d", frc_sanitize_text('option_id'));
        }

        if (in_array($customvar, array('1', '2', '3','4','5'))) {
	        $sql = $this->wpdb->prepare("$sql AND `status` = %d", $customvar);
        }

        if (!empty($_REQUEST['orderby'])) {
	        $by = frc_sanitize_text('orderby');
	        $sort = !empty($_REQUEST['order']) ? frc_sanitize_text('order') : 'ASC';
	        $sort = strtoupper($sort) == 'ASC' ? 'ASC' : 'DESC';
	        $sql = $this->wpdb->prepare("$sql ORDER BY $by $sort");
        } else {
            $sql .= ' ORDER BY id DESC';
        }

	    $sql = $this->wpdb->prepare("$sql LIMIT %d OFFSET %d", (int) $per_page, (int) (($page_number - 1) * $per_page));

        return $this->wpdb->get_results($sql, 'ARRAY_A');
    }


    /**
     * @param string $customvar
     * @return null|string
     */
    public function record_count($customvar = 'total')
    {
        $sql = "SELECT COUNT(*) FROM $this->table_post";

        if (!empty($_REQUEST['option_id'])) {
            $sql = $this->wpdb->prepare("$sql where option_id = %d", frc_sanitize_text('option_id'));
        }

        if (in_array($customvar, array('1', '2', '3','4','5'))) {
            $sql = $this->wpdb->prepare("$sql AND status = %d", $customvar);
        }

        return $this->wpdb->get_var($sql);
    }

	public function update_successful_status( $id, $post )
    {
		return $this->wpdb->update( $this->table_post,
			[ 'post_id' => $post['ID'], 'status' => 3, 'updated_at' => current_time( 'mysql' ) ],
			[ 'id' => $id ], [ '%d', '%d', '%s' ], [ '%d' ]
		);
	}


    /**
     * @param $id
     * @return false|int
     */
    public function delete($id)
    {
        return $this->wpdb->delete(
            $this->table_post, array('id' => $id), array('%d')
        );
    }


    /**
     * @param $option_id
     * @return false|int
     */
    public function delete_by_option($option_id)
    {
        return $this->wpdb->delete(
            $this->table_post, array('option_id' => $option_id), array('%d')
        );
    }


    /**
     * @param $option_id
     * @return array
     */
    public function statistical($option_id){
        $statistical = [];
        $allData = collect($this->wpdb->get_results(
                $this->wpdb->prepare("select id, status, created_at, updated_at from $this->table_post where `option_id` = %d", $option_id)
        ));

        $date = date('Y-m-d 00:00:00', strtotime(current_time('mysql')));
        $statistical['all_count'] = $allData->count();
        $statistical['release_count'] = $allData->where('status', '3')->count();
        $statistical['not_release_count'] = $allData->where('status', '2')->count();
        $statistical['to_day_release'] = $allData->where('updated_at', '>', $date)->where('status', 3)->count();
        $statistical['to_day_collect'] = $allData->where('created_at', '>', $date)->whereIn('status', [2, 3])->count();
        return $statistical;
    }

    public function data_automatic_release(){
        $result = [];
        foreach ((new FRC_Options())->options() as $option){
            $data = $this->getDataByOption($option['id']);
            foreach ($data as $article){
                $re = $this->article_to_storage($article);
                $result[] = $re;
            }
        }

        return $result;
    }


    /**
     * @return array
     */
    public function data_option_publish(){
        $option_id = frc_sanitize_text('option_id', null);
        $count = frc_sanitize_text('count', 1);
        if ($option_id === null) {
            return ['code' => FRC_ApiError::FAIL, 'msg' => 'option error!'];
        }
        $optionModel = new FRC_Options();
        $option = $optionModel->option($option_id);
        if (empty((array)json_decode($option['collect_release']))){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '失败, 请点击进入桶,配置默认发布配置后, 再使用快捷发布.'];
        }

        $data = $this->getDataByOption($option_id, $count);
        foreach ($data as $item){
            $this->article_to_storage($item);
        }

        return ['code' => FRC_ApiError::SUCCESS, 'msg' => '快捷发布完成.'];
    }


    /**
     * @return array
     */
    public function data_publish_article(){
        $release_id = frc_sanitize_text('release_id', null);
        if ($release_id === null) {
            return ['code' => FRC_ApiError::FAIL, 'msg' => '发布的文章ID异常'];
        }

        $article = $this->id($release_id);
        if (empty($article)){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '亲, 文章异常!'];
        }

        return $this->article_to_storage($article);
    }


    /**
     * @return array
     */
    public function data_preview_article(){
        $release_id = frc_sanitize_text('release_id', null);
        if ($release_id === null) {
            return ['code' => FRC_ApiError::FAIL, 'msg' => '发布的文章ID异常'];
        }

        $article = $this->id($release_id);
        if (empty($article)){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '亲, 文章异常!'];
        }

        $result = $this->article_to_storage($article, [
                'post_status' => 'draft'
        ]);

        $result['data']['preview_url'] = get_permalink($result['data']['id']);
        return $result;
    }


    /**
     * @param $article
     * @param array $custom_release_config
     * @return array
     */
    public function article_to_storage($article, $custom_release_config = [])
    {
        if ($article['status'] != 2){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '发布失败, 文章状态不正确', 'data' => $article];
        }

        $optionModel = new FRC_Options();
        $option = $optionModel->option($article['option_id']);

        $release = json_decode($option['collect_release']);
        if (empty($release) || $option['collect_release'] == '{}') {
            return ['code' => FRC_ApiError::FAIL, 'msg' => '请保存发布配置后再发布', 'data' => $option['collect_release']];
        }

        $release_config = [];
        $release_config['post_status'] = $release->status;
        $release_config['post_user'] = $release->user[array_rand($release->user)];
        $release_config['post_category'] = $release->category;

        $release_config['thumbnail'] = $release->thumbnail == 'thumbnail1';
        $release_config['image_download'] = $option['collect_image_download'];
        $release_config['release_type'] = $release->type; //
        $release_config['extension_field'] = $release->extension_field; //

        if (!empty($custom_release_config)){
            foreach ($custom_release_config as $key => $value){
                $release_config[$key] = $value;
            }
        }

        $post = array(
            'post_title' => $article['title'],
            'post_name' => $article['title'],
            'post_content' => $article['content'],
            'post_status' => $release_config['post_status'],
            'post_author' => $release_config['post_user'],
            'post_category' => $release_config['post_category'],
            'tags_input' => '',
            'post_type' => 'post',
        );

        $this->post_merge($post, $release_config);
        if ($post_id = wp_insert_post($post)) {
            $kitModel = new FRC_Kit();
            $kitModel->kit_auto_tags($post_id);
            $kitModel->kit_dynamic_fields($post_id);
            $post = get_post($post_id, ARRAY_A);
            $this->update_successful_status($article['id'], $post);
            $this->update_post_meta($post['ID'], $release_config);
            $this->uploadPicAttachment($post, $release_config);

            return ['code' => FRC_ApiError::SUCCESS, 'msg' => '发布完成', 'data' => $post];
        }

        return ['code' => FRC_ApiError::FAIL, 'msg' => '发布失败', 'data' => $post];
    }

    public function data_history_wait_play()
    {
        $option_id = frc_sanitize_text('option_id', null);
//        $cookie = frc_sanitize_text('cookie', null);
        if ($option_id === null) return ['code' => FRC_ApiError::FAIL, 'msg' => '数据桶ID异常'];
//        if ($cookie === null) return ['code' => FRC_ApiError::FAIL, 'msg' => '必须输入cookie'];
        $model = new FRC_Data();
        $result = $model->getWaitDataByOption($option_id);
        $spider = new FRC_Spider();
        if (count($result) > 0)
        {
            $info = $result[0];
//            $info['link'] = str_replace("http://", "https://", $info['link']);
            $options = new FRC_Options();
            $option = $options->lazy_person("微信");
//            $option["collect_cookie"] = $cookie;
            return $spider->response(
                FRC_ApiError::SUCCESS,
                //开始
                $spider->single_spider($option, $info['link']));
        }else{
            return $spider->response(FRC_ApiError::ERR_PARAM,[],"已经全部采集完毕");
        }

    }

    private function post_merge(&$post, $release_config){
        $param = [];
        if ($release_config['release_type'] === 'LightSNS') {
            $param['post_type'] = 'post';
            if ($release_config['extension_field'] === 'normal'){
                $param['post_parent'] = 999999999;
            }
        } elseif ($release_config['release_type'] === '7b2') {
            $param['post_type'] = 'post';
        } else {
            $param['post_type'] = $release_config['extension_field'] ? $release_config['extension_field'] : 'post';
        }

        $post = array_merge($post, $param);
        return $post;
    }

    private function update_post_meta($post_id, $release_config){
        if ($release_config['release_type'] === 'LightSNS') {
            update_post_meta($post_id, 'post_type', $release_config['extension_field']);
            if ($release_config['extension_field'] === 'normal'){
                update_post_meta($post_id, 'last_comment_time', time());
            }
        } elseif ($release_config['release_type'] === '7b2') {
            update_post_meta($post_id, 'b2_single_post_style', $release_config['extension_field']);
        } else {

        }
    }

    private function uploadPicAttachment($post, $release_config){
        if ($release_config['image_download'] != 1) {
            return ;
        }

        if (preg_match_all('/<img.*?src="(.*?)".*?\/?>/i', $post['post_content'],$matches)){
            foreach ( (array)$matches[1] as $imageUrl ){
                $wp_upload_dir = wp_upload_dir();
                // 找到真实图片路径用于上传特色图片
                $wp_upload_local_url_start = str_replace(site_url(), '', $wp_upload_dir['baseurl']);
                $wp_upload_dir_base_dir = $wp_upload_dir['basedir'];
                if (isset($wp_upload_dir['default']['baseurl'])){ // 关闭oss后 没有default
                    $wp_upload_local_url_start = str_replace(site_url(), '', $wp_upload_dir['default']['baseurl']);
                    $wp_upload_dir_base_dir = $wp_upload_dir['default']['basedir'];
                }

                if (startsWith($imageUrl, $wp_upload_local_url_start)) { // image in local
                    $imagePath = str_replace($wp_upload_local_url_start, $wp_upload_dir_base_dir, $imageUrl);
                } elseif (startsWith($imageUrl, $wp_upload_dir['baseurl'])) { // image in web/oss
                    $imagePath = str_replace($wp_upload_dir['baseurl'], $wp_upload_dir['basedir'], $imageUrl);
                } else {
                    return ;
                }

                if (!empty($imagePath) && file_exists($imagePath)){
                    $attachment = array(
                        'guid'           => $imageUrl,
                        'post_mime_type' => getimagesize($imagePath)['mime'],
                        'post_title'     => basename($post['post_title']),
                        'post_status'    => 'inherit'
                    );
                    $attach_id = wp_insert_attachment($attachment, $imagePath, $post['ID']);
                    $attachment_data = wp_generate_attachment_metadata($attach_id, $imagePath);
                    wp_update_attachment_metadata($attach_id, $attachment_data);
                    if ($release_config['thumbnail']) {
                        set_post_thumbnail($post['ID'], $attach_id);
                        $release_config['thumbnail'] = false;
                    }
                }
            }
        }
    }

}

if (!class_exists('WP_List_Table')) {
    require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
}

class FRC_Data_Detail_Table extends WP_List_Table
{
    /**
     * Retrieve snippets data from the database
     *
     * @param int $per_page
     * @param int $page_number
     *
     * @return mixed
     */
    public static function get_snippets($per_page = 10, $page_number = 1, $customvar = 'total')
    {
        $model = new FRC_Data();
        $result = $model->data_paging($page_number, $per_page, $customvar);

        return $result;
    }

    /**
     * Delete a snipppet record.
     * @param $id
     * @return false|int
     */
    public function delete_snippet($id)
    {
        $model = new FRC_Data();
        return $model->delete($id);
    }

    /**
     * @param $id
     * @return array
     */
    public function release_snippet($id)
    {
        $model = new FRC_Data();
        $article = $model->id($id);
        return $model->article_to_storage($article);
    }

    /**
     * Activate a snipppet record.
     *
     * @param int $id snippet ID
     */
    public static function activate_snippet($id)
    {

    }

    /**
     * Deactivate a snipppet record.
     *
     * @param int $id snippet ID
     */
    public static function deactivate_snippet($id)
    {

    }

    /**
     * Returns the count of records in the database.
     *
     * @return null|string
     */
    public static function record_detail_count($customvar = 'total')
    {
        $model = new FRC_Data();
        return $model->record_count($customvar);
    }

    /** Text displayed when no snippet data is available */
    public function no_items()
    {
        esc_html_e('数据空空的, 请先开始采集之旅吧.', 'Fat Rat Collect');
    }

    /**
     * Render a column when no column specific method exist.
     *
     * @param array $item
     * @param string $column_name
     *
     * @return mixed
     */
    public function column_default($item, $column_name)
    {
        switch ($column_name) {
            case 'status' :
                switch ($item[$column_name]){
                    case '1':
                        return '<span class="label label-warning">待采集</span>';
                        break;
                    case '2':
                        return '<span class="label label-primary">采集完成</span>';
                        break;
                    case '3':
                        return '<span class="label label-success">已发布</span>';
                        break;
                    case '5':
                        return '<span class="label label-danger">已失败</span>';
                        break;
                }
                break;
            case 'cover' :
                return sprintf("<img src='%s' />", $item[$column_name]);
                break;
            case 'link' :
                return sprintf("<a href='%s' target='_blank'>%s</a>", $item[$column_name], $item[$column_name]);
                break;
            case 'content':
                return esc_html(mb_substr($item[$column_name], 0, 30) . ' ...');
                break;
            case 'post_id':
                return sprintf("<a href='%s' target='_blank'>%s</a>", get_permalink($item[$column_name]), $item[$column_name]);
                break;
            case 'title':
                $title = '<strong>' . $item['title'] . '</strong>';
                if ($item['status'] != 2){
                    return $title;
                }
                $actions = array(
                    '发布' => sprintf("<a href='javascript:;'><span class='publish-article' data-value='%s'>%s</span></a>", $item['id'], esc_html__('发布', 'Fat Rat Collect')),
                    '预览' => sprintf("<a href='javascript:;'><span class='preview-article' data-value='%s'>%s</span></a>", $item['id'], esc_html__('预览', 'Fat Rat Collect')),
                );
                return $title . $this->row_actions( $actions );
                break;
            default:
                return esc_html($item[$column_name]);
                break;
        }
    }

    /**
     * Render the bulk edit checkbox
     *
     * @param array $item
     *
     * @return string
     */
    function column_cb($item)
    {
        return sprintf(
            '<input type="checkbox" name="snippets[]" value="%s" />', $item['id']
        );
    }

    /**
     * Method for name column
     *
     * @param array $item an array of DB data
     *
     * @return string
     */
    function column_name($item)
    {

    }

    /**
     *  Associative array of columns
     *
     * @return array
     */
    function get_columns()
    {
        $columns = array(
            'cb' => '<input type="checkbox" />',
            'id' => esc_html__('ID', 'Fat Rat Collect'),
            'status' => esc_html__('状态', 'Fat Rat Collect'),
            'title' => esc_html__('Title', 'Fat Rat Collect'),
            'link' => esc_html__('原文地址', 'Fat Rat Collect'),
            'content' => esc_html__('内容', 'Fat Rat Collect'),
            'post_id' => esc_html__('发布后wp ID', 'Fat Rat Collect'),
            'message' => esc_html__('Message', 'Fat Rat Collect'),
            'created_at' => esc_html__('采集时间', 'Fat Rat Collect'),
            'updated_at' => esc_html__('最后修改时间', 'Fat Rat Collect'),
        );

        return $columns;
    }

    /**
     * Columns to make sortable.
     *
     * @return array
     */
    public function get_sortable_columns()
    {

        return array(
            'id' => array('id', false),
            'status' => array('status', true),
        );
    }

    /**
     * Returns an associative array containing the bulk action
     *
     * @return array
     */
    public function get_bulk_actions()
    {
        return array(
            'bulk-release' => esc_html__('批量发布数据', 'Fat Rat Collect'),
            'bulk-delete' => esc_html__('删除(删除后滤重失效)', 'Fat Rat Collect'),
        );
    }

    /**
     * Handles data query and filter, sorting, and pagination.
     */
    public function prepare_items()
    {

        $columns = $this->get_columns();
        $hidden = array();
        $sortable = $this->get_sortable_columns();

        //Retrieve $customvar for use in query to get items.
        $customvar = frc_sanitize_text('customvar', 'total');
        $this->_column_headers = array($columns, $hidden, $sortable);

        /** Process bulk action */
        $this->process_bulk_action();
        $this->views();
        // $per_page = $this->get_items_per_page('snippets_per_page', 10);
        $per_page = frc_sanitize_text('snippets_per_page', 10);
        $current_page = $this->get_pagenum();
        $current = frc_sanitize_text('customvar', 'total');

        $total_items = self::record_detail_count($current);

        $this->set_pagination_args(array(
            'total_items' => $total_items,
            'per_page' => $per_page,
        ));

        $this->items = self::get_snippets($per_page, $current_page, $customvar);
    }

	public function get_views()
	{
		$views = array();

		// 对 customvar 参数进行安全处理
		$current = sanitize_text_field(frc_sanitize_text('customvar', 'total'));

		// 构建所有数据视图
		$class = ('total' === $current) ? ' class="current"' : '';
		$total_url = esc_url(remove_query_arg('customvar'));
		$views['total'] = sprintf(
			'<a href="%s"%s>%s (%d)</a>',
			$total_url,
			esc_attr($class),
			esc_html__('所有数据', 'Fat Rat Collect'),
			$this->record_detail_count()
		);

		// 构建待采集视图
		$foo_url = esc_url(add_query_arg('customvar', '1'));
		$class = ('1' === $current) ? ' class="current"' : '';
		$waitCollectCount = $this->record_detail_count('1');
		$views['1'] = sprintf(
			'<a href="%s"%s>%s (%d)</a>',
			$foo_url,
			esc_attr($class),
			esc_html__('待采集', 'Fat Rat Collect'),
			$waitCollectCount
		);

		// 如果有待采集数据,添加按钮
		if ($waitCollectCount > 0) {
			$views['1'] .= sprintf(
				'<input type="button" id="wp-frc-data-play" data-option_id="%s" class="button action" value="%s">',
				esc_attr(frc_sanitize_text('option_id')),
				esc_attr__('play', 'Fat Rat Collect')
			);
		}

		// 构建采集完成视图
		$bar_url = esc_url(add_query_arg('customvar', '2'));
		$class = ('2' === $current) ? ' class="current"' : '';
		$views['2'] = sprintf(
			'<a href="%s"%s>%s (%d)</a>',
			$bar_url,
			esc_attr($class),
			esc_html__('采集完成', 'Fat Rat Collect'),
			$this->record_detail_count('2')
		);

		// 构建已发布视图
		$all_url = esc_url(add_query_arg('customvar', '3'));
		$class = ('3' === $current) ? ' class="current"' : '';
		$views['3'] = sprintf(
			'<a href="%s"%s>%s (%d)</a>',
			$all_url,
			esc_attr($class),
			esc_html__('已发布', 'Fat Rat Collect'),
			$this->record_detail_count('3')
		);

		// 构建已失败视图
		$all_url = esc_url(add_query_arg('customvar', '5'));
		$class = ('5' === $current) ? ' class="current"' : '';
		$views['5'] = sprintf(
			'<a href="%s"%s>%s (%d)</a>',
			$all_url,
			esc_attr($class),
			esc_html__('已失败', 'Fat Rat Collect'),
			$this->record_detail_count('5')
		);

		return $views;
	}

	public function process_bulk_action()
    {
        // If the delete bulk action is triggered
        if (
            ( isset( $_POST['action'] ) && 'bulk-release' === $_POST['action'] ) ||
            ( isset( $_POST['action2'] ) && 'bulk-release' === $_POST['action2'] )
        ) {
            $snippets_ids = frc_sanitize_array('snippets');

            foreach ( $snippets_ids as $id ) {
                $this->release_snippet( $id );
            }

            return;
        }
        if (
            ( isset( $_POST['action'] ) && 'bulk-delete' === $_POST['action'] ) ||
            ( isset( $_POST['action2'] ) && 'bulk-delete' === $_POST['action2'] )
        ) {
            $delete_ids = frc_sanitize_array('snippets');

            // loop over the array of record IDs and delete them
            foreach ( $delete_ids as $id ) {
                $this->delete_snippet( $id );
            }

            return;
        }
    }
}

function frc_data_detail()
{
    if (!isset($_REQUEST['option_id'])){
        $url = admin_url('admin.php?page=frc-data');
        _e("<script type='text/javascript'>window.location.href = '{$url}';</script>");
        return ;
    }
    $optionModel = new FRC_Options();
    $option = $optionModel->option(frc_sanitize_text('option_id'));
    $release = json_decode($option['collect_release']);
    $categorys = get_categories(array('hide_empty' => false, 'order' => 'ASC', 'orderby' => 'id'));
    $users = get_users(array(
        'fields' => array('ID', 'user_nicename', 'display_name')
    ));
    $snippet_obj = new FRC_Data_Detail_Table();
    ?>

    <div class="wrap">
        <h2>
            <img width="40" class="request—loading" src="<?php esc_attr_e(plugin_dir_url(dirname(__FILE__)) . 'images/fat-rat-128x128.png'); ?>"/>
            <?php esc_html_e(' 数据列表', 'Fat Rat Collect'); ?>
            <?php if (!empty(get_option(FRC_Validation::FRC_VALIDATION_SPONSORSHIP))) { ?>
                <img width="20" src="<?php frc_image('fat-rat-nav-v-yellow.png') ?>" />
            <?php } ?>
            <a href="<?php esc_attr_e(admin_url( 'admin.php?page=frc-data' )); ?>"><label class="label label-warning float-end">返回数据桶</label></a>
        </h2>
        <span><?php _e($option['collect_name'], 'Fat Rat Collect'); ?></span>
        <input type="hidden" hidden id="request_url" value="<?php esc_attr_e(admin_url('admin-ajax.php')); ?>">
        <input type="hidden" hidden id="success_redirect_url" value="<?php esc_attr_e(admin_url('admin.php?page=frc-data-detail&option_id='.$option['id'])); ?>">
        <input type="hidden" hidden id="current_option_id" value="<?php esc_attr_e($option['id']) ?>">
	    <?php require_once(plugin_dir_path(__DIR__) . 'views/csrf.php'); ?>
        <div class="row">
                <div class="col-10">
                    <form method="post">
                        <?php
                        $snippet_obj->prepare_items();
                        $snippet_obj->display();
                        ?>
                    </form>
                </div>
                <div class="col-2">
                    <?php
                    if (!get_object_vars($release)){
                        _e('<h4 style="color: #4285f4">第一次来数据桶, 要想发布文章, 点击下方保存发布配置,可快速保存默认发布配置:</h4>');
                    }
                    _e( '<p>' );
                    _e( '<img width="60" src="'.plugin_dir_url(dirname(__FILE__)).'images/fat-rat-256x256.png'.'" />' );
                    _e( '<img width="60" src="'.plugin_dir_url(dirname(__FILE__)).'images/fat-rat-256x256.png'.'" />' );
                    _e( '<img width="60" src="'.plugin_dir_url(dirname(__FILE__)).'images/fat-rat-256x256.png'.'" />' );
                    _e( '</p>' );
                    ?>
                    <br />
                    <p><input type="button" class="button button-primary" id="save-release-option" value="保存发布配置" /></p>
                    <p class="p-tips-style">保存配置生效后, 用于快捷发布, 自动发布, 和其他地方发布</p>
                    <hr />
                    <?php require_once(plugin_dir_path(__DIR__) . 'views/release-type.php'); ?>
                    <h5>设置文章发布状态:</h5>
                    <ul>
                        <?php foreach ([
                                           'publish' => '发布',
                                           'pending' => '待审核',
                                           'draft' => '草稿',
                                       ] as $val => $title): ?>
                            <li><input type="radio" value="<?php esc_attr_e($val, 'publish') ?>" name="post_status" <?php if (isset($release->status) && $val == $release->status) esc_attr_e('checked'); ?>> <?php esc_html_e($title, 'Fat Rat Collect') ?></li>
                        <?php endforeach; ?>
                    </ul>
                    <hr />
                    <h5>设置特色图片(封面图):</h5>
                    <ul>
                        <li>
                            <input type="radio" value="thumbnail1" name="post_thumbnail" <?php if (isset($release->thumbnail) && 'thumbnail1' == $release->thumbnail) esc_attr_e('checked'); ?> />
                            <?php _e('使用正文第一张图', 'Fat Rat Collect') ?>
                        </li>
                        <li>
                            <input type="radio" value="thumbnail2" name="post_thumbnail" <?php if (isset($release->thumbnail) && 'thumbnail2' == $release->thumbnail) esc_attr_e('checked'); ?> />
                            <?php _e('不需要特色图片', 'Fat Rat Collect') ?>
                        </li>
                    </ul>
                    <hr />
                    <h5>设置发布分类:</h5>
                    <ul class="checkbox_post_category">
                        <?php foreach ($categorys as $category): ?>
                            <li>
                                <?php
                                if ($category->parent != 0){
                                    esc_html_e('&nbsp;&nbsp;');
                                } ?>
                                <input type="checkbox" name="post_category[]" value="<?php esc_attr_e($category->cat_ID); ?>" <?php if (isset($release->category) && in_array($category->cat_ID, $release->category)){ esc_attr_e('checked'); } ?>>&nbsp;<?php _e($category->cat_name, 'Fat Rat Collect'); ?></li>
                        <?php endforeach; ?>
                    </ul>
                    <hr />
                    <h5>设置发布作者: (多选随机)</h5>
                    <ul class="checkbox_post_user">
                        <?php foreach ($users as $user): ?>
                            <li><input type="checkbox" name="post_user[]" value="<?php esc_attr_e($user->ID); ?>" <?php if (isset($release->user) && in_array($user->ID, $release->user)){ esc_attr_e('checked'); } ?>>&nbsp;<?php _e($user->user_nicename . '(' . $user->display_name . ')', 'Fat Rat Collect'); ?></li>
                        <?php endforeach; ?>
                    </ul>
                    <br />
                    <br />
                    <div class="fixed"><img width="150" src="<?php esc_attr_e(plugin_dir_url(dirname(__FILE__)).'images/fat-rat-256x256.png');  ?>" /></div>
                </div>
            </div>
    </div>
    <?php
}

================================================
FILE: includes/fatrat-data.php
================================================
<?php
/**
 * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.
 * 胖鼠采集 WordPress最好用的采集插件.
 * 如果你觉得这个项目还不错.可以去Github上 Star 关注我.
 * 您可使用胖鼠采集自行二次开发满足您的个性化需求.
 * 请不要Copy, Rename. OR 修改源代码进行售卖获利.
 * Github: https://github.com/fbtopcn/fatratcollect
 * @Author: fbtopcn
 * @CreateTime: 2018年12月30日 02:24
 */

if (!class_exists('WP_List_Table')) {
    require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
}

class FRC_Data_List_Table extends WP_List_Table
{
    /**
     * Retrieve snippets data from the database
     *
     * @param int $per_page
     * @param int $page_number
     *
     * @return mixed
     */
    public static function get_snippets($per_page = 10, $page_number = 1, $customvar = 'total')
    {
        $model = new FRC_Options();
        $dataModel = new FRC_Data();
        $result = $model->options_paging($page_number, $per_page, $customvar);

        return collect($result)->map(function ($data) use ($model, $dataModel) {
            $option = $model->option($data['id']);

            $category = '未设置';
            if ($release = json_decode($option['collect_release'])){
                if (isset($release->category)){
                    $category = '';
                    foreach ($release->category as $item) {
                        $category .= get_cat_name($item).',';
                    }
                    $category = rtrim($category, ',');
                }
            }

            $data['collect_release_categories'] = $category;
            $statistical = $dataModel->statistical($data['id']);
            $data['data_all_count'] = $statistical['all_count'];
            $data['data_release_count'] = $statistical['release_count'];
            $data['data_not_release_count'] = $statistical['not_release_count'];
            $data['data_to_day_release'] = $statistical['to_day_release'];
            $data['data_to_day_collect'] = $statistical['to_day_collect'];
            return $data;
        });

    }

    /**
     * Delete a snipppet record.
     * @param $id
     * @return false|int
     */
    public function delete_snippet($id)
    {
        $model = new FRC_Options();
        return $model->delete($id);
    }

    /**
     * Activate a snipppet record.
     *
     * @param int $id snippet ID
     */
    public static function activate_snippet($id)
    {

    }

    /**
     * Deactivate a snipppet record.
     *
     * @param int $id snippet ID
     */
    public static function deactivate_snippet($id)
    {

    }

    /**
     * Returns the count of records in the database.
     *
     * @return null|string
     */
    public static function record_count($customvar = 'total')
    {
        $model = new FRC_Options();
        return $model->record_count($customvar);
    }

    /** Text displayed when no snippet data is available */
    public function no_items()
    {
        esc_html_e('配置空空的, 请创建采集配置开始旅程吧', 'Fat Rat Collect');
    }

    /**
     * Render a column when no column specific method exist.
     *
     * @param array $item
     * @param string $column_name
     *
     * @return mixed
     */
    public function column_default($item, $column_name)
    {
        switch ($column_name) {
//            case 'data_to_day_collect':
//                return '<span class="label label-info">'.$item[$column_name].'</span>';
//                break;
//            case 'data_not_release_count':
//                return '<span class="label label-default">'.$item[$column_name].'</span>';
//                break;
//            case 'data_release_count':
//                return '<span class="label label-warning">'.$item[$column_name].'</span>';
//                break;
//            case 'data_all_count':
//                return '<span class="label label-primary">'.$item[$column_name].'</span>';
//                break;
            case 'collect_name':
                $title = '<strong>' . $item['collect_name'] . '</strong>';
                $actions = array(
                    '进入桶' => sprintf("<a href='%s'>%s</a>", admin_url('admin.php?page=frc-data-detail&option_id=' . $item['id']), esc_html__('进入桶', 'Fat Rat Collect')),
                    '快捷发布' => sprintf("<a href='javascript:;'><span class='quick-release-option-button' data-value='%s'>%s</span></a>", $item['id'], esc_html__('快捷发布', 'Fat Rat Collect')),
                );
                return $title . $this->row_actions( $actions );
                break;
            default:
                return esc_html($item[$column_name]);
                break;
        }
    }

    /**
     * Render the bulk edit checkbox
     *
     * @param array $item
     *
     * @return string
     */
    function column_cb($item)
    {
        return sprintf(
            '<input type="checkbox" name="snippets[]" value="%s" />', $item['id']
        );
    }

    /**
     * Method for name column
     *
     * @param array $item an array of DB data
     *
     * @return string
     */
    function column_name($item)
    {

    }

    /**
     *  Associative array of columns
     *
     * @return array
     */
    function get_columns()
    {
        $columns = array(
            'cb' => '<input type="checkbox" />',
            'id' => esc_html__('ID', 'Fat Rat Collect'),
            'collect_name' => esc_html__('数据桶名称', 'Fat Rat Collect'),
            'collect_release_categories' => esc_html__('发布分类', 'Fat Rat Collect'),
            'data_to_day_release' => esc_html__('今日发布', 'Fat Rat Collect'),
            'data_to_day_collect' => esc_html__('今日采集', 'Fat Rat Collect'),
            'data_not_release_count' => esc_html__('未发布总量', 'Fat Rat Collect'),
            'data_release_count' => esc_html__('已发布总量', 'Fat Rat Collect'),
            'data_all_count' => esc_html__('桶数据总量', 'Fat Rat Collect'),
            'created_at' => esc_html__('桶创建时间', 'Fat Rat Collect'),
        );

        return $columns;
    }

    /**
     * Columns to make sortable.
     *
     * @return array
     */
    public function get_sortable_columns()
    {

        return array(
            'id' => array('id', false),
        );
    }

    /**
     * Returns an associative array containing the bulk action
     *
     * @return array
     */
    public function get_bulk_actions()
    {

        return array(
            'bulk-quick-release' => esc_html__('批量快捷发布(待开发)', 'Fat Rat Collect'),
        );
    }

    /**
     * Handles data query and filter, sorting, and pagination.
     */
    public function prepare_items()
    {

        $columns = $this->get_columns();
        $hidden = array();
        $sortable = $this->get_sortable_columns();

        //Retrieve $customvar for use in query to get items.
        $customvar = frc_sanitize_text('customvar', 'total');
        $this->_column_headers = array($columns, $hidden, $sortable);

        /** Process bulk action */
        $this->process_bulk_action();
        $this->views();
        $per_page = $this->get_items_per_page('snippets_per_page', 10);
        $current_page = $this->get_pagenum();
        $total_items = self::record_count();

        $this->set_pagination_args(array(
            'total_items' => $total_items,
            'per_page' => $per_page,
        ));

        $this->items = self::get_snippets($per_page, $current_page, $customvar);
    }

	public function get_views()
	{
		$views = array();

		// 确保对 'customvar' 的输入进行安全处理
		$current = sanitize_text_field(frc_sanitize_text('customvar', 'total'));

		// 构建总计视图
		$class = ('total' === $current) ? ' class="current"' : '';
		$total_url = esc_url(remove_query_arg('customvar'));
		$views['total'] = sprintf(
			'<a href="%s"%s>%s (%d)</a>',
			$total_url,
			esc_attr($class),
			esc_html__('全部配置', 'Fat Rat Collect'),
			$this->record_count()
		);

		// 构建列表采集视图
		$foo_url = esc_url(add_query_arg('customvar', 'list'));
		$class = ('list' === $current) ? ' class="current"' : '';
		$views['list'] = sprintf(
			'<a href="%s"%s>%s (%d)</a>',
			$foo_url,
			esc_attr($class),
			esc_html__('列表采集', 'Fat Rat Collect'),
			$this->record_count('list')
		);

		// 构建详情采集视图
		$bar_url = esc_url(add_query_arg('customvar', 'single'));
		$class = ('single' === $current) ? ' class="current"' : '';
		$views['single'] = sprintf(
			'<a href="%s"%s>%s (%d)</a>',
			$bar_url,
			esc_attr($class),
			esc_html__('详情采集', 'Fat Rat Collect'),
			$this->record_count('single')
		);

		// 构建全站采集视图(如果启用)
		if (get_option(FRC_Validation::FRC_VALIDATION_ALL_COLLECT)) {
			$all_url = esc_url(add_query_arg('customvar', 'all'));
			$class = ('all' === $current) ? ' class="current"' : '';
			$views['all'] = sprintf(
				'<a href="%s"%s>%s (%d)</a>',
				$all_url,
				esc_attr($class),
				esc_html__('全站采集', 'Fat Rat Collect'),
				$this->record_count('all')
			);
		}

		return $views;
	}

	public function process_bulk_action()
    {
        // If the delete bulk action is triggered
//        if (
//            ( isset( $_POST['action'] ) && 'bulk-delete' === $_POST['action'] ) ||
//            ( isset( $_POST['action2'] ) && 'bulk-delete' === $_POST['action2'] )
//        ) {
//            $delete_ids = esc_sql( $_POST['snippets'] );
//
//            // loop over the array of record IDs and delete them
//            foreach ( $delete_ids as $id ) {
//                $this->delete_snippet( $id );
//            }
//
//            return;
//        }
    }
}

function frc_data_list()
{
    $snippet_obj = new FRC_Data_List_Table();
    ?>

    <div class="wrap">
        <h1>
            <?php esc_html_e('数据桶控制中心', 'Fat Rat Collect') ?>
            <?php if (!empty(get_option(FRC_Validation::FRC_VALIDATION_SPONSORSHIP))) { ?>
                <img width="20" src="<?php frc_image('fat-rat-nav-v-yellow.png') ?>" />
            <?php } ?>
        </h1>
        <div><span style="color: #4285f4;"><?php _e((new FRC_Validation())->announcement('notice-data')); ?></span></div>
        <input type="hidden" hidden id="request_url" value="<?php esc_attr_e(admin_url('admin-ajax.php')); ?>">
        <input type="hidden" hidden id="success_redirect_url" value="<?php esc_attr_e(admin_url('admin.php?page=frc-data')); ?>">
	    <?php require_once(plugin_dir_path(__DIR__) . 'views/csrf.php'); ?>

        <form method="post">
            <?php
            $snippet_obj->prepare_items();
            $snippet_obj->display();
            ?>
        </form>
    </div>
    <?php
}


================================================
FILE: includes/fatrat-debugging.php
================================================
<?php
/**
 * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.
 * 胖鼠采集 WordPress最好用的采集插件.
 * 如果你觉得这个项目还不错.可以去Github上 Star 关注我.
 * 您可使用胖鼠采集自行二次开发满足您的个性化需求.
 * 请不要Copy, Rename. OR 修改源代码进行售卖获利.
 * Github: https://github.com/fbtopcn/fatratcollect
 * @Author: FatRat
 * @CreateTime: 2020年04月11日 12:25
 */

function frc_debugging(){
    ?>

    <div class="wrap">
        <h1><?php _e('胖鼠调试台', 'Fat Rat Collect') ?></h1>
        <p></p>
        <p style="color: #00b300"><?php _e((new FRC_Validation())->announcement('notice-debug')); ?></p>

        <input type="hidden" hidden id="request_url" value="<?php esc_attr_e(admin_url('admin-ajax.php')); ?>">
        <input type="hidden" hidden id="success_redirect_url" value="<?php esc_attr_e(admin_url('admin.php?page=frc-debugging')); ?>">
	    <?php require_once(plugin_dir_path(__DIR__) . 'views/csrf.php'); ?>

        <table class='form-table debug-table'>
            <tr>
                <th>地址:</th>
                <td><input size="50" name="debug_url"/><p style="font-size: 12px; color: #cca154">此处可以填写你要爬取的地址. 列表页/详情页 地址 均可</p></td>
            </tr>
            <tr>
                <th>编码处理:</th>
                <td>
                    <input type="radio" checked name="debug_remove_head" value="1"> 自动识别(推荐)
                    <input type="radio" name="debug_remove_head" value="2"> 删HEAD(非UTF-8编码推荐)
                    <input type="radio" name="debug_remove_head" value="3"> <span style="color: #db9925">强制转换(终方)</span>
                </td>
            </tr>
            <?php if (get_option(FRC_Validation::FRC_VALIDATION_RENDERING)) { ?>
            <tr>
                <th>采集方式:</th>
                <td>
                    <input type="radio" name="debug_rendering" value="1" checked >
                    静态渲染
                    <input type="radio" name="debug_rendering" value="2">
                    动态渲染
                </td>
            </tr>
            <?php } ?>
            <tr>
                <th>范围:</th>
                <td><input size="50" name="debug_range"/>
                    <p style="font-size: 12px; color: #cca154">填写Html标签的 class 或者 id (Jquery语法) <a href="https://www.fatrat.cn/docs/v2/core-rules" target="_blank">参考</a></p></td></td>
            </tr>
            <tr>
                <th>采集规则:</th>
                <td>
                    &nbsp;&nbsp;&nbsp;<span style="color: #CC6633">规则名&nbsp;&nbsp;- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JQuery选择器 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    &nbsp;&nbsp;&nbsp;- &nbsp;属性 &nbsp; - &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;标签过滤: 空格分割</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a
                        href="https://www.fatrat.cn/docs/v2/core-rules" target='_blank'>参考</a> | <a
                        href="http://jquery.cuishifeng.cn/" target='_blank'>语法</a><br/>
                    <input type="text" size="6" value="" name="collect_debug_rule_a"/>-<input type="text" size="20"
                                                                                              value="<?php esc_attr_e(isset($option) ? $rule_link['b'] : ''); ?>"
                                                                                              name="collect_debug_rule_b"/>-<input
                        type="text" size="4" value="<?php esc_attr_e(isset($option) ? $rule_link['c'] : ''); ?>"
                        name="collect_debug_rule_c"/>-<input type="text" size="40"
                                                             value="<?php esc_attr_e(isset($option) ? $rule_link['d'] : ''); ?>"
                                                             name="collect_debug_rule_d"/>*
                    <p style="color: #838383;font-size: 12px;">内容过滤Jquery常用语法: :eq(等于) :gt(大于) :lt(小于) :first(第一个) :last(最后一个) :even(偶数) :odd(奇数) <a href="http://jquery.cuishifeng.cn/element.html" target="_blank">更多</a></p>
                </td>
            </tr>
            <tr>
                <th colspan="2">
                    <input class="button button-primary" type="button" id="debug-option" value="请求调试"/>
                    <p></p>
                    <p>首先, 打开开发者工具, Chrome浏览器控制台打开方法: 右键->检查->console, 其他浏览器大同小异. </p>
                    <p>点击debugging后请看控制台Console里面的数据, 文字教程, 视频教程中 均有介绍如何使用, 照葫芦画瓢.</p>
                    <p>视频教程, 文字教程已经写的很详细了, 如果你没有耐心花30分钟熟悉胖鼠、可在插件管理->选择胖鼠->卸载 = - =! / 或者来骚扰下作者 <a target="_blank" href="https://www.fatrat.cn/docs/v2/write-rules">代写</a></p>
                    <p class="p-tips-style">采集中心所有采集均支持debugging模式哦、最后如果胖鼠采集帮助到你, 请支持一下开源作品 插件<a target="_blank" href="https://wordpress.org/support/plugin/fat-rat-collect/reviews">五星好评支持</a></p>
                </th>
            </tr>
            <tr>
                <td colspan="2"><?php _e((new FRC_Validation())->getAppreciatesHtml(7)); ?></td>
            </tr>
        </table>
    </div>
    <?php
}

================================================
FILE: includes/fatrat-kit.php
================================================
<?php
/**
 * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.
 * 胖鼠采集 WordPress最好用的采集插件.
 * 如果你觉得这个项目还不错.可以去Github上 Star 关注我.
 * 您可使用胖鼠采集自行二次开发满足您的个性化需求.
 * 请不要Copy, Rename. OR 修改源代码进行售卖获利.
 * Github: https://github.com/fbtopcn/fatratcollect
 * @Author: fbtopcn
 * @CreateTime: 2020年4月1日
 */

class FRC_Kit{

    public function kit_image_path($file){
        return plugin_dir_url(dirname(__FILE__)).'images/' . $file;
    }

    public function kit_automatic_save_pic($postID){
        if ((defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
            || (!current_user_can('edit_post', $postID))) {
            return;
        }
        remove_action('publish_post', 'frc_automatic_save_pic');
        $post_content = get_post($postID)->post_content;
        // 逻辑

        add_action('publish_post', 'frc_automatic_save_pic');
    }

    public function kit_auto_tags($postID){
        $result = get_option(FRC_Validation::FRC_VALIDATION_AUTO_TAGS);
        if ((defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) || empty($result) || @json_decode($result)->switch != 'open') {
            return;
        }

        $post_content = get_post($postID)->post_content;
        $add_tag_link = get_the_tags($postID);
        if (!$add_tag_link){
            collect(get_tags( array('hide_empty' => false) ))->map(function ($tag) use ($postID, &$post_content){
                if ( stristr($post_content,$tag->name) !== false) {
                    wp_set_post_tags( $postID, $tag->name, true );
                }
            });
        }
    }


    public function kit_dynamic_fields($postID){
        $result = get_option(FRC_Validation::FRC_VALIDATION_DYNAMIC_FIELDS);
        if ((defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) || empty($result) || @json_decode($result)->switch != 'open') {
            return;
        }

        $content = get_post($postID)->post_content;

        if (strpos( $content, '<blockquote' ) !== false || strpos( $content, '</blockquote>' ) !== false){
            return;
        }

        $cats = collect(get_the_category($postID));
        if ($cats->isEmpty()) {
            return ;
        }
        $cat_ids = $cats->pluck('term_id');
        $args = array('orderby' => 'rand','showposts' => 1,'cat' => $cat_ids->implode(','), 'date_query' => array(
            'column' => 'post_date',
            'after' => date('Y-m-d H:i:s', strtotime(current_time('mysql'))-(3600*24*57)),
            'before' => current_time('mysql')
        ));

        $query_posts = new WP_Query();
        $posts_data = $query_posts->query($args);

        if (empty($posts_data)) {
            return ;
        }

        /*
        if (isset($posts_data[0]) && $previous_post = $posts_data[0]){
            $link = get_permalink($previous_post->ID);
            $pre_string = sprintf('<blockquote style="background: #F5F5F5; font-size: 10px;"><a href="%s" style="text-decoration: none"><span style="color: #929292;">%s</span><p>%s</p></a></blockquote>', $link, $previous_post->post_title, wp_trim_words($previous_post->post_content, 130));
            $content = $pre_string.$content;
        }
         */

        if (isset($posts_data[0]) && $next_post = $posts_data[0]){
            $link = get_permalink($next_post->ID);
            $next_string = sprintf('<blockquote style="background: #F5F5F5; font-size: 10px;"><a href="%s" style="text-decoration: none"><span style="color: #929292;">相关推荐: %s</span><p>%s</p></a></blockquote>', $link, $next_post->post_title, wp_trim_words($next_post->post_content, 130));
            $content = $content.$next_string;
        }

        wp_update_post(array('ID' => $postID, 'post_content' => $content));
    }
}

if (!function_exists("frc_image")) {
    /**
     * @param $file
     * @return string
     */
    function frc_image($file){
        $model = new FRC_Kit();
        esc_html_e($model->kit_image_path($file));
    }
}

function frc_auto_task($postID){
    $model = new FRC_Kit();
    $model->kit_auto_tags($postID);
    $model->kit_dynamic_fields($postID);
}
add_action('publish_post', 'frc_auto_task');

$result = get_option(FRC_Validation::FRC_VALIDATION_INNER_CHAIN);
if ($result && @json_decode($result)->switch === 'open'){
    function frc_inner_chain( $post_content ) {
        $config = json_decode(get_option(FRC_Validation::FRC_VALIDATION_INNER_CHAIN));
        $limit = isset($config->limit) ? $config->limit : 1;

        collect(get_tags( array('hide_empty' => false) ))->map(function ($tag) use (&$post_content, $limit){
            if ( stristr($post_content,$tag->name) !== false) {

                $link = get_tag_link($tag->term_id);
                $keyword = stripslashes($tag->name);
                $url = sprintf('<a href="%s" target="_blank" title="%s">%s</a>', $link, $keyword, $keyword);
                $regEx = '\'(?!((<.*?)|(<a.*?)))('. $keyword . ')(?!(([^<>]*?)>)|([^>]*?</a>))\'s';
                $post_content = preg_replace($regEx, $url, $post_content, $limit);
            }
        });

        return $post_content;

    }
    add_filter('the_content','frc_inner_chain');
}

function frc_kit(){
    $frc_validation_tags = get_option(FRC_Validation::FRC_VALIDATION_AUTO_TAGS);
    $frc_validation_chain = get_option(FRC_Validation::FRC_VALIDATION_INNER_CHAIN);
    $frc_validation_dynamic = get_option(FRC_Validation::FRC_VALIDATION_DYNAMIC_FIELDS);
    $frc_validation_automatic_save_pic = get_option(FRC_Validation::FRC_VALIDATION_AUTOMATIC_SAVE_PIC);
    $frc_validation_release_control = get_option(FRC_Validation::FRC_VALIDATION_RELEASE_CONTROL);
    $frc_validation_insert_keyword = get_option(FRC_Validation::FRC_VALIDATION_INSERT_KEYWORD);
    $frc_validation_wechat_history = get_option(FRC_Validation::FRC_VALIDATION_WECHAT_HISTORY);
    $frc_validation_sponsorship = get_option(FRC_Validation::FRC_VALIDATION_SPONSORSHIP);
    $frc_wp_schedules = wp_get_schedules();
    array_multisort(array_column($frc_wp_schedules, 'interval'), SORT_ASC, $frc_wp_schedules);
    ?>
    <div class="wrap">
        <h1><?php esc_html_e('胖鼠工具箱', 'Fat Rat Collect') ?>
            <img width="80" class="float-end" src="<?php frc_image('fat-rat-kit-256x256.png') ?>">
        </h1>
        <p></p>

        <input type="hidden" hidden id="request_url" value="<?php esc_attr_e(admin_url('admin-ajax.php')); ?>">
        <input type="hidden" hidden id="success_redirect_url" value="<?php esc_attr_e(admin_url('admin.php?page=frc-kit')); ?>">
	    <?php require_once(plugin_dir_path(__DIR__) . 'views/csrf.php'); ?>

        <!--        增加删除采集文章是否删除图片-->
        <!--        增加删除已发布的文章是否删除附件-->
        <nav>
            <div class="nav nav-tabs" id="nav-tab" role="tablist">
                <?php foreach([
                                  ['title' => '胖鼠工具箱', 'anchor' => '#kit', 'permissions' => $frc_validation_sponsorship],
                                  ['title' => '自动采集', 'anchor' => '#autospider', 'permissions' => $frc_validation_sponsorship],
                                  ['title' => '自动发布', 'anchor' => '#autorelease', 'permissions' => $frc_validation_sponsorship],
                                  ['title' => '自动标签', 'anchor' => '#autotags', 'permissions' => $frc_validation_tags],
                                  ['title' => '标签内链', 'anchor' => '#innerchain', 'permissions' => $frc_validation_chain],
                                  ['title' => '动态内容', 'anchor' => '#dynamiccontent', 'permissions' => $frc_validation_dynamic],
                                  ['title' => '数据发布控制', 'anchor' => '#release-control', 'permissions' => $frc_validation_release_control],
                                  ['title' => '关键词随机插入', 'anchor' => '#insert-keyword', 'permissions' => $frc_validation_insert_keyword],
//                        ['title' => '自动存图', 'anchor' => '#autosavepic', 'permissions' => $frc_validation_automatic_save_pic],
                                  ['title' => '公众号历史文章采集', 'anchor' => '#wechat-history', 'permissions' => $frc_validation_wechat_history],

                                  ['title' => '赞助鼠', 'anchor' => '#activation', 'permissions' => $frc_validation_sponsorship],
                              ] as $i => $element) { ?>
                    <button class="nav-link <?php $i == 0 ? _e('active') : ''; ?>" data-bs-toggle="tab" data-bs-target="<?php _e($element['anchor']); ?>" type="button">
                        <?php _e($element['title']) ?>
                        <?php if (!empty($element['permissions'])) {?>
                            <img width="20" src="<?php frc_image('fat-rat-nav-v-yellow.png'); ?>" />
                        <?php }?>
                    </button>
                <?php } ?>
            </div>
        </nav>

        <p></p>
        <div class="tab-content">
            <!--            首页-->
            <div class="tab-pane fade show active" id="kit">
                <p>欢迎来到胖鼠工具箱</p>
                <h2 style="color: #4a148c">胖鼠采集定时任务列表</h2>
                <?php $crons = _get_cron_array();
                $frc_cron_release_boolean = false;
                $frc_cron_spider_boolean = false;
                foreach ((array)$crons as $time => $cron){
                    if (!is_array($cron)){
                        continue;
                    }
                    foreach ($cron as $key => $value){
                        if ($key == 'frc_cron_release_hook'){
                            $frc_cron_release_boolean = true;
                            _e(sprintf('<p><label class="label label-info">胖鼠采集自动发布:下次执行时间 / %s</label></p>', date('Y-m-d h:i:s', strtotime("+8 hours", $time))));
                        }
                        if ($key == 'frc_cron_spider_hook'){
                            $frc_cron_spider_boolean = true;
                            _e(sprintf('<p><label class="label label-info">胖鼠采集自动采集:下次执行时间 / %s</label></p>', date('Y-m-d h:i:s', strtotime("+8 hours", $time))));
                        }
                    }
                }
                if (!$frc_cron_release_boolean){
                    _e('<p><label class="label label-warning">胖鼠采集自动发布:未启动</label></p>');
                }
                if (!$frc_cron_spider_boolean){
                    _e('<p><label class="label label-warning">胖鼠采集自动采集:未启动</label></p>');
                }
                ?>
                <hr />
                <h6>鼠友你好, 如果您遇到定时任务不起作用, 是因为WP-Cron无法连续运行,这是一个wp问题。</h6>
                <p>有一个简单的解决方案。只需将系统的任务计划程序设置为在所需的时间间隔(或在所需的特定时间)运行。最简单的解决方案是使用工具向wp-cron.php文件发出Web请求。</p>
                <p>在系统上安排任务之后,还有一个步骤要完成。WordPress将在每次加载页面时继续运行WP-Cron。这不再是必需的,它将导致服务器上额外的资源使用。可以在wp-config.php文件中禁用WP-Cron</p>

                <h6>1, 打开/wp-config.php文件进行编辑,并添加以下行:  </h6>
                <h6><code>define('DISABLE_WP_CRON', true);</code></h6>
                <h6>2, 添加系统定时任务 你要使用的命令是:</h6>
                <h6><code>wget -qO- <?php esc_html_e(site_url( '/wp-cron.php' )); ?> &> /dev/null</code></h6>
                2选1即可
                <h6><code>curl <?php esc_html_e(site_url( '/wp-cron.php' )); ?>  &> /dev/null</code></h6>
                <p><?php esc_html_e( '合理的时间间隔是 5-15 分钟. 这是 */5 * * * * 或 */15 * * * * 的时间间隔设置', 'Fat Rat Collect' ); ?>.</p>
                <p>1, 第一步可优化节省服务器资源, 避免用户每次访问都查询cron, 优化服务速度 </p>
                <p>2, 第二步是执行一个定时的请求, 每隔 5 - 15 分钟(推荐五分钟), 请求站点的/wp-cron.php文件</p>
                <h6>linux OR ubuntu window 宝塔 都可以配置, 具体操作咨询服务商或百度</h6>
                <h6>设置完成之后, 自动采集, 自动发布. 时间很准</h6>
                <?php
                if (isset($_REQUEST['all_collect'])){
                    $frc_validation_all_collect = get_option(FRC_Validation::FRC_VALIDATION_ALL_COLLECT);
                    if ($frc_validation_all_collect === false) { ?>
                        <h5>全站采集</h5>
                        <input placeholder="请输入激活口令" name="all-collect"/>
                        <input type="button" class="frc-activation button button-primary" data-value="all-collect"
                               value="激活"/>
                    <?php } else { ?>
                        <h5>全站采集</h5>
                        <img width="60" src="<?php frc_image('fat-rat-success.png') ?>">
                        <label class="label label-success label-lg">您于 <?php _e(@json_decode($frc_validation_all_collect)->created_at); ?> 已激活成功</label>
                        <label class="label label-success label-lg"></label>
                        <p><label class="label label-info">快去使用吧~</label></p>
                        <?php
                    }
                }
                if (isset($_REQUEST['rendering'])){
                    $frc_validation_rendering = get_option(FRC_Validation::FRC_VALIDATION_RENDERING);
                    if ($frc_validation_rendering === false) { ?>
                        <h5>动态渲染</h5>
                        <input placeholder="请输入激活口令" name="rendering"/>
                        <input type="button" class="frc-activation button button-primary" data-value="rendering"
                               value="激活"/>
                    <?php } else { ?>
                        <h5>全站采集</h5>
                        <img width="60" src="<?php frc_image('fat-rat-success.png') ?>">
                        <label class="label label-success label-lg">您于 <?php _e(@json_decode($frc_validation_rendering)->created_at); ?> 已激活成功</label>
                        <label class="label label-success label-lg"></label>
                        <p><label class="label label-info">快去使用吧~</label></p>
                        <?php
                    }
                }
                ?>
            </div>
            <!--            自动爬虫-->
            <div class="tab-pane fade" id="autospider">
                <h5>自动采集</h5>
                <ul>
                    <?php $cron_spider = get_option('frc_cron_spider'); ?>
                    <li><input type="radio" name="frc_cron_spider" value="" <?php esc_attr_e(empty($cron_spider) ? 'checked' : ''); ?>> 关闭此功能</li>
                    <?php foreach ($frc_wp_schedules as $key => $info){
                        $disabled = '';
                        if (empty($frc_validation_sponsorship) && $info['interval']<43200){
                            $disabled = 'disabled';
                        }
                        _e(sprintf('<li><input type="radio" name="frc_cron_spider" value="%s" %s %s> %s(%s秒)</li>', $key, (!empty($cron_spider) && $cron_spider == $key ? esc_html('checked') : ''), $disabled, $info['display'], $info['interval']));
                    } ?>
                </ul>
                <p>胖鼠工具箱首页可看到爬虫目前的简单状态哦, 后续慢慢优化哦</p>
                <p>或者下载安装插件 Advanced Cron Manager 里面 frc_ 开头的就是咱们的定时自动任务, 其他类似插件均可</p>
                <input type="button" class="frc_cron_button button button-primary" data-value="frc_cron_spider" value="设置" />
            </div>
            <!--            自动发布-->
            <div class="tab-pane fade" id="autorelease">
                <h5>自动发布</h5>
                <p>请鼠友给胖鼠<a href="https://wordpress.org/support/plugin/fat-rat-collect/reviews" target="_blank">五星评分</a>, 感谢!</p>
                <ul>
                    <?php $cron_release = get_option('frc_cron_release'); ?>
                    <li><input type="radio" name="frc_cron_release" value="" <?php esc_attr_e(empty($cron_release) ? 'checked' : ''); ?>> 关闭此功能</li>
                    <?php foreach ($frc_wp_schedules as $key => $info){
                        $disabled = '';
                        if (empty($frc_validation_sponsorship) && $info['interval']<43200){
                            $disabled = 'disabled';
                        }
                        _e(sprintf('<li><input type="radio" name="frc_cron_release" value="%s" %s %s> %s(%s秒)</li>', $key, (!empty($cron_release) && $cron_release == $key ? esc_html('checked') : ''), $disabled, $info['display'], $info['interval']));
                    } ?>
                </ul>
                <input type="button" class="frc_cron_button button button-primary" data-value="frc_cron_release" value="设置" />
            </div>
            <!--            自动标签-->
            <div class="tab-pane fade" id="autotags">
                <h5>自动标签</h5>
                <?php
                if ($frc_validation_tags != false){
                    _e('<p><label class="label label-success label-lg">您于 '.@json_decode($frc_validation_tags)->created_at.' 已激活成功</label></p>');
                }
                ?>
                <p><a href="https://www.fatrat.cn/docs/v2/auto-tags" target="_blank">Auto Tags</a> (文章自动打标签)</p>
                <p>此功能不依赖胖鼠采集, 属可独立运行功能!</p>
                <p>自动标签意指为文章自动打标签!</p>
                <p>第一步把你的标签输入进标签库!</p>
                <p>新发布的文章会在发布的同时, 会自动匹配标签库标签.</p>
                <p>关键词命中就会自动打标签, 升级后英文不区分大小写.</p>
                <p>省时省力还省心!</p>
                <?php
                if ($frc_validation_tags === false) { ?>
                    <input placeholder="请输入激活口令" name="auto-tags"/>
                    <input type="button" class="frc-activation button button-primary" data-value="auto-tags"
                           value="激活"/>
                <?php } else { ?>
                    <?php
                    $conf_json = json_decode($frc_validation_tags);
                    $switch_text = $conf_json->switch == 'open' ? '此功能目前是启动状态' : '此功能目前是关闭状态';
                    $subsequent_text = $conf_json->switch == 'open' ? '点击关闭' : '点击启动';
                    _e(sprintf('<h3><p class="label label-info">%s</p></h3>', $switch_text));
                    _e(sprintf('<p><input type="button" class="frc-function-switch button button-primary" data-value="auto-tags" value="%s" /></p>', $subsequent_text));
                } ?>
            </div>
            <!--            标签内链-->
            <div class="tab-pane fade" id="innerchain">
                <p><h5>标签内链</h5></p>
                <?php
                if ($frc_validation_chain != false){
                    _e('<p><label class="label label-success label-lg">您于 '.@json_decode($frc_validation_chain)->created_at.' 已激活成功</label></p>');
                }
                ?>
                <p>开启后会给文章中的标签增加标签列表页的链接</p>
                <p>每个标签目前只增加一次链接</p>
                <p>配合自动标签更完美, 省时省力还省心.</p>
                <?php
                if ($frc_validation_chain === false) { ?>
                    <input placeholder="请输入激活口令" name="inner-chain"/>
                    <input type="button" class="frc-activation button button-primary" data-value="inner-chain"
                           value="激活"/>
                <?php } else { ?>
                    <?php
                    $conf_json = json_decode($frc_validation_chain);
                    $switch_text = $conf_json->switch == 'open' ? '此功能目前是启动状态' : '此功能目前是关闭状态';
                    $subsequent_text = $conf_json->switch == 'open' ? '点击关闭' : '点击启动';
                    _e(sprintf('<h3><p class="label label-info">%s</p></h3>', $switch_text));
                    _e(sprintf('<input type="button" class="frc-function-switch button button-primary" data-value="inner-chain" value="%s" />', $subsequent_text));
                } ?>
            </div>
            <!--            动态内容-->
            <div class="tab-pane fade" id="dynamiccontent">
                <p><h5>动态内容</h5></p>
                <?php
                if ($frc_validation_dynamic != false){
                    _e('<p><label class="label label-success label-lg">您于 '.@json_decode($frc_validation_dynamic)->created_at.' 已激活成功</label></p>');
                }
                ?>
                <p><a href="https://www.fatrat.cn/docs/v2/dynamic-content" target="_blank">Dynamic Content</a> (文章自动添加动态内容)</p>
                <p>动态内容不依赖胖鼠采集, 属可独立运行功能!</p>
                <p>动态内容是为文章自动添加一段动态内容!</p>
                <p>指在文章正文开头、结尾各插入一段其他文章内容 (新版本去掉开头的内容)</p>
                <p>插入的内容来自: 同分类下,最近七天的随机文章,如果没有找到七天内文章, 就不添加</p>
                <p>文章正文前后插入内容后, 有利于收录, 并且不影响用户阅读.</p>
                <p>动态内容胖鼠推荐使用!!! 省时省力还省心!</p>
                <?php
                if ($frc_validation_dynamic === false) { ?>
                    <input placeholder="请输入激活口令" name="dynamic-fields"/>
                    <input type="button" class="frc-activation button button-primary" data-value="dynamic-fields"
                           value="激活"/>
                <?php } else { ?>
                    <p class="label label-success">您已激活成功</p>
                    <?php
                    $conf_json = json_decode($frc_validation_dynamic);
                    $switch_text = $conf_json->switch == 'open' ? '此功能目前是启动状态' : '此功能目前是关闭状态';
                    $subsequent_text = $conf_json->switch == 'open' ? '点击关闭' : '点击启动';
                    _e(sprintf('<h3><p class="label label-info">%s</p></h3>', $switch_text));
                    _e(sprintf('<input type="button" class="frc-function-switch button button-primary" data-value="dynamic-fields" value="%s" />', $subsequent_text));
                } ?>
            </div>
            <!--            数据发布控制-->
            <div class="tab-pane fade" id="release-control">
                <p><h5>数据发布控制</h5></p>
                <?php
                if ($frc_validation_release_control != false){
                    _e('<p><label class="label label-success label-lg">您于 '.@json_decode($frc_validation_release_control)->created_at.' 已激活成功</label></p>');
                }
                ?>
                <p>此功能激活后: 可操作发布页面所有选项。</p>
                <?php
                if ($frc_validation_release_control === false) { ?>
                    <input placeholder="请输入激活口令" name="release-control"/>
                    <input type="button" class="frc-activation button button-primary" data-value="release-control"
                           value="激活"/>
                <?php } else { ?>
                    <p class="label label-success">您已激活成功</p>
                <?php } ?>
            </div>
            <!--            关键词随机插入-->
            <div class="tab-pane fade" id="insert-keyword">
                <p><h5>关键词随机插入</h5></p>
                <?php
                if ($frc_validation_insert_keyword != false){
                    _e('<p><label class="label label-success label-lg">您于 '.@json_decode($frc_validation_insert_keyword)->created_at.' 已激活成功</label></p>');
                }
                ?>
                <?php
                if ($frc_validation_insert_keyword === false) { ?>
                    <input placeholder="请输入激活口令" name="insert-keyword"/>
                    <input type="button" class="frc-activation button button-primary" data-value="insert-keyword"
                           value="激活"/>
                <?php } else { ?>
                    <?php
                    $conf_json = json_decode($frc_validation_insert_keyword);
                    $switch_text = $conf_json->switch == 'open' ? '此功能目前是启动状态' : '此功能目前是关闭状态';
                    $subsequent_text = $conf_json->switch == 'open' ? '点击关闭' : '点击启动';
                    _e(sprintf('<h3><p class="label label-info">%s</p></h3>', $switch_text));
                    _e(sprintf('<input type="button" class="frc-function-switch button button-primary" data-value="insert-keyword" value="%s" />', $subsequent_text));
                } ?>
            </div>
            <!--            自动保存图片-->
            <div class="tab-pane fade" id="autosavepic">
                <p><h5>从其他站点手动复制过来的文章,点击保存后,所有远程图片自动本地化</h5></p>
                <p><h5>待开发</h5></p>
                <?php
                if ($frc_validation_automatic_save_pic != false){
                    _e('<p><label class="label label-success label-lg">您于 '.@json_decode($frc_validation_automatic_save_pic)->created_at.' 已激活成功</label></p>');
                }
                ?>
                <p>开启后会给文章中的标签增加标签列表页的链接</p>
                <p>每个标签目前只增加一次链接</p>
                <p>配合自动标签更完美, 省时省力还省心.</p>
                <?php
                if ($frc_validation_automatic_save_pic === false) { ?>
                    <input placeholder="请输入激活口令" name="automatic-save-pic"/>
                    <input type="button" class="frc-activation button button-primary" data-value="automatic-save-pic"
                           value="激活"/>
                <?php } else { ?>
                    <?php
                    $conf_json = json_decode($frc_validation_automatic_save_pic);
                    $switch_text = $conf_json->switch == 'open' ? '此功能目前是启动状态' : '此功能目前是关闭状态';
                    $subsequent_text = $conf_json->switch == 'open' ? '点击关闭' : '点击启动';
                    _e(sprintf('<h3><p class="label label-info">%s</p></h3>', $switch_text));
                    _e(sprintf('<input type="button" class="frc-function-switch button button-primary" data-value="automatic-save-pic" value="%s" />', $subsequent_text));
                } ?>
            </div>
            <!--            赞助鼠-->
            <div class="tab-pane fade" id="activation">
                <?php
                if (get_option(FRC_Validation::FRC_VALIDATION_SPONSORSHIP) === false) { ?>
                    <h5>赞助鼠</h5>
                    <p><a href="https://www.fatrat.cn/docs/v2/sponsorship" target="_blank">https://www.fatrat.cn/docs/v2/sponsorship</a></p>
                    <input placeholder="请输入激活口令" name="sponsorship"/>
                    <input type="button" class="frc-activation button button-primary" data-value="sponsorship"
                           value="赞助激活"/>
                <?php } else { ?>
                    <h2 style="color: #00b300">感谢赞助支持. 您享有胖鼠采集所有功能</h2>
                <?php } ?>


            </div>

            <!--            公众号历史文章采集-->
            <div class="tab-pane fade" id="wechat-history">
                <p><h5>公众号历史文章采集</h5></p>
                <?php
                if ($frc_validation_wechat_history != false){
                    _e('<p><label class="label label-success label-lg">您于 '.@json_decode($frc_validation_wechat_history)->created_at.' 已激活成功</label></p>');
                }
                ?>
                <?php
                if ($frc_validation_wechat_history === false) { ?>
                    <input placeholder="请输入激活口令" name="wechat-history"/>
                    <input type="button" class="frc-activation button button-primary" data-value="wechat-history"
                           value="激活"/>
                <?php } else { ?>
                    <h2 style="color: #00b300">感谢支持</h2>鼠友限时享有胖鼠采集公众号历史文章采集功能</h2>
                    <input hidden="hidden" placeholder="请输入激活口令" name="wechat-history"/>
                    <input type="button" class="frc-activation button button-primary" data-value="wechat-history"
                           value="更新激活"/>
                <?php } ?>
            </div>
        </div>
    </div>
    <?php
}

================================================
FILE: includes/fatrat-options-add-edit.php
================================================
<?php
/**
 * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.
 * 胖鼠采集 WordPress最好用的采集插件.
 * 如果你觉得这个项目还不错.可以去Github上 Star 关注我.
 * 您可使用胖鼠采集自行二次开发满足您的个性化需求.
 * 请不要Copy, Rename. OR 修改源代码进行售卖获利.
 * Github: https://github.com/fbtopcn/fatratcollect
 * @Author: fbtopcn
 * @CreateTime: 2018年12月30日 02:24
 */


function frc_options_add_edit()
{
    $option = null;
    $custom_content = null;
    $rule_link = $rule_title = $rule_content = $rule_paging = [];
    $option_id = frc_sanitize_text('option_id', 0);
    if ($option_id) {
        $options = new FRC_Options();
        $option = $options->option($option_id);

	    // 全站采集转义数据处理
        if ($option['collect_type'] == 'all'){
	        $option['collect_list_range'] = str_replace("\\\\", "\\", htmlspecialchars_decode($option['collect_list_range']));
        }

	    // 转义数据处理
        $option['collect_keywords_replace_rule'] = str_replace(" ", "\n", $option['collect_keywords_replace_rule']);
        $custom_content = json_decode(!empty($option['collect_custom_content'])?$option['collect_custom_content']:'{"head":"","foot":""}', true);
        $custom_content['head'] = str_replace('\\"', '"', htmlspecialchars_decode($custom_content['head']));
        $custom_content['foot'] = str_replace('\\"', '"', htmlspecialchars_decode($custom_content['foot']));

        // TODO: optimized
        $list_rules = translationRules($option['collect_list_rules']);
        $rule_link = [
            'a' => 'link',
            'b' => $list_rules['link']['selector']??'',
            'c' => $list_rules['link']['attribute']??'',
            'd' => $list_rules['link']['filter']??'',
        ];
        foreach (translationRules($option['collect_content_rules']) as $key => $val){
            $value = [
                'a' => $key,
                'b' => $val['selector'],
                'c' => $val['attribute'],
                'd' => $val['filter'],
            ];

            if ($key == 'title'){
                $rule_title = $value;
            } elseif ($key == 'content'){
                $rule_content = $value;
            } elseif ($key == 'paging'){
                $rule_paging = $value;
            }
        }
    }

    $frc_validation_sponsorship = get_option(FRC_Validation::FRC_VALIDATION_SPONSORSHIP);
    $frc_validation_all_collect = get_option(FRC_Validation::FRC_VALIDATION_ALL_COLLECT);

    ?>

    <div class="wrap frc-option-add-edit">
        <h1>
            <?php _e((isset($option)) ? '修改' : '新建' ) ?>配置规则
            <?php if (!empty($frc_validation_sponsorship)) { ?>
                <img width="20" src="<?php frc_image('fat-rat-nav-v-yellow.png') ?>" />
            <?php } ?>
        </h1>
        <p style="color: #838382">欢迎你使用胖鼠创建自己的规则, 如果第一次遇见认识胖鼠. 点<a href="https://www.fatrat.cn/docs/v2/create-rules" target="_blank">这里</a></p>
        <input type="hidden" hidden id="success_redirect_url"
               value="<?php esc_attr_e(admin_url('admin.php?page=frc-options')); ?>">
        <input type="hidden" hidden id="request_url" value="<?php esc_attr_e(admin_url('admin-ajax.php')); ?>">
        <input type="hidden" hidden id="option_id" value="<?php frc_option_esc_attr_e($option, 'id'); ?>">
	    <?php require_once(plugin_dir_path(__DIR__) . 'views/csrf.php'); ?>
        <table class="form-table">
            <tr>
                <th>配置名称:</th>
                <td><input type="text" size="50" name="collect_name"
                        <?php if (isset($option['collect_name']) && in_array($option['collect_name'], FRC_ApiError::BUTTON_DISABLED)){ esc_attr_e('disabled'); } ?>
                           value="<?php frc_option_esc_attr_e($option, 'collect_name'); ?>" placeholder="我的第一个胖鼠采集规则"/>*
                </td>
            </tr>
            <tr>
                <th>一句话的描述:</th>
                <td><input type="text" size="50" name="collect_describe"
                           value="<?php frc_option_esc_attr_e($option, 'collect_describe'); ?>" placeholder="胖鼠采集, WordPress 最好用的文章采集器"/>
                </td>
            </tr>
            <tr>
                <th>配置类型:</th>
                <td>
                    <input type="radio" name="collect_type" checked
                            <?php if (isset($option['collect_name']) && in_array($option['collect_name'], FRC_ApiError::BUTTON_DISABLED)){ esc_attr_e('disabled'); } ?>
                           value="list" <?php esc_attr_e(isset($option) ? ($option['collect_type'] == 'list' ? 'checked' : '') : ''); ?> >
                    列表采集配置
                    <input type="radio" name="collect_type"
                           value="single" <?php esc_attr_e( isset($option) ? ($option['collect_type'] == 'single' ? 'checked' : '') : ''); ?> >
                    详情采集配置
                    <?php if ($frc_validation_all_collect){ ?>
                    <input type="radio" name="collect_type"
                           value="all" <?php esc_attr_e( isset($option) ? ($option['collect_type'] == 'all' ? 'checked' : '') : ''); ?> >
                    全站采集
                    <p>全站采集: 采集范围处写全站正则, <a href="https://www.fatrat.cn/docs/v2/total-station-collect" target="_blank">参考</a></p>
                    <p>全站采集: 采集规则处不填</p>
                    <?php }?>
                    <p>列表可直接写采集地址. 详情只写规则, 采集地址在使用的时候填写即可.</p>
                </td>
            </tr>
            <?php if (get_option(FRC_Validation::FRC_VALIDATION_RENDERING)) { ?>
            <tr>
                <th>采集方式:</th>
                <td>
                    <input type="radio" name="collect_rendering" checked
                           value="1" <?php esc_attr_e( isset($option) ? ($option['collect_rendering'] == '1' ? 'checked' : '') : ''); ?> >
                    静态渲染
                    <input type="radio" name="collect_rendering"
                           value="2" <?php esc_attr_e( isset($option) ? ($option['collect_rendering'] == '2' ? 'checked' : '') : ''); ?> >
                    动态渲染
                    <p>静态渲染: 普通页面, 动态渲染: ajax页面</p>
                </td>
            </tr>
            <?php } ?>
            <tr>
                <th>编码处理:</th>
                <td>
                    <input type="radio" name="collect_remove_head" checked
                           value="1" <?php esc_attr_e( isset($option) ? ($option['collect_remove_head'] == '1' ? 'checked' : '') : ''); ?> >
                    自动识别(推荐)
                    <input type="radio" name="collect_remove_head"
                           value="2" <?php esc_attr_e( isset($option) ? ($option['collect_remove_head'] == '2' ? 'checked' : '') : ''); ?> >
                    删HEAD(非UTF-8编码推荐)
                    <input type="radio" name="collect_remove_head"
                           value="3" <?php esc_attr_e( isset($option) ? ($option['collect_remove_head'] == '3' ? 'checked' : '') : ''); ?> <?php if (!$frc_validation_sponsorship) { esc_attr_e( 'disabled' ); }?> >
                    <span style="color: #db9925">强制转换(终极方案)</span>

                    <p>此功能用于解决乱码问题,自动识别转码失败你可尝试删HEAD,强制转换,选的不对有可能会取不到数据哦.</p>
                </td>
            </tr>
            <tr>
                <th>图片下载:</th>
                <td>
                    <input type="radio"  name="collect_image_download" value="1" <?php esc_attr_e( isset($option) ? ($option['collect_image_download'] == '1' ? 'checked' : '') : 'checked' );?> >
                    下载到本地(推荐)
                    <input type="radio"  name="collect_image_download" value="2" <?php esc_attr_e( isset($option) ? ($option['collect_image_download'] == '2' ? 'checked' : '') : '' );?> >
                    不下载
                    <input type="radio"  name="collect_image_download" value="3" <?php esc_attr_e( isset($option) ? ($option['collect_image_download'] == '3' ? 'checked' : '') : '' );?> >
                    删除图片
                    <input type="radio"  name="collect_image_download" value="4" <?php esc_attr_e( isset($option) ? ($option['collect_image_download'] == '4' ? 'checked' : '') : '' );?> <?php if (!$frc_validation_sponsorship) { esc_attr_e( 'disabled' ); }?> >
                    <span style="color: #db9925">图片下载不入媒体库</span>
                    <p>「经典速度」  下载到本地: 可安装云存储插件对接云存储</p>
                    <p>「高速采集」  不下载:     使用源站图片路径, 如果源站图片路径是相对路径, 会把地址补全</p>
                    <p>「超超高速采集」删除图片:   删除正文所有<\img > </p>
                    <p>「经典速度」  图片下载不入媒体库: 图片已经下载, 但是不上传到媒体库中「发布文章速度: 超快」 </p>
                </td>
            </tr>
            <tr>
                <th>图片路径:</th>
                <td>
                    <input type="radio"  name="collect_image_path" value="1" <?php esc_attr_e( isset($option) ? ($option['collect_image_path'] == '1' ? 'checked' : '') : 'checked' ); ?> >
                    绝对路径(OSS/云存储必选)
                    <input type="radio"  name="collect_image_path" value="2" <?php esc_attr_e( isset($option) ? ($option['collect_image_path'] == '2' ? 'checked' : '') : '' ); ?> >
                    相对路径(本地存储图片)
                    <p>绝对路径格式: https://www.xxx.com/wp-content/uploads/2020/05/A.jpg</p>
                    <p>相对路径格式: /wp-content/uploads/2020/05/A.jpg</p>
                </td>
            </tr>
<!--            <tr>-->
<!--                <th>去除标签中Css样式/注释:</th>-->
<!--                <td>-->
<!--                    <input type="text" size="82"-->
<!--                           value="--><?php //esc_attr_e( isset($option) ? $option['collect_list_url'] : ''); ?><!--"-->
<!--                           name="collect_list_url"  />*-->
<!--                </td>-->
<!--            </tr>-->
            <tr class="collect_type_radio_change">
                <th>采集地址:</th>
                <td><input type="text" size="82"
                           value="<?php frc_option_esc_attr_e($option, 'collect_list_url'); ?>"
                           name="collect_list_url"  />*
                    <p>小提示: 不清楚下面的规则怎么写? 去试试debug功能吧 ~ </p>
                </td>
            </tr>
            <tr class="collect_type_radio_change">
                <th>分页采集地址:</th>
                <td><input type="text" size="82"
                           value="<?php frc_option_esc_attr_e($option, 'collect_list_url_paging'); ?>"
                           name="collect_list_url_paging"  />
                    <p>把页码的码数替换为 {page} 注: 非列表采集不填</p>
                    <p>例子: https://xx.qq.com/webplat/info/news_version3/154/2233/3889/m2702/list_{page}.shtml</p>
                </td>
            </tr>
            <tr class="collect_type_radio_change">
                <th>采集范围:</th>
                <td><input type="text" size="82"
                           value="<?php frc_option_esc_attr_e($option, 'collect_list_range'); ?>"
                           name="collect_list_range" />*
                    <p>填写Html标签的 class 或者 id (Jquery语法) 采集范围<a href="https://www.fatrat.cn/docs/v2/core-rules" target="_blank">参考</a></p>
                </td>
            </tr>
            <tr class="collect_type_radio_change">
                <th>采集规则:</th>
                <td>
                    &nbsp;&nbsp;&nbsp;<span style="color: #CC6633">规则名&nbsp;&nbsp;- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JQuery选择器 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    &nbsp;&nbsp;&nbsp;- &nbsp;属性 &nbsp; - &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;内容过滤: 空格分割</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a
                            href="http://jquery.cuishifeng.cn/" target='_blank'>Jquery手册</a><br/>
                    <input type="text" size="6" value="<?php esc_attr_e( isset($option) ? $rule_link['a'] : 'link' ); ?>"
                           disabled name="collect_list_rule_link_a"/>-<input type="text" size="20"
                                                                             value="<?php esc_attr_e( isset($option) ? $rule_link['b'] : ''); ?>"
                                                                             name="collect_list_rule_link_b"/>-<input
                            type="text" size="4" value="<?php esc_attr_e( isset($option) ? $rule_link['c'] : ''); ?>"
                            name="collect_list_rule_link_c"/>-<input type="text" size="40"
                                                                     value="<?php esc_attr_e( isset($option) ? $rule_link['d'] : ''); ?>"
                                                                     name="collect_list_rule_link_d"/>*
                    <p>列表页 我们只取详情页的url链接即可</p>
                </td>
            </tr>
            <tr>
                <th>详情页面采集区域:</th>
                <td><input type="text" size="82"
                           value="<?php frc_option_esc_attr_e($option, 'collect_content_range'); ?>"
                           name="collect_content_range"/>*
                    <p>填写Html标签的 class 或者 id (Jquery语法) <a href="https://www.fatrat.cn/docs/v2/core-rules" target="_blank">参考</a></p>
                </td>
            </tr>
            <tr>
                <th>详情页面采集规则:</th>
                <td>
                    &nbsp;&nbsp;&nbsp;<span style="color: #CC6633">规则名&nbsp;&nbsp;- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JQuery选择器 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    &nbsp;&nbsp;&nbsp;- &nbsp;属性 &nbsp; - &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;内容过滤: 空格分割</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a
                            href="http://jquery.cuishifeng.cn/" target='_blank'>Jquery手册</a><br/>
                    <input type="text" size="6"
                           value="<?php esc_attr_e( isset($rule_title['a']) ? $rule_title['a'] : 'title'); ?>" disabled
                           name="collect_content_rule_title_a"/>-<input type="text" size="20"
                                                                        value="<?php esc_attr_e( isset($rule_title['b']) ? $rule_title['b'] : ''); ?>"
                                                                        name="collect_content_rule_title_b"/>-<input
                            type="text" size="4" value="<?php esc_attr_e( isset($rule_title['c']) ? $rule_title['c'] : ''); ?>"
                            name="collect_content_rule_title_c"/>-<input type="text" size="40"
                                                                         value="<?php esc_attr_e( isset($rule_title['d']) ? $rule_title['d'] : ''); ?>"
                                                                         name="collect_content_rule_title_d"/>*
                    <br/>
                    <input type="text" size="6"
                           value="<?php esc_attr_e( isset($rule_content['a']) ? $rule_content['a'] : 'content'); ?>" disabled
                           name="collect_content_rule_content_a"/>-<input type="text" size="20"
                                                                          value="<?php esc_attr_e( isset($rule_content['b']) ? $rule_content['b'] : ''); ?>"
                                                                          name="collect_content_rule_content_b"/>-<input
                            type="text" size="4"
                            value="<?php esc_attr_e( isset($rule_content['c']) ? $rule_content['c'] : ''); ?>"
                            name="collect_content_rule_content_c"/>-<input type="text" size="40"
                                                                           value="<?php esc_attr_e( isset($rule_content['d']) ? $rule_content['d'] : ''); ?>"
                                                                           name="collect_content_rule_content_d"/>*
                    <br/>
                    <input type="text" size="6"
                           value="<?php esc_attr_e( isset($rule_paging['a']) ? $rule_paging['a'] : 'paging'); ?>" disabled
                           name="collect_content_rule_paging_a"/>-<input type="text" size="20" placeholder="a:contains(下一页)"
                                                                          value="<?php esc_attr_e( isset($rule_paging['b']) ? $rule_paging['b'] : ''); ?>"
                                                                          name="collect_content_rule_paging_b"/>-<input
                            type="text" size="4"
                            value="<?php esc_attr_e( isset($rule_paging['c']) ? $rule_paging['c'] : ''); ?>"
                            name="collect_content_rule_paging_c"/>-<input type="text" size="40"
                                                                           value="<?php esc_attr_e( isset($rule_paging['d']) ? $rule_paging['d'] : ''); ?>"
                                                                           name="collect_content_rule_paging_d"/>
                    <p>详情页,我们只拿 Title Content 一片文章岂不是就有了. 其他字段如 日期/作者 回头考虑怎么开放给大家用.. </p>
                    <p>Paging字段为详情页内容分页采集功能, 细节用法参考官网文档</p>
                </td>
            </tr>
            <tr>
                <th>cookie:</th>
                <td>
                    <textarea name="collect_cookie" cols="80" rows="3" placeholder=""><?php if (!empty($option)){ esc_html_e($option['collect_cookie'], ''); } ?></textarea>
                    <p>不需要登陆就可采集的不用填写,cookie可能需要根据不同网站不同需要定时更新。</p>
                </td>
            </tr>
            <tr>
                <th>图片源属性:</th>
                <td>
                    <input type="text" size="82"
                           value="<?php esc_attr_e( isset($option) ? $option['collect_image_attribute'] : 'src'); ?>"
                           name="collect_image_attribute"/>
                    <p>默认即可。某些站点图片是使用 Js 异步加载。此选项用来设置真实图片地址的属性。</p>
                </td>
            </tr>
            <tr>
                <th>内容插入:</th>
                <td>
                    <p style="color: #CC6633">插入文章开头</p>
                    <textarea name="collect_custom_content_head" cols="80" rows="3" placeholder=""><?php if (!empty($custom_content)){ esc_html_e($custom_content['head'], 'Far Rat Collect'); } ?></textarea>
                    <br />
                    <p style="color: #CC6633">插入文章结尾</p>
                    <textarea name="collect_custom_content_foot" cols="80" rows="3" placeholder=""><?php if (!empty($custom_content)){ esc_html_e($custom_content['foot'], 'Far Rat Collect'); } else { esc_html_e('文章来源于互联网:{title+link}', 'Far Rat Collect'); } ?></textarea>
                    <p>可使用的变量: {title} | {link} | {title+link} <a href="https://www.fatrat.cn/docs/v2/variable-expansion" target="_blank">参考</a></p>
                </td>
            </tr>
            <tr>
                <th scope="row">关键词替换</th>
                <td>
                    <textarea name="collect_keywords_replace_rule" cols="80" rows="8" placeholder="在此输入关键词替换规则,可以替换替换标题和内容的数据
例:
苹果=橘子
小蝌蚪=蝌蚪宝宝
妻子=老婆"><?php esc_html_e( isset($option) ? $option['collect_keywords_replace_rule'] : ''); ?></textarea><p>注: 阿拉伯数字1 2 3 和 英文字符 a b c 不可以配置替换. 可能会把内容图片URL替换成错误的. 别乱搞哦</p>
                </td>
            </tr>
            <tr>
                <th scope="row">关键词随机插入</th>
                <td>
                    <textarea name="collect_keywords" cols="80" rows="8" placeholder="[
    {'count':'2', 'title':'胖鼠采集', 'link':'https://www.fatrat.cn'}
]"><?php esc_html_e( isset($option) ? $option['collect_keywords'] : ''); ?></textarea>
                    <p><a href="javascript:" id="keywords_default">默认数据</a> | <a href="http://json.cn/" target="_blank">Json格式效验</a></p>
                </td>
            </tr>
            <tr>
                <th colspan="2"><input class="button button-primary" type="button" id="save-option-button" value="保存"/>
                    <p></p><p>带*号必填且不可错误的</p>
                </th>
            </tr>
        </table>
    </div>
    <?php
}

================================================
FILE: includes/fatrat-options.php
================================================
<?php
/**
 * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.
 * 胖鼠采集 WordPress最好用的采集插件.
 * 如果你觉得这个项目还不错.可以去Github上 Star 关注我.
 * 您可使用胖鼠采集自行二次开发满足您的个性化需求.
 * 请不要Copy, Rename. OR 修改源代码进行售卖获利.
 * Github: https://github.com/fbtopcn/fatratcollect
 * @Author: fbtopcn
 * @CreateTime: 2018年12月30日 02:24
 */

if (!class_exists('WP_List_Table')) {
    require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
}

class FRC_Options
{
    protected $wpdb;
    protected $table_options;


    public function __construct()
    {
        global $wpdb;
        $this->wpdb = $wpdb;
        $this->table_options = $wpdb->prefix . 'frc_options';
    }


    /**
     * @param int $page_number
     * @param int $per_page
     * @param string $customvar
     *
     * @return array
     */
    public function options_paging(int $page_number = 1, int $per_page = 10, string $customvar = 'total'): array
    {
        $sql = "SELECT * FROM $this->table_options";

        if (in_array($customvar, array('list', 'single', 'all'))) {
            $sql = $this->wpdb->prepare("$sql where `collect_type` = '%s'", $customvar);
        }

        if (!empty($_REQUEST['orderby'])) {
            $by = frc_sanitize_text('orderby');
            $sort = !empty($_REQUEST['order']) ? frc_sanitize_text('order') : 'ASC';
            $sql = $this->wpdb->prepare("$sql ORDER BY $by $sort");
        } else {
            $sql .= ' ORDER BY id DESC';
        }

        $sql = $this->wpdb->prepare("$sql LIMIT %d OFFSET %d", (int) $per_page, (int) (($page_number - 1) * $per_page));

        return $this->wpdb->get_results($sql, 'ARRAY_A');
    }


    /**
     * @return array|null|object
     */
    public function options(){
        return $this->wpdb->get_results($this->wpdb->prepare("select * from %i ",$this->table_options),ARRAY_A);
    }


    /**
     * @param int $option_id
     * @return array|null|object|void
     */
    public function option(int $option_id): array
    {
        return $this->wpdb->get_row($this->wpdb->prepare("select * from $this->table_options where `id` = %d", $option_id),ARRAY_A);
    }


    /**
     * @param $id
     * @return false|int
     */
    public function delete($id)
    {
        $re = $this->wpdb->delete(
            $this->table_options, array('id' => $id), array('%d')
        );
        (new FRC_Data())->delete_by_option($id);
        return $re;
    }


    /**
     * @param $name
     * @return array|null|object|void
     */
    public function lazy_person($name){
        $option = $this->option_by_key($name, 'collect_name');
        if (empty($option)){
            // 默认生成基础配置
            $this->insert_option($name);
            $option = $this->option_by_key($name, 'collect_name');
        }

        return $option;
    }

    /**
     * @param $name
     * @param $key
     * @return array|null|object|void
     */
    public function option_by_key($name, $key)
    {
        return  $this->wpdb->get_row($this->wpdb->prepare("SELECT * FROM {$this->table_options} WHERE `{$key}` = '%s'", $name), ARRAY_A );
    }


    /**
     * @param string $customvar
     * @return null|string
     */
    public function record_count(string $customvar = 'total')
    {
        $sql = "SELECT COUNT(*) FROM $this->table_options";
        if (in_array($customvar, array('list', 'single', 'all', 'keyword'))) {
            $sql = $this->wpdb->prepare("$sql where collect_type = %s", $customvar);
        }

        return $this->wpdb->get_var($sql);
    }



    /**
     * @param $name
     * @return array|null|object|void
     */
    public function insert_option($name)
    {
        $date = current_time('mysql');
        if ($name == '微信'){
            $sql = "INSERT INTO `{$this->table_options}` SET `collect_name` = '微信', `collect_describe` = '胖鼠采集. WordPress 最好用的采集小插件. ', `collect_type` = 'single', `collect_image_attribute` = 'data-src', `collect_content_range` = '#img-content',  `collect_content_rules` = 'title%#activity-name|text|null)(content%#js_content|html|null)(author%#js_author_name|text|null)(name%#js_name|text|null', `created_at` = '{$date}', `updated_at` = '{$date}'";
        } elseif ($name == '简书'){
            $sql = "INSERT INTO `{$this->table_options}` SET `collect_name` = '简书', `collect_describe` = '胖鼠采集. WordPress 最好用的采集小插件. ', `collect_type` = 'single', `collect_image_attribute` = 'data-original-src', `collect_content_range` = 'body',  `collect_content_rules` = 'title%h1:first|text|null)(content%article|html|a', `created_at` = '{$date}', `updated_at` = '{$date}'";
        }  elseif ($name == '知乎'){
            $sql = "INSERT INTO `{$this->table_options}` SET `collect_name` = '知乎', `collect_describe` = '胖鼠采集. WordPress 最好用的采集小插件. ', `collect_type` = 'single', `collect_image_attribute` = 'data-actualsrc', `collect_content_range` = '.App-main',  `collect_content_rules` = 'title%.QuestionHeader-title|text|null)(content%.RichContent-inner|html|a -.LinkCard-content', `created_at` = '{$date}', `updated_at` = '{$date}'";
        } else {
            return ;
        }

        return $this->wpdb->query($sql);
    }


    /**
     * @return array
     */
    public function interface_save_option(){

        if (!get_option(FRC_Validation::FRC_VALIDATION_SPONSORSHIP)){
            if (count($this->options()) > 5){
                return ['code' => FRC_ApiError::FAIL, 'msg' => FRC_Validation::FRC_HINT_Z];
            }
        }

        $option_id                  = frc_sanitize_text('option_id', null);
        $collect_name               = frc_sanitize_text('collect_name');
        $collect_describe           = frc_sanitize_text('collect_describe', '胖鼠采集, Wordpress最好用的采集神器.');
        $collect_type               = frc_sanitize_text('collect_type', 'list');
        $collect_cookie             = frc_sanitize_text('collect_cookie', '');
        $collect_rendering          = (int) frc_sanitize_text('collect_rendering', 1);
        $collect_image_download     = (int) frc_sanitize_text('collect_image_download', 1);
        $collect_image_path         = (int) frc_sanitize_text('collect_image_path', 1);
        $collect_remove_head        = (int) frc_sanitize_text('collect_remove_head', 1);
        $collect_list_url           = frc_sanitize_text('collect_list_url');
        $collect_list_url_paging    = frc_sanitize_text('collect_list_url_paging');
        $collect_list_range         = frc_sanitize_text('collect_list_range');
        $collect_list_rules         = frc_sanitize_text('collect_list_rules');
        $collect_content_range      = frc_sanitize_text('collect_content_range');
        $collect_content_rules      = frc_sanitize_text('collect_content_rules');
        $collect_image_attribute    = frc_sanitize_text('collect_image_attribute', 'src');
        $collect_custom_content_head = frc_sanitize_textarea('collect_custom_content_head');
        $collect_custom_content_foot = frc_sanitize_textarea('collect_custom_content_foot');
        $collect_keywords_replace_rule = frc_sanitize_text('collect_keywords_replace_rule');
        $collect_keywords = frc_sanitize_textarea('collect_keywords', '');

        if ($collect_name == ''){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '给你的配置写个名字吧, 着啥急'];
        }
        if ($collect_type == 'list'){
            if ($collect_list_url == ''){
                return ['code' => FRC_ApiError::FAIL, 'msg' => '请填写采集地址.'];
            }
            if (empty($collect_list_range) || empty($collect_list_rules)){
                return ['code' => FRC_ApiError::FAIL, 'msg' => '列表采集范围/采集规则为空.'];
            }
        }
        if (empty($collect_content_range) || empty($collect_content_rules)){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '详情采集范围/采集规则为空.'];
        }

        if ($collect_keywords != ''){
            $collect_keywords = str_replace('\"', '"', htmlspecialchars_decode($collect_keywords, ENT_QUOTES));
            if (!json_decode($collect_keywords)){
                return ['code' => FRC_ApiError::FAIL, 'msg' => '关键词随机插入Json错误'];
            }
        }

        $params = [
            'collect_name' => $collect_name,
            'collect_describe' => $collect_describe,
            'collect_type' => $collect_type,
            'collect_cookie'=>$collect_cookie,
            'collect_rendering' => $collect_rendering,
            'collect_image_download' => $collect_image_download,
            'collect_image_path' => $collect_image_path,
            'collect_remove_head' => $collect_remove_head,
            'collect_list_url' => $collect_list_url,
            'collect_list_url_paging' => $collect_list_url_paging,
            'collect_list_range' => $collect_list_range,
            'collect_list_rules' => $collect_list_rules,
            'collect_content_range' => $collect_content_range,
            'collect_content_rules' => $collect_content_rules,
            'collect_image_attribute' => $collect_image_attribute,
            'collect_custom_content' => json_encode(['head' => $collect_custom_content_head, 'foot' => $collect_custom_content_foot]),
            'collect_keywords_replace_rule' => $collect_keywords_replace_rule,
            'collect_keywords' => $collect_keywords,
            'created_at' => current_time('mysql'),
            'updated_at' => current_time('mysql'),
        ];

        // Tips: 优化掉
        if (in_array($collect_name, FRC_ApiError::BUTTON_DISABLED)){
            // add author name variable
            if ($collect_name == '微信'){
                $params['collect_content_rules'] = $params['collect_content_rules'].')(author%#js_author_name|text|null)(name%#js_name|text|null';
            } elseif ($collect_name == '简书'){
                $params['collect_content_rules'] = $params['collect_content_rules'].')(author%span[class=name]|text|null';
            }
        }

        if ($option_id === null){
            if (in_array($collect_name, FRC_ApiError::BUTTON_DISABLED)){
                return ['code' => FRC_ApiError::FAIL, 'msg' => '不可使用这个配置名称!'];
            }
            if ($this->wpdb->insert($this->table_options, $params)) {
                return ['code' => FRC_ApiError::SUCCESS, 'msg' => 'Creating Success.'];
            } else {
	            $error = $this->wpdb->last_error;
                return ['code' => FRC_ApiError::FAIL, 'msg' => 'Creating error. ' . $error];
            }
        }
        if (false !== $this->wpdb->update($this->table_options, $params, ['id' => $option_id], ['%s', '%s'], ['%d'])) {
            return ['code' => FRC_ApiError::SUCCESS, 'msg' => ' Update Success.'];
        } else {
	        $error = $this->wpdb->last_error;
            return ['code' => FRC_ApiError::FAIL, 'msg' => 'Update error. ' . $error];
        }

    }


    /**
     * @return array
     */
    public function interface_save_option_release(){

        $option_id = frc_sanitize_text('option_id', null);

        if (!$option_id){
            return ['code' => FRC_ApiError::SUCCESS, 'msg' => 'option id error.'];
        }

        $msg = '保存完成.';
        if (get_option(FRC_Validation::FRC_VALIDATION_RELEASE_CONTROL)){
            $params = [
                'category' => frc_sanitize_array('release_category', 'integer'),
                'user' => frc_sanitize_array('release_user', 'integer'),
                'status' => frc_sanitize_text('release_status', 'pending'),
                'type' => frc_sanitize_text('release_type', 'post'),
                'thumbnail' => frc_sanitize_text('release_thumbnail', 'thumbnail1'),
                'release_type' => frc_sanitize_text('release_type', 'WordPress'),
                'extension_field' => frc_sanitize_text('extension_field', 'post'),
            ];

            if (empty($params['category'])){
                $params['category'] = array(1);
            }

            if (empty($params['user'])){
                $params['user'] = [get_current_user_id()];
            }
        } else {
            $msg = FRC_Validation::FRC_HINT_L;
            $params = [
                'category' => array(1),
                'user' => [get_current_user_id()],
                'status' => frc_sanitize_text('release_status', 'pending'),
                'thumbnail' => 'thumbnail2',
                'release_type' => 'WordPress',
                'type' => 'post',
                'extension_field' => 'post',
            ];
        }

        $result = $this->wpdb->update($this->table_options,
            ['collect_release' => json_encode($params)],
            ['id' => $option_id],
            ['%s', '%s'],
            ['%d']
        );

        return ['code' => FRC_ApiError::SUCCESS, 'msg' => $msg, 'data' => $result];
    }


    /**
     * @return array
     */
    public function interface_import_default_configuration(){

        $default_configurations = collect([
            [
                'collect_name' => '胖鼠采集-御龙在天',
                'collect_describe' => '列表采集规则, 页面编码GBK 小提示 如果class有两个属性,选一个唯一的即可 | ul li 中间还可以加空格哦知道什么意思吗?',
                'collect_type' => 'list',
                'collect_list_url' => 'https://yl.qq.com/webplat/info/news_version3/118/430/m279/list_1.shtml',
                'collect_list_url_paging' => 'https://yl.qq.com/webplat/info/news_version3/118/430/m279/list_{page}.shtml',
                'collect_list_range' => '.news_list ul li',
                'collect_list_rules' => 'link%a:eq(1)|href|null',
                'collect_content_range' => '.center_part',
                'collect_content_rules' => 'title%.news_h2|text|null)(content%.news_content|html|null',
                'collect_image_attribute' => 'src',
                'collect_remove_head' => '2',
                'collect_charset' => 'gbk',
                'collect_custom_content' => '{"head":"","foot":""}',
                'created_at' => current_time('mysql'),
                'updated_at' => current_time('mysql'),
            ],
            [
                'collect_name' => '胖鼠采集-寻仙',
                'collect_describe' => '列表采集规则, 页面编码GBK, 曾经玩过这个游戏至今念念不忘. 小提示 仔细看配置 选择元素第二个a标签用 eq 语法',
                'collect_type' => 'list',
                'collect_list_url' => 'https://xx.qq.com/webplat/info/news_version3/154/2233/3889/m2702/list_1.shtml',
                'collect_list_url_paging' => 'https://xx.qq.com/webplat/info/news_version3/154/2233/3889/m2702/list_{page}.shtml',
                'collect_list_range' => '.down-nr>ul>li',
                'collect_list_rules' => 'link%a:eq(1)|href|null',
                'collect_content_range' => '.sub-cont',
                'collect_content_rules' => 'title%.n_title|text|null)(content%.sub-nr|html|null',
                'collect_image_attribute' => 'src',
                'collect_remove_head' => '3',
                'collect_charset' => 'gbk',
                'collect_custom_content' => '{"head":"","foot":""}',
                'created_at' => current_time('mysql'),
                'updated_at' => current_time('mysql'),
            ],
            [
                'collect_name' => '胖鼠采集-虎扑',
                'collect_describe' => '地址: https://voice.hupu.com/sports',
                'collect_type' => 'single',
                'collect_content_range' => '.voice-main',
                'collect_content_rules' => 'title%.artical-title>h1|text|null)(content%.artical-content|html|null',
                'collect_image_attribute' => 'src',
                'collect_remove_head' => '1',
                'collect_charset' => 'utf-8',
                'collect_custom_content' => '{"head":"","foot":""}',
                'created_at' => current_time('mysql'),
                'updated_at' => current_time('mysql'),
            ],
            [
                'collect_name' => '胖鼠采集-直播8',
                'collect_describe' => '地址: https://news.zhibo8.cc/nba/more.htm',
                'collect_type' => 'single',
                'collect_content_range' => '#main',
                'collect_content_rules' => 'title%h1|text|null)(content%div[class=content]|html|null',
                'collect_image_attribute' => 'src',
                'collect_remove_head' => '1',
                'collect_charset' => 'utf-8',
                'collect_custom_content' => '{"head":"","foot":""}',
                'created_at' => current_time('mysql'),
                'updated_at' => current_time('mysql'),
            ],
            [
                'collect_name' => '胖鼠采集-小故事',
                'collect_describe' => '内容分页采集例子 http://www.xigushi.com/aqgs/3262.html',
                'collect_type' => 'single',
                'collect_content_range' => '.by',
                'collect_content_rules' => 'title%h1|text|null)(content%dl>dd>p|html|a)(paging%.page a:contains(下一页)|href|null',
                'collect_image_attribute' => 'src',
                'collect_remove_head' => '2',
                'collect_charset' => 'utf-8',
                'collect_custom_content' => '{"head":"","foot":""}',
                'created_at' => current_time('mysql'),
                'updated_at' => current_time('mysql'),
            ],
        ]);

        $default_configurations->map(function($default_config){
            if (!$this->wpdb->get_row(
                $this->wpdb->prepare("SELECT * FROM $this->table_options WHERE `collect_name` = %s limit 1", $default_config['collect_name'])
                , ARRAY_A
            )){
                $this->wpdb->insert($this->table_options, $default_config, ['%s', '%s']);
            }
        });

        return ['code' => FRC_ApiError::SUCCESS, 'msg' => '完成, 快来走进胖鼠采集的世界吧. '];
    }


    /**
     * @return array
     */
    public function interface_del_option(){

        if(!current_user_can( 'manage_options' )){
            wp_send_json(['code' => 5006, 'msg' => FRC_Validation::FRC_HINT_M]);
            wp_die();
        }

        $option_id = frc_sanitize_text('option_id', null);
        if (empty($option_id)){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '配置ID错误'];
        }

        return ['code' => FRC_ApiError::SUCCESS, 'msg' => '删除成功', 'data' => $this->delete($option_id)];
    }


    /**
     * @return array
     */
    public function interface_upgrade(){
        if ('upgrade complete' == get_option('frc_mysql_upgrade')){
            return ['code' => FRC_ApiError::SUCCESS, 'msg' => '升级完成'];
        }

        $progress = frc_sanitize_text('progress');
        if ($progress == '1'){
            $former_table_options = $this->wpdb->prefix . 'fr_options';
            $res = $this->wpdb->get_results("SHOW TABLES LIKE '%{$former_table_options}%'");
            if (empty($res)){
                update_option('frc_mysql_upgrade', '2');
                return ['code' => FRC_ApiError::SUCCESS, 'msg' => '配置表升级完成.'];
            }

            $data = $this->wpdb->get_results("select * from $former_table_options", ARRAY_A);
            foreach ($data as $option){

                $params = [
                    'id' => $option['id'],
                    'collect_name' => $option['collect_name'],
                    'collect_describe' => $option['collect_describe'],
                    'collect_type' => $option['collect_type'],
                    'collect_cookie' => $option['collect_cookie'],
                    'collect_rendering' => 1,
                    'collect_image_download' => $option['collect_image_download'],
                    'collect_image_path' => $option['collect_image_path'],
                    'collect_remove_head' => ($option['collect_remove_head'] == 0) ? 1 : 2,
                    'collect_list_url' => $option['collect_list_url'],
                    'collect_list_url_paging' => '',
                    'collect_list_range' => $option['collect_list_range'],
                    'collect_list_rules' => $option['collect_list_rules'],
                    'collect_content_range' => $option['collect_content_range'],
                    'collect_content_rules' => $option['collect_content_rules'],
                    'collect_image_attribute' => $option['collect_image_attribute'],
                    'collect_custom_content' => $option['collect_custom_content'],
                    'collect_keywords_replace_rule' => $option['collect_keywords_replace_rule'],
                    'collect_charset' => $option['collect_charset'],
                    'created_at' => $option['created'],
                    'updated_at' => $option['created'],
                ];

                $this->wpdb->insert($this->table_options, $params);
            }

            update_option('frc_mysql_upgrade', '2');
            //$this->wpdb->query( "DROP TABLE IF EXISTS $former_table_options" );
            return ['code' => FRC_ApiError::SUCCESS, 'msg' => '配置系统、升级完成.'];
        }
        if ($progress == '2'){
            $former_table_post = $this->wpdb->prefix . 'fr_post';
            $res = $this->wpdb->get_results("SHOW TABLES LIKE '%{$former_table_post}%'");
            if (empty($res)){
                update_option('frc_mysql_upgrade', 'upgrade complete');
                return ['code' => FRC_ApiError::SUCCESS, 'msg' => '升级完成.'];
            }

            try{
                $last_id = get_option('frc_mysql_upgrade_progress', 0);
                $data = $this->wpdb->get_results($this->wpdb->prepare("select `id`, `title`, `content`, `image`, `post_type`, `link`, `post_id`, `is_post`, `created`  from $former_table_post where id > %d limit 500", $last_id), ARRAY_A);
                if (empty($data)){
                    delete_option('frc_mysql_upgrade_progress');
                    update_option('frc_mysql_upgrade', 'upgrade complete');
                    //$this->wpdb->query( "DROP TABLE IF EXISTS $former_table_post" );
                    return ['code' => FRC_ApiError::SUCCESS, 'msg' => '数据系统,升级完成.'];
                }

                foreach ($data as $post){
                    $params = [
                        'id' => $post['id'],
                        'option_id' => $post['post_type'],
                        'status' => ($post['is_post'] == 0) ? 2 : 3,
                        'title' => $post['title'],
                        'cover' => $post['image'],
                        'content' => $post['content'],
                        'link' => $post['link'],
                        'post_id' => $post['post_id'],
                        'message' => 'migration data.',
                        'created_at' => $post['created'],
                        'updated_at' => $post['created'],
                    ];

                    try{
                        $this->wpdb->replace($this->wpdb->prefix.'frc_post', $params);
                    } catch (Exception $e){
                    }

                }

                $last_id = update_option('frc_mysql_upgrade_progress', end($data)['id']);
                return ['code' => FRC_ApiError::SUCCESS, 'msg' => '数据系统,分段升级进行中, 分段升级市为避免大数据量鼠升级失败提供的, 目前已经升级进度'.$last_id.'条, 请继续点击红色按钮进行下一段升级'];

            } catch (Exception $e) {
                return ['code' => FRC_ApiError::SUCCESS, 'msg' => '异常,数据导入失败.'];
            }
        }

        return ['code' => FRC_ApiError::SUCCESS, 'msg' => '升级完成'];
    }


    /**
     * @return array
     */
    public function interface_update_auto_config(){
        $option = frc_sanitize_text('option');
        $value = frc_sanitize_text('value');

        if (empty($option)){
            return ['code' => FRC_ApiError::FAIL, 'msg' => 'Operation Key Error!'];
        }
        if (!strstr($option, 'frc_')){
            return ['code' => FRC_ApiError::FAIL, 'msg' => 'Off the white list.'];
        }

        $data = update_option($option, $value);
        wp_clear_scheduled_hook($option.'_hook');
        return ['code' => FRC_ApiError::SUCCESS, 'msg' => '设置完成.', 'data' => $data];
    }
}

class FRC_Configuration_List_Table extends WP_List_Table
{
    /**
     * Retrieve snippets data from the database
     *
     * @param int $per_page
     * @param int $page_number
     *
     * @return mixed
     */
    public static function get_snippets($per_page = 10, $page_number = 1, $customvar = 'total')
    {
        $model = new FRC_Options();
        $result = $model->options_paging($page_number, $per_page, $customvar);
        return collect($result)->map(function ($data){
            $data['collect_auto_collect'] = '完善中';
            $data['collect_auto_release'] = '完善中';
            return $data;
        });
    }

    /**
     * Delete a snipppet record.
     * @param $id
     * @return false|int
     */
    public function delete_snippet($id)
    {
        $model = new FRC_Options();
        return $model->delete($id);
    }

    /**
     * Activate a snipppet record.
     *
     * @param int $id snippet ID
     */
    public static function activate_snippet($id)
    {

    }

    /**
     * Deactivate a snipppet record.
     *
     * @param int $id snippet ID
     */
    public static function deactivate_snippet($id)
    {

    }

    /**
     * Returns the count of records in the database.
     *
     * @return null|string
     */
    public static function record_count($customvar = 'total')
    {
        $model = new FRC_Options();
        return $model->record_count($customvar);
    }

    /** Text displayed when no snippet data is available */
    public function no_items()
    {
        esc_html_e('配置空空的, 请创建采集配置开始旅程吧, 如果你快速认识胖鼠, 可以使用上面一键导入默认配置来学习.', 'Fat Rat Collect');
    }

    /**
     * Render a column when no column specific method exist.
     *
     * @param array $item
     * @param string $column_name
     *
     * @return mixed
     */
    public function column_default($item, $column_name)
    {
        switch ($column_name) {
            case 'collect_image_download' :
                switch ($item[$column_name]){
                    case '1':
                        return esc_html('下载到本地');
                        break;
                    case '2':
                        return esc_html('不下载');
                        break;
                    case '3':
                        return esc_html('清除所有图片');
                        break;
                }
                break;
            case 'collect_image_path' :
                switch ($item[$column_name]){
                    case '1':
                        return esc_html('绝对路径');
                        break;
                    case '2':
                        return esc_html('相对路径');
                        break;
                }
            case 'collect_list_url' :
                return sprintf("<a href='%s' target='_blank'>%s</a>", $item[$column_name], $item[$column_name]);
                break;
            case 'collect_describe':
                return esc_html(mb_substr($item[$column_name], 0, 30) . ' ...');
                break;
            case 'collect_type' :
                switch ($item[$column_name]){
                    case 'list':
                        return esc_html('列表采集');
                        break;
                    case 'single':
                        return esc_html('详情采集');
                        break;
                    case 'all':
                        return esc_html('全站采集');
                        break;
                    case 'keyword':
                        return esc_html('关键字采集');
                        break;
                }
                break;
            case 'collect_name':
                $title = '<strong>' . $item['collect_name'] . '</strong>';
                $actions = array(
                    '修改' => sprintf("<a href='%s'>%s</a>", admin_url('admin.php?page=frc-options-add-edit&option_id=' . $item['id']), esc_html__('修改', 'Fat Rat Collect')),
                    '删除' => sprintf("<a href='javascript:;'><span class='delete-option-button' data-value='%s'>%s</span></a>", $item['id'], esc_html__('删除', 'Fat Rat Collect')),
                );
                return $title . $this->row_actions( $actions );
                break;
            case 'collect_keywords_replace_rule' :
                return esc_html('... 点击查看');
                break;
            default:
                return esc_html($item[$column_name]);
                break;
        }
    }

    /**
     * Render the bulk edit checkbox
     *
     * @param array $item
     *
     * @return string
     */
    function column_cb($item)
    {
        return sprintf(
            '<input type="checkbox" name="snippets[]" value="%s" />', $item['id']
        );
    }

    /**
     * Method for name column
     *
     * @param array $item an array of DB data
     *
     * @return string
     */
    function column_name($item)
    {

    }

    /**
     *  Associative array of columns
     *
     * @return array
     */
    function get_columns()
    {
        $columns = array(
            'cb' => '<input type="checkbox" />',
            'id' => esc_html__('ID', 'Fat Rat Collect'),
            'collect_name' => esc_html__('配置名称', 'Fat Rat Collect'),
            'collect_describe' => esc_html__('配置描述', 'Fat Rat Collect'),
            'collect_type' => esc_html__('采集类型', 'Fat Rat Collect'),
            'collect_list_url' => esc_html__('采集地址', 'Fat Rat Collect'),
//            'collect_auto_collect' => esc_html__('自动采集', 'Fat Rat Collect'),
//            'collect_auto_release' => esc_html__('自动发布', 'Fat Rat Collect'),
            'collect_list_url' => esc_html__('采集地址', 'Fat Rat Collect'),
            'collect_image_download' => esc_html__('下载图片', 'Fat Rat Collect'),
            'collect_image_path' => esc_html__('图片使用路径', 'Fat Rat Collect'),
            'collect_image_attribute' => esc_html__('目标图片源属性', 'Fat Rat Collect'),
            'created_at' => esc_html__('创建时间', 'Fat Rat Collect'),
        );

        return $columns;
    }

    /**
     * Columns to make sortable.
     *
     * @return array
     */
    public function get_sortable_columns()
    {

        return array(
            'id' => array('id', false),
        );
    }

    /**
     * Returns an associative array containing the bulk action
     *
     * @return array
     */
    public function get_bulk_actions()
    {

        return array(
            'bulk-todo' => esc_html__('敬请期待', 'Fat Rat Collect'),
//            'bulk-start-collect' => esc_html__('开启自动采集', 'Fat Rat Collect'),
//            'bulk-stop-collect' => esc_html__('关闭自动采集', 'Fat Rat Collect'),
//            'bulk-start-release' => esc_html__('开启自动采集', 'Fat Rat Collect'),
//            'bulk-stop-release' => esc_html__('关闭自动采集', 'Fat Rat Collect'),
        );
    }

    /**
     * Handles data query and filter, sorting, and pagination.
     */
    public function prepare_items()
    {

        $columns = $this->get_columns();
        $hidden = array();
        $sortable = $this->get_sortable_columns();

        //Retrieve $customvar for use in query to get items.
        $customvar = frc_sanitize_text('customvar', 'total');
        $this->_column_headers = array($columns, $hidden, $sortable);

        /** Process bulk action */
        $this->process_bulk_action();
        $this->views();
        $per_page = $this->get_items_per_page('snippets_per_page', 10);
        $current_page = $this->get_pagenum();
        $total_items = self::record_count();

        $this->set_pagination_args(array(
            'total_items' => $total_items,
            'per_page' => $per_page,
        ));

        $this->items = self::get_snippets($per_page, $current_page, $customvar);
    }

	public function get_views()
	{
		$views = array();
		$current = frc_sanitize_text('customvar', 'total'); // 假设这里的 `frc_sanitize_text` 已确保安全

		// 总计
		$class = 'total' === $current ? ' class="current"' : '';
		$total_url = esc_url(remove_query_arg('customvar')); // 转义 URL
		$views['total'] = sprintf(
			'<a href="%s"%s>%s (%d)</a>',
			$total_url,
			esc_attr($class),
			esc_html__('全部配置', 'Fat Rat Collect'),
			$this->record_count()
		);

		// 列表采集
		$foo_url = esc_url(add_query_arg('customvar', 'list')); // 转义 URL
		$class = ('list' === $current ? ' class="current"' : '');
		$views['list'] = sprintf(
			'<a href="%s"%s>%s (%d)</a>',
			$foo_url,
			esc_attr($class),
			esc_html__('列表采集', 'Fat Rat Collect'),
			$this->record_count('list')
		);

		// 详情采集
		$bar_url = esc_url(add_query_arg('customvar', 'single')); // 转义 URL
		$class = ('single' === $current ? ' class="current"' : '');
		$views['single'] = sprintf(
			'<a href="%s"%s>%s (%d)</a>',
			$bar_url,
			esc_attr($class),
			esc_html__('详情采集', 'Fat Rat Collect'),
			$this->record_count('single')
		);

		// 全站采集(可选)
		if (get_option(FRC_Validation::FRC_VALIDATION_ALL_COLLECT)) {
			$all_url = esc_url(add_query_arg('customvar', 'all')); // 转义 URL
			$class = ('all' === $current ? ' class="current"' : '');
			$views['all'] = sprintf(
				'<a href="%s"%s>%s (%d)</a>',
				$all_url,
				esc_attr($class),
				esc_html__('全站采集', 'Fat Rat Collect'),
				$this->record_count('all')
			);
		}

		return $views;
	}

	public function process_bulk_action()
    {
        // If the delete bulk action is triggered
        if (
            ( isset( $_POST['action'] ) && 'bulk-delete' === $_POST['action'] ) ||
            ( isset( $_POST['action2'] ) && 'bulk-delete' === $_POST['action2'] )
        ) {
//            $delete_ids = esc_sql( $_POST['snippets'] );
//
//            // loop over the array of record IDs and delete them
//            foreach ( $delete_ids as $id ) {
//                $this->delete_snippet( $id );
//            }
//
//            return;
        }
    }
}


function frc_options()
{
    $snippet_obj = new FRC_Configuration_List_Table();
    ?>
    <div class="wrap">
        <h1><?php esc_html_e( '配置中心', 'Fat Rat Collect' ) ?>
            <?php if (!empty(get_option(FRC_Validation::FRC_VALIDATION_SPONSORSHIP))) { ?>
                <img width="20" src="<?php frc_image('fat-rat-nav-v-yellow.png') ?>" />
            <?php } ?>
            <a href="<?php esc_attr_e(admin_url( 'admin.php?page=frc-options-add-edit' )); ?>" class="page-title-action"><?php _e( '新建采集配置', 'Fat Rat Collect' ) ?></a>
            <a href="javascript:" class="page-title-action import_default_configuration"><?php _e( '演示例子', 'Fat Rat Collect' ) ?></a>
        </h1>
        <div><span style="color: #ff3d00;"><?php _e(((new FRC_Validation())->announcement('notice-options'))); ?></span></div>
        <input type="hidden" hidden id="success_redirect_url"
               value="<?php esc_attr_e(admin_url('admin.php?page=frc-options')); ?>">

        <form method="post">
            <input type="hidden" hidden id="request_url" value="<?php esc_attr_e(admin_url('admin-ajax.php')); ?>">
	        <?php require_once(plugin_dir_path(__DIR__) . 'views/csrf.php'); ?>
            <?php
            $snippet_obj->prepare_items();
            $snippet_obj->display();
            ?>
        </form>

    </div>
    <?php
}



================================================
FILE: includes/fatrat-spider.php
================================================
<?php
/**
 * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.
 * 胖鼠采集 WordPress最好用的采集插件.
 * 如果你觉得这个项目还不错.可以去Github上 Star 关注我.
 * 您可使用胖鼠采集自行二次开发满足您的个性化需求.
 * 请不要Copy, Rename. OR 修改源代码进行售卖获利.
 * Github: https://github.com/fbtopcn/fatratcollect
 * @Author: FatRat
 * @CreateTime: 2018年12月30日 02:24
 */

if (!class_exists('AbsoluteUrl')) {
    require_once(plugin_dir_path(__DIR__) . 'src/Service/AbsoluteUrl.php');
}
if (!class_exists('DownloadImage')) {
    require_once(plugin_dir_path(__DIR__) . 'src/Service/DownloadImage.php');
}
if (!class_exists('GetTransCoding')) {
    require_once(plugin_dir_path(__DIR__) . 'src/Service/GetTransCoding.php');
}

use Nesk\Rialto\Data\JsFunction;
use QL\Ext\AbsoluteUrl;
use QL\Ext\Chrome;
use QL\Ext\DownloadImage;
use QL\Ext\GetTransCoding;
use QL\QueryList;

class FRC_Spider
{
    protected $wpdb;
    protected $table_post;

    public function __construct()
    {
        global $wpdb;
        $this->wpdb = $wpdb;
        $this->table_post = $wpdb->prefix . 'frc_post';
    }


    /**
     * 懒人采集
     * @return array
     */
    public function grab_custom_page(){
        $urls = frc_sanitize_text('collect_urls');
        $name = frc_sanitize_text('collect_name');

        if (empty($urls)){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '链接不能为空'];
        }
        if (empty($name) || !in_array($name, ['wx', 'js', 'zh'])){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '链接不能为空'];
        }

        switch ($name){
            case 'wx':
                $name = '微信';
                $urls = $this->wx_url_format($urls);
                break;
            case 'js':
                $name = '简书';
                break;
            case 'zh':
                $name = '知乎';
                break;
        }

        $options = new FRC_Options();
        $option = $options->lazy_person($name);

        return $this->response(FRC_ApiError::SUCCESS, $this->single_spider($option, $urls), $name .'数据处理完成, F12可查看单条数据具体采集结果喔');
    }

    private function wx_url_format($urls){
        $urls = explode(' ', $urls);
        foreach ($urls as &$url){
            $i = strpos($url, '&chksm');
            if ($i === false){
                continue;
            }
            $url = substr($url, 0, $i);
        }

        return join(' ', $urls);
    }

    /**
     * 抓取详情
     * @return array
     */
    public function grab_details_page(){
        $urls       = frc_sanitize_text('collect_details_urls');
        $option_id  = frc_sanitize_text('collect_details_relus', 0);
        if (empty($urls)){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '链接不能为空'];
        }
        if (empty($option_id)){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '请选择一个有效的详情配置'];
        }
        $options = new FRC_Options();
        $option = $options->option($option_id);
        if (!$option) {
            return ['code' => FRC_ApiError::FAIL, 'msg' => '未查询到配置, 配置ID错误'];
        }

        return $this->response(FRC_ApiError::SUCCESS, $this->single_spider($option, $urls));
    }


    /**
     * 列表采集
     * @return array
     */
    public function grab_list_page()
    {
        $option_id = frc_sanitize_text('option_id', 0);

        $options = new FRC_Options();
        $option = $options->option($option_id);
        if (!$option) {
            return ['code' => FRC_ApiError::FAIL, 'msg' => '未查询到配置, 配置ID错误'];
        }

        $config = new stdClass();
        $config->url = $option['collect_list_url'];
        $config->range = $option['collect_list_range'];
        $config->rules = $this->rulesFormat($option['collect_list_rules']);
        $config->rendering = $option['collect_rendering'];
        $config->remove_head = $option['collect_remove_head'];
        $config->image_download = $option['collect_image_download'];
        $config->image_path = $option['collect_image_path'];
        $config->src = $option['collect_image_attribute'];
        isset($option["collect_cookie"]) && $config->cookie = $option["collect_cookie"];

        $articles = $this->_QlObject($config)->absoluteUrl($config)->query(function($item) use ($option, $config) {
            if ($this->checkPostLink($item['link'])){
                return $this->format($item, '已滤重');
            }

            $config->url = $item['link'];
            $config->range = $option['collect_content_range'];
            $config->rules = $this->rulesFormat($option['collect_content_rules']);
            $detail = $this->_QlObject($config)->absoluteUrl($config)->downloadImage($config)->special($config)->query()->getDataAndRelease();
            $detail = array_merge($item, empty($detail)?[]:current($detail));
            $this->paging($detail, $config);
            return $this->insert_article($detail, $option);
        })->getDataAndRelease();

        return $this->response(FRC_ApiError::SUCCESS, $articles, '列表采集完成');
    }


    /**
     * 历史(分页)页面
     */
    public function grab_history_page()
    {
        $history_page_number    = frc_sanitize_text('collect_history_page_number');
        $option_id              = frc_sanitize_text('collect_history_relus_id', null);
        if ($option_id === null){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '请选择一个配置'];
        }
        $options = new FRC_Options();
        $option = $options->option($option_id);
        if (!$option) {
            return ['code' => FRC_ApiError::FAIL, 'msg' => '请选择一个有效的配置, 配置异常'];
        }

        if (empty($history_page_number)){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '请填写页码/翻页'];
        }

        if (empty($option['collect_list_url_paging'])){
            return ['code' => FRC_ApiError::FAIL, 'msg' => '请配置分页采集地址'];
        }

        if ($option['collect_rendering'] == 1){

            if (!strstr($option['collect_list_url_paging'], '{page}')){
                return ['code' => FRC_ApiError::FAIL, 'msg' => 'URL不正确。未包含 {page} 关键字 or URL不能为空'];
            }

            $page_count = explode('-', $history_page_number);
            $page_count = count($page_count) == 2 ? range($page_count[0], $page_count[1]) : [(int)$page_count[0]];

            if (!get_option(FRC_Validation::FRC_VALIDATION_SPONSORSHIP) && count($page_count) > 3){
                return ['code' => FRC_ApiError::FAIL, 'msg' => FRC_Validation::FRC_HINT_F];
            }

            $articles = collect($page_count)->map(function($digital) use ($option){
                $config = new stdClass();
                $config->url = $option['collect_list_url_paging'];
                $config->range = $option['collect_list_range'];
                $config->rules = $this->rulesFormat($option['collect_list_rules']);
                $config->rendering = $option['collect_rendering'];
                $config->remove_head = $option['collect_remove_head'];
                $config->image_download = $option['collect_image_download'];
                $config->image_path = $option['collect_image_path'];
                $config->src = $option['collect_image_attribute'];
                $config->pn = $digital;

                $result['url'] = str_replace('{page}', $config->pn, $config->url);
                $article = $this->_QlPagingObject($config)->absoluteUrl($config)->query(function($item) use ($option, $config) {
                    if ($this->checkPostLink($item['link'])){
                        return $this->format($item, '已滤重');
                    }

                    $config->url = $item['link'];
                    $config->range = $option['collect_content_range'];
                    $config->rules = $this->rulesFormat($option['collect_content_rules']);
                    $detail = $this->_QlObject($config)->absoluteUrl($config)->downloadImage($config)->special($config)->query()->getDataAndRelease();
                    $detail = array_merge($item, empty($detail)?[]:current($detail));
                    $this->paging($detail, $config);
                    return $this->insert_article($detail, $option);
                })->getDataAndRelease();
                $result['data'] = $article;
                return $result;
            });
        } else {
            $config = new stdClass();
            $config->url = $option['collect_list_url'];
            $config->range = $option['collect_list_range'];
            $config->rules = $this->rulesFormat($option['collect_list_rules']);
            $config->rendering = $option['collect_rendering'];
            $config->remove_head = $option['collect_remove_head'];
            $config->image_download = $option['collect_image_download'];
            $config->image_path = $option['collect_image_path'];
            $config->src = $option['collect_image_attribute'];
            $config->pn = $history_page_number;
            $article = $this->_QlPagingObject($config)->absoluteUrl($config)->query(function($item) use ($option, $config) {
                if ($this->checkPostLink($item['link'])){
                    return $this->format($item, '已滤重');
                }

                $config->url = $item['link'];
                $config->range = $option['collect_content_range'];
                $config->rules = $this->rulesFormat($option['collect_content_rules']);
                $detail = $this->_QlObject($config)->absoluteUrl($config)->downloadImage($config)->query()->getDataAndRelease();
                $detail = array_merge($item, current($detail)??'');
                $this->paging($detail, $config);
                return $this->insert_article($detail, $option);
            })->getDataAndRelease();
            $articles['rolling'] = $history_page_number;
            $articles['data'] = $article;
        }

        return $this->response(FRC_ApiError::SUCCESS, $articles, '分页采集完成');
    }


    /**
     * @return array
     */
    public function grab_all_page()
    {
        $option_id = frc_sanitize_text('option_id', 0);

        $options = new FRC_Options();
        $option = $options->option($option_id);
        if (!$option) {
            return ['code' => FRC_ApiError::FAIL, 'msg' => '未查询到配置, 配置ID错误'];
        }

        $config = new stdClass();
        $config->url = $option['collect_list_url'];
        $config->range = $option['collect_list_range'];
        //$config->rules = $this->rulesFormat($option['collect_list_rules']);
        $config->rendering = $option['collect_rendering'];
        $config->remove_head = $option['collect_remove_head'];
        $config->image_download = $option['collect_image_download'];
        $config->image_path = $option['collect_image_path'];
        $config->src = $option['collect_image_attribute'];
        $config->pure = true;

        // TODO: 优化内存使用
        $articles = $this->_QlObject($config)->absoluteUrl($config)->find('a')->attrs('href')->filter(function ($item) use ($config) {
            if ($item === null){
                return false;
            }

	        $config->range = str_replace("\\\\", "\\", htmlspecialchars_decode($config->range));
            $pattern = '/'.str_replace('/', '\/', $config->range).'/';
            if (preg_match($pattern, $item, $matches)){
                return true;
            }

            return false;
        });

        $articles = $articles->map(function ($link) use ($config, $option) {
            $item['link'] = $link;
            if ($this->checkPostLink($item['link'])){
                return $this->format($item, '已滤重');
            }
            $config->url = $item['link'];
            $config->range = $option['collect_content_range'];
            $config->rules = $this->rulesFormat($option['collect_content_rules']);
            $config->pure = false;
            $detail = $this->_QlObject($config)->absoluteUrl($config)->downloadImage($config)->query()->getDataAndRelease();
            $detail = array_merge($item, empty($detail)?[]:current($detail));
            $this->paging($detail, $config);
            return $this->insert_article($detail, $option);
        });

        return $this->response(FRC_ApiError::SUCCESS, $articles, '全站采集完成');
    }


    /**
     * @return array
     */
    public function grab_debug(){
        $config = new stdClass();
        $config->url = frc_sanitize_text('debug_url');
        $config->range = frc_sanitize_text('debug_range');
        $config->rules = $this->rulesFormat(frc_sanitize_text('debug_rules'));
        $config->rendering = frc_sanitize_text('debug_rendering', 1);
        $config->remove_head = frc_sanitize_text('debug_remove_head', 1);

        if (empty($config->url)){
            return $this->response(FRC_ApiError::SUCCESS, null, '请输入参数.');
        }

        $detail = $this->_QlObject($config)->absoluteUrl($config)->query()->getDataAndRelease();

        return $this->response(FRC_ApiError::SUCCESS, $detail, '调试完成, 请在F12中查看');
    }


    /**
     * 微信公众号历史文章采集
     */
    function grab_wechat_history()
    {
        $appName = frc_sanitize_text('collect_wechat_app_name');
        $startNumber = frc_sanitize_text('collect_wechat_app_start_number');
        $page = frc_sanitize_text('collect_wechat_app_number');
        $cookie = frc_sanitize_text('collect_wx_app_cookie');
        $token = frc_sanitize_text('collect_wx_app_token');

        $auth = get_option('frc_validation_wechat_history');
        if (empty($auth))  return $this->response(FRC_ApiError::FAIL, null, '激'.'活后才'.'能使'.'用哦');
        $auth = json_decode($auth,true);
        //if (isset($auth['expireDate']) && time() > $auth['expireDate']) return $this->response(FRC_ApiError::FAIL, null, '试用结束啦,请赞赏后试用~');

        if (empty($appName) || empty($startNumber) || empty($page) || empty($cookie) || empty($token)) return $this->response(FRC_ApiError::FAIL, null, '请检查提交参数,所有参数均不可为空');

        if ($page > 30) return $this->response(FRC_ApiError::FAIL, null, '为保护鼠友账号安全,单次采集最大页数暂定不超过30页');

        $cookie = explode("; ",$cookie);
        $cookieData = [];
        foreach ($cookie as $item) {
            $item = explode("=",$item);
            $cookieData[$item[0]] = isset($item[1]) ? $item[1] : "";
        }

        $cookieJar = \GuzzleHttp\Cookie\CookieJar::fromArray($cookieData,"mp.weixin.qq.com");
        $client = new \GuzzleHttp\Client();
        //ps 优化点 这个fakeid 可以存在option里 不用每次都去查
        $url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&token='.$token.'&lang=zh_CN&f=json&ajax=1&query='.urlencode($appName);
        $result = $client->request("get",$url,[
            "cookies"=>$cookieJar
        ])
            ->getBody()
            ->getContents();
        if (!empty($result)) {
            $result = json_decode($result,true);
            if (!isset($result["base_resp"]["ret"]) && $result["base_resp"]["ret"] != 0) return $this->response(FRC_ApiError::FAIL, null, '请检查公众号名称是否有误,未搜索到相关公众号');
            $list = $result["list"];
            $fakeId = '';
            foreach ($list as $item) {
                if ($item["nickname"] == $appName)
                {
                    $fakeId = $item['fakeid'];
                }
            }
            if (empty($fakeId))  return $this->response(FRC_ApiError::FAIL, null, '请检查公众号名称是否有误,未搜索到相关公众号');
            $listUrl = 'https://mp.weixin.qq.com/cgi-bin/appmsgpublish?sub=list&search_field=null&';

            $options = new FRC_Options();
            $option = $options->lazy_person("微信");

            if (!$this->checkWechatHistoryTimeLimit($page)) return $this->response(FRC_ApiError::FAIL, null, '为保护鼠友公众号安全,单日采集最大页数不能超过500页');

            for ($i = 0; $i < $page; $i++)
            {
                sleep(3);
                $begin = $startNumber == 1 ? 0 : $startNumber * 20 + $i * 20;

                $listUrl .= 'begin='.$begin.'&count=20&query=&fakeid='.$fakeId.'&type=101_1&free_publish_type=1&sub_action=list_ex&token='.$token.'&lang=zh_CN&f=json&ajax=1';

                $result = $client->request("get",$listUrl,[
                    "cookies"=>$cookieJar
                ])
                    ->getBody()
                    ->getContents();
                if (!empty($result)) {
                    $result = json_decode($result, true);
                    if (!isset($re
Download .txt
gitextract_djfl1zo2/

├── .gitignore
├── LICENSE
├── README.md
├── composer.json
├── fatratcollect.php
├── includes/
│   ├── fatrat-apierror.php
│   ├── fatrat-data-detail.php
│   ├── fatrat-data.php
│   ├── fatrat-debugging.php
│   ├── fatrat-kit.php
│   ├── fatrat-options-add-edit.php
│   ├── fatrat-options.php
│   ├── fatrat-spider.php
│   └── fatrat-validation.php
├── public/
│   ├── css/
│   │   ├── bootstrap.css
│   │   └── fatrat.css
│   └── js/
│       ├── bootstrap.js
│       └── fatrat.js
├── readme.txt
├── src/
│   ├── Controller/
│   │   └── TaskController.php
│   ├── Helpers/
│   │   ├── helpers.php
│   │   └── helpers2.php
│   └── Service/
│       ├── AbsoluteUrl.php
│       ├── DownloadImage.php
│       └── GetTransCoding.php
├── vendor/
│   ├── autoload.php
│   ├── cache/
│   │   ├── adapter-common/
│   │   │   ├── AbstractCachePool.php
│   │   │   ├── CacheItem.php
│   │   │   ├── Changelog.md
│   │   │   ├── Exception/
│   │   │   │   ├── CacheException.php
│   │   │   │   ├── CachePoolException.php
│   │   │   │   └── InvalidArgumentException.php
│   │   │   ├── HasExpirationTimestampInterface.php
│   │   │   ├── JsonBinaryArmoring.php
│   │   │   ├── LICENSE
│   │   │   ├── PhpCacheItem.php
│   │   │   ├── PhpCachePool.php
│   │   │   ├── README.md
│   │   │   ├── TagSupportWithArray.php
│   │   │   └── composer.json
│   │   └── filesystem-adapter/
│   │       ├── Changelog.md
│   │       ├── FilesystemCachePool.php
│   │       ├── LICENSE
│   │       ├── README.md
│   │       └── composer.json
│   ├── clue/
│   │   └── socket-raw/
│   │       ├── .github/
│   │       │   ├── FUNDING.yml
│   │       │   └── workflows/
│   │       │       └── ci.yml
│   │       ├── CHANGELOG.md
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── composer.json
│   │       └── src/
│   │           ├── Exception.php
│   │           ├── Factory.php
│   │           └── Socket.php
│   ├── composer/
│   │   ├── ClassLoader.php
│   │   ├── InstalledVersions.php
│   │   ├── LICENSE
│   │   ├── autoload_classmap.php
│   │   ├── autoload_files.php
│   │   ├── autoload_namespaces.php
│   │   ├── autoload_psr4.php
│   │   ├── autoload_real.php
│   │   ├── autoload_static.php
│   │   ├── installed.json
│   │   └── installed.php
│   ├── guzzlehttp/
│   │   ├── guzzle/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── UPGRADING.md
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── BodySummarizer.php
│   │   │       ├── BodySummarizerInterface.php
│   │   │       ├── Client.php
│   │   │       ├── ClientInterface.php
│   │   │       ├── ClientTrait.php
│   │   │       ├── Cookie/
│   │   │       │   ├── CookieJar.php
│   │   │       │   ├── CookieJarInterface.php
│   │   │       │   ├── FileCookieJar.php
│   │   │       │   ├── SessionCookieJar.php
│   │   │       │   └── SetCookie.php
│   │   │       ├── Exception/
│   │   │       │   ├── BadResponseException.php
│   │   │       │   ├── ClientException.php
│   │   │       │   ├── ConnectException.php
│   │   │       │   ├── GuzzleException.php
│   │   │       │   ├── InvalidArgumentException.php
│   │   │       │   ├── RequestException.php
│   │   │       │   ├── ServerException.php
│   │   │       │   ├── TooManyRedirectsException.php
│   │   │       │   └── TransferException.php
│   │   │       ├── Handler/
│   │   │       │   ├── CurlFactory.php
│   │   │       │   ├── CurlFactoryInterface.php
│   │   │       │   ├── CurlHandler.php
│   │   │       │   ├── CurlMultiHandler.php
│   │   │       │   ├── EasyHandle.php
│   │   │       │   ├── HeaderProcessor.php
│   │   │       │   ├── MockHandler.php
│   │   │       │   ├── Proxy.php
│   │   │       │   └── StreamHandler.php
│   │   │       ├── HandlerStack.php
│   │   │       ├── MessageFormatter.php
│   │   │       ├── MessageFormatterInterface.php
│   │   │       ├── Middleware.php
│   │   │       ├── Pool.php
│   │   │       ├── PrepareBodyMiddleware.php
│   │   │       ├── RedirectMiddleware.php
│   │   │       ├── RequestOptions.php
│   │   │       ├── RetryMiddleware.php
│   │   │       ├── TransferStats.php
│   │   │       ├── Utils.php
│   │   │       ├── functions.php
│   │   │       └── functions_include.php
│   │   ├── promises/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE
│   │   │   ├── Makefile
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── AggregateException.php
│   │   │       ├── CancellationException.php
│   │   │       ├── Coroutine.php
│   │   │       ├── Create.php
│   │   │       ├── Each.php
│   │   │       ├── EachPromise.php
│   │   │       ├── FulfilledPromise.php
│   │   │       ├── Is.php
│   │   │       ├── Promise.php
│   │   │       ├── PromiseInterface.php
│   │   │       ├── PromisorInterface.php
│   │   │       ├── RejectedPromise.php
│   │   │       ├── RejectionException.php
│   │   │       ├── TaskQueue.php
│   │   │       ├── TaskQueueInterface.php
│   │   │       ├── Utils.php
│   │   │       ├── functions.php
│   │   │       └── functions_include.php
│   │   └── psr7/
│   │       ├── CHANGELOG.md
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── composer.json
│   │       ├── src/
│   │       │   ├── AppendStream.php
│   │       │   ├── BufferStream.php
│   │       │   ├── CachingStream.php
│   │       │   ├── DroppingStream.php
│   │       │   ├── Exception/
│   │       │   │   └── MalformedUriException.php
│   │       │   ├── FnStream.php
│   │       │   ├── Header.php
│   │       │   ├── HttpFactory.php
│   │       │   ├── InflateStream.php
│   │       │   ├── LazyOpenStream.php
│   │       │   ├── LimitStream.php
│   │       │   ├── Message.php
│   │       │   ├── MessageTrait.php
│   │       │   ├── MimeType.php
│   │       │   ├── MultipartStream.php
│   │       │   ├── NoSeekStream.php
│   │       │   ├── PumpStream.php
│   │       │   ├── Query.php
│   │       │   ├── Request.php
│   │       │   ├── Response.php
│   │       │   ├── Rfc7230.php
│   │       │   ├── ServerRequest.php
│   │       │   ├── Stream.php
│   │       │   ├── StreamDecoratorTrait.php
│   │       │   ├── StreamWrapper.php
│   │       │   ├── UploadedFile.php
│   │       │   ├── Uri.php
│   │       │   ├── UriNormalizer.php
│   │       │   ├── UriResolver.php
│   │       │   └── Utils.php
│   │       └── vendor-bin/
│   │           ├── php-cs-fixer/
│   │           │   └── composer.json
│   │           ├── phpstan/
│   │           │   └── composer.json
│   │           └── psalm/
│   │               └── composer.json
│   ├── jaeger/
│   │   └── phpquery-single/
│   │       ├── README.md
│   │       ├── composer.json
│   │       └── phpQuery.php
│   ├── league/
│   │   ├── flysystem/
│   │   │   ├── CODE_OF_CONDUCT.md
│   │   │   ├── LICENSE
│   │   │   ├── SECURITY.md
│   │   │   ├── composer.json
│   │   │   ├── deprecations.md
│   │   │   └── src/
│   │   │       ├── Adapter/
│   │   │       │   ├── AbstractAdapter.php
│   │   │       │   ├── AbstractFtpAdapter.php
│   │   │       │   ├── CanOverwriteFiles.php
│   │   │       │   ├── Ftp.php
│   │   │       │   ├── Ftpd.php
│   │   │       │   ├── Local.php
│   │   │       │   ├── NullAdapter.php
│   │   │       │   ├── Polyfill/
│   │   │       │   │   ├── NotSupportingVisibilityTrait.php
│   │   │       │   │   ├── StreamedCopyTrait.php
│   │   │       │   │   ├── StreamedReadingTrait.php
│   │   │       │   │   ├── StreamedTrait.php
│   │   │       │   │   └── StreamedWritingTrait.php
│   │   │       │   └── SynologyFtp.php
│   │   │       ├── AdapterInterface.php
│   │   │       ├── Config.php
│   │   │       ├── ConfigAwareTrait.php
│   │   │       ├── ConnectionErrorException.php
│   │   │       ├── ConnectionRuntimeException.php
│   │   │       ├── CorruptedPathDetected.php
│   │   │       ├── Directory.php
│   │   │       ├── Exception.php
│   │   │       ├── File.php
│   │   │       ├── FileExistsException.php
│   │   │       ├── FileNotFoundException.php
│   │   │       ├── Filesystem.php
│   │   │       ├── FilesystemException.php
│   │   │       ├── FilesystemInterface.php
│   │   │       ├── FilesystemNotFoundException.php
│   │   │       ├── Handler.php
│   │   │       ├── InvalidRootException.php
│   │   │       ├── MountManager.php
│   │   │       ├── NotSupportedException.php
│   │   │       ├── Plugin/
│   │   │       │   ├── AbstractPlugin.php
│   │   │       │   ├── EmptyDir.php
│   │   │       │   ├── ForcedCopy.php
│   │   │       │   ├── ForcedRename.php
│   │   │       │   ├── GetWithMetadata.php
│   │   │       │   ├── ListFiles.php
│   │   │       │   ├── ListPaths.php
│   │   │       │   ├── ListWith.php
│   │   │       │   ├── PluggableTrait.php
│   │   │       │   └── PluginNotFoundException.php
│   │   │       ├── PluginInterface.php
│   │   │       ├── ReadInterface.php
│   │   │       ├── RootViolationException.php
│   │   │       ├── SafeStorage.php
│   │   │       ├── UnreadableFileException.php
│   │   │       ├── Util/
│   │   │       │   ├── ContentListingFormatter.php
│   │   │       │   ├── MimeType.php
│   │   │       │   └── StreamHasher.php
│   │   │       └── Util.php
│   │   └── mime-type-detection/
│   │       ├── CHANGELOG.md
│   │       ├── LICENSE
│   │       ├── composer.json
│   │       └── src/
│   │           ├── EmptyExtensionToMimeTypeMap.php
│   │           ├── ExtensionMimeTypeDetector.php
│   │           ├── ExtensionToMimeTypeMap.php
│   │           ├── FinfoMimeTypeDetector.php
│   │           ├── GeneratedExtensionToMimeTypeMap.php
│   │           ├── MimeTypeDetector.php
│   │           └── OverridingExtensionToMimeTypeMap.php
│   ├── psr/
│   │   ├── cache/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE.txt
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── CacheException.php
│   │   │       ├── CacheItemInterface.php
│   │   │       ├── CacheItemPoolInterface.php
│   │   │       └── InvalidArgumentException.php
│   │   ├── http-client/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── ClientExceptionInterface.php
│   │   │       ├── ClientInterface.php
│   │   │       ├── NetworkExceptionInterface.php
│   │   │       └── RequestExceptionInterface.php
│   │   ├── http-message/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── MessageInterface.php
│   │   │       ├── RequestInterface.php
│   │   │       ├── ResponseInterface.php
│   │   │       ├── ServerRequestInterface.php
│   │   │       ├── StreamInterface.php
│   │   │       ├── UploadedFileInterface.php
│   │   │       └── UriInterface.php
│   │   ├── log/
│   │   │   ├── LICENSE
│   │   │   ├── Psr/
│   │   │   │   └── Log/
│   │   │   │       ├── AbstractLogger.php
│   │   │   │       ├── InvalidArgumentException.php
│   │   │   │       ├── LogLevel.php
│   │   │   │       ├── LoggerAwareInterface.php
│   │   │   │       ├── LoggerAwareTrait.php
│   │   │   │       ├── LoggerInterface.php
│   │   │   │       ├── LoggerTrait.php
│   │   │   │       ├── NullLogger.php
│   │   │   │       └── Test/
│   │   │   │           ├── DummyTest.php
│   │   │   │           ├── LoggerInterfaceTest.php
│   │   │   │           └── TestLogger.php
│   │   │   ├── README.md
│   │   │   └── composer.json
│   │   └── simple-cache/
│   │       ├── .editorconfig
│   │       ├── LICENSE.md
│   │       ├── README.md
│   │       ├── composer.json
│   │       └── src/
│   │           ├── CacheException.php
│   │           ├── CacheInterface.php
│   │           └── InvalidArgumentException.php
│   ├── ralouphie/
│   │   └── getallheaders/
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── composer.json
│   │       └── src/
│   │           └── getallheaders.php
│   ├── symfony/
│   │   ├── polyfill-mbstring/
│   │   │   ├── LICENSE
│   │   │   ├── Mbstring.php
│   │   │   ├── README.md
│   │   │   ├── Resources/
│   │   │   │   └── unidata/
│   │   │   │       ├── lowerCase.php
│   │   │   │       ├── titleCaseRegexp.php
│   │   │   │       └── upperCase.php
│   │   │   ├── bootstrap.php
│   │   │   ├── bootstrap80.php
│   │   │   └── composer.json
│   │   ├── polyfill-php80/
│   │   │   ├── LICENSE
│   │   │   ├── Php80.php
│   │   │   ├── PhpToken.php
│   │   │   ├── README.md
│   │   │   ├── Resources/
│   │   │   │   └── stubs/
│   │   │   │       ├── Attribute.php
│   │   │   │       ├── PhpToken.php
│   │   │   │       ├── Stringable.php
│   │   │   │       ├── UnhandledMatchError.php
│   │   │   │       └── ValueError.php
│   │   │   ├── bootstrap.php
│   │   │   └── composer.json
│   │   ├── process/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── Exception/
│   │   │   │   ├── ExceptionInterface.php
│   │   │   │   ├── InvalidArgumentException.php
│   │   │   │   ├── LogicException.php
│   │   │   │   ├── ProcessFailedException.php
│   │   │   │   ├── ProcessSignaledException.php
│   │   │   │   ├── ProcessTimedOutException.php
│   │   │   │   └── RuntimeException.php
│   │   │   ├── ExecutableFinder.php
│   │   │   ├── InputStream.php
│   │   │   ├── LICENSE
│   │   │   ├── PhpExecutableFinder.php
│   │   │   ├── PhpProcess.php
│   │   │   ├── Pipes/
│   │   │   │   ├── AbstractPipes.php
│   │   │   │   ├── PipesInterface.php
│   │   │   │   ├── UnixPipes.php
│   │   │   │   └── WindowsPipes.php
│   │   │   ├── Process.php
│   │   │   ├── ProcessUtils.php
│   │   │   ├── README.md
│   │   │   └── composer.json
│   │   └── var-dumper/
│   │       ├── CHANGELOG.md
│   │       ├── Caster/
│   │       │   ├── AmqpCaster.php
│   │       │   ├── ArgsStub.php
│   │       │   ├── Caster.php
│   │       │   ├── ClassStub.php
│   │       │   ├── ConstStub.php
│   │       │   ├── CutArrayStub.php
│   │       │   ├── CutStub.php
│   │       │   ├── DOMCaster.php
│   │       │   ├── DateCaster.php
│   │       │   ├── DoctrineCaster.php
│   │       │   ├── DsCaster.php
│   │       │   ├── DsPairStub.php
│   │       │   ├── EnumStub.php
│   │       │   ├── ExceptionCaster.php
│   │       │   ├── FiberCaster.php
│   │       │   ├── FrameStub.php
│   │       │   ├── GmpCaster.php
│   │       │   ├── ImagineCaster.php
│   │       │   ├── ImgStub.php
│   │       │   ├── IntlCaster.php
│   │       │   ├── LinkStub.php
│   │       │   ├── MemcachedCaster.php
│   │       │   ├── MysqliCaster.php
│   │       │   ├── PdoCaster.php
│   │       │   ├── PgSqlCaster.php
│   │       │   ├── ProxyManagerCaster.php
│   │       │   ├── RdKafkaCaster.php
│   │       │   ├── RedisCaster.php
│   │       │   ├── ReflectionCaster.php
│   │       │   ├── ResourceCaster.php
│   │       │   ├── SplCaster.php
│   │       │   ├── StubCaster.php
│   │       │   ├── SymfonyCaster.php
│   │       │   ├── TraceStub.php
│   │       │   ├── UuidCaster.php
│   │       │   ├── XmlReaderCaster.php
│   │       │   └── XmlResourceCaster.php
│   │       ├── Cloner/
│   │       │   ├── AbstractCloner.php
│   │       │   ├── ClonerInterface.php
│   │       │   ├── Cursor.php
│   │       │   ├── Data.php
│   │       │   ├── DumperInterface.php
│   │       │   ├── Stub.php
│   │       │   └── VarCloner.php
│   │       ├── Command/
│   │       │   ├── Descriptor/
│   │       │   │   ├── CliDescriptor.php
│   │       │   │   ├── DumpDescriptorInterface.php
│   │       │   │   └── HtmlDescriptor.php
│   │       │   └── ServerDumpCommand.php
│   │       ├── Dumper/
│   │       │   ├── AbstractDumper.php
│   │       │   ├── CliDumper.php
│   │       │   ├── ContextProvider/
│   │       │   │   ├── CliContextProvider.php
│   │       │   │   ├── ContextProviderInterface.php
│   │       │   │   ├── RequestContextProvider.php
│   │       │   │   └── SourceContextProvider.php
│   │       │   ├── ContextualizedDumper.php
│   │       │   ├── DataDumperInterface.php
│   │       │   ├── HtmlDumper.php
│   │       │   └── ServerDumper.php
│   │       ├── Exception/
│   │       │   └── ThrowingCasterException.php
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── bin/
│   │       │   │   └── var-dump-server
│   │       │   ├── css/
│   │       │   │   └── htmlDescriptor.css
│   │       │   ├── functions/
│   │       │   │   └── dump.php
│   │       │   └── js/
│   │       │       └── htmlDescriptor.js
│   │       ├── Server/
│   │       │   ├── Connection.php
│   │       │   └── DumpServer.php
│   │       ├── Test/
│   │       │   └── VarDumperTestTrait.php
│   │       ├── VarDumper.php
│   │       └── composer.json
│   ├── tightenco/
│   │   └── collect/
│   │       ├── .github/
│   │       │   └── workflows/
│   │       │       └── run-tests.yml
│   │       ├── branch-commit-push.sh
│   │       ├── composer.json
│   │       └── src/
│   │           └── Collect/
│   │               ├── Contracts/
│   │               │   └── Support/
│   │               │       ├── Arrayable.php
│   │               │       ├── CanBeEscapedWhenCastToString.php
│   │               │       ├── Htmlable.php
│   │               │       └── Jsonable.php
│   │               └── Support/
│   │                   ├── Arr.php
│   │                   ├── Collection.php
│   │                   ├── Enumerable.php
│   │                   ├── HigherOrderCollectionProxy.php
│   │                   ├── HigherOrderWhenProxy.php
│   │                   ├── LazyCollection.php
│   │                   ├── Traits/
│   │                   │   ├── EnumeratesValues.php
│   │                   │   ├── Macroable.php
│   │                   │   └── Tappable.php
│   │                   ├── alias.php
│   │                   └── helpers.php
│   └── vierbergenlars/
│       └── php-semver/
│           ├── .travis.yml
│           ├── README.md
│           ├── bin/
│           │   ├── semver
│           │   └── update-versions
│           ├── composer.json
│           ├── definitions
│           ├── license.md
│           ├── phpunit.xml.dist
│           ├── src/
│           │   └── vierbergenlars/
│           │       ├── LibJs/
│           │       │   ├── JObject.php
│           │       │   ├── JSArray.php
│           │       │   ├── JString.php
│           │       │   ├── RegExp.php
│           │       │   └── Util.php
│           │       └── SemVer/
│           │           ├── SemVerException.php
│           │           ├── expression.php
│           │           ├── internal.php
│           │           └── version.php
│           └── tests/
│               ├── RegressionTest.php
│               ├── SemVerTest.php
│               └── VersionTest.php
└── views/
    ├── csrf.php
    ├── frc-spider.php
    ├── release-type.php
    └── todo.html
Download .txt
Showing preview only (301K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3494 symbols across 330 files)

FILE: fatratcollect.php
  function frc_plugin_install (line 30) | function frc_plugin_install(){
  function frc_plugin_update (line 99) | function frc_plugin_update() {
  function frc_loading_assets (line 148) | function frc_loading_assets( $hook ) {
  function frc_loading_menu (line 180) | function frc_loading_menu()
  function frc_write_log (line 271) | function frc_write_log($string, $file_name = '')
  function frc_more_schedules (line 364) | function frc_more_schedules() {
  function frc_spider_timing_task (line 376) | function frc_spider_timing_task()
  function frc_cron_release_task (line 396) | function frc_cron_release_task()
  function frc_plugin_uninstall (line 407) | function frc_plugin_uninstall() {

FILE: includes/fatrat-apierror.php
  class FRC_ApiError (line 17) | class FRC_ApiError
    method msg (line 65) | public static function msg($errno, $lang = 'en')

FILE: includes/fatrat-data-detail.php
  class FRC_Data (line 14) | class FRC_Data
    method __construct (line 19) | public function __construct()
    method id (line 27) | public function id($id){
    method getDataByOption (line 34) | public function getDataByOption($option_id, $count = 1, $sort = 'ASC'){
    method getWaitDataByOption (line 42) | public function getWaitDataByOption($option_id, $count = 1, $sort = 'A...
    method data_paging (line 52) | public function data_paging($page_number = 1, $per_page = 10, $customv...
    method record_count (line 82) | public function record_count($customvar = 'total')
    method update_successful_status (line 97) | public function update_successful_status( $id, $post )
    method delete (line 110) | public function delete($id)
    method delete_by_option (line 122) | public function delete_by_option($option_id)
    method statistical (line 134) | public function statistical($option_id){
    method data_automatic_release (line 149) | public function data_automatic_release(){
    method data_option_publish (line 166) | public function data_option_publish(){
    method data_publish_article (line 190) | public function data_publish_article(){
    method data_preview_article (line 208) | public function data_preview_article(){
    method article_to_storage (line 233) | public function article_to_storage($article, $custom_release_config = [])
    method data_history_wait_play (line 290) | public function data_history_wait_play()
    method post_merge (line 316) | private function post_merge(&$post, $release_config){
    method update_post_meta (line 333) | private function update_post_meta($post_id, $release_config){
    method uploadPicAttachment (line 346) | private function uploadPicAttachment($post, $release_config){
  class FRC_Data_Detail_Table (line 395) | class FRC_Data_Detail_Table extends WP_List_Table
    method get_snippets (line 405) | public static function get_snippets($per_page = 10, $page_number = 1, ...
    method delete_snippet (line 418) | public function delete_snippet($id)
    method release_snippet (line 428) | public function release_snippet($id)
    method activate_snippet (line 440) | public static function activate_snippet($id)
    method deactivate_snippet (line 450) | public static function deactivate_snippet($id)
    method record_detail_count (line 460) | public static function record_detail_count($customvar = 'total')
    method no_items (line 467) | public function no_items()
    method column_default (line 480) | public function column_default($item, $column_name)
    method column_cb (line 535) | function column_cb($item)
    method column_name (line 549) | function column_name($item)
    method get_columns (line 559) | function get_columns()
    method get_sortable_columns (line 582) | public function get_sortable_columns()
    method get_bulk_actions (line 596) | public function get_bulk_actions()
    method prepare_items (line 607) | public function prepare_items()
    method get_views (line 636) | public function get_views()
    method process_bulk_action (line 711) | public function process_bulk_action()
  function frc_data_detail (line 742) | function frc_data_detail()

FILE: includes/fatrat-data.php
  class FRC_Data_List_Table (line 17) | class FRC_Data_List_Table extends WP_List_Table
    method get_snippets (line 27) | public static function get_snippets($per_page = 10, $page_number = 1, ...
    method delete_snippet (line 64) | public function delete_snippet($id)
    method activate_snippet (line 75) | public static function activate_snippet($id)
    method deactivate_snippet (line 85) | public static function deactivate_snippet($id)
    method record_count (line 95) | public static function record_count($customvar = 'total')
    method no_items (line 102) | public function no_items()
    method column_default (line 115) | public function column_default($item, $column_name)
    method column_cb (line 151) | function column_cb($item)
    method column_name (line 165) | function column_name($item)
    method get_columns (line 175) | function get_columns()
    method get_sortable_columns (line 198) | public function get_sortable_columns()
    method get_bulk_actions (line 211) | public function get_bulk_actions()
    method prepare_items (line 222) | public function prepare_items()
    method get_views (line 248) | public function get_views()
    method process_bulk_action (line 304) | public function process_bulk_action()
  function frc_data_list (line 323) | function frc_data_list()

FILE: includes/fatrat-debugging.php
  function frc_debugging (line 13) | function frc_debugging(){

FILE: includes/fatrat-kit.php
  class FRC_Kit (line 13) | class FRC_Kit{
    method kit_image_path (line 15) | public function kit_image_path($file){
    method kit_automatic_save_pic (line 19) | public function kit_automatic_save_pic($postID){
    method kit_auto_tags (line 31) | public function kit_auto_tags($postID){
    method kit_dynamic_fields (line 49) | public function kit_dynamic_fields($postID){
  function frc_image (line 102) | function frc_image($file){
  function frc_auto_task (line 108) | function frc_auto_task($postID){
  function frc_inner_chain (line 117) | function frc_inner_chain( $post_content ) {
  function frc_kit (line 138) | function frc_kit(){

FILE: includes/fatrat-options-add-edit.php
  function frc_options_add_edit (line 14) | function frc_options_add_edit()

FILE: includes/fatrat-options.php
  class FRC_Options (line 17) | class FRC_Options
    method __construct (line 23) | public function __construct()
    method options_paging (line 38) | public function options_paging(int $page_number = 1, int $per_page = 1...
    method options (line 63) | public function options(){
    method option (line 72) | public function option(int $option_id): array
    method delete (line 82) | public function delete($id)
    method lazy_person (line 96) | public function lazy_person($name){
    method option_by_key (line 112) | public function option_by_key($name, $key)
    method record_count (line 122) | public function record_count(string $customvar = 'total')
    method insert_option (line 138) | public function insert_option($name)
    method interface_save_option (line 158) | public function interface_save_option(){
    method interface_save_option_release (line 266) | public function interface_save_option_release(){
    method interface_import_default_configuration (line 320) | public function interface_import_default_configuration(){
    method interface_del_option (line 414) | public function interface_del_option(){
    method interface_upgrade (line 433) | public function interface_upgrade(){
    method interface_update_auto_config (line 536) | public function interface_update_auto_config(){
  class FRC_Configuration_List_Table (line 553) | class FRC_Configuration_List_Table extends WP_List_Table
    method get_snippets (line 563) | public static function get_snippets($per_page = 10, $page_number = 1, ...
    method delete_snippet (line 579) | public function delete_snippet($id)
    method activate_snippet (line 590) | public static function activate_snippet($id)
    method deactivate_snippet (line 600) | public static function deactivate_snippet($id)
    method record_count (line 610) | public static function record_count($customvar = 'total')
    method no_items (line 617) | public function no_items()
    method column_default (line 630) | public function column_default($item, $column_name)
    method column_cb (line 701) | function column_cb($item)
    method column_name (line 715) | function column_name($item)
    method get_columns (line 725) | function get_columns()
    method get_sortable_columns (line 751) | public function get_sortable_columns()
    method get_bulk_actions (line 764) | public function get_bulk_actions()
    method prepare_items (line 779) | public function prepare_items()
    method get_views (line 805) | public function get_views()
    method process_bulk_action (line 859) | public function process_bulk_action()
  function frc_options (line 879) | function frc_options()

FILE: includes/fatrat-spider.php
  class FRC_Spider (line 30) | class FRC_Spider
    method __construct (line 35) | public function __construct()
    method grab_custom_page (line 47) | public function grab_custom_page(){
    method wx_url_format (line 77) | private function wx_url_format($urls){
    method grab_details_page (line 94) | public function grab_details_page(){
    method grab_list_page (line 117) | public function grab_list_page()
    method grab_history_page (line 159) | public function grab_history_page()
    method grab_all_page (line 257) | public function grab_all_page()
    method grab_debug (line 315) | public function grab_debug(){
    method grab_wechat_history (line 336) | function grab_wechat_history()
    method single_spider (line 438) | public function single_spider($option, $urls)
    method paging (line 473) | private function paging(&$detail, $config)
    method text_keyword_replace (line 505) | private function text_keyword_replace($text, $option)
    method timing_spider (line 527) | public function timing_spider()
    method _QlObject (line 573) | public function _QlObject($option)
    method _QlPagingObject (line 627) | public function _QlPagingObject($option)
    method _QlInstance (line 679) | private function _QlInstance(){
    method insert_article (line 716) | protected function insert_article($article, $option){
    method insertKeywords (line 782) | protected function insertKeywords($txt, $option){
    method checkPostLink (line 810) | protected function checkPostLink($link){
    method rulesFormat (line 822) | private function rulesFormat($rules)
    method response (line 840) | public function response($error, $data = [], $msg = 'ok'){
    method format (line 891) | protected function format($article, $msg = ''){
    method checkWechatHistoryTimeLimit (line 903) | private function checkWechatHistoryTimeLimit($time)
  function frc_spider (line 918) | function frc_spider()
  function frc_mysql_upgrade (line 1276) | function frc_mysql_upgrade(){
  function frc_front_loading (line 1313) | function frc_front_loading(){

FILE: includes/fatrat-validation.php
  class FRC_Validation (line 13) | class FRC_Validation {
    method __construct (line 65) | public function __construct()
    method validation_function_switch (line 72) | public function validation_function_switch(){
    method validation_activation (line 81) | public function validation_activation(){
    method update_switch (line 118) | protected function update_switch($action){
    method validation_correction (line 128) | public function validation_correction(){
    method notice (line 136) | public function notice(){
    method announcement (line 145) | public function announcement($location = 'notice-home'){
    method report_permissions (line 163) | public function report_permissions() {
    method getAppreciatesHtml (line 192) | public function getAppreciatesHtml($count = 5){
    method appreciates (line 208) | public function appreciates($count = null){
    method checkAccessToken (line 221) | private function checkAccessToken($data){
    method getAccessToken (line 226) | private function getAccessToken(){
    method validation_request_static (line 230) | private function validation_request_static($path, $timeout = 1){
    method validation_request (line 234) | private function validation_request($uri, $query = [], $timeout = 1){

FILE: public/js/bootstrap.js
  function _interopNamespace (line 12) | function _interopNamespace(e) {
  method find (line 48) | find(selector, element = document.documentElement) {
  method findOne (line 52) | findOne(selector, element = document.documentElement) {
  method children (line 56) | children(element, selector) {
  method parents (line 60) | parents(element, selector) {
  method prev (line 75) | prev(element, selector) {
  method next (line 89) | next(element, selector) {
  function getUidEvent (line 435) | function getUidEvent(element, uid) {
  function getEvent (line 439) | function getEvent(element) {
  function bootstrapHandler (line 446) | function bootstrapHandler(element, fn) {
  function bootstrapDelegationHandler (line 458) | function bootstrapDelegationHandler(element, selector, fn) {
  function findHandler (line 484) | function findHandler(events, handler, delegationSelector = null) {
  function normalizeParams (line 498) | function normalizeParams(originalTypeEvent, handler, delegationFn) {
  function addHandler (line 511) | function addHandler(element, originalTypeEvent, handler, delegationFn, o...
  function removeHandler (line 559) | function removeHandler(element, events, typeEvent, handler, delegationSe...
  function removeNamespacedHandlers (line 570) | function removeNamespacedHandlers(element, events, typeEvent, namespace) {
  function getTypeEvent (line 580) | function getTypeEvent(event) {
  method on (line 587) | on(element, event, handler, delegationFn) {
  method one (line 591) | one(element, event, handler, delegationFn) {
  method off (line 595) | off(element, originalTypeEvent, handler, delegationFn) {
  method trigger (line 632) | trigger(element, event, args) {
  method set (line 708) | set(element, key, instance) {
  method get (line 725) | get(element, key) {
  method remove (line 733) | remove(element, key) {
  class BaseComponent (line 762) | class BaseComponent {
    method constructor (line 763) | constructor(element) {
    method dispose (line 774) | dispose() {
    method _queueCallback (line 782) | _queueCallback(callback, element, isAnimated = true) {
    method getInstance (line 788) | static getInstance(element) {
    method getOrCreateInstance (line 792) | static getOrCreateInstance(element, config = {}) {
    method VERSION (line 796) | static get VERSION() {
    method NAME (line 800) | static get NAME() {
    method DATA_KEY (line 804) | static get DATA_KEY() {
    method EVENT_KEY (line 808) | static get EVENT_KEY() {
  class Alert (line 843) | class Alert extends BaseComponent {
    method NAME (line 845) | static get NAME() {
    method close (line 850) | close(element) {
    method _getRootElement (line 863) | _getRootElement(element) {
    method _triggerCloseEvent (line 867) | _triggerCloseEvent(element) {
    method _removeElement (line 871) | _removeElement(element) {
    method _destroyElement (line 878) | _destroyElement(element) {
    method jQueryInterface (line 884) | static jQueryInterface(config) {
    method handleDismiss (line 894) | static handleDismiss(alertInstance) {
  class Button (line 947) | class Button extends BaseComponent {
    method NAME (line 949) | static get NAME() {
    method toggle (line 954) | toggle() {
    method jQueryInterface (line 960) | static jQueryInterface(config) {
  function normalizeData (line 999) | function normalizeData(val) {
  function normalizeDataKey (line 1019) | function normalizeDataKey(key) {
  method setDataAttribute (line 1024) | setDataAttribute(element, key, value) {
  method removeDataAttribute (line 1028) | removeDataAttribute(element, key) {
  method getDataAttributes (line 1032) | getDataAttributes(element) {
  method getDataAttribute (line 1046) | getDataAttribute(element, key) {
  method offset (line 1050) | offset(element) {
  method position (line 1058) | position(element) {
  class Carousel (line 1150) | class Carousel extends BaseComponent {
    method constructor (line 1151) | constructor(element, config) {
    method Default (line 1170) | static get Default() {
    method NAME (line 1174) | static get NAME() {
    method next (line 1179) | next() {
    method nextWhenVisible (line 1183) | nextWhenVisible() {
    method prev (line 1191) | prev() {
    method pause (line 1195) | pause(event) {
    method cycle (line 1209) | cycle(event) {
    method to (line 1226) | to(index) {
    method _getConfig (line 1252) | _getConfig(config) {
    method _handleSwipe (line 1261) | _handleSwipe() {
    method _addEventListeners (line 1278) | _addEventListeners() {
    method _addTouchEventListeners (line 1293) | _addTouchEventListeners() {
    method _keydown (line 1348) | _keydown(event) {
    method _getItemIndex (line 1362) | _getItemIndex(element) {
    method _getItemByOrder (line 1367) | _getItemByOrder(order, activeElement) {
    method _triggerSlideEvent (line 1372) | _triggerSlideEvent(relatedTarget, eventDirectionName) {
    method _setActiveIndicatorElement (line 1385) | _setActiveIndicatorElement(element) {
    method _updateInterval (line 1402) | _updateInterval() {
    method _slide (line 1419) | _slide(directionOrOrder, element) {
    method _directionToOrder (line 1503) | _directionToOrder(direction) {
    method _orderToDirection (line 1515) | _orderToDirection(order) {
    method carouselInterface (line 1528) | static carouselInterface(element, config) {
    method jQueryInterface (line 1556) | static jQueryInterface(config) {
    method dataApiClickHandler (line 1562) | static dataApiClickHandler(event) {
  class Collapse (line 1655) | class Collapse extends BaseComponent {
    method constructor (line 1656) | constructor(element, config) {
    method Default (line 1687) | static get Default() {
    method NAME (line 1691) | static get NAME() {
    method toggle (line 1696) | toggle() {
    method show (line 1704) | show() {
    method hide (line 1790) | hide() {
    method setTransitioning (line 1841) | setTransitioning(isTransitioning) {
    method _getConfig (line 1846) | _getConfig(config) {
    method _getDimension (line 1856) | _getDimension() {
    method _getParent (line 1860) | _getParent() {
    method _addAriaAndCollapsedClass (line 1874) | _addAriaAndCollapsedClass(element, triggerArray) {
    method collapseInterface (line 1892) | static collapseInterface(element, config) {
    method jQueryInterface (line 1916) | static jQueryInterface(config) {
  class Dropdown (line 2036) | class Dropdown extends BaseComponent {
    method constructor (line 2037) | constructor(element, config) {
    method Default (line 2048) | static get Default() {
    method DefaultType (line 2052) | static get DefaultType() {
    method NAME (line 2056) | static get NAME() {
    method toggle (line 2061) | toggle() {
    method show (line 2076) | show() {
    method hide (line 2138) | hide() {
    method dispose (line 2150) | dispose() {
    method update (line 2158) | update() {
    method _addEventListeners (line 2167) | _addEventListeners() {
    method _completeHide (line 2174) | _completeHide(relatedTarget) {
    method _getConfig (line 2201) | _getConfig(config) {
    method _getMenuElement (line 2216) | _getMenuElement() {
    method _getPlacement (line 2220) | _getPlacement() {
    method _detectNavbar (line 2241) | _detectNavbar() {
    method _getOffset (line 2245) | _getOffset() {
    method _getPopperConfig (line 2261) | _getPopperConfig() {
    method _selectMenuItem (line 2289) | _selectMenuItem({
    method dropdownInterface (line 2305) | static dropdownInterface(element, config) {
    method jQueryInterface (line 2317) | static jQueryInterface(config) {
    method clearMenus (line 2323) | static clearMenus(event) {
    method getParentFromElement (line 2367) | static getParentFromElement(element) {
    method dataApiKeydownHandler (line 2371) | static dataApiKeydownHandler(event) {
  class ScrollBarHelper (line 2453) | class ScrollBarHelper {
    method constructor (line 2454) | constructor() {
    method getWidth (line 2458) | getWidth() {
    method hide (line 2464) | hide() {
    method _disableOverFlow (line 2478) | _disableOverFlow() {
    method _setElementAttributes (line 2484) | _setElementAttributes(selector, styleProp, callback) {
    method reset (line 2501) | reset() {
    method _saveInitialAttribute (line 2511) | _saveInitialAttribute(element, styleProp) {
    method _resetElementAttributes (line 2519) | _resetElementAttributes(selector, styleProp) {
    method _applyManipulationCallback (line 2534) | _applyManipulationCallback(selector, callBack) {
    method isOverflowing (line 2542) | isOverflowing() {
  class Backdrop (line 2574) | class Backdrop {
    method constructor (line 2575) | constructor(config) {
    method show (line 2581) | show(callback) {
    method hide (line 2600) | hide(callback) {
    method _getElement (line 2615) | _getElement() {
    method _getConfig (line 2630) | _getConfig(config) {
    method _append (line 2640) | _append() {
    method dispose (line 2653) | dispose() {
    method _emulateAnimation (line 2665) | _emulateAnimation(callback) {
  class Modal (line 2724) | class Modal extends BaseComponent {
    method constructor (line 2725) | constructor(element, config) {
    method Default (line 2737) | static get Default() {
    method NAME (line 2741) | static get NAME() {
    method toggle (line 2746) | toggle(relatedTarget) {
    method show (line 2750) | show(relatedTarget) {
    method hide (line 2791) | hide(event) {
    method dispose (line 2828) | dispose() {
    method handleUpdate (line 2843) | handleUpdate() {
    method _initializeBackDrop (line 2848) | _initializeBackDrop() {
    method _getConfig (line 2856) | _getConfig(config) {
    method _showElement (line 2865) | _showElement(relatedTarget) {
    method _enforceFocus (line 2913) | _enforceFocus() {
    method _setEscapeEvent (line 2923) | _setEscapeEvent() {
    method _setResizeEvent (line 2938) | _setResizeEvent() {
    method _hideModal (line 2946) | _hideModal() {
    method _showBackdrop (line 2968) | _showBackdrop(callback) {
    method _isAnimated (line 2989) | _isAnimated() {
    method _triggerBackdropTransition (line 2993) | _triggerBackdropTransition() {
    method _adjustDialog (line 3033) | _adjustDialog() {
    method _resetAdjustments (line 3049) | _resetAdjustments() {
    method jQueryInterface (line 3055) | static jQueryInterface(config, relatedTarget) {
  class Offcanvas (line 3156) | class Offcanvas extends BaseComponent {
    method constructor (line 3157) | constructor(element, config) {
    method NAME (line 3167) | static get NAME() {
    method Default (line 3171) | static get Default() {
    method toggle (line 3176) | toggle(relatedTarget) {
    method show (line 3180) | show(relatedTarget) {
    method hide (line 3221) | hide() {
    method dispose (line 3261) | dispose() {
    method _getConfig (line 3269) | _getConfig(config) {
    method _initializeBackDrop (line 3278) | _initializeBackDrop() {
    method _enforceFocusOnElement (line 3287) | _enforceFocusOnElement(element) {
    method _addEventListeners (line 3298) | _addEventListeners() {
    method jQueryInterface (line 3308) | static jQueryInterface(config) {
  function sanitizeHtml (line 3446) | function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {
  class Tooltip (line 3572) | class Tooltip extends BaseComponent {
    method constructor (line 3573) | constructor(element, config) {
    method Default (line 3593) | static get Default() {
    method NAME (line 3597) | static get NAME() {
    method Event (line 3601) | static get Event() {
    method DefaultType (line 3605) | static get DefaultType() {
    method enable (line 3610) | enable() {
    method disable (line 3614) | disable() {
    method toggleEnabled (line 3618) | toggleEnabled() {
    method toggle (line 3622) | toggle(event) {
    method dispose (line 3648) | dispose() {
    method show (line 3663) | show() {
    method hide (line 3746) | hide() {
    method update (line 3798) | update() {
    method isWithContent (line 3805) | isWithContent() {
    method getTipElement (line 3809) | getTipElement() {
    method setContent (line 3820) | setContent() {
    method setElementContent (line 3826) | setElementContent(element, content) {
    method getTitle (line 3857) | getTitle() {
    method updateAttachment (line 3867) | updateAttachment(attachment) {
    method _initializeOnDelegatedTarget (line 3880) | _initializeOnDelegatedTarget(event, context) {
    method _getOffset (line 3892) | _getOffset() {
    method _getPopperConfig (line 3908) | _getPopperConfig(attachment) {
    method _addAttachmentClass (line 3948) | _addAttachmentClass(attachment) {
    method _getAttachment (line 3952) | _getAttachment(placement) {
    method _setListeners (line 3956) | _setListeners() {
    method _fixTitle (line 3988) | _fixTitle() {
    method _enter (line 4004) | _enter(event, context) {
    method _leave (line 4031) | _leave(event, context) {
    method _isWithActiveTrigger (line 4057) | _isWithActiveTrigger() {
    method _getConfig (line 4067) | _getConfig(config) {
    method _getDelegateConfig (line 4104) | _getDelegateConfig() {
    method _cleanTipClass (line 4118) | _cleanTipClass() {
    method _handlePopperPlacementChange (line 4127) | _handlePopperPlacementChange(popperData) {
    method jQueryInterface (line 4144) | static jQueryInterface(config) {
  class Popover (line 4218) | class Popover extends Tooltip {
    method Default (line 4220) | static get Default() {
    method NAME (line 4224) | static get NAME() {
    method Event (line 4228) | static get Event() {
    method DefaultType (line 4232) | static get DefaultType() {
    method isWithContent (line 4237) | isWithContent() {
    method getTipElement (line 4241) | getTipElement() {
    method setContent (line 4259) | setContent() {
    method _addAttachmentClass (line 4275) | _addAttachmentClass(attachment) {
    method _getContent (line 4279) | _getContent() {
    method _cleanTipClass (line 4283) | _cleanTipClass() {
    method jQueryInterface (line 4293) | static jQueryInterface(config) {
  class ScrollSpy (line 4364) | class ScrollSpy extends BaseComponent {
    method constructor (line 4365) | constructor(element, config) {
    method Default (line 4381) | static get Default() {
    method NAME (line 4385) | static get NAME() {
    method refresh (line 4390) | refresh() {
    method dispose (line 4418) | dispose() {
    method _getConfig (line 4424) | _getConfig(config) {
    method _getScrollTop (line 4447) | _getScrollTop() {
    method _getScrollHeight (line 4451) | _getScrollHeight() {
    method _getOffsetHeight (line 4455) | _getOffsetHeight() {
    method _process (line 4459) | _process() {
    method _activate (line 4497) | _activate(target) {
    method _clear (line 4528) | _clear() {
    method jQueryInterface (line 4533) | static jQueryInterface(config) {
  class Tab (line 4607) | class Tab extends BaseComponent {
    method NAME (line 4609) | static get NAME() {
    method show (line 4614) | show() {
    method _activate (line 4660) | _activate(element, container, callback) {
    method _transitionComplete (line 4676) | _transitionComplete(element, active, callback) {
    method jQueryInterface (line 4724) | static jQueryInterface(config) {
  class Toast (line 4812) | class Toast extends BaseComponent {
    method constructor (line 4813) | constructor(element, config) {
    method DefaultType (line 4824) | static get DefaultType() {
    method Default (line 4828) | static get Default() {
    method NAME (line 4832) | static get NAME() {
    method show (line 4837) | show() {
    method hide (line 4869) | hide() {
    method dispose (line 4891) | dispose() {
    method _getConfig (line 4902) | _getConfig(config) {
    method _maybeScheduleHide (line 4911) | _maybeScheduleHide() {
    method _onInteraction (line 4925) | _onInteraction(event, isInteracting) {
    method _setListeners (line 4953) | _setListeners() {
    method _clearTimeout (line 4961) | _clearTimeout() {
    method jQueryInterface (line 4967) | static jQueryInterface(config) {

FILE: public/js/fatrat.js
  function preview_article (line 373) | function preview_article(response){
  function change_frc_play_flag (line 540) | function change_frc_play_flag()
  function ajax_collect_request_tool (line 545) | function ajax_collect_request_tool(request_url, data, progress_bar = '',...
  function ajax_option_request_tool (line 609) | function ajax_option_request_tool(request_url, data, success_redirect_ur...
  function ajax_import_data_request_tool (line 637) | function ajax_import_data_request_tool(request_url, data, success_redire...
  function ajax_validation_request_tool (line 672) | function ajax_validation_request_tool(request_url, data, success_redirec...

FILE: src/Controller/TaskController.php
  class TaskController (line 13) | class TaskController extends WP_List_Table
    method __construct (line 18) | public function __construct()
    method prepare_items (line 25) | public function prepare_items()
    method process_bulk_action (line 49) | public function process_bulk_action()
    method get_columns (line 67) | public function get_columns(): array
    method get_sortable_columns (line 83) | public function get_sortable_columns(): array
    method get_snippets (line 90) | public static function get_snippets($per_page = 10, $page_number = 1, ...
    method record_count (line 101) | public static function record_count($customvar = 'total')
    method view (line 107) | public function view()

FILE: src/Helpers/helpers.php
  function startsWith (line 11) | function startsWith(string $haystack, $needles): bool
  function frc_sanitize_text (line 30) | function frc_sanitize_text(string $key, ?string $default = ''): ?string
  function frc_sanitize_textarea (line 47) | function frc_sanitize_textarea(string $key, ?string $default = ''): ?string
  function frc_sanitize_array (line 64) | function frc_sanitize_array(string $key, string $type = 'integer' ): array
  function frc_option_esc_attr_e (line 93) | function frc_option_esc_attr_e($option, $key, string $default = '')
  function translationRules (line 109) | function translationRules($rules): array
  function frcAddColumn (line 134) | function frcAddColumn($column, $alterColumnSql, $table): void
  function frcChangeColumn (line 155) | function frcChangeColumn($sql, $table): void
  function getDb (line 166) | function getDb()
  function getTable (line 179) | function getTable($table): string

FILE: src/Helpers/helpers2.php
  function randomInsertString (line 9) | function randomInsertString($txt, $insert): string
  function insertK (line 44) | function insertK($count, $delay): int

FILE: src/Service/AbsoluteUrl.php
  class AbsoluteUrl (line 8) | class AbsoluteUrl implements PluginContract
    method install (line 10) | public static function install(QueryList $queryList, ...$opt)
    method convertAll (line 18) | public static function convertAll($ql, $config)
    method urlFormat (line 29) | public static function urlFormat($url, $domain){

FILE: src/Service/DownloadImage.php
  class DownloadImage (line 8) | class DownloadImage implements PluginContract
    method install (line 10) | public static function install(QueryList $queryList, ...$opt)
    method downloadAll (line 18) | public static function downloadAll($ql, $config)
    method suffix (line 73) | public static function suffix($path){

FILE: src/Service/GetTransCoding.php
  class GetTransCoding (line 8) | class GetTransCoding implements PluginContract
    method install (line 10) | public static function install(QueryList $queryList, ...$opt)
    method getTransCoding (line 18) | public static function getTransCoding(QueryList $ql, $url)

FILE: vendor/cache/adapter-common/AbstractCachePool.php
  class AbstractCachePool (line 26) | abstract class AbstractCachePool implements PhpCachePool, LoggerAwareInt...
    method storeItemInCache (line 46) | abstract protected function storeItemInCache(PhpCacheItem $item, $ttl);
    method fetchObjectFromCache (line 57) | abstract protected function fetchObjectFromCache($key);
    method clearAllObjectsFromCache (line 64) | abstract protected function clearAllObjectsFromCache();
    method clearOneObjectFromCache (line 73) | abstract protected function clearOneObjectFromCache($key);
    method getList (line 82) | abstract protected function getList($name);
    method removeList (line 91) | abstract protected function removeList($name);
    method appendListItem (line 99) | abstract protected function appendListItem($name, $key);
    method removeListItem (line 107) | abstract protected function removeListItem($name, $key);
    method __destruct (line 112) | public function __destruct()
    method getItem (line 120) | public function getItem($key)
    method getItems (line 145) | public function getItems(array $keys = [])
    method hasItem (line 158) | public function hasItem($key)
    method clear (line 170) | public function clear()
    method deleteItem (line 185) | public function deleteItem($key)
    method deleteItems (line 197) | public function deleteItems(array $keys)
    method save (line 221) | public function save(CacheItemInterface $item)
    method saveDeferred (line 249) | public function saveDeferred(CacheItemInterface $item)
    method commit (line 259) | public function commit()
    method validateKey (line 277) | protected function validateKey($key)
    method setLogger (line 302) | public function setLogger(LoggerInterface $logger): void
    method log (line 314) | protected function log($level, $message, array $context = [])
    method handleException (line 329) | private function handleException(\Exception $e, $function)
    method invalidateTags (line 349) | public function invalidateTags(array $tags)
    method invalidateTag (line 370) | public function invalidateTag($tag)
    method saveTags (line 378) | protected function saveTags(PhpCacheItem $item)
    method preRemoveItem (line 395) | protected function preRemoveItem($key)
    method removeTagEntries (line 406) | private function removeTagEntries(PhpCacheItem $item)
    method getTagKey (line 419) | protected function getTagKey($tag)
    method get (line 427) | public function get($key, $default = null)
    method set (line 440) | public function set($key, $value, $ttl = null)
    method delete (line 452) | public function delete($key)
    method getMultiple (line 460) | public function getMultiple($keys, $default = null)
    method generateValues (line 483) | private function generateValues($default, $items)
    method setMultiple (line 498) | public function setMultiple($values, $ttl = null)
    method deleteMultiple (line 537) | public function deleteMultiple($keys)
    method has (line 555) | public function has($key)

FILE: vendor/cache/adapter-common/CacheItem.php
  class CacheItem (line 21) | class CacheItem implements PhpCacheItem
    method __construct (line 66) | public function __construct($key, $callable = null, $value = null)
    method getKey (line 82) | public function getKey()
    method set (line 90) | public function set($value)
    method get (line 102) | public function get()
    method isHit (line 114) | public function isHit()
    method getExpirationTimestamp (line 132) | public function getExpirationTimestamp()
    method expiresAt (line 140) | public function expiresAt($expiration)
    method expiresAfter (line 156) | public function expiresAfter($time)
    method getPreviousTags (line 176) | public function getPreviousTags()
    method getTags (line 186) | public function getTags()
    method setTags (line 194) | public function setTags(array $tags)
    method tag (line 211) | private function tag($tags)
    method initialize (line 240) | private function initialize()
    method moveTagsToPrevious (line 264) | public function moveTagsToPrevious()

FILE: vendor/cache/adapter-common/Exception/CacheException.php
  class CacheException (line 21) | abstract class CacheException extends \RuntimeException implements Cache...

FILE: vendor/cache/adapter-common/Exception/CachePoolException.php
  class CachePoolException (line 19) | class CachePoolException extends CacheException

FILE: vendor/cache/adapter-common/Exception/InvalidArgumentException.php
  class InvalidArgumentException (line 17) | class InvalidArgumentException extends CacheException implements CacheIn...

FILE: vendor/cache/adapter-common/HasExpirationTimestampInterface.php
  type HasExpirationTimestampInterface (line 18) | interface HasExpirationTimestampInterface
    method getExpirationTimestamp (line 25) | public function getExpirationTimestamp();

FILE: vendor/cache/adapter-common/JsonBinaryArmoring.php
  type JsonBinaryArmoring (line 21) | trait JsonBinaryArmoring
    method jsonArmor (line 44) | protected static function jsonArmor($value)
    method jsonDeArmor (line 60) | protected static function jsonDeArmor($value)

FILE: vendor/cache/adapter-common/PhpCacheItem.php
  type PhpCacheItem (line 19) | interface PhpCacheItem extends HasExpirationTimestampInterface, Taggable...
    method getTags (line 31) | public function getTags();

FILE: vendor/cache/adapter-common/PhpCachePool.php
  type PhpCachePool (line 19) | interface PhpCachePool extends TaggableCacheItemPoolInterface
    method getItem (line 26) | public function getItem($key);
    method getItems (line 33) | public function getItems(array $keys = []);

FILE: vendor/cache/adapter-common/TagSupportWithArray.php
  type TagSupportWithArray (line 19) | trait TagSupportWithArray
    method getDirectValue (line 28) | abstract public function getDirectValue($name);
    method setDirectValue (line 36) | abstract public function setDirectValue($name, $value);
    method appendListItem (line 41) | protected function appendListItem($name, $value)
    method getList (line 54) | protected function getList($name)
    method removeList (line 67) | protected function removeList($name)
    method removeListItem (line 77) | protected function removeListItem($name, $key)

FILE: vendor/cache/filesystem-adapter/FilesystemCachePool.php
  class FilesystemCachePool (line 24) | class FilesystemCachePool extends AbstractCachePool
    method __construct (line 42) | public function __construct(FilesystemInterface $filesystem, $folder =...
    method setFolder (line 53) | public function setFolder($folder)
    method fetchObjectFromCache (line 61) | protected function fetchObjectFromCache($key)
    method clearAllObjectsFromCache (line 92) | protected function clearAllObjectsFromCache()
    method clearOneObjectFromCache (line 103) | protected function clearOneObjectFromCache($key)
    method storeItemInCache (line 111) | protected function storeItemInCache(PhpCacheItem $item, $ttl)
    method getFilePath (line 142) | private function getFilePath($key)
    method getList (line 154) | protected function getList($name)
    method removeList (line 168) | protected function removeList($name)
    method appendListItem (line 177) | protected function appendListItem($name, $key)
    method removeListItem (line 188) | protected function removeListItem($name, $key)
    method forceClear (line 205) | private function forceClear($key)

FILE: vendor/clue/socket-raw/src/Exception.php
  class Exception (line 7) | class Exception extends RuntimeException
    method createFromSocketResource (line 19) | public static function createFromSocketResource($resource, $messagePre...
    method createFromGlobalSocketOperation (line 47) | public static function createFromGlobalSocketOperation($messagePrefix ...
    method createFromCode (line 64) | public static function createFromCode($code, $messagePrefix = 'Socket ...
    method getErrorMessage (line 77) | protected static function getErrorMessage($code)

FILE: vendor/clue/socket-raw/src/Factory.php
  class Factory (line 7) | class Factory
    method createClient (line 21) | public function createClient($address, $timeout = null)
    method createServer (line 51) | public function createServer($address)
    method createTcp4 (line 76) | public function createTcp4()
    method createTcp6 (line 88) | public function createTcp6()
    method createUdp4 (line 100) | public function createUdp4()
    method createUdp6 (line 112) | public function createUdp6()
    method createUnix (line 124) | public function createUnix()
    method createUdg (line 136) | public function createUdg()
    method createIcmp4 (line 148) | public function createIcmp4()
    method createIcmp6 (line 160) | public function createIcmp6()
    method create (line 176) | public function create($domain, $type, $protocol)
    method createPair (line 196) | public function createPair($domain, $type, $protocol)
    method createListen (line 216) | public function createListen($port, $backlog = 128)
    method createFromString (line 235) | public function createFromString(&$address, &$scheme)

FILE: vendor/clue/socket-raw/src/Socket.php
  class Socket (line 11) | class Socket
    method __construct (line 28) | public function __construct($resource)
    method getResource (line 38) | public function getResource()
    method accept (line 54) | public function accept()
    method bind (line 74) | public function bind($address)
    method close (line 94) | public function close()
    method connect (line 109) | public function connect($address)
    method connectTimeout (line 139) | public function connectTimeout($address, $timeout)
    method getOption (line 177) | public function getOption($level, $optname)
    method getPeerName (line 194) | public function getPeerName()
    method getSockName (line 211) | public function getSockName()
    method listen (line 230) | public function listen($backlog = 0)
    method read (line 253) | public function read($length, $type = PHP_BINARY_READ)
    method recv (line 274) | public function recv($length, $flags)
    method recvFrom (line 295) | public function recvFrom($length, $flags, &$remote)
    method selectRead (line 314) | public function selectRead($sec = 0)
    method selectWrite (line 335) | public function selectWrite($sec = 0)
    method send (line 359) | public function send($buffer, $flags)
    method sendTo (line 380) | public function sendTo($buffer, $flags, $remote)
    method setBlocking (line 399) | public function setBlocking($toggle = true)
    method setOption (line 420) | public function setOption($level, $optname, $optval)
    method shutdown (line 439) | public function shutdown($how = 2)
    method write (line 458) | public function write($buffer)
    method getType (line 475) | public function getType()
    method assertAlive (line 499) | public function assertAlive()
    method formatAddress (line 515) | protected function formatAddress($address, $port)
    method unformatAddress (line 533) | protected function unformatAddress($address, &$port)

FILE: vendor/composer/ClassLoader.php
  class ClassLoader (line 43) | class ClassLoader
    method __construct (line 106) | public function __construct($vendorDir = null)
    method getPrefixes (line 114) | public function getPrefixes()
    method getPrefixesPsr4 (line 127) | public function getPrefixesPsr4()
    method getFallbackDirs (line 136) | public function getFallbackDirs()
    method getFallbackDirsPsr4 (line 145) | public function getFallbackDirsPsr4()
    method getClassMap (line 154) | public function getClassMap()
    method addClassMap (line 165) | public function addClassMap(array $classMap)
    method add (line 184) | public function add($prefix, $paths, $prepend = false)
    method addPsr4 (line 233) | public function addPsr4($prefix, $paths, $prepend = false)
    method set (line 280) | public function set($prefix, $paths)
    method setPsr4 (line 300) | public function setPsr4($prefix, $paths)
    method setUseIncludePath (line 321) | public function setUseIncludePath($useIncludePath)
    method getUseIncludePath (line 332) | public function getUseIncludePath()
    method setClassMapAuthoritative (line 345) | public function setClassMapAuthoritative($classMapAuthoritative)
    method isClassMapAuthoritative (line 355) | public function isClassMapAuthoritative()
    method setApcuPrefix (line 367) | public function setApcuPrefix($apcuPrefix)
    method getApcuPrefix (line 377) | public function getApcuPrefix()
    method register (line 389) | public function register($prepend = false)
    method unregister (line 410) | public function unregister()
    method loadClass (line 425) | public function loadClass($class)
    method findFile (line 443) | public function findFile($class)
    method getRegisteredLoaders (line 483) | public static function getRegisteredLoaders()
    method findFileWithExtension (line 493) | private function findFileWithExtension($class, $ext)
  function includeFile (line 569) | function includeFile($file)

FILE: vendor/composer/InstalledVersions.php
  class InstalledVersions (line 25) | class InstalledVersions
    method getInstalledPackages (line 50) | public static function getInstalledPackages()
    method getInstalledPackagesByType (line 71) | public static function getInstalledPackagesByType($type)
    method isInstalled (line 95) | public static function isInstalled($packageName, $includeDevRequiremen...
    method satisfies (line 118) | public static function satisfies(VersionParser $parser, $packageName, ...
    method getVersionRanges (line 135) | public static function getVersionRanges($packageName)
    method getVersion (line 166) | public static function getVersion($packageName)
    method getPrettyVersion (line 187) | public static function getPrettyVersion($packageName)
    method getReference (line 208) | public static function getReference($packageName)
    method getInstallPath (line 229) | public static function getInstallPath($packageName)
    method getRootPackage (line 246) | public static function getRootPackage()
    method getRawData (line 260) | public static function getRawData()
    method getAllRawData (line 283) | public static function getAllRawData()
    method reload (line 306) | public static function reload($data)
    method getInstalled (line 316) | private static function getInstalled()

FILE: vendor/composer/autoload_real.php
  class ComposerAutoloaderInit15ad0a0b334e2ea46dbbf214582f0b16 (line 5) | class ComposerAutoloaderInit15ad0a0b334e2ea46dbbf214582f0b16
    method loadClassLoader (line 9) | public static function loadClassLoader($class)
    method getLoader (line 19) | public static function getLoader()
  function composerRequire15ad0a0b334e2ea46dbbf214582f0b16 (line 66) | function composerRequire15ad0a0b334e2ea46dbbf214582f0b16($fileIdentifier...

FILE: vendor/composer/autoload_static.php
  class ComposerStaticInit15ad0a0b334e2ea46dbbf214582f0b16 (line 7) | class ComposerStaticInit15ad0a0b334e2ea46dbbf214582f0b16
    method getInitializer (line 228) | public static function getInitializer(ClassLoader $loader)

FILE: vendor/guzzlehttp/guzzle/src/BodySummarizer.php
  class BodySummarizer (line 7) | final class BodySummarizer implements BodySummarizerInterface
    method __construct (line 14) | public function __construct(int $truncateAt = null)
    method summarize (line 22) | public function summarize(MessageInterface $message): ?string

FILE: vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php
  type BodySummarizerInterface (line 7) | interface BodySummarizerInterface
    method summarize (line 12) | public function summarize(MessageInterface $message): ?string;

FILE: vendor/guzzlehttp/guzzle/src/Client.php
  class Client (line 17) | class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
    method __construct (line 57) | public function __construct(array $config = [])
    method __call (line 81) | public function __call($method, $args)
    method sendAsync (line 101) | public function sendAsync(RequestInterface $request, array $options = ...
    method send (line 120) | public function send(RequestInterface $request, array $options = []): ...
    method sendRequest (line 131) | public function sendRequest(RequestInterface $request): ResponseInterface
    method requestAsync (line 152) | public function requestAsync(string $method, $uri = '', array $options...
    method request (line 184) | public function request(string $method, $uri = '', array $options = []...
    method getConfig (line 203) | public function getConfig(?string $option = null)
    method buildUri (line 210) | private function buildUri(UriInterface $uri, array $config): UriInterface
    method configureDefaults (line 227) | private function configureDefaults(array $config): void
    method prepareDefaults (line 281) | private function prepareDefaults(array $options): array
    method transfer (line 324) | private function transfer(RequestInterface $request, array $options): ...
    method applyOptions (line 340) | private function applyOptions(RequestInterface $request, array &$optio...
    method invalidBody (line 469) | private function invalidBody(): InvalidArgumentException

FILE: vendor/guzzlehttp/guzzle/src/ClientInterface.php
  type ClientInterface (line 14) | interface ClientInterface
    method send (line 30) | public function send(RequestInterface $request, array $options = []): ...
    method sendAsync (line 39) | public function sendAsync(RequestInterface $request, array $options = ...
    method request (line 54) | public function request(string $method, $uri, array $options = []): Re...
    method requestAsync (line 68) | public function requestAsync(string $method, $uri, array $options = []...
    method getConfig (line 83) | public function getConfig(?string $option = null);

FILE: vendor/guzzlehttp/guzzle/src/ClientTrait.php
  type ClientTrait (line 13) | trait ClientTrait
    method request (line 28) | abstract public function request(string $method, $uri, array $options ...
    method get (line 42) | public function get($uri, array $options = []): ResponseInterface
    method head (line 59) | public function head($uri, array $options = []): ResponseInterface
    method put (line 76) | public function put($uri, array $options = []): ResponseInterface
    method post (line 93) | public function post($uri, array $options = []): ResponseInterface
    method patch (line 110) | public function patch($uri, array $options = []): ResponseInterface
    method delete (line 127) | public function delete($uri, array $options = []): ResponseInterface
    method requestAsync (line 144) | abstract public function requestAsync(string $method, $uri, array $opt...
    method getAsync (line 157) | public function getAsync($uri, array $options = []): PromiseInterface
    method headAsync (line 173) | public function headAsync($uri, array $options = []): PromiseInterface
    method putAsync (line 189) | public function putAsync($uri, array $options = []): PromiseInterface
    method postAsync (line 205) | public function postAsync($uri, array $options = []): PromiseInterface
    method patchAsync (line 221) | public function patchAsync($uri, array $options = []): PromiseInterface
    method deleteAsync (line 237) | public function deleteAsync($uri, array $options = []): PromiseInterface

FILE: vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
  class CookieJar (line 11) | class CookieJar implements CookieJarInterface
    method __construct (line 30) | public function __construct(bool $strictMode = false, array $cookieArr...
    method fromArray (line 48) | public static function fromArray(array $cookies, string $domain): self
    method shouldPersist (line 70) | public static function shouldPersist(SetCookie $cookie, bool $allowSes...
    method getCookieByName (line 88) | public function getCookieByName(string $name): ?SetCookie
    method toArray (line 102) | public function toArray(): array
    method clear (line 112) | public function clear(?string $domain = null, ?string $path = null, ?s...
    method clearSessionCookies (line 147) | public function clearSessionCookies(): void
    method setCookie (line 160) | public function setCookie(SetCookie $cookie): bool
    method count (line 220) | public function count(): int
    method getIterator (line 228) | public function getIterator(): \ArrayIterator
    method extractCookies (line 233) | public function extractCookies(RequestInterface $request, ResponseInte...
    method getCookiePathFromRequest (line 254) | private function getCookiePathFromRequest(RequestInterface $request): ...
    method withCookieHeader (line 274) | public function withCookieHeader(RequestInterface $request): RequestIn...
    method removeCookieIfEmpty (line 302) | private function removeCookieIfEmpty(SetCookie $cookie): void

FILE: vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php
  type CookieJarInterface (line 19) | interface CookieJarInterface extends \Countable, \IteratorAggregate
    method withCookieHeader (line 31) | public function withCookieHeader(RequestInterface $request): RequestIn...
    method extractCookies (line 39) | public function extractCookies(RequestInterface $request, ResponseInte...
    method setCookie (line 48) | public function setCookie(SetCookie $cookie): bool;
    method clear (line 64) | public function clear(?string $domain = null, ?string $path = null, ?s...
    method clearSessionCookies (line 73) | public function clearSessionCookies(): void;
    method toArray (line 78) | public function toArray(): array;

FILE: vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
  class FileCookieJar (line 10) | class FileCookieJar extends CookieJar
    method __construct (line 31) | public function __construct(string $cookieFile, bool $storeSessionCook...
    method __destruct (line 45) | public function __destruct()
    method save (line 57) | public function save(string $filename): void
    method load (line 82) | public function load(string $filename): void

FILE: vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
  class SessionCookieJar (line 8) | class SessionCookieJar extends CookieJar
    method __construct (line 28) | public function __construct(string $sessionKey, bool $storeSessionCook...
    method __destruct (line 39) | public function __destruct()
    method save (line 47) | public function save(): void
    method load (line 63) | protected function load(): void

FILE: vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
  class SetCookie (line 8) | class SetCookie
    method fromString (line 35) | public static function fromString(string $cookie): self
    method __construct (line 75) | public function __construct(array $data = [])
    method __toString (line 93) | public function __toString()
    method toArray (line 109) | public function toArray(): array
    method getName (line 119) | public function getName()
    method setName (line 129) | public function setName($name): void
    method getValue (line 143) | public function getValue()
    method setValue (line 153) | public function setValue($value): void
    method getDomain (line 167) | public function getDomain()
    method setDomain (line 177) | public function setDomain($domain): void
    method getPath (line 191) | public function getPath()
    method setPath (line 201) | public function setPath($path): void
    method getMaxAge (line 215) | public function getMaxAge()
    method setMaxAge (line 225) | public function setMaxAge($maxAge): void
    method getExpires (line 239) | public function getExpires()
    method setExpires (line 249) | public function setExpires($timestamp): void
    method getSecure (line 263) | public function getSecure()
    method setSecure (line 273) | public function setSecure($secure): void
    method getDiscard (line 287) | public function getDiscard()
    method setDiscard (line 297) | public function setDiscard($discard): void
    method getHttpOnly (line 311) | public function getHttpOnly()
    method setHttpOnly (line 321) | public function setHttpOnly($httpOnly): void
    method matchesPath (line 345) | public function matchesPath(string $requestPath): bool
    method matchesDomain (line 373) | public function matchesDomain(string $domain): bool
    method isExpired (line 401) | public function isExpired(): bool
    method validate (line 411) | public function validate()

FILE: vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php
  class BadResponseException (line 11) | class BadResponseException extends RequestException
    method __construct (line 13) | public function __construct(
    method hasResponse (line 26) | public function hasResponse(): bool
    method getResponse (line 34) | public function getResponse(): ResponseInterface

FILE: vendor/guzzlehttp/guzzle/src/Exception/ClientException.php
  class ClientException (line 8) | class ClientException extends BadResponseException

FILE: vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php
  class ConnectException (line 13) | class ConnectException extends TransferException implements NetworkExcep...
    method __construct (line 25) | public function __construct(
    method getRequest (line 39) | public function getRequest(): RequestInterface
    method getHandlerContext (line 52) | public function getHandlerContext(): array

FILE: vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php
  type GuzzleException (line 7) | interface GuzzleException extends ClientExceptionInterface

FILE: vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php
  class InvalidArgumentException (line 5) | final class InvalidArgumentException extends \InvalidArgumentException i...

FILE: vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
  class RequestException (line 15) | class RequestException extends TransferException implements RequestExcep...
    method __construct (line 32) | public function __construct(
    method wrapException (line 50) | public static function wrapException(RequestInterface $request, \Throw...
    method create (line 64) | public static function create(
    method obfuscateUri (line 119) | private static function obfuscateUri(UriInterface $uri): UriInterface
    method getRequest (line 133) | public function getRequest(): RequestInterface
    method getResponse (line 141) | public function getResponse(): ?ResponseInterface
    method hasResponse (line 149) | public function hasResponse(): bool
    method getHandlerContext (line 162) | public function getHandlerContext(): array

FILE: vendor/guzzlehttp/guzzle/src/Exception/ServerException.php
  class ServerException (line 8) | class ServerException extends BadResponseException

FILE: vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php
  class TooManyRedirectsException (line 5) | class TooManyRedirectsException extends RequestException

FILE: vendor/guzzlehttp/guzzle/src/Exception/TransferException.php
  class TransferException (line 5) | class TransferException extends \RuntimeException implements GuzzleExcep...

FILE: vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
  class CurlFactory (line 20) | class CurlFactory implements CurlFactoryInterface
    method __construct (line 42) | public function __construct(int $maxHandles)
    method create (line 47) | public function create(RequestInterface $request, array $options): Eas...
    method release (line 75) | public function release(EasyHandle $easy): void
    method finish (line 103) | public static function finish(callable $handler, EasyHandle $easy, Cur...
    method invokeStats (line 125) | private static function invokeStats(EasyHandle $easy): void
    method finishError (line 142) | private static function finishError(callable $handler, EasyHandle $eas...
    method createRejection (line 161) | private static function createRejection(EasyHandle $easy, array $ctx):...
    method getDefaultConf (line 219) | private function getDefaultConf(EasyHandle $easy): array
    method applyMethod (line 246) | private function applyMethod(EasyHandle $easy, array &$conf): void
    method applyBody (line 273) | private function applyBody(RequestInterface $request, array $options, ...
    method applyHeaders (line 312) | private function applyHeaders(EasyHandle $easy, array &$conf): void
    method removeHeader (line 339) | private function removeHeader(string $name, array &$options): void
    method applyHandlerOptions (line 349) | private function applyHandlerOptions(EasyHandle $easy, array &$conf): ...
    method retryFailedRewind (line 516) | private static function retryFailedRewind(callable $handler, EasyHandl...
    method createHeaderFn (line 550) | private function createHeaderFn(EasyHandle $easy): callable

FILE: vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php
  type CurlFactoryInterface (line 7) | interface CurlFactoryInterface
    method create (line 17) | public function create(RequestInterface $request, array $options): Eas...
    method release (line 24) | public function release(EasyHandle $easy): void;

FILE: vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php
  class CurlHandler (line 17) | class CurlHandler
    method __construct (line 31) | public function __construct(array $options = [])
    method __invoke (line 37) | public function __invoke(RequestInterface $request, array $options): P...

FILE: vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
  class CurlMultiHandler (line 22) | class CurlMultiHandler
    method __construct (line 67) | public function __construct(array $options = [])
    method __get (line 91) | public function __get($name)
    method __destruct (line 113) | public function __destruct()
    method __invoke (line 121) | public function __invoke(RequestInterface $request, array $options): P...
    method tick (line 141) | public function tick(): void
    method execute (line 174) | public function execute(): void
    method addRequest (line 187) | private function addRequest(array $entry): void
    method cancel (line 206) | private function cancel($id): bool
    method processMessages (line 225) | private function processMessages(): void
    method timeToNext (line 249) | private function timeToNext(): int

FILE: vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php
  class EasyHandle (line 16) | final class EasyHandle
    method createResponse (line 69) | public function createResponse(): void
    method __get (line 107) | public function __get($name)

FILE: vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php
  class HeaderProcessor (line 10) | final class HeaderProcessor
    method parseHeaders (line 21) | public static function parseHeaders(array $headers): array

FILE: vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
  class MockHandler (line 20) | class MockHandler implements \Countable
    method createWithMiddleware (line 55) | public static function createWithMiddleware(array $queue = null, calla...
    method __construct (line 69) | public function __construct(array $queue = null, callable $onFulfilled...
    method __invoke (line 80) | public function __invoke(RequestInterface $request, array $options): P...
    method append (line 152) | public function append(...$values): void
    method getLastRequest (line 170) | public function getLastRequest(): ?RequestInterface
    method getLastOptions (line 178) | public function getLastOptions(): array
    method count (line 186) | public function count(): int
    method reset (line 191) | public function reset(): void
    method invokeStats (line 199) | private function invokeStats(

FILE: vendor/guzzlehttp/guzzle/src/Handler/Proxy.php
  class Proxy (line 14) | class Proxy
    method wrapSync (line 25) | public static function wrapSync(callable $default, callable $sync): ca...
    method wrapStreaming (line 45) | public static function wrapStreaming(callable $default, callable $stre...

FILE: vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
  class StreamHandler (line 23) | class StreamHandler
    method __invoke (line 36) | public function __invoke(RequestInterface $request, array $options): P...
    method invokeStats (line 82) | private function invokeStats(
    method createResponse (line 98) | private function createResponse(RequestInterface $request, array $opti...
    method createSink (line 148) | private function createSink(StreamInterface $stream, array $options): ...
    method checkDecode (line 162) | private function checkDecode(array $options, array $headers, $stream):...
    method drain (line 201) | private function drain(StreamInterface $source, StreamInterface $sink,...
    method createResource (line 228) | private function createResource(callable $callback)
    method createStream (line 262) | private function createStream(RequestInterface $request, array $options)
    method resolveHost (line 339) | private function resolveHost(RequestInterface $request, array $options...
    method getDefaultContext (line 363) | private function getDefaultContext(RequestInterface $request): array
    method add_proxy (line 400) | private function add_proxy(RequestInterface $request, array &$options,...
    method parse_proxy (line 433) | private function parse_proxy(string $url): array
    method add_timeout (line 461) | private function add_timeout(RequestInterface $request, array &$option...
    method add_verify (line 471) | private function add_verify(RequestInterface $request, array &$options...
    method add_cert (line 497) | private function add_cert(RequestInterface $request, array &$options, ...
    method add_progress (line 514) | private function add_progress(RequestInterface $request, array &$optio...
    method add_debug (line 531) | private function add_debug(RequestInterface $request, array &$options,...
    method addNotification (line 565) | private static function addNotification(array &$params, callable $noti...
    method callArray (line 578) | private static function callArray(array $functions): callable

FILE: vendor/guzzlehttp/guzzle/src/HandlerStack.php
  class HandlerStack (line 15) | class HandlerStack
    method create (line 47) | public static function create(?callable $handler = null): self
    method __construct (line 61) | public function __construct(callable $handler = null)
    method __invoke (line 71) | public function __invoke(RequestInterface $request, array $options)
    method __toString (line 83) | public function __toString()
    method setHandler (line 114) | public function setHandler(callable $handler): void
    method hasHandler (line 123) | public function hasHandler(): bool
    method unshift (line 134) | public function unshift(callable $middleware, ?string $name = null): void
    method push (line 146) | public function push(callable $middleware, string $name = ''): void
    method before (line 159) | public function before(string $findName, callable $middleware, string ...
    method after (line 171) | public function after(string $findName, callable $middleware, string $...
    method remove (line 181) | public function remove($remove): void
    method resolve (line 202) | public function resolve(): callable
    method findByName (line 220) | private function findByName(string $name): int
    method splice (line 234) | private function splice(string $findName, string $withName, callable $...
    method debugCallable (line 260) | private function debugCallable($fn): string

FILE: vendor/guzzlehttp/guzzle/src/MessageFormatter.php
  class MessageFormatter (line 38) | class MessageFormatter implements MessageFormatterInterface
    method __construct (line 59) | public function __construct(?string $template = self::CLF)
    method format (line 71) | public function format(RequestInterface $request, ?ResponseInterface $...
    method headers (line 189) | private function headers(MessageInterface $message): string

FILE: vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php
  type MessageFormatterInterface (line 8) | interface MessageFormatterInterface
    method format (line 17) | public function format(RequestInterface $request, ?ResponseInterface $...

FILE: vendor/guzzlehttp/guzzle/src/Middleware.php
  class Middleware (line 16) | final class Middleware
    method cookies (line 26) | public static function cookies(): callable
    method httpErrors (line 56) | public static function httpErrors(BodySummarizerInterface $bodySummari...
    method history (line 85) | public static function history(&$container): callable
    method tap (line 130) | public static function tap(callable $before = null, callable $after = ...
    method redirect (line 151) | public static function redirect(): callable
    method retry (line 173) | public static function retry(callable $decider, callable $delay = null...
    method log (line 192) | public static function log(LoggerInterface $logger, $formatter, string...
    method prepareBody (line 222) | public static function prepareBody(): callable
    method mapRequest (line 236) | public static function mapRequest(callable $fn): callable
    method mapResponse (line 252) | public static function mapResponse(callable $fn): callable

FILE: vendor/guzzlehttp/guzzle/src/Pool.php
  class Pool (line 24) | class Pool implements PromisorInterface
    method __construct (line 41) | public function __construct(ClientInterface $client, $requests, array ...
    method promise (line 73) | public function promise(): PromiseInterface
    method batch (line 96) | public static function batch(ClientInterface $client, $requests, array...
    method cmpCallback (line 111) | private static function cmpCallback(array &$options, string $name, arr...

FILE: vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php
  class PrepareBodyMiddleware (line 14) | class PrepareBodyMiddleware
    method __construct (line 24) | public function __construct(callable $nextHandler)
    method __invoke (line 29) | public function __invoke(RequestInterface $request, array $options): P...
    method addExpectHeader (line 70) | private function addExpectHeader(RequestInterface $request, array $opt...

FILE: vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
  class RedirectMiddleware (line 20) | class RedirectMiddleware
    method __construct (line 45) | public function __construct(callable $nextHandler)
    method __invoke (line 50) | public function __invoke(RequestInterface $request, array $options): P...
    method checkRedirect (line 80) | public function checkRedirect(RequestInterface $request, array $option...
    method withTracking (line 116) | private function withTracking(PromiseInterface $promise, string $uri, ...
    method guardMax (line 139) | private function guardMax(RequestInterface $request, ResponseInterface...
    method modifyRequest (line 151) | public function modifyRequest(RequestInterface $request, array $option...
    method redirectUri (line 202) | private function redirectUri(RequestInterface $request, ResponseInterf...

FILE: vendor/guzzlehttp/guzzle/src/RequestOptions.php
  class RequestOptions (line 12) | final class RequestOptions

FILE: vendor/guzzlehttp/guzzle/src/RetryMiddleware.php
  class RetryMiddleware (line 16) | class RetryMiddleware
    method __construct (line 43) | public function __construct(callable $decider, callable $nextHandler, ...
    method exponentialDelay (line 55) | public static function exponentialDelay(int $retries): int
    method __invoke (line 60) | public function __invoke(RequestInterface $request, array $options): P...
    method onFulfilled (line 77) | private function onFulfilled(RequestInterface $request, array $options...
    method onRejected (line 95) | private function onRejected(RequestInterface $req, array $options): ca...
    method doRetry (line 110) | private function doRetry(RequestInterface $request, array $options, Re...

FILE: vendor/guzzlehttp/guzzle/src/TransferStats.php
  class TransferStats (line 13) | final class TransferStats
    method __construct (line 47) | public function __construct(
    method getRequest (line 61) | public function getRequest(): RequestInterface
    method getResponse (line 69) | public function getResponse(): ?ResponseInterface
    method hasResponse (line 77) | public function hasResponse(): bool
    method getHandlerErrorData (line 91) | public function getHandlerErrorData()
    method getEffectiveUri (line 99) | public function getEffectiveUri(): UriInterface
    method getTransferTime (line 109) | public function getTransferTime(): ?float
    method getHandlerStats (line 117) | public function getHandlerStats(): array
    method getHandlerStat (line 129) | public function getHandlerStat(string $stat)

FILE: vendor/guzzlehttp/guzzle/src/Utils.php
  class Utils (line 12) | final class Utils
    method describeType (line 22) | public static function describeType($input): string
    method headersFromLines (line 46) | public static function headersFromLines(iterable $lines): array
    method debugResource (line 65) | public static function debugResource($value = null)
    method chooseHandler (line 86) | public static function chooseHandler(): callable
    method defaultUserAgent (line 111) | public static function defaultUserAgent(): string
    method defaultCaBundle (line 131) | public static function defaultCaBundle(): string
    method normalizeHeaderKeys (line 192) | public static function normalizeHeaderKeys(array $headers): array
    method isHostInNoProxy (line 221) | public static function isHostInNoProxy(string $host, array $noProxyArr...
    method jsonDecode (line 271) | public static function jsonDecode(string $json, bool $assoc = false, i...
    method jsonEncode (line 292) | public static function jsonEncode($value, int $options = 0, int $depth...
    method currentTime (line 311) | public static function currentTime(): float
    method idnUriConvert (line 321) | public static function idnUriConvert(UriInterface $uri, int $options =...
    method getenv (line 358) | public static function getenv(string $name): ?string
    method idnToAsci (line 374) | private static function idnToAsci(string $domain, int $options, ?array...

FILE: vendor/guzzlehttp/guzzle/src/functions.php
  function describe_type (line 16) | function describe_type($input): string
  function headers_from_lines (line 29) | function headers_from_lines(iterable $lines): array
  function debug_resource (line 43) | function debug_resource($value = null)
  function choose_handler (line 59) | function choose_handler(): callable
  function default_user_agent (line 69) | function default_user_agent(): string
  function default_ca_bundle (line 89) | function default_ca_bundle(): string
  function normalize_header_keys (line 100) | function normalize_header_keys(array $headers): array
  function is_host_in_noproxy (line 126) | function is_host_in_noproxy(string $host, array $noProxyArray): bool
  function json_decode (line 147) | function json_decode(string $json, bool $assoc = false, int $depth = 512...
  function json_encode (line 164) | function json_encode($value, int $options = 0, int $depth = 512): string

FILE: vendor/guzzlehttp/promises/src/AggregateException.php
  class AggregateException (line 8) | class AggregateException extends RejectionException
    method __construct (line 10) | public function __construct($msg, array $reasons)

FILE: vendor/guzzlehttp/promises/src/CancellationException.php
  class CancellationException (line 8) | class CancellationException extends RejectionException

FILE: vendor/guzzlehttp/promises/src/Coroutine.php
  class Coroutine (line 45) | final class Coroutine implements PromiseInterface
    method __construct (line 62) | public function __construct(callable $generatorFn)
    method of (line 84) | public static function of(callable $generatorFn)
    method then (line 89) | public function then(
    method otherwise (line 96) | public function otherwise(callable $onRejected)
    method wait (line 101) | public function wait($unwrap = true)
    method getState (line 106) | public function getState()
    method resolve (line 111) | public function resolve($value)
    method reject (line 116) | public function reject($reason)
    method cancel (line 121) | public function cancel()
    method nextCoroutine (line 127) | private function nextCoroutine($yielded)
    method _handleSuccess (line 136) | public function _handleSuccess($value)
    method _handleFailure (line 156) | public function _handleFailure($reason)

FILE: vendor/guzzlehttp/promises/src/Create.php
  class Create (line 5) | final class Create
    method promiseFor (line 14) | public static function promiseFor($value)
    method rejectionFor (line 40) | public static function rejectionFor($reason)
    method exceptionFor (line 56) | public static function exceptionFor($reason)
    method iterFor (line 72) | public static function iterFor($value)

FILE: vendor/guzzlehttp/promises/src/Each.php
  class Each (line 5) | final class Each
    method of (line 26) | public static function of(
    method ofLimit (line 52) | public static function ofLimit(
    method ofLimitAll (line 76) | public static function ofLimitAll(

FILE: vendor/guzzlehttp/promises/src/EachPromise.php
  class EachPromise (line 9) | class EachPromise implements PromisorInterface
    method __construct (line 54) | public function __construct($iterable, array $config = [])
    method promise (line 72) | public function promise()
    method createPromise (line 104) | private function createPromise()
    method refillPending (line 133) | private function refillPending()
    method addPending (line 161) | private function addPending()
    method advanceIterator (line 202) | private function advanceIterator()
    method step (line 227) | private function step($idx)
    method checkIfFinished (line 245) | private function checkIfFinished()

FILE: vendor/guzzlehttp/promises/src/FulfilledPromise.php
  class FulfilledPromise (line 11) | class FulfilledPromise implements PromiseInterface
    method __construct (line 15) | public function __construct($value)
    method then (line 26) | public function then(
    method otherwise (line 53) | public function otherwise(callable $onRejected)
    method wait (line 58) | public function wait($unwrap = true, $defaultDelivery = null)
    method getState (line 63) | public function getState()
    method resolve (line 68) | public function resolve($value)
    method reject (line 75) | public function reject($reason)
    method cancel (line 80) | public function cancel()

FILE: vendor/guzzlehttp/promises/src/Is.php
  class Is (line 5) | final class Is
    method pending (line 12) | public static function pending(PromiseInterface $promise)
    method settled (line 22) | public static function settled(PromiseInterface $promise)
    method fulfilled (line 32) | public static function fulfilled(PromiseInterface $promise)
    method rejected (line 42) | public static function rejected(PromiseInterface $promise)

FILE: vendor/guzzlehttp/promises/src/Promise.php
  class Promise (line 10) | class Promise implements PromiseInterface
    method __construct (line 23) | public function __construct(
    method then (line 31) | public function then(
    method otherwise (line 55) | public function otherwise(callable $onRejected)
    method wait (line 60) | public function wait($unwrap = true)
    method getState (line 76) | public function getState()
    method cancel (line 81) | public function cancel()
    method resolve (line 108) | public function resolve($value)
    method reject (line 113) | public function reject($reason)
    method settle (line 118) | private function settle($state, $value)
    method callHandler (line 183) | private static function callHandler($index, $value, array $handler)
    method waitIfPending (line 219) | private function waitIfPending()
    method invokeWaitFn (line 243) | private function invokeWaitFn()
    method invokeWaitList (line 262) | private function invokeWaitList()

FILE: vendor/guzzlehttp/promises/src/PromiseInterface.php
  type PromiseInterface (line 14) | interface PromiseInterface
    method then (line 29) | public function then(
    method otherwise (line 44) | public function otherwise(callable $onRejected);
    method getState (line 54) | public function getState();
    method resolve (line 63) | public function resolve($value);
    method reject (line 72) | public function reject($reason);
    method cancel (line 79) | public function cancel();
    method wait (line 96) | public function wait($unwrap = true);

FILE: vendor/guzzlehttp/promises/src/PromisorInterface.php
  type PromisorInterface (line 8) | interface PromisorInterface
    method promise (line 15) | public function promise();

FILE: vendor/guzzlehttp/promises/src/RejectedPromise.php
  class RejectedPromise (line 11) | class RejectedPromise implements PromiseInterface
    method __construct (line 15) | public function __construct($reason)
    method then (line 26) | public function then(
    method otherwise (line 56) | public function otherwise(callable $onRejected)
    method wait (line 61) | public function wait($unwrap = true, $defaultDelivery = null)
    method getState (line 70) | public function getState()
    method resolve (line 75) | public function resolve($value)
    method reject (line 80) | public function reject($reason)
    method cancel (line 87) | public function cancel()

FILE: vendor/guzzlehttp/promises/src/RejectionException.php
  class RejectionException (line 10) | class RejectionException extends \RuntimeException
    method __construct (line 19) | public function __construct($reason, $description = null)
    method getReason (line 44) | public function getReason()

FILE: vendor/guzzlehttp/promises/src/TaskQueue.php
  class TaskQueue (line 14) | class TaskQueue implements TaskQueueInterface
    method __construct (line 19) | public function __construct($withShutdown = true)
    method isEmpty (line 34) | public function isEmpty()
    method add (line 39) | public function add(callable $task)
    method run (line 44) | public function run()
    method disableShutdown (line 63) | public function disableShutdown()

FILE: vendor/guzzlehttp/promises/src/TaskQueueInterface.php
  type TaskQueueInterface (line 5) | interface TaskQueueInterface
    method isEmpty (line 12) | public function isEmpty();
    method add (line 18) | public function add(callable $task);
    method run (line 23) | public function run();

FILE: vendor/guzzlehttp/promises/src/Utils.php
  class Utils (line 5) | final class Utils
    method queue (line 24) | public static function queue(TaskQueueInterface $assign = null)
    method task (line 45) | public static function task(callable $task)
    method inspect (line 78) | public static function inspect(PromiseInterface $promise)
    method inspectAll (line 106) | public static function inspectAll($promises)
    method unwrap (line 130) | public static function unwrap($promises)
    method all (line 153) | public static function all($promises, $recursive = false)
    method some (line 199) | public static function some($count, $promises)
    method any (line 240) | public static function any($promises)
    method settle (line 259) | public static function settle($promises)

FILE: vendor/guzzlehttp/promises/src/functions.php
  function queue (line 24) | function queue(TaskQueueInterface $assign = null)
  function task (line 39) | function task(callable $task)
  function promise_for (line 53) | function promise_for($value)
  function rejection_for (line 68) | function rejection_for($reason)
  function exception_for (line 82) | function exception_for($reason)
  function iter_for (line 96) | function iter_for($value)
  function inspect (line 117) | function inspect(PromiseInterface $promise)
  function inspect_all (line 136) | function inspect_all($promises)
  function unwrap (line 157) | function unwrap($promises)
  function all (line 177) | function all($promises, $recursive = false)
  function some (line 200) | function some($count, $promises)
  function any (line 215) | function any($promises)
  function settle (line 234) | function settle($promises)
  function each (line 260) | function each(
  function each_limit (line 285) | function each_limit(
  function each_limit_all (line 307) | function each_limit_all(
  function is_fulfilled (line 322) | function is_fulfilled(PromiseInterface $promise)
  function is_rejected (line 334) | function is_rejected(PromiseInterface $promise)
  function is_settled (line 346) | function is_settled(PromiseInterface $promise)
  function coroutine (line 360) | function coroutine(callable $generatorFn)

FILE: vendor/guzzlehttp/psr7/src/AppendStream.php
  class AppendStream (line 14) | final class AppendStream implements StreamInterface
    method __construct (line 32) | public function __construct(array $streams = [])
    method __toString (line 39) | public function __toString(): string
    method addStream (line 60) | public function addStream(StreamInterface $stream): void
    method getContents (line 74) | public function getContents(): string
    method close (line 82) | public function close(): void
    method detach (line 99) | public function detach()
    method tell (line 113) | public function tell(): int
    method getSize (line 124) | public function getSize(): ?int
    method eof (line 139) | public function eof(): bool
    method rewind (line 146) | public function rewind(): void
    method seek (line 154) | public function seek($offset, $whence = SEEK_SET): void
    method read (line 186) | public function read($length): string
    method isReadable (line 220) | public function isReadable(): bool
    method isWritable (line 225) | public function isWritable(): bool
    method isSeekable (line 230) | public function isSeekable(): bool
    method write (line 235) | public function write($string): int
    method getMetadata (line 245) | public function getMetadata($key = null)

FILE: vendor/guzzlehttp/psr7/src/BufferStream.php
  class BufferStream (line 17) | final class BufferStream implements StreamInterface
    method __construct (line 32) | public function __construct(int $hwm = 16384)
    method __toString (line 37) | public function __toString(): string
    method getContents (line 42) | public function getContents(): string
    method close (line 50) | public function close(): void
    method detach (line 55) | public function detach()
    method getSize (line 62) | public function getSize(): ?int
    method isReadable (line 67) | public function isReadable(): bool
    method isWritable (line 72) | public function isWritable(): bool
    method isSeekable (line 77) | public function isSeekable(): bool
    method rewind (line 82) | public function rewind(): void
    method seek (line 87) | public function seek($offset, $whence = SEEK_SET): void
    method eof (line 92) | public function eof(): bool
    method tell (line 97) | public function tell(): int
    method read (line 105) | public function read($length): string
    method write (line 125) | public function write($string): int
    method getMetadata (line 141) | public function getMetadata($key = null)

FILE: vendor/guzzlehttp/psr7/src/CachingStream.php
  class CachingStream (line 13) | final class CachingStream implements StreamInterface
    method __construct (line 29) | public function __construct(
    method getSize (line 37) | public function getSize(): ?int
    method rewind (line 48) | public function rewind(): void
    method seek (line 53) | public function seek($offset, $whence = SEEK_SET): void
    method read (line 84) | public function read($length): string
    method write (line 113) | public function write($string): int
    method eof (line 127) | public function eof(): bool
    method close (line 135) | public function close(): void
    method cacheEntireStream (line 141) | private function cacheEntireStream(): int

FILE: vendor/guzzlehttp/psr7/src/DroppingStream.php
  class DroppingStream (line 13) | final class DroppingStream implements StreamInterface
    method __construct (line 24) | public function __construct(StreamInterface $stream, int $maxLength)
    method write (line 30) | public function write($string): int

FILE: vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php
  class MalformedUriException (line 12) | class MalformedUriException extends InvalidArgumentException

FILE: vendor/guzzlehttp/psr7/src/FnStream.php
  class FnStream (line 15) | final class FnStream implements StreamInterface
    method __construct (line 29) | public function __construct(array $methods)
    method __get (line 44) | public function __get(string $name): void
    method __destruct (line 53) | public function __destruct()
    method __wakeup (line 65) | public function __wakeup(): void
    method decorate (line 79) | public static function decorate(StreamInterface $stream, array $methods)
    method __toString (line 92) | public function __toString(): string
    method close (line 105) | public function close(): void
    method detach (line 110) | public function detach()
    method getSize (line 115) | public function getSize(): ?int
    method tell (line 120) | public function tell(): int
    method eof (line 125) | public function eof(): bool
    method isSeekable (line 130) | public function isSeekable(): bool
    method rewind (line 135) | public function rewind(): void
    method seek (line 140) | public function seek($offset, $whence = SEEK_SET): void
    method isWritable (line 145) | public function isWritable(): bool
    method write (line 150) | public function write($string): int
    method isReadable (line 155) | public function isReadable(): bool
    method read (line 160) | public function read($length): string
    method getContents (line 165) | public function getContents(): string
    method getMetadata (line 175) | public function getMetadata($key = null)

FILE: vendor/guzzlehttp/psr7/src/Header.php
  class Header (line 7) | final class Header
    method parse (line 17) | public static function parse($header): array
    method normalize (line 48) | public static function normalize($header): array

FILE: vendor/guzzlehttp/psr7/src/HttpFactory.php
  class HttpFactory (line 26) | final class HttpFactory implements
    method createUploadedFile (line 34) | public function createUploadedFile(
    method createStream (line 48) | public function createStream(string $content = ''): StreamInterface
    method createStreamFromFile (line 53) | public function createStreamFromFile(string $file, string $mode = 'r')...
    method createStreamFromResource (line 68) | public function createStreamFromResource($resource): StreamInterface
    method createServerRequest (line 73) | public function createServerRequest(string $method, $uri, array $serve...
    method createResponse (line 86) | public function createResponse(int $code = 200, string $reasonPhrase =...
    method createRequest (line 91) | public function createRequest(string $method, $uri): RequestInterface
    method createUri (line 96) | public function createUri(string $uri = ''): UriInterface

FILE: vendor/guzzlehttp/psr7/src/InflateStream.php
  class InflateStream (line 20) | final class InflateStream implements StreamInterface
    method __construct (line 24) | public function __construct(StreamInterface $stream)

FILE: vendor/guzzlehttp/psr7/src/LazyOpenStream.php
  class LazyOpenStream (line 13) | final class LazyOpenStream implements StreamInterface
    method __construct (line 27) | public function __construct(string $filename, string $mode)
    method createStream (line 36) | protected function createStream(): StreamInterface

FILE: vendor/guzzlehttp/psr7/src/LimitStream.php
  class LimitStream (line 12) | final class LimitStream implements StreamInterface
    method __construct (line 29) | public function __construct(
    method eof (line 39) | public function eof(): bool
    method getSize (line 57) | public function getSize(): ?int
    method seek (line 71) | public function seek($offset, $whence = SEEK_SET): void
    method tell (line 95) | public function tell(): int
    method setOffset (line 107) | public function setOffset(int $offset): void
    method setLimit (line 132) | public function setLimit(int $limit): void
    method read (line 137) | public function read($length): string

FILE: vendor/guzzlehttp/psr7/src/Message.php
  class Message (line 11) | final class Message
    method toString (line 18) | public static function toString(MessageInterface $message): string
    method bodySummary (line 56) | public static function bodySummary(MessageInterface $message, int $tru...
    method rewindBody (line 96) | public static function rewindBody(MessageInterface $message): void
    method parseMessage (line 114) | public static function parseMessage(string $message): array
    method parseRequestUri (line 175) | public static function parseRequestUri(string $path, array $headers): ...
    method parseRequest (line 197) | public static function parseRequest(string $message): RequestInterface
    method parseResponse (line 223) | public static function parseResponse(string $message): ResponseInterface

FILE: vendor/guzzlehttp/psr7/src/MessageTrait.php
  type MessageTrait (line 13) | trait MessageTrait
    method getProtocolVersion (line 27) | public function getProtocolVersion(): string
    method withProtocolVersion (line 32) | public function withProtocolVersion($version): MessageInterface
    method getHeaders (line 43) | public function getHeaders(): array
    method hasHeader (line 48) | public function hasHeader($header): bool
    method getHeader (line 53) | public function getHeader($header): array
    method getHeaderLine (line 66) | public function getHeaderLine($header): string
    method withHeader (line 71) | public function withHeader($header, $value): MessageInterface
    method withAddedHeader (line 87) | public function withAddedHeader($header, $value): MessageInterface
    method withoutHeader (line 105) | public function withoutHeader($header): MessageInterface
    method getBody (line 121) | public function getBody(): StreamInterface
    method withBody (line 130) | public function withBody(StreamInterface $body): MessageInterface
    method setHeaders (line 144) | private function setHeaders(array $headers): void
    method normalizeHeaderValue (line 171) | private function normalizeHeaderValue($value): array
    method trimHeaderValues (line 198) | private function trimHeaderValues(array $values): array
    method assertHeader (line 217) | private function assertHeader($header): void

FILE: vendor/guzzlehttp/psr7/src/MimeType.php
  class MimeType (line 7) | final class MimeType
    method fromFilename (line 116) | public static function fromFilename(string $filename): ?string
    method fromExtension (line 126) | public static function fromExtension(string $extension): ?string

FILE: vendor/guzzlehttp/psr7/src/MultipartStream.php
  class MultipartStream (line 13) | final class MultipartStream implements StreamInterface
    method __construct (line 32) | public function __construct(array $elements = [], string $boundary = n...
    method getBoundary (line 38) | public function getBoundary(): string
    method isWritable (line 43) | public function isWritable(): bool
    method getHeaders (line 53) | private function getHeaders(array $headers): string
    method createStream (line 66) | protected function createStream(array $elements = []): StreamInterface
    method addElement (line 80) | private function addElement(AppendStream $stream, array $element): void
    method createElement (line 109) | private function createElement(string $name, StreamInterface $stream, ...
    method getHeader (line 142) | private function getHeader(array $headers, string $key)

FILE: vendor/guzzlehttp/psr7/src/NoSeekStream.php
  class NoSeekStream (line 12) | final class NoSeekStream implements StreamInterface
    method seek (line 16) | public function seek($offset, $whence = SEEK_SET): void
    method isSeekable (line 21) | public function isSeekable(): bool

FILE: vendor/guzzlehttp/psr7/src/PumpStream.php
  class PumpStream (line 19) | final class PumpStream implements StreamInterface
    method __construct (line 46) | public function __construct(callable $source, array $options = [])
    method __toString (line 54) | public function __toString(): string
    method close (line 67) | public function close(): void
    method detach (line 72) | public function detach()
    method getSize (line 80) | public function getSize(): ?int
    method tell (line 85) | public function tell(): int
    method eof (line 90) | public function eof(): bool
    method isSeekable (line 95) | public function isSeekable(): bool
    method rewind (line 100) | public function rewind(): void
    method seek (line 105) | public function seek($offset, $whence = SEEK_SET): void
    method isWritable (line 110) | public function isWritable(): bool
    method write (line 115) | public function write($string): int
    method isReadable (line 120) | public function isReadable(): bool
    method read (line 125) | public function read($length): string
    method getContents (line 141) | public function getContents(): string
    method getMetadata (line 156) | public function getMetadata($key = null)
    method pump (line 165) | private function pump(int $length): void

FILE: vendor/guzzlehttp/psr7/src/Query.php
  class Query (line 7) | final class Query
    method parse (line 20) | public static function parse(string $str, $urlEncoding = true): array
    method build (line 71) | public static function build(array $params, $encoding = PHP_QUERY_RFC3...

FILE: vendor/guzzlehttp/psr7/src/Request.php
  class Request (line 15) | class Request implements RequestInterface
    method __construct (line 35) | public function __construct(
    method getRequestTarget (line 61) | public function getRequestTarget(): string
    method withRequestTarget (line 78) | public function withRequestTarget($requestTarget): RequestInterface
    method getMethod (line 91) | public function getMethod(): string
    method withMethod (line 96) | public function withMethod($method): RequestInterface
    method getUri (line 104) | public function getUri(): UriInterface
    method withUri (line 109) | public function withUri(UriInterface $uri, $preserveHost = false): Req...
    method updateHostFromUri (line 125) | private function updateHostFromUri(): void
    method assertMethod (line 151) | private function assertMethod($method): void

FILE: vendor/guzzlehttp/psr7/src/Response.php
  class Response (line 13) | class Response implements ResponseInterface
    method __construct (line 94) | public function __construct(
    method getStatusCode (line 119) | public function getStatusCode(): int
    method getReasonPhrase (line 124) | public function getReasonPhrase(): string
    method withStatus (line 129) | public function withStatus($code, $reasonPhrase = ''): ResponseInterface
    method assertStatusCodeIsInteger (line 147) | private function assertStatusCodeIsInteger($statusCode): void
    method assertStatusCodeRange (line 154) | private function assertStatusCodeRange(int $statusCode): void

FILE: vendor/guzzlehttp/psr7/src/Rfc7230.php
  class Rfc7230 (line 10) | final class Rfc7230

FILE: vendor/guzzlehttp/psr7/src/ServerRequest.php
  class ServerRequest (line 27) | class ServerRequest extends Request implements ServerRequestInterface
    method __construct (line 67) | public function __construct(
    method normalizeFiles (line 87) | public static function normalizeFiles(array $files): array
    method createUploadedFileFromSpec (line 117) | private static function createUploadedFileFromSpec(array $value)
    method normalizeNestedFileSpec (line 140) | private static function normalizeNestedFileSpec(array $files = []): array
    method fromGlobals (line 166) | public static function fromGlobals(): ServerRequestInterface
    method extractHostAndPortFromAuthority (line 183) | private static function extractHostAndPortFromAuthority(string $author...
    method getUriFromGlobals (line 200) | public static function getUriFromGlobals(): UriInterface
    method getServerParams (line 244) | public function getServerParams(): array
    method getUploadedFiles (line 249) | public function getUploadedFiles(): array
    method withUploadedFiles (line 254) | public function withUploadedFiles(array $uploadedFiles): ServerRequest...
    method getCookieParams (line 262) | public function getCookieParams(): array
    method withCookieParams (line 267) | public function withCookieParams(array $cookies): ServerRequestInterface
    method getQueryParams (line 275) | public function getQueryParams(): array
    method withQueryParams (line 280) | public function withQueryParams(array $query): ServerRequestInterface
    method getParsedBody (line 293) | public function getParsedBody()
    method withParsedBody (line 298) | public function withParsedBody($data): ServerRequestInterface
    method getAttributes (line 306) | public function getAttributes(): array
    method getAttribute (line 316) | public function getAttribute($attribute, $default = null)
    method withAttribute (line 325) | public function withAttribute($attribute, $value): ServerRequestInterface
    method withoutAttribute (line 333) | public function withoutAttribute($attribute): ServerRequestInterface

FILE: vendor/guzzlehttp/psr7/src/Stream.php
  class Stream (line 12) | class Stream implements StreamInterface
    method __construct (line 50) | public function __construct($stream, array $options = [])
    method __destruct (line 72) | public function __destruct()
    method __toString (line 77) | public function __toString(): string
    method getContents (line 93) | public function getContents(): string
    method close (line 108) | public function close(): void
    method detach (line 118) | public function detach()
    method getSize (line 132) | public function getSize(): ?int
    method isReadable (line 156) | public function isReadable(): bool
    method isWritable (line 161) | public function isWritable(): bool
    method isSeekable (line 166) | public function isSeekable(): bool
    method eof (line 171) | public function eof(): bool
    method tell (line 180) | public function tell(): int
    method rewind (line 195) | public function rewind(): void
    method seek (line 200) | public function seek($offset, $whence = SEEK_SET): void
    method read (line 216) | public function read($length): string
    method write (line 240) | public function write($string): int
    method getMetadata (line 265) | public function getMetadata($key = null)

FILE: vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php
  type StreamDecoratorTrait (line 14) | trait StreamDecoratorTrait
    method __construct (line 19) | public function __construct(StreamInterface $stream)
    method __get (line 30) | public function __get(string $name)
    method __toString (line 40) | public function __toString(): string
    method getContents (line 56) | public function getContents(): string
    method __call (line 66) | public function __call(string $method, array $args)
    method close (line 76) | public function close(): void
    method getMetadata (line 86) | public function getMetadata($key = null)
    method detach (line 91) | public function detach()
    method getSize (line 96) | public function getSize(): ?int
    method eof (line 101) | public function eof(): bool
    method tell (line 106) | public function tell(): int
    method isReadable (line 111) | public function isReadable(): bool
    method isWritable (line 116) | public function isWritable(): bool
    method isSeekable (line 121) | public function isSeekable(): bool
    method rewind (line 126) | public function rewind(): void
    method seek (line 131) | public function seek($offset, $whence = SEEK_SET): void
    method read (line 136) | public function read($length): string
    method write (line 141) | public function write($string): int
    method createStream (line 151) | protected function createStream(): StreamInterface

FILE: vendor/guzzlehttp/psr7/src/StreamWrapper.php
  class StreamWrapper (line 14) | final class StreamWrapper
    method getResource (line 34) | public static function getResource(StreamInterface $stream)
    method createStreamContext (line 55) | public static function createStreamContext(StreamInterface $stream)
    method register (line 65) | public static function register(): void
    method stream_open (line 72) | public function stream_open(string $path, string $mode, int $options, ...
    method stream_read (line 86) | public function stream_read(int $count): string
    method stream_write (line 91) | public function stream_write(string $data): int
    method stream_tell (line 96) | public function stream_tell(): int
    method stream_eof (line 101) | public function stream_eof(): bool
    method stream_seek (line 106) | public function stream_seek(int $offset, int $whence): bool
    method stream_cast (line 116) | public function stream_cast(int $cast_as)
    method stream_stat (line 127) | public function stream_stat(): array
    method url_stat (line 157) | public function url_stat(string $path, int $flags): array

FILE: vendor/guzzlehttp/psr7/src/UploadedFile.php
  class UploadedFile (line 12) | class UploadedFile implements UploadedFileInterface
    method __construct (line 63) | public function __construct(
    method setStreamOrFile (line 87) | private function setStreamOrFile($streamOrFile): void
    method setError (line 105) | private function setError(int $error): void
    method isStringNotEmpty (line 116) | private function isStringNotEmpty($param): bool
    method isOk (line 124) | private function isOk(): bool
    method isMoved (line 129) | public function isMoved(): bool
    method validateActive (line 137) | private function validateActive(): void
    method getStream (line 148) | public function getStream(): StreamInterface
    method moveTo (line 162) | public function moveTo($targetPath): void
    method getSize (line 192) | public function getSize(): ?int
    method getError (line 197) | public function getError(): int
    method getClientFilename (line 202) | public function getClientFilename(): ?string
    method getClientMediaType (line 207) | public function getClientMediaType(): ?string

FILE: vendor/guzzlehttp/psr7/src/Uri.php
  class Uri (line 17) | class Uri implements UriInterface
    method __construct (line 80) | public function __construct(string $uri = '')
    method parse (line 105) | private static function parse(string $url)
    method __toString (line 133) | public function __toString(): string
    method composeComponents (line 166) | public static function composeComponents(?string $scheme, ?string $aut...
    method isDefaultPort (line 198) | public static function isDefaultPort(UriInterface $uri): bool
    method isAbsolute (line 219) | public static function isAbsolute(UriInterface $uri): bool
    method isNetworkPathReference (line 231) | public static function isNetworkPathReference(UriInterface $uri): bool
    method isAbsolutePathReference (line 243) | public static function isAbsolutePathReference(UriInterface $uri): bool
    method isRelativePathReference (line 258) | public static function isRelativePathReference(UriInterface $uri): bool
    method isSameDocumentReference (line 277) | public static function isSameDocumentReference(UriInterface $uri, UriI...
    method withoutQueryValue (line 300) | public static function withoutQueryValue(UriInterface $uri, string $ke...
    method withQueryValue (line 320) | public static function withQueryValue(UriInterface $uri, string $key, ...
    method withQueryValues (line 337) | public static function withQueryValues(UriInterface $uri, array $keyVa...
    method fromParts (line 355) | public static function fromParts(array $parts): UriInterface
    method getScheme (line 364) | public function getScheme(): string
    method getAuthority (line 369) | public function getAuthority(): string
    method getUserInfo (line 383) | public function getUserInfo(): string
    method getHost (line 388) | public function getHost(): string
    method getPort (line 393) | public function getPort(): ?int
    method getPath (line 398) | public function getPath(): string
    method getQuery (line 403) | public function getQuery(): string
    method getFragment (line 408) | public function getFragment(): string
    method withScheme (line 413) | public function withScheme($scheme): UriInterface
    method withUserInfo (line 430) | public function withUserInfo($user, $password = null): UriInterface
    method withHost (line 449) | public function withHost($host): UriInterface
    method withPort (line 465) | public function withPort($port): UriInterface
    method withPath (line 482) | public function withPath($path): UriInterface
    method withQuery (line 498) | public function withQuery($query): UriInterface
    method withFragment (line 513) | public function withFragment($fragment): UriInterface
    method applyParts (line 533) | private function applyParts(array $parts): void
    method filterScheme (line 568) | private function filterScheme($scheme): string
    method filterUserInfoComponent (line 582) | private function filterUserInfoComponent($component): string
    method filterHost (line 600) | private function filterHost($host): string
    method filterPort (line 614) | private function filterPort($port): ?int
    method getFilteredQueryString (line 635) | private static function getFilteredQueryString(UriInterface $uri, arra...
    method generateQueryString (line 650) | private static function generateQueryString(string $key, ?string $valu...
    method removeDefaultPort (line 664) | private function removeDefaultPort(): void
    method filterPath (line 678) | private function filterPath($path): string
    method filterQueryAndFragment (line 698) | private function filterQueryAndFragment($str): string
    method rawurlencodeMatchZero (line 711) | private function rawurlencodeMatchZero(array $match): string
    method validateState (line 716) | private function validateState(): void

FILE: vendor/guzzlehttp/psr7/src/UriNormalizer.php
  class UriNormalizer (line 16) | final class UriNormalizer
    method normalize (line 124) | public static function normalize(UriInterface $uri, int $flags = self:...
    method isEquivalent (line 179) | public static function isEquivalent(UriInterface $uri1, UriInterface $...
    method capitalizePercentEncoding (line 184) | private static function capitalizePercentEncoding(UriInterface $uri): ...
    method decodeUnreservedCharacters (line 200) | private static function decodeUnreservedCharacters(UriInterface $uri):...
    method __construct (line 216) | private function __construct()

FILE: vendor/guzzlehttp/psr7/src/UriResolver.php
  class UriResolver (line 16) | final class UriResolver
    method removeDotSegments (line 23) | public static function removeDotSegments(string $path): string
    method resolve (line 58) | public static function resolve(UriInterface $base, UriInterface $rel):...
    method relativize (line 128) | public static function relativize(UriInterface $base, UriInterface $ta...
    method getRelativePath (line 174) | private static function getRelativePath(UriInterface $base, UriInterfa...
    method __construct (line 207) | private function __construct()

FILE: vendor/guzzlehttp/psr7/src/Utils.php
  class Utils (line 12) | final class Utils
    method caselessRemove (line 19) | public static function caselessRemove(array $keys, array $data): array
    method copyToStream (line 47) | public static function copyToStream(StreamInterface $source, StreamInt...
    method copyToString (line 81) | public static function copyToString(StreamInterface $stream, int $maxL...
    method hash (line 121) | public static function hash(StreamInterface $stream, string $algo, boo...
    method modifyRequest (line 158) | public static function modifyRequest(RequestInterface $request, array ...
    method readLine (line 233) | public static function readLine(StreamInterface $stream, ?int $maxLeng...
    method streamFor (line 286) | public static function streamFor($resource = '', array $options = []):...
    method tryFopen (line 353) | public static function tryFopen(string $filename, string $mode)
    method uriFor (line 400) | public static function uriFor($uri): UriInterface

FILE: vendor/jaeger/phpquery-single/phpQuery.php
  class DOMEvent (line 31) | class DOMEvent {
    method __construct (line 106) | public function __construct($data) {
    method preventDefault (line 117) | public function preventDefault() {
    method stopPropagation (line 124) | public function stopPropagation() {
  class DOMDocumentWrapper (line 140) | class DOMDocumentWrapper {
    method __construct (line 175) | public function __construct($markup = null, $contentType = null, $newD...
    method load (line 182) | public function load($markup, $contentType = null, $newDocumentID = nu...
    method afterMarkupLoad (line 205) | protected function afterMarkupLoad() {
    method loadMarkup (line 210) | protected function loadMarkup($markup) {
    method loadMarkupReset (line 250) | protected function loadMarkupReset() {
    method documentCreate (line 253) | protected function documentCreate($charset, $version = '1.0') {
    method loadMarkupHTML (line 262) | protected function loadMarkupHTML($markup, $requestedCharset = null) {
    method loadMarkupXML (line 336) | protected function loadMarkupXML($markup, $requestedCharset = null) {
    method isXHTML (line 428) | protected function isXHTML($markup = null) {
    method isXML (line 439) | protected function isXML($markup) {
    method contentTypeToArray (line 443) | protected function contentTypeToArray($contentType) {
    method contentTypeFromHTML (line 460) | protected function contentTypeFromHTML($markup) {
    method charsetFromHTML (line 474) | protected function charsetFromHTML($markup) {
    method charsetFromXML (line 478) | protected function charsetFromXML($markup) {
    method charsetFixHTML (line 494) | protected function charsetFixHTML($markup) {
    method charsetAppendToHTML (line 510) | protected function charsetAppendToHTML($html, $charset, $xhtml = false) {
    method charsetAppendToXML (line 535) | protected function charsetAppendToXML($markup, $charset) {
    method isDocumentFragmentHTML (line 539) | public static function isDocumentFragmentHTML($markup) {
    method isDocumentFragmentXML (line 542) | public static function isDocumentFragmentXML($markup) {
    method isDocumentFragmentXHTML (line 545) | public static function isDocumentFragmentXHTML($markup) {
    method importAttr (line 548) | public function importAttr($value) {
    method import (line 558) | public function import($source, $sourceCharset = null) {
    method documentFragmentCreate (line 608) | protected function documentFragmentCreate($source, $charset = null) {
    method documentFragmentLoadMarkup (line 640) | private function documentFragmentLoadMarkup($fragment, $charset, $mark...
    method documentFragmentToMarkup (line 678) | protected function documentFragmentToMarkup($fragment) {
    method markup (line 705) | public function markup($nodes = null, $innerMarkup = false) {
    method markupFixXHTML (line 773) | protected static function markupFixXHTML($markup) {
    method debug (line 779) | public static function debug($text) {
    method expandEmptyTag (line 791) | public static function expandEmptyTag($tag, $xml){
  class phpQueryEvents (line 815) | abstract class phpQueryEvents {
    method trigger (line 827) | public static function trigger($document, $type, $data = array(), $nod...
    method add (line 907) | public static function add($document, $node, $type, $data, $callback =...
    method remove (line 934) | public static function remove($document, $node, $type = null, $callbac...
    method getNode (line 947) | protected static function getNode($documentID, $node) {
    method setNode (line 953) | protected static function setNode($documentID, $node) {
    method issetGlobal (line 959) | protected static function issetGlobal($documentID, $type) {
  type ICallbackNamed (line 967) | interface ICallbackNamed {
    method hasName (line 968) | function hasName();
    method getName (line 969) | function getName();
  class Callback (line 994) | class Callback
    method __construct (line 999) | public function __construct($callback, $param1 = null, $param2 = null,
    method getName (line 1010) | public function getName() {
    method hasName (line 1013) | public function hasName() {
    method setName (line 1016) | public function setName($name) {
  class CallbackBody (line 1031) | class CallbackBody extends Callback {
    method __construct (line 1032) | public function __construct($paramList, $code, $param1 = null, $param2...
  class CallbackReturnReference (line 1045) | class CallbackReturnReference extends Callback
    method __construct (line 1048) | public function __construct(&$reference, $name = null){
    method callback (line 1052) | public function callback() {
    method getName (line 1055) | public function getName() {
    method hasName (line 1058) | public function hasName() {
  class CallbackReturnValue (line 1067) | class CallbackReturnValue extends Callback
    method __construct (line 1071) | public function __construct($value, $name = null){
    method callback (line 1076) | public function callback() {
    method __toString (line 1079) | public function __toString() {
    method getName (line 1082) | public function getName() {
    method hasName (line 1085) | public function hasName() {
  class CallbackParameterToReference (line 1096) | class CallbackParameterToReference extends Callback {
    method __construct (line 1102) | public function __construct(&$reference){
  class CallbackParam (line 1117) | class CallbackParam {}
  class phpQueryObject (line 1130) | class phpQueryObject
    method __construct (line 1200) | public function __construct($documentID) {
    method __get (line 1229) | public function __get($attr) {
    method toReference (line 1245) | public function toReference(&$var) {
    method documentFragment (line 1248) | public function documentFragment($state = null) {
    method isRoot (line 1259) | protected function isRoot( $node) {
    method stackIsRoot (line 1268) | protected function stackIsRoot() {
    method toRoot (line 1279) | public function toRoot() {
    method getDocumentIDRef (line 1298) | public function getDocumentIDRef(&$documentID) {
    method getDocument (line 1307) | public function getDocument() {
    method getDOMDocument (line 1314) | public function getDOMDocument() {
    method getDocumentID (line 1322) | public function getDocumentID() {
    method unloadDocument (line 1332) | public function unloadDocument() {
    method isHTML (line 1335) | public function isHTML() {
    method isXHTML (line 1338) | public function isXHTML() {
    method isXML (line 1341) | public function isXML() {
    method serialize (line 1350) | public function serialize() {
    method serializeArray (line 1359) | public function serializeArray($submit = null) {
    method debug (line 1391) | protected function debug($in) {
    method isRegexp (line 1406) | protected function isRegexp($pattern) {
    method isChar (line 1420) | protected function isChar($char) {
    method parseSelector (line 1428) | protected function parseSelector($query) {
    method get (line 1595) | public function get($index = null, $callback1 = null, $callback2 = nul...
    method getString (line 1621) | public function getString($index = null, $callback1 = null, $callback2...
    method getStrings (line 1648) | public function getStrings($index = null, $callback1 = null, $callback...
    method newInstance (line 1674) | public function newInstance($newStack = null) {
    method matchClasses (line 1702) | protected function matchClasses($class, $node) {
    method runQuery (line 1732) | protected function runQuery($XQuery, $selector = null, $compare = null) {
    method find (line 1804) | public function find($selectors, $context = null, $noHistory = false) {
    method pseudoClasses (line 1968) | protected function pseudoClasses($class) {
    method __pseudoClassParam (line 2251) | protected function __pseudoClassParam($paramsString) {
    method is (line 2259) | public function is($selector, $nodes = null) {
    method filterCallback (line 2287) | public function filterCallback($callback, $_skipHistory = false) {
    method filter (line 2309) | public function filter($selectors, $_skipHistory = false) {
    method unQuote (line 2444) | protected static function unQuote($value) {
    method load (line 2456) | public function load($url, $data = null, $callback = null) {
    method __loadSuccess (line 2487) | public function __loadSuccess($html) {
    method css (line 2503) | public function css() {
    method show (line 2511) | public function show(){
    method hide (line 2519) | public function hide(){
    method trigger (line 2531) | public function trigger($type, $data = array()) {
    method triggerHandler (line 2544) | public function triggerHandler($type, $data = array()) {
    method bind (line 2558) | public function bind($type, $data, $callback = null) {
    method unbind (line 2577) | public function unbind($type = null, $callback = null) {
    method change (line 2587) | public function change($callback = null) {
    method submit (line 2597) | public function submit($callback = null) {
    method click (line 2607) | public function click($callback = null) {
    method wrapAllOld (line 2618) | public function wrapAllOld($wrapper) {
    method wrapAll (line 2636) | public function wrapAll($wrapper) {
    method ___wrapAllCallback (line 2651) | public function ___wrapAllCallback($node) {
    method wrapAllPHP (line 2664) | public function wrapAllPHP($codeBefore, $codeAfter) {
    method wrap (line 2679) | public function wrap($wrapper) {
    method wrapPHP (line 2690) | public function wrapPHP($codeBefore, $codeAfter) {
    method wrapInner (line 2701) | public function wrapInner($wrapper) {
    method wrapInnerPHP (line 2712) | public function wrapInnerPHP($codeBefore, $codeAfter) {
    method contents (line 2724) | public function contents() {
    method contentsUnwrap (line 2743) | public function contentsUnwrap() {
    method switchWith (line 2763) | public function switchWith($markup) {
    method eq (line 2778) | public function eq($num) {
    method size (line 2791) | public function size() {
    method length (line 2800) | public function length() {
    method count (line 2803) | public function count() {
    method end (line 2812) | public function end($level = 1) {
    method _clone (line 2828) | public function _clone() {
    method replaceWithPHP (line 2844) | public function replaceWithPHP($code) {
    method replaceWith (line 2854) | public function replaceWith($content) {
    method replaceAll (line 2864) | public function replaceAll($selector) {
    method remove (line 2876) | public function remove($selector = null) {
    method markupEvents (line 2897) | protected function markupEvents($newMarkup, $oldMarkup, $node) {
    method markup (line 2915) | public function markup($markup = null, $callback1 = null, $callback2 =...
    method markupOuter (line 2928) | public function markupOuter($callback1 = null, $callback2 = null, $cal...
    method html (line 2942) | public function html($html = null, $callback1 = null, $callback2 = nul...
    method xml (line 2975) | public function xml($xml = null, $callback1 = null, $callback2 = null,...
    method htmlOuter (line 2985) | public function htmlOuter($callback1 = null, $callback2 = null, $callb...
    method xmlOuter (line 2997) | public function xmlOuter($callback1 = null, $callback2 = null, $callba...
    method __toString (line 3001) | public function __toString() {
    method php (line 3010) | public function php($code = null) {
    method markupPHP (line 3019) | public function markupPHP($code = null) {
    method markupOuterPHP (line 3030) | public function markupOuterPHP() {
    method children (line 3038) | public function children($selector = null) {
    method ancestors (line 3061) | public function ancestors($selector = null) {
    method append (line 3069) | public function append( $content) {
    method appendPHP (line 3077) | public function appendPHP( $content) {
    method appendTo (line 3085) | public function appendTo( $seletor) {
    method prepend (line 3093) | public function prepend( $content) {
    method prependPHP (line 3102) | public function prependPHP( $content) {
    method prependTo (line 3110) | public function prependTo( $seletor) {
    method before (line 3118) | public function before($content) {
    method beforePHP (line 3126) | public function beforePHP( $content) {
    method insertBefore (line 3135) | public function insertBefore( $seletor) {
    method after (line 3143) | public function after( $content) {
    method afterPHP (line 3151) | public function afterPHP( $content) {
    method insertAfter (line 3159) | public function insertAfter( $seletor) {
    method insert (line 3170) | public function insert($target, $type) {
    method index (line 3335) | public function index($subject) {
    method slice (line 3355) | public function slice($start, $end = null) {
    method reverse (line 3375) | public function reverse() {
    method text (line 3384) | public function text($text = null, $callback1 = null, $callback2 = nul...
    method texts (line 3406) | public function texts($attr = null) {
    method plugin (line 3418) | public function plugin($class, $file = null) {
    method extend (line 3430) | public static function extend($class, $file = null) {
    method __call (line 3440) | public function __call($method, $args) {
    method _next (line 3473) | public function _next($selector = null) {
    method _prev (line 3485) | public function _prev($selector = null) {
    method prev (line 3493) | public function prev($selector = null) {
    method prevAll (line 3502) | public function prevAll($selector = null) {
    method nextAll (line 3511) | public function nextAll($selector = null) {
    method getElementSiblings (line 3519) | protected function getElementSiblings($direction, $selector = null, $l...
    method siblings (line 3546) | public function siblings($selector = null) {
    method not (line 3563) | public function not($selector = null) {
    method add (line 3609) | public function add($selector = null) {
    method merge (line 3621) | protected function merge() {
    method elementsContainsNode (line 3631) | protected function elementsContainsNode($nodeToCheck, $elementsStack =...
    method parent (line 3646) | public function parent($selector = null) {
    method parents (line 3662) | public function parents($selector = null) {
    method stack (line 3689) | public function stack($nodeTypes = null) {
    method attrEvents (line 3702) | protected function attrEvents($attr, $oldAttr, $oldValue, $node) {
    method attr (line 3751) | public function attr($attr = null, $value = null) {
    method attrs (line 3784) | public function attrs($attr = null) {
    method getNodeAttrs (line 3796) | protected function getNodeAttrs($node) {
    method attrPHP (line 3808) | public function attrPHP($attr, $code) {
    method removeAttr (line 3838) | public function removeAttr($attr) {
    method val (line 3856) | public function val($val = null) {
    method andSelf (line 3922) | public function andSelf() {
    method addClass (line 3932) | public function addClass( $className) {
    method addClassPHP (line 3949) | public function addClassPHP( $className) {
    method hasClass (line 3965) | public function hasClass($className) {
    method removeClass (line 3977) | public function removeClass($className) {
    method toggleClass (line 3995) | public function toggleClass($className) {
    method _empty (line 4021) | public function _empty() {
    method each (line 4037) | public function each($callback, $param1 = null, $param2 = null, $param...
    method callback (line 4052) | public function callback($callback, $param1 = null, $param2 = null, $p...
    method map (line 4064) | public function map($callback, $param1 = null, $param2 = null, $param3...
    method data (line 4085) | public function data($key, $value = null) {
    method removeData (line 4101) | public function removeData($key) {
    method rewind (line 4112) | public function rewind(){
    method current (line 4127) | public function current(){
    method key (line 4133) | public function key(){
    method next (line 4147) | public function next($cssSelector = null){
    method valid (line 4164) | public function valid(){
    method offsetExists (line 4172) | public function offsetExists($offset) {
    method offsetGet (line 4178) | public function offsetGet($offset) {
    method offsetSet (line 4184) | public function offsetSet($offset, $value) {
    method offsetUnset (line 4191) | public function offsetUnset($offset) {
    method getNodeXpath (line 4204) | protected function getNodeXpath($oneNode = null, $namespace = null) {
    method whois (line 4239) | public function whois($oneNode = null) {
    method dump (line 4282) | public function dump() {
    method dumpWhois (line 4290) | public function dumpWhois() {
    method dumpLength (line 4299) | public function dumpLength() {
    method dumpTree (line 4308) | public function dumpTree($html = true, $title = true) {
    method __dumpTree (line 4321) | private function __dumpTree($node, $intend = 0) {
    method dumpDie (line 4335) | public function dumpDie() {
  function mb_internal_encoding (line 4353) | function mb_internal_encoding($enc) {return true; }
  function mb_regex_encoding (line 4363) | function mb_regex_encoding($enc) {return true; }
  function mb_strlen (line 4373) | function mb_strlen($str)
  function mb_strpos (line 4386) | function mb_strpos($haystack, $needle, $offset=0)
  function mb_stripos (line 4398) | function mb_stripos($haystack, $needle, $offset=0)
  function mb_substr (line 4411) | function mb_substr($str, $start, $length=0)
  function mb_substr_count (line 4424) | function mb_substr_count($haystack, $needle)
  class phpQuery (line 4437) | abstract class phpQuery {
    method pq (line 4546) | public static function pq($arg1, $context = null) {
    method selectDocument (line 4644) | public static function selectDocument($id) {
    method getDocument (line 4658) | public static function getDocument($id = null) {
    method newDocument (line 4672) | public static function newDocument($markup = null, $contentType = null) {
    method newDocumentHTML (line 4685) | public static function newDocumentHTML($markup = null, $charset = null) {
    method newDocumentXML (line 4698) | public static function newDocumentXML($markup = null, $charset = null) {
    method newDocumentXHTML (line 4711) | public static function newDocumentXHTML($markup = null, $charset = nul...
    method newDocumentPHP (line 4724) | public static function newDocumentPHP($markup = null, $contentType = "...
    method phpToMarkup (line 4729) | public static function phpToMarkup($php, $charset = 'utf-8') {
    method _phpToMarkupCallback (line 4753) | public static function _phpToMarkupCallback($php, $charset = 'utf-8') {
    method _markupToPHPCallback (line 4758) | public static function _markupToPHPCallback($m) {
    method markupToPHP (line 4768) | public static function markupToPHP($content) {
    method newDocumentFile (line 4809) | public static function newDocumentFile($file, $contentType = null) {
    method newDocumentFileHTML (line 4822) | public static function newDocumentFileHTML($file, $charset = null) {
    method newDocumentFileXML (line 4835) | public static function newDocumentFileXML($file, $charset = null) {
    method newDocumentFileXHTML (line 4848) | public static function newDocumentFileXHTML($file, $charset = null) {
    method newDocumentFilePHP (line 4861) | public static function newDocumentFilePHP($file, $contentType = null) {
    method loadDocument (line 4872) | public static function loadDocument($document) {
    method createDocumentWrapper (line 4885) | protected static function createDocumentWrapper($html, $contentType = ...
    method extend (line 4918) | public static function extend($target, $source) {
    method plugin (line 4955) | public static function plugin($class, $file = null) {
    method unloadDocuments (line 5015) | public static function unloadDocuments($id = null) {
    method unsafePHPTags (line 5032) | public static function unsafePHPTags($content) {
    method DOMNodeListToArray (line 5035) | public static function DOMNodeListToArray($DOMNodeList) {
    method isMarkup (line 5051) | public static function isMarkup($input) {
    method debug (line 5054) | public static function debug($text) {
    method ajax (line 5075) | public static function ajax($options = array(), $xhr = null) {
    method httpData (line 5241) | protected static function httpData($data, $type, $options) {
    method param (line 5260) | public static function param($data) {
    method get (line 5263) | public static function get($url, $data = null, $callback = null, $type...
    method post (line 5277) | public static function post($url, $data = null, $callback = null, $typ...
    method getJSON (line 5290) | public static function getJSON($url, $data = null, $callback = null) {
    method ajaxSetup (line 5304) | public static function ajaxSetup($options) {
    method ajaxAllowHost (line 5310) | public static function ajaxAllowHost($host1, $host2 = null, $host3 = n...
    method ajaxAllowURL (line 5320) | public static function ajaxAllowURL($url1, $url2 = null, $url3 = null) {
    method toJSON (line 5334) | public static function toJSON($data) {
    method parseJSON (line 5347) | public static function parseJSON($json) {
    method getDocumentID (line 5363) | public static function getDocumentID($source) {
    method getDOMDocument (line 5386) | public static function getDOMDocument($source) {
    method makeArray (line 5403) | public static function makeArray($obj) {
    method inArray (line 5417) | public static function inArray($value, $array) {
    method each (line 5427) | public static function each($object, $callback, $param1 = null, $param...
    method map (line 5445) | public static function map($array, $callback, $param1 = null, $param2 ...
    method callbackRun (line 5477) | public static function callbackRun($callback, $params = array(), $para...
    method merge (line 5507) | public static function merge($one, $two) {
    method grep (line 5531) | public static function grep($array, $callback, $invert = false) {
    method unique (line 5540) | public static function unique($array) {
    method isFunction (line 5550) | public static function isFunction($function) {
    method trim (line 5553) | public static function trim($str) {
    method browserGet (line 5566) | public static function browserGet($url, $callback, $param1 = null, $pa...
    method browserPost (line 5584) | public static function browserPost($url, $data, $callback, $param1 = n...
    method browser (line 5601) | public static function browser($ajaxSettings, $callback, $param1 = nul...
    method php (line 5614) | public static function php($code) {
    method code (line 5623) | public static function code($type, $code) {
    method __callStatic (line 5627) | public static function __callStatic($method, $params) {
    method dataSetupNode (line 5633) | protected static function dataSetupNode($node, $documentID) {
    method dataRemoveNode (line 5643) | protected static function dataRemoveNode($node, $documentID) {
    method data (line 5652) | public static function data($node, $name, $data, $documentID = null) {
    method removeData (line 5671) | public static function removeData($node, $name, $documentID) {
  class phpQueryPlugins (line 5698) | class phpQueryPlugins {
    method __call (line 5699) | public function __call($method, $args) {
  function pq (line 5728) | function pq($arg1, $context = null) {

FILE: vendor/league/flysystem/src/Adapter/AbstractAdapter.php
  class AbstractAdapter (line 7) | abstract class AbstractAdapter implements AdapterInterface
    method setPathPrefix (line 26) | public function setPathPrefix($prefix)
    method getPathPrefix (line 44) | public function getPathPrefix()
    method applyPathPrefix (line 56) | public function applyPathPrefix($path)
    method removePathPrefix (line 68) | public function removePathPrefix($path)

FILE: vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php
  class AbstractFtpAdapter (line 12) | abstract class AbstractFtpAdapter extends AbstractAdapter
    method __construct (line 91) | public function __construct(array $config)
    method setConfig (line 104) | public function setConfig(array $config)
    method getHost (line 126) | public function getHost()
    method setHost (line 138) | public function setHost($host)
    method setPermPublic (line 152) | public function setPermPublic($permPublic)
    method setPermPrivate (line 166) | public function setPermPrivate($permPrivate)
    method getPort (line 178) | public function getPort()
    method getRoot (line 188) | public function getRoot()
    method setPort (line 200) | public function setPort($port)
    method setRoot (line 214) | public function setRoot($root)
    method getUsername (line 226) | public function getUsername()
    method setUsername (line 240) | public function setUsername($username)
    method getPassword (line 252) | public function getPassword()
    method setPassword (line 264) | public function setPassword($password)
    method getTimeout (line 276) | public function getTimeout()
    method setTimeout (line 288) | public function setTimeout($timeout)
    method getSystemType (line 300) | public function getSystemType()
    method setSystemType (line 312) | public function setSystemType($systemType)
    method setEnableTimestampsOnUnixListings (line 326) | public function setEnableTimestampsOnUnixListings($bool = false)
    method listContents (line 336) | public function listContents($directory = '', $recursive = false)
    method listDirectoryContents (line 341) | abstract protected function listDirectoryContents($directory, $recursi...
    method normalizeListing (line 351) | protected function normalizeListing(array $listing, $prefix = '')
    method sortListing (line 376) | protected function sortListing(array $result)
    method normalizeObject (line 397) | protected function normalizeObject($item, $base)
    method normalizeUnixObject (line 430) | protected function normalizeUnixObject($item, $base)
    method normalizeUnixTimestamp (line 479) | protected function normalizeUnixTimestamp($month, $day, $timeOrYear)
    method normalizeWindowsObject (line 504) | protected function normalizeWindowsObject($item, $base)
    method detectSystemType (line 540) | protected function detectSystemType($item)
    method detectType (line 552) | protected function detectType($permissions)
    method normalizePermissions (line 564) | protected function normalizePermissions($permissions)
    method removeDotDirectories (line 596) | public function removeDotDirectories(array $list)
    method has (line 608) | public function has($path)
    method getSize (line 616) | public function getSize($path)
    method getVisibility (line 624) | public function getVisibility($path)
    method ensureDirectory (line 634) | public function ensureDirectory($dirname)
    method getConnection (line 646) | public function getConnection()
    method getPermPublic (line 661) | public function getPermPublic()
    method getPermPrivate (line 671) | public function getPermPrivate()
    method __destruct (line 679) | public function __destruct()
    method connect (line 687) | abstract public function connect();
    method disconnect (line 692) | abstract public function disconnect();
    method isConnected (line 699) | abstract public function isConnected();
    method escapePath (line 701) | protected function escapePath($path)

FILE: vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php
  type CanOverwriteFiles (line 10) | interface CanOverwriteFiles

FILE: vendor/league/flysystem/src/Adapter/Ftp.php
  class Ftp (line 16) | class Ftp extends AbstractFtpAdapter
    method setTransferMode (line 74) | public function setTransferMode($mode)
    method setSsl (line 88) | public function setSsl($ssl)
    method setPassive (line 100) | public function setPassive($passive = true)
    method setIgnorePassiveAddress (line 108) | public function setIgnorePassiveAddress($ignorePassiveAddress)
    method setRecurseManually (line 116) | public function setRecurseManually($recurseManually)
    method setUtf8 (line 124) | public function setUtf8($utf8)
    method connect (line 132) | public function connect()
    method setUtf8Mode (line 161) | protected function setUtf8Mode()
    method setConnectionPassiveMode (line 178) | protected function setConnectionPassiveMode()
    method setConnectionRoot (line 194) | protected function setConnectionRoot()
    method login (line 215) | protected function login()
    method disconnect (line 238) | public function disconnect()
    method write (line 250) | public function write($path, $contents, Config $config)
    method writeStream (line 271) | public function writeStream($path, $resource, Config $config)
    method update (line 291) | public function update($path, $contents, Config $config)
    method updateStream (line 299) | public function updateStream($path, $resource, Config $config)
    method rename (line 307) | public function rename($path, $newpath)
    method delete (line 315) | public function delete($path)
    method deleteDir (line 323) | public function deleteDir($dirname)
    method createDir (line 344) | public function createDir($dirname, Config $config)
    method createActualDirectory (line 372) | protected function createActualDirectory($directory, $connection)
    method getMetadata (line 393) | public function getMetadata($path)
    method getMimetype (line 425) | public function getMimetype($path)
    method getTimestamp (line 439) | public function getTimestamp($path)
    method read (line 449) | public function read($path)
    method readStream (line 465) | public function readStream($path)
    method setVisibility (line 483) | public function setVisibility($path, $visibility)
    method listDirectoryContents (line 499) | protected function listDirectoryContents($directory, $recursive = true)
    method listDirectoryContentsRecursive (line 516) | protected function listDirectoryContentsRecursive($directory)
    method isConnected (line 539) | public function isConnected()
    method isPureFtpdServer (line 547) | protected function isPureFtpdServer()
    method ftpRawlist (line 562) | protected function ftpRawlist($options, $path)
    method getRawExecResponseCode (line 573) | private function getRawExecResponseCode($command)
    method hasFtpConnection (line 580) | private function hasFtpConnection(): bool

FILE: vendor/league/flysystem/src/Adapter/Ftpd.php
  class Ftpd (line 5) | class Ftpd extends Ftp
    method getMetadata (line 10) | public function getMetadata($path)
    method listDirectoryContents (line 38) | protected function listDirectoryContents($directory, $recursive = true)

FILE: vendor/league/flysystem/src/Adapter/Local.php
  class Local (line 18) | class Local extends AbstractAdapter
    method __construct (line 74) | public function __construct($root, $writeFlags = LOCK_EX, $linkHandlin...
    method ensureDirectory (line 98) | protected function ensureDirectory($root)
    method has (line 120) | public function has($path)
    method write (line 130) | public function write($path, $contents, Config $config)
    method writeStream (line 153) | public function writeStream($path, $resource, Config $config)
    method readStream (line 177) | public function readStream($path)
    method updateStream (line 188) | public function updateStream($path, $resource, Config $config)
    method update (line 196) | public function update($path, $contents, Config $config)
    method read (line 220) | public function read($path)
    method rename (line 235) | public function rename($path, $newpath)
    method copy (line 248) | public function copy($path, $newpath)
    method delete (line 260) | public function delete($path)
    method listContents (line 270) | public function listContents($directory = '', $recursive = false)
    method getMetadata (line 299) | public function getMetadata($path)
    method getSize (line 311) | public function getSize($path)
    method getMimetype (line 319) | public function getMimetype($path)
    method getTimestamp (line 335) | public function getTimestamp($path)
    method getVisibility (line 343) | public function getVisibility($path)
    method setVisibility (line 364) | public function setVisibility($path, $visibility)
    method createDir (line 380) | public function createDir($dirname, Config $config)
    method deleteDir (line 402) | public function deleteDir($dirname)
    method deleteFileInfoObject (line 426) | protected function deleteFileInfoObject(SplFileInfo $file)
    method normalizeFileInfo (line 449) | protected function normalizeFileInfo(SplFileInfo $file)
    method getFilePath (line 467) | protected function getFilePath(SplFileInfo $file)
    method getRecursiveDirectoryIterator (line 481) | protected function getRecursiveDirectoryIterator($path, $mode = Recurs...
    method getDirectoryIterator (line 494) | protected function getDirectoryIterator($path)
    method mapFileInfo (line 506) | protected function mapFileInfo(SplFileInfo $file)
    method guardAgainstUnreadableFileInfo (line 527) | protected function guardAgainstUnreadableFileInfo(SplFileInfo $file)

FILE: vendor/league/flysystem/src/Adapter/NullAdapter.php
  class NullAdapter (line 9) | class NullAdapter extends AbstractAdapter
    method has (line 21) | public function has($path)
    method write (line 29) | public function write($path, $contents, Config $config)
    method update (line 44) | public function update($path, $contents, Config $config)
    method read (line 52) | public function read($path)
    method rename (line 60) | public function rename($path, $newpath)
    method delete (line 68) | public function delete($path)
    method listContents (line 76) | public function listContents($directory = '', $recursive = false)
    method getMetadata (line 84) | public function getMetadata($path)
    method getSize (line 92) | public function getSize($path)
    method getMimetype (line 100) | public function getMimetype($path)
    method getTimestamp (line 108) | public function getTimestamp($path)
    method getVisibility (line 116) | public function getVisibility($path)
    method setVisibility (line 124) | public function setVisibility($path, $visibility)
    method createDir (line 132) | public function createDir($dirname, Config $config)
    method deleteDir (line 140) | public function deleteDir($dirname)

FILE: vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php
  type NotSupportingVisibilityTrait (line 7) | trait NotSupportingVisibilityTrait
    method getVisibility (line 16) | public function getVisibility($path)
    method setVisibility (line 29) | public function setVisibility($path, $visibility)

FILE: vendor/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php
  type StreamedCopyTrait (line 7) | trait StreamedCopyTrait
    method copy (line 17) | public function copy($path, $newpath)
    method readStream (line 41) | abstract public function readStream($path);
    method writeStream (line 50) | abstract public function writeStream($path, $resource, Config $config);

FILE: vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php
  type StreamedReadingTrait (line 8) | trait StreamedReadingTrait
    method readStream (line 19) | public function readStream($path)
    method read (line 43) | abstract public function read($path);

FILE: vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php
  type StreamedTrait (line 5) | trait StreamedTrait

FILE: vendor/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php
  type StreamedWritingTrait (line 8) | trait StreamedWritingTrait
    method stream (line 20) | protected function stream($path, $resource, Config $config, $fallback)
    method writeStream (line 38) | public function writeStream($path, $resource, Config $config)
    method updateStream (line 52) | public function updateStream($path, $resource, Config $config)
    method write (line 58) | abstract public function write($pash, $contents, Config $config);
    method update (line 59) | abstract public function update($pash, $contents, Config $config);

FILE: vendor/league/flysystem/src/Adapter/SynologyFtp.php
  class SynologyFtp (line 5) | class SynologyFtp extends Ftpd

FILE: vendor/league/flysystem/src/AdapterInterface.php
  type AdapterInterface (line 5) | interface AdapterInterface extends ReadInterface
    method write (line 26) | public function write($path, $contents, Config $config);
    method writeStream (line 37) | public function writeStream($path, $resource, Config $config);
    method update (line 48) | public function update($path, $contents, Config $config);
    method updateStream (line 59) | public function updateStream($path, $resource, Config $config);
    method rename (line 69) | public function rename($path, $newpath);
    method copy (line 79) | public function copy($path, $newpath);
    method delete (line 88) | public function delete($path);
    method deleteDir (line 97) | public function deleteDir($dirname);
    method createDir (line 107) | public function createDir($dirname, Config $config);
    method setVisibility (line 117) | public function setVisibility($path, $visibility);

FILE: vendor/league/flysystem/src/Config.php
  class Config (line 5) | class Config
    method __construct (line 22) | public function __construct(array $settings = [])
    method get (line 35) | public function get($key, $default = null)
    method has (line 51) | public function has($key)
    method getDefault (line 70) | protected function getDefault($key, $default)
    method set (line 87) | public function set($key, $value)
    method setFallback (line 101) | public function setFallback(Config $fallback)

FILE: vendor/league/flysystem/src/ConfigAwareTrait.php
  type ConfigAwareTrait (line 8) | trait ConfigAwareTrait
    method setConfig (line 20) | protected function setConfig($config)
    method getConfig (line 30) | public function getConfig()
    method prepareConfig (line 42) | protected function prepareConfig(array $config)

FILE: vendor/league/flysystem/src/ConnectionErrorException.php
  class ConnectionErrorException (line 7) | class ConnectionErrorException extends ErrorException implements Filesys...

FILE: vendor/league/flysystem/src/ConnectionRuntimeException.php
  class ConnectionRuntimeException (line 7) | class ConnectionRuntimeException extends RuntimeException implements Fil...

FILE: vendor/league/flysystem/src/CorruptedPathDetected.php
  class CorruptedPathDetected (line 7) | class CorruptedPathDetected extends LogicException implements Filesystem...
    method forPath (line 13) | public static function forPath($path)

FILE: vendor/league/flysystem/src/Directory.php
  class Directory (line 8) | class Directory extends Handler
    method delete (line 15) | public function delete()
    method getContents (line 27) | public function getContents($recursive = false)

FILE: vendor/league/flysystem/src/Exception.php
  class Exception (line 5) | class Exception extends \Exception implements FilesystemException

FILE: vendor/league/flysystem/src/File.php
  class File (line 8) | class File extends Handler
    method exists (line 15) | public function exists()
    method read (line 25) | public function read()
    method readStream (line 35) | public function readStream()
    method write (line 47) | public function write($content)
    method writeStream (line 59) | public function writeStream($resource)
    method update (line 71) | public function update($content)
    method updateStream (line 83) | public function updateStream($resource)
    method put (line 95) | public function put($content)
    method putStream (line 107) | public function putStream($resource)
    method rename (line 119) | public function rename($newpath)
    method copy (line 137) | public function copy($newpath)
    method getTimestamp (line 151) | public function getTimestamp()
    method getMimetype (line 161) | public function getMimetype()
    method getVisibility (line 171) | public function getVisibility()
    method getMetadata (line 181) | public function getMetadata()
    method getSize (line 191) | public function getSize()
    method delete (line 201) | public function delete()

FILE: vendor/league/flysystem/src/FileExistsException.php
  class FileExistsException (line 7) | class FileExistsException extends Exception
    method __construct (line 21) | public function __construct($path, $code = 0, BaseException $previous ...
    method getPath (line 33) | public function getPath()

FILE: vendor/league/flysystem/src/FileNotFoundException.php
  class FileNotFoundException (line 7) | class FileNotFoundException extends Exception
    method __construct (line 21) | public function __construct($path, $code = 0, BaseException $previous ...
    method getPath (line 33) | public function getPath()

FILE: vendor/league/flysystem/src/Filesystem.php
  class Filesystem (line 19) | class Filesystem implements FilesystemInterface
    method __construct (line 35) | public function __construct(AdapterInterface $adapter, $config = null)
    method getAdapter (line 46) | public function getAdapter()
    method has (line 54) | public function has($path)
    method write (line 64) | public function write($path, $contents, array $config = [])
    method writeStream (line 76) | public function writeStream($path, $resource, array $config = [])
    method put (line 94) | public function put($path, $contents, array $config = [])
    method putStream (line 109) | public function putStream($path, $resource, array $config = [])
    method readAndDelete (line 129) | public function readAndDelete($path)
    method update (line 147) | public function update($path, $contents, array $config = [])
    method updateStream (line 160) | public function updateStream($path, $resource, array $config = [])
    method read (line 177) | public function read($path)
    method readStream (line 192) | public function readStream($path)
    method rename (line 207) | public function rename($path, $newpath)
    method copy (line 220) | public function copy($path, $newpath)
    method delete (line 233) | public function delete($path)
    method deleteDir (line 244) | public function deleteDir($dirname)
    method createDir (line 258) | public function createDir($dirname, array $config = [])
    method listContents (line 269) | public function listContents($directory = '', $recursive = false)
    method getMimetype (line 281) | public function getMimetype($path)
    method getTimestamp (line 296) | public function getTimestamp($path)
    method getVisibility (line 311) | public function getVisibility($path)
    method getSize (line 326) | public function getSize($path)
    method setVisibility (line 341) | public function setVisibility($path, $visibility)
    method getMetadata (line 352) | public function getMetadata($path)
    method get (line 363) | public function get($path, Handler $handler = null)
    method assertPresent (line 387) | public function assertPresent($path)
    method assertAbsent (line 403) | public function assertAbsent($path)

FILE: vendor/league/flysystem/src/FilesystemException.php
  type FilesystemException (line 5) | interface FilesystemException

FILE: vendor/league/flysystem/src/FilesystemInterface.php
  type FilesystemInterface (line 7) | interface FilesystemInterface
    method has (line 16) | public function has($path);
    method read (line 27) | public function read($path);
    method readStream (line 38) | public function readStream($path);
    method listContents (line 48) | public function listContents($directory = '', $recursive = false);
    method getMetadata (line 59) | public function getMetadata($path);
    method getSize (line 70) | public function getSize($path);
    method getMimetype (line 81) | public function getMimetype($path);
    method getTimestamp (line 92) | public function getTimestamp($path);
    method getVisibility (line 103) | public function getVisibility($path);
    method write (line 116) | public function write($path, $contents, array $config = []);
    method writeStream (line 130) | public function writeStream($path, $resource, array $config = []);
    method update (line 143) | public function update($path, $contents, array $config = []);
    method updateStream (line 157) | public function updateStream($path, $resource, array $config = []);
    method rename (line 170) | public function rename($path, $newpath);
    method copy (line 183) | public function copy($path, $newpath);
    method delete (line 194) | public function delete($path);
    method deleteDir (line 205) | public function deleteDir($dirname);
    method createDir (line 215) | public function createDir($dirname, array $config = []);
    method setVisibility (line 227) | public function setVisibility($path, $visibility);
    method put (line 238) | public function put($path, $contents, array $config = []);
    method putStream (line 251) | public function putStream($path, $resource, array $config = []);
    method readAndDelete (line 262) | public function readAndDelete($path);
    method get (line 274) | public function get($path, Handler $handler = null);
    method addPlugin (line 283) | public function addPlugin(PluginInterface $plugin);

FILE: vendor/league/flysystem/src/FilesystemNotFoundException.php
  class FilesystemNotFoundException (line 10) | class FilesystemNotFoundException extends LogicException implements File...

FILE: vendor/league/flysystem/src/Handler.php
  class Handler (line 10) | abstract class Handler
    method __construct (line 28) | public function __construct(FilesystemInterface $filesystem = null, $p...
    method isDir (line 39) | public function isDir()
    method isFile (line 49) | public function isFile()
    method getType (line 59) | public function getType()
    method setFilesystem (line 73) | public function setFilesystem(FilesystemInterface $filesystem)
    method getFilesystem (line 85) | public function getFilesystem()
    method setPath (line 97) | public function setPath($path)
    method getPath (line 109) | public function getPath()
    method __call (line 122) | public function __call($method, array $arguments)

FILE: vendor/league/flysystem/src/InvalidRootException.php
  class InvalidRootException (line 7) | class InvalidRootException extends RuntimeException implements Filesyste...

FILE: vendor/league/flysystem/src/MountManager.php
  class MountManager (line 24) | class MountManager implements FilesystemInterface
    method __construct (line 40) | public function __construct(array $filesystems = [])
    method mountFilesystems (line 54) | public function mountFilesystems(array $filesystems)
    method mountFilesystem (line 73) | public function mountFilesystem($prefix, FilesystemInterface $filesystem)
    method getFilesystem (line 93) | public function getFilesystem($prefix)
    method filterPrefix (line 111) | public function filterPrefix(array $arguments)
    method listContents (line 138) | public function listContents($directory = '', $recursive = false)
    method __call (line 162) | public function __call($method, $arguments)
    method copy (line 180) | public function copy($from, $to, array $config = [])
    method listWith (line 213) | public function listWith(array $keys = [], $directory = '', $recursive...
    method move (line 233) | public function move($from, $to, array $config = [])
    method invokePluginOnFilesystem (line 269) | public function invokePluginOnFilesystem($method, $arguments, $prefix)
    method getPrefixAndPath (line 291) | protected function getPrefixAndPath($path)
    method has (line 307) | public function has($path)
    method read (line 323) | public function read($path)
    method readStream (line 339) | public function readStream($path)
    method getMetadata (line 355) | public function getMetadata($path)
    method getSize (line 371) | public function getSize($path)
    method getMimetype (line 387) | public function getMimetype($path)
    method getTimestamp (line 403) | public function getTimestamp($path)
    method getVisibility (line 419) | public function getVisibility($path)
    method write (line 437) | public function write($path, $contents, array $config = [])
    method writeStream (line 456) | public function writeStream($path, $resource, array $config = [])
    method update (line 474) | public function update($path, $contents, array $config = [])
    method updateStream (line 493) | public function updateStream($path, $resource, array $config = [])
    method rename (line 511) | public function rename($path, $newpath)
    method delete (line 527) | public function delete($path)
    method deleteDir (line 543) | public function deleteDir($dirname)
    method createDir (line 558) | public function createDir($dirname, array $config = [])
    method setVisibility (line 575) | public function setVisibility($path, $visibility)
    method put (line 591) | public function put($path, $contents, array $config = [])
    method putStream (line 609) | public function putStream($path, $resource, array $config = [])
    method readAndDelete (line 625) | public function readAndDelete($path)
    method get (line 642) | public function get($path, Handler $handler = null)

FILE: vendor/league/flysystem/src/NotSupportedException.php
  class NotSupportedException (line 8) | class NotSupportedException extends RuntimeException implements Filesyst...
    method forLink (line 17) | public static function forLink(SplFileInfo $file)
    method forFtpSystemType (line 31) | public static function forFtpSystemType($systemType)

FILE: vendor/league/flysystem/src/Plugin/AbstractPlugin.php
  class AbstractPlugin (line 8) | abstract class AbstractPlugin implements PluginInterface
    method setFilesystem (line 20) | public function setFilesystem(FilesystemInterface $filesystem)

FILE: vendor/league/flysystem/src/Plugin/EmptyDir.php
  class EmptyDir (line 5) | class EmptyDir extends AbstractPlugin
    method getMethod (line 12) | public function getMethod()
    method handle (line 22) | public function handle($dirname)

FILE: vendor/league/flysystem/src/Plugin/ForcedCopy.php
  class ForcedCopy (line 8) | class ForcedCopy extends AbstractPlugin
    method getMethod (line 13) | public function getMethod()
    method handle (line 29) | public function handle($path, $newpath)

FILE: vendor/league/flysystem/src/Plugin/ForcedRename.php
  class ForcedRename (line 8) | class ForcedRename extends AbstractPlugin
    method getMethod (line 13) | public function getMethod()
    method handle (line 29) | public function handle($path, $newpath)

FILE: vendor/league/flysystem/src/Plugin/GetWithMetadata.php
  class GetWithMetadata (line 8) | class GetWithMetadata extends AbstractPlugin
    method getMethod (line 15) | public function getMethod()
    method handle (line 31) | public function handle($path, array $metadata)

FILE: vendor/league/flysystem/src/Plugin/ListFiles.php
  class ListFiles (line 5) | class ListFiles extends AbstractPlugin
    method getMethod (line 12) | public function getMethod()
    method handle (line 25) | public function handle($directory = '', $recursive = false)

FILE: vendor/league/flysystem/src/Plugin/ListPaths.php
  class ListPaths (line 5) | class ListPaths extends AbstractPlugin
    method getMethod (line 12) | public function getMethod()
    method handle (line 25) | public function handle($directory = '', $recursive = false)

FILE: vendor/league/flysystem/src/Plugin/ListWith.php
  class ListWith (line 5) | class ListWith extends AbstractPlugin
    method getMethod (line 12) | public function getMethod()
    method handle (line 26) | public function handle(array $keys = [], $directory = '', $recursive =...
    method getMetadataByName (line 48) | protected function getMetadataByName(array $object, $key)

FILE: vendor/league/flysystem/src/Plugin/PluggableTrait.php
  type PluggableTrait (line 10) | trait PluggableTrait
    method addPlugin (line 26) | public function addPlugin(PluginInterface $plugin)
    method findPlugin (line 46) | protected function findPlugin($method)
    method invokePlugin (line 66) | protected function invokePlugin($method, array $arguments, FilesystemI...
    method __call (line 85) | public function __call($method, array $arguments)

FILE: vendor/league/flysystem/src/Plugin/PluginNotFoundException.php
  class PluginNotFoundException (line 7) | class PluginNotFoundException extends LogicException

FILE: vendor/league/flysystem/src/PluginInterface.php
  type PluginInterface (line 5) | interface PluginInterface
    method getMethod (line 12) | public function getMethod();
    method setFilesystem (line 19) | public function setFilesystem(FilesystemInterface $filesystem);

FILE: vendor/league/flysystem/src/ReadInterface.php
  type ReadInterface (line 5) | interface ReadInterface
    method has (line 14) | public function has($path);
    method read (line 23) | public function read($path);
    method readStream (line 32) | public function readStream($path);
    method listContents (line 42) | public function listContents($directory = '', $recursive = false);
    method getMetadata (line 51) | public function getMetadata($path);
    method getSize (line 60) | public function getSize($path);
    method getMimetype (line 69) | public function getMimetype($path);
    method getTimestamp (line 78) | public function getTimestamp($path);
    method getVisibility (line 87) | public function getVisibility($path);

FILE: vendor/league/flysystem/src/RootViolationException.php
  class RootViolationException (line 7) | class RootViolationException extends LogicException implements Filesyste...

FILE: vendor/league/flysystem/src/SafeStorage.php
  class SafeStorage (line 5) | final class SafeStorage
    method __construct (line 17) | public function __construct()
    method storeSafely (line 23) | public function storeSafely($key, $value)
    method retrieveSafely (line 28) | public function retrieveSafely($key)
    method __destruct (line 35) | public function __destruct()

FILE: vendor/league/flysystem/src/UnreadableFileException.php
  class UnreadableFileException (line 7) | class UnreadableFileException extends Exception
    method forFileInfo (line 9) | public static function forFileInfo(SplFileInfo $fileInfo)

FILE: vendor/league/flysystem/src/Util.php
  class Util (line 10) | class Util
    method pathinfo (line 19) | public static function pathinfo($path)
    method normalizeDirname (line 41) | public static function normalizeDirname($dirname)
    method dirname (line 53) | public static function dirname($path)
    method map (line 66) | public static function map(array $object, array $map)
    method normalizePath (line 90) | public static function normalizePath($path)
    method normalizeRelativePath (line 104) | public static function normalizeRelativePath($path)
    method removeFunkyWhiteSpace (line 143) | protected static function removeFunkyWhiteSpace($path)
    method normalizePrefix (line 160) | public static function normalizePrefix($prefix, $separator)
    method contentSize (line 172) | public static function contentSize($contents)
    method guessMimeType (line 185) | public static function guessMimeType($path, $content)
    method emulateDirectories (line 203) | public static function emulateDirectories(array $listing)
    method ensureConfig (line 230) | public static function ensureConfig($config)
    method rewindStream (line 252) | public static function rewindStream($resource)
    method isSeekableStream (line 259) | public static function isSeekableStream($resource)
    method getStreamSize (line 273) | public static function getStreamSize($resource)
    method emulateObjectDirectories (line 293) | protected static function emulateObjectDirectories(array $object, arra...
    method basename (line 326) | private static function basename($path)

FILE: vendor/league/flysystem/src/Util/ContentListingFormatter.php
  class ContentListingFormatter (line 10) | class ContentListingFormatter
    method __construct (line 31) | public function __construct($directory, $recursive, $caseSensitive = t...
    method formatListing (line 45) | public function formatListing(array $listing)
    method addPathInfo (line 52) | private function addPathInfo(array $entry)
    method isEntryOutOfScope (line 64) | private function isEntryOutOfScope(array $entry)
    method residesInDirectory (line 84) | private function residesInDirectory(array $entry)
    method isDirectChild (line 102) | private function isDirectChild(array $entry)
    method sortListing (line 114) | private function sortListing(array $listing)

FILE: vendor/league/flysystem/src/Util/MimeType.php
  class MimeType (line 12) | class MimeType
    method useDetector (line 17) | public static function useDetector(MimeTypeDetector $detector)
    method detector (line 25) | protected static function detector()
    method detectByContent (line 42) | public static function detectByContent($content)
    method detectByFileExtension (line 58) | public static function detectByFileExtension($extension)
    method detectByFilename (line 68) | public static function detectByFilename($filename)
    method getExtensionToMimeTypeMap (line 76) | public static function getExtensionToMimeTypeMap()

FILE: vendor/league/flysystem/src/Util/StreamHasher.php
  class StreamHasher (line 5) | class StreamHasher
    method __construct (line 17) | public function __construct($algo)
    method hash (line 27) | public function hash($resource)

FILE: vendor/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php
  class EmptyExtensionToMimeTypeMap (line 7) | class EmptyExtensionToMimeTypeMap implements ExtensionToMimeTypeMap
    method lookupMimeType (line 9) | public function lookupMimeType(string $extension): ?string

FILE: vendor/league/mime-type-detection/src/ExtensionMimeTypeDetector.php
  class ExtensionMimeTypeDetector (line 9) | class ExtensionMimeTypeDetector implements MimeTypeDetector
    method __construct (line 16) | public function __construct(ExtensionToMimeTypeMap $extensions = null)
    method detectMimeType (line 21) | public function detectMimeType(string $path, $contents): ?string
    method detectMimeTypeFromPath (line 26) | public function detectMimeTypeFromPath(string $path): ?string
    method detectMimeTypeFromFile (line 33) | public function detectMimeTypeFromFile(string $path): ?string
    method detectMimeTypeFromBuffer (line 38) | public function detectMimeTypeFromBuffer(string $contents): ?string

FILE: vendor/league/mime-type-detection/src/ExtensionToMimeTypeMap.php
  type ExtensionToMimeTypeMap (line 7) | interface ExtensionToMimeTypeMap
    method lookupMimeType (line 9) | public function lookupMimeType(string $extension): ?string;

FILE: vendor/league/mime-type-detection/src/FinfoMimeTypeDetector.php
  class FinfoMimeTypeDetector (line 12) | class FinfoMimeTypeDetector implements MimeTypeDetector
    method __construct (line 42) | public function __construct(
    method detectMimeType (line 54) | public function detectMimeType(string $path, $contents): ?string
    method detectMimeTypeFromPath (line 67) | public function detectMimeTypeFromPath(string $path): ?string
    method detectMimeTypeFromFile (line 74) | public function detectMimeTypeFromFile(string $path): ?string
    method detectMimeTypeFromBuffer (line 79) | public function detectMimeTypeFromBuffer(string $contents): ?string
    method takeSample (line 84) | private function takeSample(string $contents): string

FILE: vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php
  class GeneratedExtensionToMimeTypeMap (line 7) | class GeneratedExtensionToMimeTypeMap implements ExtensionToMimeTypeMap
    method lookupMimeType (line 1222) | public function lookupMimeType(string $extension): ?string

FILE: vendor/league/mime-type-detection/src/MimeTypeDetector.php
  type MimeTypeDetector (line 7) | interface MimeTypeDetector
    method detectMimeType (line 12) | public function detectMimeType(string $path, $contents): ?string;
    method detectMimeTypeFromBuffer (line 14) | public function detectMimeTypeFromBuffer(string $contents): ?string;
    method detectMimeTypeFromPath (line 16) | public function detectMimeTypeFromPath(string $path): ?string;
    method detectMimeTypeFromFile (line 18) | public function detectMimeTypeFromFile(string $path): ?string;

FILE: vendor/league/mime-type-detection/src/OverridingExtensionToMimeTypeMap.php
  class OverridingExtensionToMimeTypeMap (line 5) | class OverridingExtensionToMimeTypeMap implements ExtensionToMimeTypeMap
    method __construct (line 20) | public function __construct(ExtensionToMimeTypeMap $innerMap, array $o...
    method lookupMimeType (line 26) | public function lookupMimeType(string $extension): ?string

FILE: vendor/psr/cache/src/CacheException.php
  type CacheException (line 8) | interface CacheException extends \Throwable

FILE: vendor/psr/cache/src/CacheItemInterface.php
  type CacheItemInterface (line 24) | interface CacheItemInterface
    method getKey (line 35) | public function getKey();
    method get (line 49) | public function get();
    method isHit (line 60) | public function isHit();
    method set (line 75) | public function set(mixed $value);
    method expiresAt (line 89) | public function expiresAt(?\DateTimeInterface $expiration);
    method expiresAfter (line 104) | public function expiresAfter(int|\DateInterval|null $time);

FILE: vendor/psr/cache/src/CacheItemPoolInterface.php
  type CacheItemPoolInterface (line 14) | interface CacheItemPoolInterface
    method getItem (line 32) | public function getItem(string $key);
    method getItems (line 50) | public function getItems(array $keys = []);
    method hasItem (line 69) | public function hasItem(string $key);
    method clear (line 77) | public function clear();
    method deleteItem (line 92) | public function deleteItem(string $key);
    method deleteItems (line 107) | public function deleteItems(array $keys);
    method save (line 118) | public function save(CacheItemInterface $item);
    method saveDeferred (line 129) | public function saveDeferred(CacheItemInterface $item);
    method commit (line 137) | public function commit();

FILE: vendor/psr/cache/src/InvalidArgumentException.php
  type InvalidArgumentException (line 11) | interface InvalidArgumentException extends CacheException

FILE: vendor/psr/http-client/src/ClientExceptionInterface.php
  type ClientExceptionInterface (line 8) | interface ClientExceptionInterface extends \Throwable

FILE: vendor/psr/http-client/src/ClientInterface.php
  type ClientInterface (line 8) | interface ClientInterface
    method sendRequest (line 19) | public function sendRequest(RequestInterface $request): ResponseInterf...

FILE: vendor/psr/http-client/src/NetworkExceptionInterface.php
  type NetworkExceptionInterface (line 14) | interface NetworkExceptionInterface extends ClientExceptionInterface
    method getRequest (line 23) | public function getRequest(): RequestInterface;

FILE: vendor/psr/http-client/src/RequestExceptionInterface.php
  type RequestExceptionInterface (line 14) | interface RequestExceptionInterface extends ClientExceptionInterface
    method getRequest (line 23) | public function getRequest(): RequestInterface;

FILE: vendor/psr/http-message/src/MessageInterface.php
  type MessageInterface (line 17) | interface MessageInterface
    method getProtocolVersion (line 26) | public function getProtocolVersion();
    method withProtocolVersion (line 41) | public function withProtocolVersion($version);
    method getHeaders (line 68) | public function getHeaders();
    method hasHeader (line 78) | public function hasHeader($name);
    method getHeader (line 94) | public function getHeader($name);
    method getHeaderLine (line 115) | public function getHeaderLine($name);
    method withHeader (line 132) | public function withHeader($name, $value);
    method withAddedHeader (line 150) | public function withAddedHeader($name, $value);
    method withoutHeader (line 164) | public function withoutHeader($name);
    method getBody (line 171) | public function getBody();
    method withBody (line 186) | public function withBody(StreamInterface $body);

FILE: vendor/psr/http-message/src/RequestInterface.php
  type RequestInterface (line 24) | interface RequestInterface extends MessageInterface
    method getRequestTarget (line 42) | public function getRequestTarget();
    method withRequestTarget (line 61) | public function withRequestTarget($requestTarget);
    method getMethod (line 68) | public function getMethod();
    method withMethod (line 85) | public function withMethod($method);
    method getUri (line 96) | public function getUri();
    method withUri (line 128) | public function withUri(UriInterface $uri, $preserveHost = false);

FILE: vendor/psr/http-message/src/ResponseInterface.php
  type ResponseInterface (line 20) | interface ResponseInterface extends MessageInterface
    method getStatusCode (line 30) | public function getStatusCode();
    method withStatus (line 52) | public function withStatus($code, $reasonPhrase = '');
    method getReasonPhrase (line 67) | public function getReasonPhrase();

FILE: vendor/psr/http-message/src/ServerRequestInterface.php
  type ServerRequestInterface (line 43) | interface ServerRequestInterface extends RequestInterface
    method getServerParams (line 54) | public function getServerParams();
    method getCookieParams (line 66) | public function getCookieParams();
    method withCookieParams (line 85) | public function withCookieParams(array $cookies);
    method getQueryParams (line 99) | public function getQueryParams();
    method withQueryParams (line 123) | public function withQueryParams(array $query);
    method getUploadedFiles (line 137) | public function getUploadedFiles();
    method withUploadedFiles (line 150) | public function withUploadedFiles(array $uploadedFiles);
    method getParsedBody (line 167) | public function getParsedBody();
    method withParsedBody (line 197) | public function withParsedBody($data);
    method getAttributes (line 210) | public function getAttributes();
    method getAttribute (line 227) | public function getAttribute($name, $default = null);
    method withAttribute (line 244) | public function withAttribute($name, $value);
    method withoutAttribute (line 260) | public function withoutAttribute($name);

FILE: vendor/psr/http-message/src/StreamInterface.php
  type StreamInterface (line 12) | interface StreamInterface
    method __toString (line 28) | public function __toString();
    method close (line 35) | public function close();
    method detach (line 44) | public function detach();
    method getSize (line 51) | public function getSize();
    method tell (line 59) | public function tell();
    method eof (line 66) | public function eof();
    method isSeekable (line 73) | public function isSeekable();
    method seek (line 87) | public function seek($offset, $whence = SEEK_SET);
    method rewind (line 99) | public function rewind();
    method isWritable (line 106) | public function isWritable();
    method write (line 115) | public function write($string);
    method isReadable (line 122) | public function isReadable();
    method read (line 134) | public function read($length);
    method getContents (line 143) | public function getContents();
    method getMetadata (line 157) | public function getMetadata($key = null);

FILE: vendor/psr/http-message/src/UploadedFileInterface.php
  type UploadedFileInterface (line 13) | interface UploadedFileInterface
    method getStream (line 31) | public function getStream();
    method moveTo (line 65) | public function moveTo($targetPath);
    method getSize (line 76) | public function getSize();
    method getError (line 92) | public function getError();
    method getClientFilename (line 107) | public function getClientFilename();
    method getClientMediaType (line 122) | public function getClientMediaType();

FILE: vendor/psr/http-message/src/UriInterface.php
  type UriInterface (line 24) | interface UriInterface
    method getScheme (line 40) | public function getScheme();
    method getAuthority (line 60) | public function getAuthority();
    method getUserInfo (line 77) | public function getUserInfo();
    method getHost (line 90) | public function getHost();
    method getPort (line 107) | public function getPort();
    method getPath (line 134) | public function getPath();
    method getQuery (line 156) | public function getQuery();
    method getFragment (line 174) | public function getFragment();
    method withScheme (line 191) | public function withScheme($scheme);
    method withUserInfo (line 207) | public function withUserInfo($user, $password = null);
    method withHost (line 221) | public function withHost($host);
    method withPort (line 240) | public function withPort($port);
    method withPath (line 264) | public function withPath($path);
    method withQuery (line 281) | public function withQuery($query);
    method withFragment (line 297) | public function withFragment($fragment);
    method __toString (line 322) | public function __toString();

FILE: vendor/psr/log/Psr/Log/AbstractLogger.php
  class AbstractLogger (line 12) | abstract class AbstractLogger implements LoggerInterface
    method emergency (line 22) | public function emergency($message, array $context = array())
    method alert (line 38) | public function alert($message, array $context = array())
    method critical (line 53) | public function critical($message, array $context = array())
    method error (line 67) | public function error($message, array $context = array())
    method warning (line 83) | public function warning($message, array $context = array())
    method notice (line 96) | public function notice($message, array $context = array())
    method info (line 111) | public function info($message, array $context = array())
    method debug (line 124) | public function debug($message, array $context = array())

FILE: vendor/psr/log/Psr/Log/InvalidArgumentException.php
  class InvalidArgumentException (line 5) | class InvalidArgumentException extends \InvalidArgumentException

FILE: vendor/psr/log/Psr/Log/LogLevel.php
  class LogLevel (line 8) | class LogLevel

FILE: vendor/psr/log/Psr/Log/LoggerAwareInterface.php
  type LoggerAwareInterface (line 8) | interface LoggerAwareInterface
    method setLogger (line 17) | public function setLogger(LoggerInterface $logger);

FILE: vendor/psr/log/Psr/Log/LoggerAwareTrait.php
  type LoggerAwareTrait (line 8) | trait LoggerAwareTrait
    method setLogger (line 22) | public function setLogger(LoggerInterface $logger)

FILE: vendor/psr/log/Psr/Log/LoggerInterface.php
  type LoggerInterface (line 20) | interface LoggerInterface
    method emergency (line 30) | public function emergency($message, array $context = array());
    method alert (line 43) | public function alert($message, array $context = array());
    method critical (line 55) | public function critical($message, array $context = array());
    method error (line 66) | public function error($message, array $context = array());
    method warning (line 79) | public function warning($message, array $context = array());
    method notice (line 89) | public function notice($message, array $context = array());
    method info (line 101) | public function info($message, array $context = array());
    method debug (line 111) | public function debug($message, array $context = array());
    method log (line 124) | public function log($level, $message, array $context = array());

FILE: vendor/psr/log/Psr/Log/LoggerTrait.php
  type LoggerTrait (line 13) | trait LoggerTrait
    method emergency (line 23) | public function emergency($message, array $context = array())
    method alert (line 39) | public function alert($message, array $context = array())
    method critical (line 54) | public function critical($message, array $context = array())
    method error (line 68) | public function error($message, array $context = array())
    method warning (line 84) | public function warning($message, array $context = array())
    method notice (line 97) | public function notice($message, array $context = array())
    method info (line 112) | public function info($message, array $context = array())
    method debug (line 125) | public function debug($message, array $context = array())
    method log (line 141) | abstract public function log($level, $message, array $context = array());

FILE: vendor/psr/log/Psr/Log/NullLogger.php
  class NullLogger (line 13) | class NullLogger extends AbstractLogger
    method log (line 26) | public function log($level, $message, array $context = array())

FILE: vendor/psr/log/Psr/Log/Test/DummyTest.php
  class DummyTest (line 12) | class DummyTest
    method __toString (line 14) | public function __toString()

FILE: vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
  class LoggerInterfaceTest (line 15) | abstract class LoggerInterfaceTest extends TestCase
    method getLogger (line 20) | abstract public function getLogger();
    method getLogs (line 31) | abstract public function getLogs();
    method testImplements (line 33) | public function testImplements()
    method testLogsAtAllLevels (line 41) | public function testLogsAtAllLevels($level, $message)
    method provideLevelsAndMessages (line 54) | public function provideLevelsAndMessages()
    method testThrowsOnInvalidLevel (line 71) | public function testThrowsOnInvalidLevel()
    method testContextReplacement (line 77) | public function testContextReplacement()
    method testObjectCastToString (line 86) | public function testObjectCastToString()
    method testContextCanContainAnything (line 103) | public function testContextCanContainAnything()
    method testContextExceptionKeyCanBeExceptionOrOtherValues (line 126) | public function testContextExceptionKeyCanBeExceptionOrOtherValues()

FILE: vendor/psr/log/Psr/Log/Test/TestLogger.php
  class TestLogger (line 57) | class TestLogger extends AbstractLogger
    method log (line 69) | public function log($level, $message, array $context = [])
    method hasRecords (line 81) | public function hasRecords($level)
    method hasRecord (line 86) | public function hasRecord($record, $level)
    method hasRecordThatContains (line 102) | public function hasRecordThatContains($message, $level)
    method hasRecordThatMatches (line 109) | public function hasRecordThatMatches($regex, $level)
    method hasRecordThatPasses (line 116) | public function hasRecordThatPasses(callable $predicate, $level)
    method __call (line 129) | public function __call($method, $args)
    method reset (line 142) | public function reset()

FILE: vendor/psr/simple-cache/src/CacheException.php
  type CacheException (line 8) | interface CacheException

FILE: vendor/psr/simple-cache/src/CacheInterface.php
  type CacheInterface (line 5) | interface CacheInterface
    method get (line 18) | public function get($key, $default = null);
    method set (line 34) | public function set($key, $value, $ttl = null);
    method delete (line 46) | public function delete($key);
    method clear (line 53) | public function clear();
    method getMultiple (line 67) | public function getMultiple($keys, $default = null);
    method setMultiple (line 83) | public function setMultiple($values, $ttl = null);
    method deleteMultiple (line 96) | public function deleteMultiple($keys);
    method has (line 113) | public function has($key);

FILE: vendor/psr/simple-cache/src/InvalidArgumentException.php
  type InvalidArgumentException (line 11) | interface InvalidArgumentException extends CacheException

FILE: vendor/ralouphie/getallheaders/src/getallheaders.php
  function getallheaders (line 10) | function getallheaders()

FILE: vendor/symfony/polyfill-mbstring/Mbstring.php
  class Mbstring (line 68) | final class Mbstring
    method mb_convert_encoding (line 81) | public static function mb_convert_encoding($s, $toEncoding, $fromEncod...
    method mb_convert_variables (line 119) | public static function mb_convert_variables($toEncoding, $fromEncoding...
    method mb_decode_mimeheader (line 131) | public static function mb_decode_mimeheader($s)
    method mb_encode_mimeheader (line 136) | public static function mb_encode_mimeheader($s, $charset = null, $tran...
    method mb_decode_numericentity (line 141) | public static function mb_decode_numericentity($s, $convmap, $encoding...
    method mb_encode_numericentity (line 201) | public static function mb_encode_numericentity($s, $convmap, $encoding...
    method mb_convert_case (line 271) | public static function mb_convert_case($s, $mode, $encoding = null)
    method mb_internal_encoding (line 349) | public static function mb_internal_encoding($encoding = null)
    method mb_language (line 370) | public static function mb_language($lang = null)
    method mb_list_encodings (line 391) | public static function mb_list_encodings()
    method mb_encoding_aliases (line 396) | public static function mb_encoding_aliases($encoding)
    method mb_check_encoding (line 407) | public static function mb_check_encoding($var = null, $encoding = null)
    method mb_detect_encoding (line 419) | public static function mb_detect_encoding($str, $encodingList = null, ...
    method mb_detect_order (line 455) | public static function mb_detect_order($encodingList = null)
    method mb_strlen (line 484) | public static function mb_strlen($s, $encoding = null)
    method mb_strpos (line 494) | public static function mb_strpos($haystack, $needle, $offset = 0, $enc...
    method mb_strrpos (line 515) | public static function mb_strrpos($haystack, $needle, $offset = 0, $en...
    method mb_str_split (line 542) | public static function mb_str_split($string, $split_length = 1, $encod...
    method mb_strtolower (line 584) | public static function mb_strtolower($s, $encoding = null)
    method mb_strtoupper (line 589) | public static function mb_strtoupper($s, $encoding = null)
    method mb_substitute_character (line 594) | public static function mb_substitute_character($c = null)
    method mb_substr (line 612) | public static function mb_substr($s, $start, $length = null, $encoding...
    method mb_stripos (line 638) | public static function mb_stripos($haystack, $needle, $offset = 0, $en...
    method mb_stristr (line 646) | public static function mb_stristr($haystack, $needle, $part = false, $...
    method mb_strrchr (line 653) | public static function mb_strrchr($haystack, $needle, $part = false, $...
    method mb_strrichr (line 666) | public static function mb_strrichr($haystack, $needle, $part = false, ...
    method mb_strripos (line 674) | public static function mb_strripos($haystack, $needle, $offset = 0, $e...
    method mb_strstr (line 682) | public static function mb_strstr($haystack, $needle, $part = false, $e...
    method mb_get_info (line 695) | public static function mb_get_info($type = 'all')
    method mb_http_input (line 724) | public static function mb_http_input($type = '')
    method mb_http_output (line 729) | public static function mb_http_output($encoding = null)
    method mb_strwidth (line 734) | public static function mb_strwidth($s, $encoding = null)
    method mb_substr_count (line 747) | public static function mb_substr_count($haystack, $needle, $encoding =...
    method mb_output_handler (line 752) | public static function mb_output_handler($contents, $status)
    method mb_chr (line 757) | public static function mb_chr($code, $encoding = null)
    method mb_ord (line 776) | public static function mb_ord($s, $encoding = null)
    method getSubpart (line 800) | private static function getSubpart($pos, $part, $haystack, $encoding)
    method html_encoding_callback (line 812) | private static function html_encoding_callback(array $m)
    method title_case (line 837) | private static function title_case(array $s)
    method getData (line 842) | private static function getData($file)
    method getEncoding (line 851) | private static function getEncoding($encoding)

FILE: vendor/symfony/polyfill-mbstring/bootstrap.php
  function mb_convert_encoding (line 19) | function mb_convert_encoding($string, $to_encoding, $from_encoding = nul...
  function mb_decode_mimeheader (line 22) | function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mi...
  function mb_encode_mimeheader (line 25) | function mb_encode_mimeheader($string, $charset = null, $transfer_encodi...
  function mb_decode_numericentity (line 28) | function mb_decode_numericentity($string, $map, $encoding = null) { retu...
  function mb_encode_numericentity (line 31) | function mb_encode_numericentity($string, $map, $encoding = null, $hex =...
  function mb_convert_case (line 34) | function mb_convert_case($string, $mode, $encoding = null) { return p\Mb...
  function mb_internal_encoding (line 37) | function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_...
  function mb_language (line 40) | function mb_language($language = null) { return p\Mbstring::mb_language(...
  function mb_list_encodings (line 43) | function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
  function mb_encoding_aliases (line 46) | function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding...
  function mb_check_encoding (line 49) | function mb_check_encoding($value = null, $encoding = null) { return p\M...
  function mb_detect_encoding (line 52) | function mb_detect_encoding($string, $encodings = null, $strict = false)...
  function mb_detect_order (line 55) | function mb_detect_order($encoding = null) { return p\Mbstring::mb_detec...
  function mb_parse_str (line 58) | function mb_parse_str($string, &$result = []) { parse_str($string, $resu...
  function mb_strlen (line 61) | function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_st...
  function mb_strpos (line 64) | function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { ...
  function mb_strtolower (line 67) | function mb_strtolower($string, $encoding = null) { return p\Mbstring::m...
  function mb_strtoupper (line 70) | function mb_strtoupper($string, $encoding = null) { return p\Mbstring::m...
  function mb_substitute_character (line 73) | function mb_substitute_character($substitute_character = null) { return ...
  function mb_substr (line 76) | function mb_substr($string, $start, $length = 2147483647, $encoding = nu...
  function mb_stripos (line 79) | function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) {...
  function mb_stristr (line 82) | function mb_stristr($haystack, $needle, $before_needle = false, $encodin...
  function mb_strrchr (line 85) | function mb_strrchr($haystack, $needle, $before_needle = false, $encodin...
  function mb_strrichr (line 88) | function mb_strrichr($haystack, $needle, $before_needle = false, $encodi...
  function mb_strripos (line 91) | function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) ...
  function mb_strrpos (line 94) | function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) {...
  function mb_strstr (line 97) | function mb_strstr($haystack, $needle, $before_needle = false, $encoding...
  function mb_get_info (line 100) | function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($ty...
  function mb_http_output (line 103) | function mb_http_output($encoding = null) { return p\Mbstring::mb_http_o...
  function mb_strwidth (line 106) | function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_...
  function mb_substr_count (line 109) | function mb_substr_count($haystack, $needle, $encoding = null) { return ...
  function mb_output_handler (line 112) | function mb_output_handler($string, $status) { return p\Mbstring::mb_out...
  function mb_http_input (line 115) | function mb_http_input($type = null) { return p\Mbstring::mb_http_input(...
  function mb_convert_variables (line 119) | function mb_convert_variables($to_encoding, $from_encoding, &...$vars) {...
  function mb_ord (line 123) | function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($...
  function mb_chr (line 126) | function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_ch...
  function mb_scrub (line 129) | function mb_scrub($string, $encoding = null) { $encoding = null === $enc...
  function mb_str_split (line 132) | function mb_str_split($string, $length = 1, $encoding = null) { return p...

FILE: vendor/symfony/polyfill-mbstring/bootstrap80.php
  function mb_convert_encoding (line 15) | function mb_convert_encoding(array|string|null $string, ?string $to_enco...
  function mb_decode_mimeheader (line 18) | function mb_decode_mimeheader(?string $string): string { return p\Mbstri...
  function mb_encode_mimeheader (line 21) | function mb_encode_mimeheader(?string $string, ?string $charset = null, ...
  function mb_decode_numericentity (line 24) | function mb_decode_numericentity(?string $string, array $map, ?string $e...
  function mb_encode_numericentity (line 27) | function mb_encode_numericentity(?string $string, array $map, ?string $e...
  function mb_convert_case (line 30) | function mb_convert_case(?string $string, ?int $mode, ?string $encoding ...
  function mb_internal_encoding (line 33) | function mb_internal_encoding(?string $encoding = null): string|bool { r...
  function mb_language (line 36) | function mb_language(?string $language = null): string|bool { return p\M...
  function mb_list_encodings (line 39) | function mb_list_encodings(): array { return p\Mbstring::mb_list_encodin...
  function mb_encoding_aliases (line 42) | function mb_encoding_aliases(?string $encoding): array { return p\Mbstri...
  function mb_check_encoding (line 45) | function mb_check_encoding(array|string|null $value = null, ?string $enc...
  function mb_detect_encoding (line 48) | function mb_detect_encoding(?string $string, array|string|null $encoding...
  function mb_detect_order (line 51) | function mb_detect_order(array|string|null $encoding = null): array|bool...
  function mb_parse_str (line 54) | function mb_parse_str(?string $string, &$result = []): bool { parse_str(...
  function mb_strlen (line 57) | function mb_strlen(?string $string, ?string $encoding = null): int { ret...
  function mb_strpos (line 60) | function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0,...
  function mb_strtolower (line 63) | function mb_strtolower(?string $string, ?string $encoding = null): strin...
  function mb_strtoupper (line 66) | function mb_strtoupper(?string $string, ?string $encoding = null): strin...
  function mb_substitute_character (line 69) | function mb_substitute_character(string|int|null $substitute_character =...
  function mb_substr (lin
Condensed preview — 446 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,986K chars).
[
  {
    "path": ".gitignore",
    "chars": 24,
    "preview": "/node_modules\n.DS_Store\n"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.md",
    "chars": 2400,
    "preview": "<p align=\"center\">\n  <img width=\"150\" src=\"logo.png\" alt=\"胖鼠采集\">\n  <br>\n  <br>\n</p>\n\n### <a href=\"https://www.fatrat.cn\""
  },
  {
    "path": "composer.json",
    "chars": 816,
    "preview": "{\n    \"require\": {\n        \"jaeger/querylist\": \"^4.2\",\n        \"jaeger/querylist-puppeteer\": \"^4.0\",\n        \"tightenco/"
  },
  {
    "path": "fatratcollect.php",
    "chars": 14964,
    "preview": "<?php\n/**\n * Plugin Name: Fat Rat Collect\n * Plugin URI: https://www.fatrat.cn\n * Description: 胖鼠采集(Fat Rat Collect) 是一款"
  },
  {
    "path": "includes/fatrat-apierror.php",
    "chars": 1964,
    "preview": "<?php\n/**\n * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.\n * 胖鼠采集 WordPress最好用的采集插件.\n * 如果你觉得这个项目还不错.可"
  },
  {
    "path": "includes/fatrat-data-detail.php",
    "chars": 30201,
    "preview": "<?php\n\n/**\n * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.\n * 胖鼠采集 WordPress最好用的采集插件.\n * 如果你觉得这个项目还不错."
  },
  {
    "path": "includes/fatrat-data.php",
    "chars": 10381,
    "preview": "<?php\n/**\n * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.\n * 胖鼠采集 WordPress最好用的采集插件.\n * 如果你觉得这个项目还不错.可"
  },
  {
    "path": "includes/fatrat-debugging.php",
    "chars": 4928,
    "preview": "<?php\n/**\n * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.\n * 胖鼠采集 WordPress最好用的采集插件.\n * 如果你觉得这个项目还不错.可"
  },
  {
    "path": "includes/fatrat-kit.php",
    "chars": 26711,
    "preview": "<?php\n/**\n * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.\n * 胖鼠采集 WordPress最好用的采集插件.\n * 如果你觉得这个项目还不错.可"
  },
  {
    "path": "includes/fatrat-options-add-edit.php",
    "chars": 19765,
    "preview": "<?php\n/**\n * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.\n * 胖鼠采集 WordPress最好用的采集插件.\n * 如果你觉得这个项目还不错.可"
  },
  {
    "path": "includes/fatrat-options.php",
    "chars": 34834,
    "preview": "<?php\n/**\n * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.\n * 胖鼠采集 WordPress最好用的采集插件.\n * 如果你觉得这个项目还不错.可"
  },
  {
    "path": "includes/fatrat-spider.php",
    "chars": 55072,
    "preview": "<?php\n/**\n * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.\n * 胖鼠采集 WordPress最好用的采集插件.\n * 如果你觉得这个项目还不错.可"
  },
  {
    "path": "includes/fatrat-validation.php",
    "chars": 10434,
    "preview": "<?php\n/**\n * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.\n * 胖鼠采集 WordPress最好用的采集插件.\n * 如果你觉得这个项目还不错.可"
  },
  {
    "path": "public/css/bootstrap.css",
    "chars": 195701,
    "preview": "@charset \"UTF-8\";\n/*!\n * Bootstrap v5.0.2 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Co"
  },
  {
    "path": "public/css/fatrat.css",
    "chars": 950,
    "preview": ".frc-option-add-edit table p {\n    color: #838383;\n    font-size: 12px;\n}\n.spider-tab-content table p {\n    color: #8383"
  },
  {
    "path": "public/js/bootstrap.js",
    "chars": 148578,
    "preview": "/*!\n  * Bootstrap v5.0.2 (https://getbootstrap.com/)\n  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/t"
  },
  {
    "path": "public/js/fatrat.js",
    "chars": 27417,
    "preview": "(function($){\n\n    var option_id                       = $('#option_id').val();\n    var request_url                     "
  },
  {
    "path": "readme.txt",
    "chars": 7466,
    "preview": "=== 胖鼠采集(Fat Rat Collect) ===\nContributors: fbtopcn\nDonate link: https://www.fatrat.cn/docs/v2/bounty\nTags: 采集,微信公众号文章采集"
  },
  {
    "path": "src/Controller/TaskController.php",
    "chars": 4822,
    "preview": "<?php\n/**\n * Copyright (c) 2018-2020 Fat Rat Collect . All rights reserved.\n * 胖鼠采集 WordPress最好用的采集插件.\n * GitHub: https:"
  },
  {
    "path": "src/Helpers/helpers.php",
    "chars": 4844,
    "preview": "<?php\n\nif (!function_exists(\"startsWith\")) {\n    /**\n     * Determine if a given string starts with a given substring.\n "
  },
  {
    "path": "src/Helpers/helpers2.php",
    "chars": 1235,
    "preview": "<?php\n\nif (!function_exists(\"randomInsertString\")) {\n    /**\n     * @param $txt\n     * @param $insert\n     * @return str"
  },
  {
    "path": "src/Service/AbsoluteUrl.php",
    "chars": 1882,
    "preview": "<?php\n\nnamespace QL\\Ext;\n\nuse QL\\Contracts\\PluginContract;\nuse QL\\QueryList;\n\nclass AbsoluteUrl implements PluginContrac"
  },
  {
    "path": "src/Service/DownloadImage.php",
    "chars": 3586,
    "preview": "<?php\n\nnamespace QL\\Ext;\n\nuse QL\\Contracts\\PluginContract;\nuse QL\\QueryList;\n\nclass DownloadImage implements PluginContr"
  },
  {
    "path": "src/Service/GetTransCoding.php",
    "chars": 916,
    "preview": "<?php\n\nnamespace QL\\Ext;\n\nuse QL\\Contracts\\PluginContract;\nuse QL\\QueryList;\n\nclass GetTransCoding implements PluginCont"
  },
  {
    "path": "vendor/autoload.php",
    "chars": 178,
    "preview": "<?php\n\n// autoload.php @generated by Composer\n\nrequire_once __DIR__ . '/composer/autoload_real.php';\n\nreturn ComposerAut"
  },
  {
    "path": "vendor/cache/adapter-common/AbstractCachePool.php",
    "chars": 13625,
    "preview": "<?php\n\n/*\n * This file is part of php-cache organization.\n *\n * (c) 2015 Aaron Scherer <aequasi@gmail.com>, Tobias Nyhol"
  },
  {
    "path": "vendor/cache/adapter-common/CacheItem.php",
    "chars": 6307,
    "preview": "<?php\n\n/*\n * This file is part of php-cache organization.\n *\n * (c) 2015 Aaron Scherer <aequasi@gmail.com>, Tobias Nyhol"
  },
  {
    "path": "vendor/cache/adapter-common/Changelog.md",
    "chars": 1802,
    "preview": "# Change Log\n\nThe change log describes what is \"Added\", \"Removed\", \"Changed\" or \"Fixed\" between each release.\n\n## 1.3.0\n"
  },
  {
    "path": "vendor/cache/adapter-common/Exception/CacheException.php",
    "chars": 611,
    "preview": "<?php\n\n/*\n * This file is part of php-cache organization.\n *\n * (c) 2015 Aaron Scherer <aequasi@gmail.com>, Tobias Nyhol"
  },
  {
    "path": "vendor/cache/adapter-common/Exception/CachePoolException.php",
    "chars": 489,
    "preview": "<?php\n\n/*\n * This file is part of php-cache organization.\n *\n * (c) 2015 Aaron Scherer <aequasi@gmail.com>, Tobias Nyhol"
  },
  {
    "path": "vendor/cache/adapter-common/Exception/InvalidArgumentException.php",
    "chars": 606,
    "preview": "<?php\n\n/*\n * This file is part of php-cache organization.\n *\n * (c) 2015 Aaron Scherer <aequasi@gmail.com>, Tobias Nyhol"
  },
  {
    "path": "vendor/cache/adapter-common/HasExpirationTimestampInterface.php",
    "chars": 590,
    "preview": "<?php\n\n/*\n * This file is part of php-cache organization.\n *\n * (c) 2015 Aaron Scherer <aequasi@gmail.com>, Tobias Nyhol"
  },
  {
    "path": "vendor/cache/adapter-common/JsonBinaryArmoring.php",
    "chars": 2055,
    "preview": "<?php\n\n/*\n * This file is part of php-cache organization.\n *\n * (c) 2015 Aaron Scherer <aequasi@gmail.com>, Tobias Nyhol"
  },
  {
    "path": "vendor/cache/adapter-common/LICENSE",
    "chars": 1096,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Aaron Scherer, Tobias Nyholm\n\nPermission is hereby granted, free of charge, to"
  },
  {
    "path": "vendor/cache/adapter-common/PhpCacheItem.php",
    "chars": 884,
    "preview": "<?php\n\n/*\n * This file is part of php-cache organization.\n *\n * (c) 2015 Aaron Scherer <aequasi@gmail.com>, Tobias Nyhol"
  },
  {
    "path": "vendor/cache/adapter-common/PhpCachePool.php",
    "chars": 729,
    "preview": "<?php\n\n/*\n * This file is part of php-cache organization.\n *\n * (c) 2015 Aaron Scherer <aequasi@gmail.com>, Tobias Nyhol"
  },
  {
    "path": "vendor/cache/adapter-common/README.md",
    "chars": 1295,
    "preview": "# Common PSR-6 Cache pool \n[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?u"
  },
  {
    "path": "vendor/cache/adapter-common/TagSupportWithArray.php",
    "chars": 1811,
    "preview": "<?php\n\n/*\n * This file is part of php-cache organization.\n *\n * (c) 2015 Aaron Scherer <aequasi@gmail.com>, Tobias Nyhol"
  },
  {
    "path": "vendor/cache/adapter-common/composer.json",
    "chars": 1354,
    "preview": "{\n    \"name\": \"cache/adapter-common\",\n    \"description\": \"Common classes for PSR-6 adapters\",\n    \"license\": \"MIT\",\n    "
  },
  {
    "path": "vendor/cache/filesystem-adapter/Changelog.md",
    "chars": 1155,
    "preview": "# Change Log\n\nThe change log describes what is \"Added\", \"Removed\", \"Changed\" or \"Fixed\" between each release.\n\n## UNRELE"
  },
  {
    "path": "vendor/cache/filesystem-adapter/FilesystemCachePool.php",
    "chars": 5219,
    "preview": "<?php\n\n/*\n * This file is part of php-cache organization.\n *\n * (c) 2015 Aaron Scherer <aequasi@gmail.com>, Tobias Nyhol"
  },
  {
    "path": "vendor/cache/filesystem-adapter/LICENSE",
    "chars": 1096,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Aaron Scherer, Tobias Nyholm\n\nPermission is hereby granted, free of charge, to"
  },
  {
    "path": "vendor/cache/filesystem-adapter/README.md",
    "chars": 2074,
    "preview": "# Filesystem PSR-6 Cache pool \n[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cac"
  },
  {
    "path": "vendor/cache/filesystem-adapter/composer.json",
    "chars": 1431,
    "preview": "{\n    \"name\": \"cache/filesystem-adapter\",\n    \"description\": \"A PSR-6 cache implementation using filesystem. This implem"
  },
  {
    "path": "vendor/clue/socket-raw/.github/FUNDING.yml",
    "chars": 54,
    "preview": "github: clue\ncustom: https://clue.engineering/support\n"
  },
  {
    "path": "vendor/clue/socket-raw/.github/workflows/ci.yml",
    "chars": 767,
    "preview": "name: CI\n\non:\n  push:\n  pull_request:\n\njobs:\n  PHPUnit:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n      "
  },
  {
    "path": "vendor/clue/socket-raw/CHANGELOG.md",
    "chars": 2706,
    "preview": "# Changelog\n\n## 1.5.0 (2020-11-27)\n\n*   Feature: Support PHP 8 and drop legacy HHVM support.\n    (#60 and #61 by @clue)\n"
  },
  {
    "path": "vendor/clue/socket-raw/LICENSE",
    "chars": 1081,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2013 Christian Lück\n\nPermission is hereby granted, free of charge, to any person ob"
  },
  {
    "path": "vendor/clue/socket-raw/README.md",
    "chars": 8534,
    "preview": "# clue/socket-raw\n\n[![CI status](https://github.com/clue/php-socket-raw/workflows/CI/badge.svg)](https://github.com/clue"
  },
  {
    "path": "vendor/clue/socket-raw/composer.json",
    "chars": 703,
    "preview": "{\n    \"name\": \"clue/socket-raw\",\n    \"description\": \"Simple and lightweight OOP wrapper for PHP's low-level sockets exte"
  },
  {
    "path": "vendor/clue/socket-raw/src/Exception.php",
    "chars": 3005,
    "preview": "<?php\n\nnamespace Socket\\Raw;\n\nuse RuntimeException;\n\nclass Exception extends RuntimeException\n{\n    /**\n     * Create an"
  },
  {
    "path": "vendor/clue/socket-raw/src/Factory.php",
    "chars": 8388,
    "preview": "<?php\n\nnamespace Socket\\Raw;\n\nuse \\InvalidArgumentException;\n\nclass Factory\n{\n    /**\n     * create client socket connec"
  },
  {
    "path": "vendor/clue/socket-raw/src/Socket.php",
    "chars": 18934,
    "preview": "<?php\n\nnamespace Socket\\Raw;\n\n/**\n * Simple and lightweight OOP wrapper for the low-level sockets extension (ext-sockets"
  },
  {
    "path": "vendor/composer/ClassLoader.php",
    "chars": 16065,
    "preview": "<?php\n\n/*\n * This file is part of Composer.\n *\n * (c) Nils Adermann <naderman@naderman.de>\n *     Jordi Boggiano <j.bogg"
  },
  {
    "path": "vendor/composer/InstalledVersions.php",
    "chars": 14991,
    "preview": "<?php\n\n/*\n * This file is part of Composer.\n *\n * (c) Nils Adermann <naderman@naderman.de>\n *     Jordi Boggiano <j.bogg"
  },
  {
    "path": "vendor/composer/LICENSE",
    "chars": 1070,
    "preview": "\nCopyright (c) Nils Adermann, Jordi Boggiano\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
  },
  {
    "path": "vendor/composer/autoload_classmap.php",
    "chars": 2371,
    "preview": "<?php\n\n// autoload_classmap.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($ven"
  },
  {
    "path": "vendor/composer/autoload_files.php",
    "chars": 2107,
    "preview": "<?php\n\n// autoload_files.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendor"
  },
  {
    "path": "vendor/composer/autoload_namespaces.php",
    "chars": 324,
    "preview": "<?php\n\n// autoload_namespaces.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($v"
  },
  {
    "path": "vendor/composer/autoload_psr4.php",
    "chars": 1955,
    "preview": "<?php\n\n// autoload_psr4.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorD"
  },
  {
    "path": "vendor/composer/autoload_real.php",
    "chars": 2499,
    "preview": "<?php\n\n// autoload_real.php @generated by Composer\n\nclass ComposerAutoloaderInit15ad0a0b334e2ea46dbbf214582f0b16\n{\n    p"
  },
  {
    "path": "vendor/composer/autoload_static.php",
    "chars": 10298,
    "preview": "<?php\n\n// autoload_static.php @generated by Composer\n\nnamespace Composer\\Autoload;\n\nclass ComposerStaticInit15ad0a0b334e"
  },
  {
    "path": "vendor/composer/installed.json",
    "chars": 78727,
    "preview": "{\n    \"packages\": [\n        {\n            \"name\": \"cache/adapter-common\",\n            \"version\": \"1.3.0\",\n            \"v"
  },
  {
    "path": "vendor/composer/installed.php",
    "chars": 12410,
    "preview": "<?php return array(\n    'root' => array(\n        'pretty_version' => 'dev-master',\n        'version' => 'dev-master',\n  "
  },
  {
    "path": "vendor/guzzlehttp/guzzle/CHANGELOG.md",
    "chars": 85186,
    "preview": "# Change Log\n\nPlease refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version.\n\n## 7.4.1 - 2021-12-06\n\n"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/LICENSE",
    "chars": 1457,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2011 Michael Dowling <mtdowling@gmail.com>\nCopyright (c) 2012 Jeremy Lindblom <jere"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/README.md",
    "chars": 4945,
    "preview": "![Guzzle](.github/logo.png?raw=true)\n\n# Guzzle, PHP HTTP client\n\n[![Latest Version](https://img.shields.io/github/releas"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/UPGRADING.md",
    "chars": 53616,
    "preview": "Guzzle Upgrade Guide\n====================\n\n6.0 to 7.0\n----------\n\nIn order to take advantage of the new features of PHP,"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/composer.json",
    "chars": 2695,
    "preview": "{\n    \"name\": \"guzzlehttp/guzzle\",\n    \"description\": \"Guzzle is a PHP HTTP client library\",\n    \"keywords\": [\n        \""
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/BodySummarizer.php",
    "chars": 631,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\MessageInterface;\n\nfinal class BodySummarizer implements BodySummariz"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php",
    "chars": 233,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\MessageInterface;\n\ninterface BodySummarizerInterface\n{\n    /**\n     *"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Client.php",
    "chars": 18370,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Cookie\\CookieJar;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse GuzzleHttp\\"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/ClientInterface.php",
    "chars": 2901,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/ClientTrait.php",
    "chars": 9006,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php",
    "chars": 9382,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Cookie;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php",
    "chars": 2827,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Cookie;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php",
    "chars": 2758,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Cookie;\n\nuse GuzzleHttp\\Utils;\n\n/**\n * Persists non-session cookies using a JSON formatted f"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php",
    "chars": 2003,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Cookie;\n\n/**\n * Persists cookies in the client session\n */\nclass SessionCookieJar extends Co"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php",
    "chars": 13183,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Cookie;\n\n/**\n * Set-Cookie object\n */\nclass SetCookie\n{\n    /**\n     * @var array\n     */\n  "
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php",
    "chars": 981,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Exception/ClientException.php",
    "chars": 163,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\n/**\n * Exception when a client error is encountered (4xx codes)\n */\nclass Client"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php",
    "chars": 1408,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Client\\NetworkExceptionInterface;\nuse Psr\\Http\\Message\\RequestInter"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php",
    "chars": 150,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Client\\ClientExceptionInterface;\n\ninterface GuzzleException extends"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php",
    "chars": 142,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nfinal class InvalidArgumentException extends \\InvalidArgumentException implement"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Exception/RequestException.php",
    "chars": 4852,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nuse GuzzleHttp\\BodySummarizer;\nuse GuzzleHttp\\BodySummarizerInterface;\nuse Psr\\H"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Exception/ServerException.php",
    "chars": 163,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\n/**\n * Exception when a server error is encountered (5xx codes)\n */\nclass Server"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php",
    "chars": 101,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nclass TooManyRedirectsException extends RequestException\n{\n}\n"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Exception/TransferException.php",
    "chars": 121,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nclass TransferException extends \\RuntimeException implements GuzzleException\n{\n}"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php",
    "chars": 22691,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\ConnectException;\nuse GuzzleHttp\\Exception\\RequestExcepti"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php",
    "chars": 657,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse Psr\\Http\\Message\\RequestInterface;\n\ninterface CurlFactoryInterface\n{\n    /**\n "
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php",
    "chars": 1330,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php",
    "chars": 7938,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\Promise;\nuse GuzzleHttp\\Promis"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php",
    "chars": 2902,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse GuzzleHttp\\Utils;\nuse Psr\\Http\\Message\\RequestIn"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php",
    "chars": 1056,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Utils;\n\n/**\n * @internal\n */\nfinal class HeaderProcessor\n{\n    /**\n"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php",
    "chars": 6414,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\HandlerStack;\nuse Guzzle"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Handler/Proxy.php",
    "chars": 2286,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\RequestOptions;\nuse Psr\\Ht"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php",
    "chars": 20351,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\ConnectException;\nuse GuzzleHttp\\Exception\\RequestExcepti"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/HandlerStack.php",
    "chars": 8724,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Ht"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/MessageFormatter.php",
    "chars": 7818,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php",
    "chars": 561,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\ninterface "
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Middleware.php",
    "chars": 11158,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Cookie\\CookieJarInterface;\nuse GuzzleHttp\\Exception\\RequestException;\nuse G"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Pool.php",
    "chars": 4716,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\EachPromise;\nuse GuzzleHttp\\Promise\\Pr"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php",
    "chars": 3148,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Pr"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php",
    "chars": 7682,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\BadResponseException;\nuse GuzzleHttp\\Exception\\TooManyRedirectsEx"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/RequestOptions.php",
    "chars": 10568,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\n/**\n * This class contains a list of built-in Guzzle request options.\n *\n * More documenta"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/RetryMiddleware.php",
    "chars": 3604,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/TransferStats.php",
    "chars": 3180,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Htt"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/Utils.php",
    "chars": 13011,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\InvalidArgumentException;\nuse GuzzleHttp\\Handler\\CurlHandler;\nuse"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/functions.php",
    "chars": 5690,
    "preview": "<?php\n\nnamespace GuzzleHttp;\n\n/**\n * Debug function used to describe the provided value type and class.\n *\n * @param mix"
  },
  {
    "path": "vendor/guzzlehttp/guzzle/src/functions_include.php",
    "chars": 162,
    "preview": "<?php\n\n// Don't redefine the functions if included multiple times.\nif (!\\function_exists('GuzzleHttp\\describe_type')) {\n"
  },
  {
    "path": "vendor/guzzlehttp/promises/CHANGELOG.md",
    "chars": 1843,
    "preview": "# CHANGELOG\n\n## 1.5.1 - 2021-10-22\n\n### Fixed\n\n- Revert \"Call handler when waiting on fulfilled/rejected Promise\"\n- Fix "
  },
  {
    "path": "vendor/guzzlehttp/promises/LICENSE",
    "chars": 1284,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Michael Dowling <mtdowling@gmail.com>\nCopyright (c) 2015 Graham Campbell <hell"
  },
  {
    "path": "vendor/guzzlehttp/promises/Makefile",
    "chars": 189,
    "preview": "all: clean test\n\ntest:\n\tvendor/bin/phpunit\n\ncoverage:\n\tvendor/bin/phpunit --coverage-html=artifacts/coverage\n\nview-cover"
  },
  {
    "path": "vendor/guzzlehttp/promises/README.md",
    "chars": 17404,
    "preview": "# Guzzle Promises\n\n[Promises/A+](https://promisesaplus.com/) implementation that handles promise\nchaining and resolution"
  },
  {
    "path": "vendor/guzzlehttp/promises/composer.json",
    "chars": 1499,
    "preview": "{\n    \"name\": \"guzzlehttp/promises\",\n    \"description\": \"Guzzle promises library\",\n    \"keywords\": [\"promise\"],\n    \"lic"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/AggregateException.php",
    "chars": 380,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Exception thrown when too many errors occur in the some() or any() methods."
  },
  {
    "path": "vendor/guzzlehttp/promises/src/CancellationException.php",
    "chars": 183,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Exception that is set as the reason for a promise that has been cancelled.\n"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/Coroutine.php",
    "chars": 4346,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\nuse Exception;\nuse Generator;\nuse Throwable;\n\n/**\n * Creates a promise that is res"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/Create.php",
    "chars": 2112,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\nfinal class Create\n{\n    /**\n     * Creates a promise for a value if the value is "
  },
  {
    "path": "vendor/guzzlehttp/promises/src/Each.php",
    "chars": 2887,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\nfinal class Each\n{\n    /**\n     * Given an iterator that yields promises or values"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/EachPromise.php",
    "chars": 8017,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Represents a promise that iterates over many promises and invokes\n * side-e"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/FulfilledPromise.php",
    "chars": 1991,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise that has been fulfilled.\n *\n * Thenning off of this promise will "
  },
  {
    "path": "vendor/guzzlehttp/promises/src/Is.php",
    "chars": 999,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\nfinal class Is\n{\n    /**\n     * Returns true if a promise is pending.\n     *\n     "
  },
  {
    "path": "vendor/guzzlehttp/promises/src/Promise.php",
    "chars": 8944,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Promises/A+ implementation that avoids recursion when possible.\n *\n * @link"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/PromiseInterface.php",
    "chars": 2850,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise represents the eventual result of an asynchronous operation.\n *\n "
  },
  {
    "path": "vendor/guzzlehttp/promises/src/PromisorInterface.php",
    "chars": 244,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Interface used with classes that return a promise.\n */\ninterface PromisorIn"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/RejectedPromise.php",
    "chars": 2284,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise that has been rejected.\n *\n * Thenning off of this promise will i"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/RejectionException.php",
    "chars": 1218,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A special exception that is thrown when waiting on a rejected promise.\n *\n "
  },
  {
    "path": "vendor/guzzlehttp/promises/src/TaskQueue.php",
    "chars": 1940,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A task queue that executes tasks in a FIFO order.\n *\n * This task queue cla"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/TaskQueueInterface.php",
    "chars": 433,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\ninterface TaskQueueInterface\n{\n    /**\n     * Returns true if the queue is empty.\n"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/Utils.php",
    "chars": 8704,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\nfinal class Utils\n{\n    /**\n     * Get the global task queue used for promise reso"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/functions.php",
    "chars": 10128,
    "preview": "<?php\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Get the global task queue used for promise resolution.\n *\n * This task queu"
  },
  {
    "path": "vendor/guzzlehttp/promises/src/functions_include.php",
    "chars": 167,
    "preview": "<?php\n\n// Don't redefine the functions if included multiple times.\nif (!function_exists('GuzzleHttp\\Promise\\promise_for'"
  },
  {
    "path": "vendor/guzzlehttp/psr7/CHANGELOG.md",
    "chars": 8784,
    "preview": "# Change Log\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Chang"
  },
  {
    "path": "vendor/guzzlehttp/psr7/LICENSE",
    "chars": 1399,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Michael Dowling <mtdowling@gmail.com>\nCopyright (c) 2015 Márk Sági-Kazár <mark"
  },
  {
    "path": "vendor/guzzlehttp/psr7/README.md",
    "chars": 27663,
    "preview": "# PSR-7 Message Implementation\n\nThis repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/)\nmessage imple"
  },
  {
    "path": "vendor/guzzlehttp/psr7/composer.json",
    "chars": 2408,
    "preview": "{\n    \"name\": \"guzzlehttp/psr7\",\n    \"description\": \"PSR-7 message implementation that also provides common utility meth"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/AppendStream.php",
    "chars": 5977,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Reads from mu"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/BufferStream.php",
    "chars": 3244,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Provides a bu"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/CachingStream.php",
    "chars": 4526,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decora"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/DroppingStream.php",
    "chars": 1142,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decora"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php",
    "chars": 245,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7\\Exception;\n\nuse InvalidArgumentException;\n\n/**\n * Exception t"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/FnStream.php",
    "chars": 4480,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Compose strea"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/Header.php",
    "chars": 2084,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nfinal class Header\n{\n    /**\n     * Parse an array of heade"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/HttpFactory.php",
    "chars": 3096,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\RequestFactoryInterface;\nuse Psr\\Http\\"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/InflateStream.php",
    "chars": 1336,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Uses PHP's zl"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/LazyOpenStream.php",
    "chars": 899,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Lazily reads "
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/LimitStream.php",
    "chars": 4243,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Decorator use"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/Message.php",
    "chars": 8202,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/MessageTrait.php",
    "chars": 6618,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/MimeType.php",
    "chars": 4305,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nfinal class MimeType\n{\n    private const MIME_TYPES = [\n   "
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/MultipartStream.php",
    "chars": 4782,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream that w"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/NoSeekStream.php",
    "chars": 470,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decora"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/PumpStream.php",
    "chars": 4603,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Provides a re"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/Query.php",
    "chars": 3640,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nfinal class Query\n{\n    /**\n     * Parse a query string int"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/Request.php",
    "chars": 3899,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\RequestI"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/Response.php",
    "chars": 4905,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Messag"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/Rfc7230.php",
    "chars": 665,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\n/**\n * @internal\n */\nfinal class Rfc7230\n{\n    /**\n     * H"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/ServerRequest.php",
    "chars": 9589,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\ServerRe"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/Stream.php",
    "chars": 7287,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * PHP stream im"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php",
    "chars": 3360,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decora"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/StreamWrapper.php",
    "chars": 4109,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Converts Guzz"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/UploadedFile.php",
    "chars": 4859,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\StreamIn"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/Uri.php",
    "chars": 21842,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse GuzzleHttp\\Psr7\\Exception\\MalformedUriException;\nuse Ps"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/UriNormalizer.php",
    "chars": 8397,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Provides methods"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/UriResolver.php",
    "chars": 8558,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Resolves a URI r"
  },
  {
    "path": "vendor/guzzlehttp/psr7/src/Utils.php",
    "chars": 14248,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message"
  },
  {
    "path": "vendor/guzzlehttp/psr7/vendor-bin/php-cs-fixer/composer.json",
    "chars": 164,
    "preview": "{\n    \"require\": {\n        \"php\": \"^7.2.5 || ^8.0\",\n        \"friendsofphp/php-cs-fixer\": \"3.2.1\"\n    },\n    \"config\": {\n"
  },
  {
    "path": "vendor/guzzlehttp/psr7/vendor-bin/phpstan/composer.json",
    "chars": 211,
    "preview": "{\n    \"require\": {\n        \"php\": \"^7.2.5 || ^8.0\",\n        \"phpstan/phpstan\": \"0.12.81\",\n        \"phpstan/phpstan-depre"
  },
  {
    "path": "vendor/guzzlehttp/psr7/vendor-bin/psalm/composer.json",
    "chars": 149,
    "preview": "{\n    \"require\": {\n        \"php\": \"^7.2.5 || ^8.0\",\n        \"psalm/phar\": \"4.6.2\"\n    },\n    \"config\": {\n        \"prefer"
  },
  {
    "path": "vendor/jaeger/phpquery-single/README.md",
    "chars": 867,
    "preview": "# phpQuery-single\nphpQuery onefile composer.Continuous maintenance,Welcome PR.\n\n`QueryList` base on phpQuery: https://gi"
  },
  {
    "path": "vendor/jaeger/phpquery-single/composer.json",
    "chars": 648,
    "preview": "{\n    \"name\": \"jaeger/phpquery-single\",\n    \"description\": \"phpQuery单文件版本,是Querylist的依赖(http://querylist.cc/),phpQuery项目"
  },
  {
    "path": "vendor/jaeger/phpquery-single/phpQuery.php",
    "chars": 168403,
    "preview": "<?php\n/**\n * phpQuery is a server-side, chainable, CSS3 selector driven\n * Document Object Model (DOM) API based on jQue"
  },
  {
    "path": "vendor/league/flysystem/CODE_OF_CONDUCT.md",
    "chars": 3362,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "vendor/league/flysystem/LICENSE",
    "chars": 1063,
    "preview": "Copyright (c) 2013-2019 Frank de Jonge\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof "
  },
  {
    "path": "vendor/league/flysystem/SECURITY.md",
    "chars": 428,
    "preview": "# Security Policy\n\n## Supported Versions\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 1.0.x   | "
  },
  {
    "path": "vendor/league/flysystem/composer.json",
    "chars": 2375,
    "preview": "{\n    \"name\": \"league/flysystem\",\n    \"type\": \"library\",\n    \"description\": \"Filesystem abstraction: Many filesystems, o"
  },
  {
    "path": "vendor/league/flysystem/deprecations.md",
    "chars": 724,
    "preview": "# Deprecations\n\nThis document lists all the planned deprecations.\n\n## Handlers will be removed in 2.0\n\nThe `Handler` typ"
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/AbstractAdapter.php",
    "chars": 1368,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter;\n\nuse League\\Flysystem\\AdapterInterface;\n\nabstract class AbstractAdapter imple"
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php",
    "chars": 15436,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter;\n\nuse DateTime;\nuse League\\Flysystem\\AdapterInterface;\nuse League\\Flysystem\\Co"
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php",
    "chars": 320,
    "preview": "<?php\n\n\nnamespace League\\Flysystem\\Adapter;\n\n/**\n * Adapters that implement this interface let the Filesystem know that "
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/Ftp.php",
    "chars": 14029,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter;\n\nuse League\\Flysystem\\Adapter\\Polyfill\\StreamedCopyTrait;\nuse League\\Flysyste"
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/Ftpd.php",
    "chars": 1157,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter;\n\nclass Ftpd extends Ftp\n{\n    /**\n     * @inheritdoc\n     */\n    public funct"
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/Local.php",
    "chars": 12952,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter;\n\nuse DirectoryIterator;\nuse FilesystemIterator;\nuse finfo as Finfo;\nuse Leagu"
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/NullAdapter.php",
    "chars": 2331,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter;\n\nuse League\\Flysystem\\Adapter\\Polyfill\\StreamedCopyTrait;\nuse League\\Flysyste"
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php",
    "chars": 750,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter\\Polyfill;\n\nuse LogicException;\n\ntrait NotSupportingVisibilityTrait\n{\n    /**\n "
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php",
    "chars": 1061,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter\\Polyfill;\n\nuse League\\Flysystem\\Config;\n\ntrait StreamedCopyTrait\n{\n    /**\n   "
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php",
    "chars": 893,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter\\Polyfill;\n\n/**\n * A helper for adapters that only handle strings to provide re"
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php",
    "chars": 137,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter\\Polyfill;\n\ntrait StreamedTrait\n{\n    use StreamedReadingTrait;\n    use Streame"
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php",
    "chars": 1569,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter\\Polyfill;\n\nuse League\\Flysystem\\Config;\nuse League\\Flysystem\\Util;\n\ntrait Stre"
  },
  {
    "path": "vendor/league/flysystem/src/Adapter/SynologyFtp.php",
    "chars": 126,
    "preview": "<?php\n\nnamespace League\\Flysystem\\Adapter;\n\nclass SynologyFtp extends Ftpd\n{\n    // This class merely exists because of "
  },
  {
    "path": "vendor/league/flysystem/src/AdapterInterface.php",
    "chars": 2592,
    "preview": "<?php\n\nnamespace League\\Flysystem;\n\ninterface AdapterInterface extends ReadInterface\n{\n    /**\n     * @const  VISIBILITY"
  },
  {
    "path": "vendor/league/flysystem/src/Config.php",
    "chars": 1985,
    "preview": "<?php\n\nnamespace League\\Flysystem;\n\nclass Config\n{\n    /**\n     * @var array\n     */\n    protected $settings = [];\n\n    "
  },
  {
    "path": "vendor/league/flysystem/src/ConfigAwareTrait.php",
    "chars": 851,
    "preview": "<?php\n\nnamespace League\\Flysystem;\n\n/**\n * @internal\n */\ntrait ConfigAwareTrait\n{\n    /**\n     * @var Config\n     */\n   "
  },
  {
    "path": "vendor/league/flysystem/src/ConnectionErrorException.php",
    "chars": 146,
    "preview": "<?php\n\nnamespace League\\Flysystem;\n\nuse ErrorException;\n\nclass ConnectionErrorException extends ErrorException implement"
  },
  {
    "path": "vendor/league/flysystem/src/ConnectionRuntimeException.php",
    "chars": 152,
    "preview": "<?php\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\n\nclass ConnectionRuntimeException extends RuntimeException imp"
  },
  {
    "path": "vendor/league/flysystem/src/CorruptedPathDetected.php",
    "chars": 356,
    "preview": "<?php\n\nnamespace League\\Flysystem;\n\nuse LogicException;\n\nclass CorruptedPathDetected extends LogicException implements F"
  },
  {
    "path": "vendor/league/flysystem/src/Directory.php",
    "chars": 554,
    "preview": "<?php\n\nnamespace League\\Flysystem;\n\n/**\n * @deprecated\n */\nclass Directory extends Handler\n{\n    /**\n     * Delete the d"
  },
  {
    "path": "vendor/league/flysystem/src/Exception.php",
    "chars": 113,
    "preview": "<?php\n\nnamespace League\\Flysystem;\n\nclass Exception extends \\Exception implements FilesystemException\n{\n    //\n}\n"
  }
]

// ... and 246 more files (download for full content)

About this extraction

This page contains the full source code of the KitePig/FatRat-Collect GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 446 files (2.6 MB), approximately 718.1k tokens, and a symbol index with 3494 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!