From 1929b84685d5bfe18d40c191f855cfa4926eda6c Mon Sep 17 00:00:00 2001 From: zino Date: Sun, 23 Oct 2022 01:39:27 +0200 Subject: [PATCH] init --- code_depricated/instafeed.1.pl | 170 ++ code_depricated/instafeed.pl | 253 ++ composer.json | 5 + composer.lock | 1294 ++++++++ foo | 0 instafeed.pl | 261 ++ instafeed/code_depricated/instafeed.1.pl | 170 ++ instafeed/code_depricated/instafeed.pl | 253 ++ instafeed/composer.json | 5 + instafeed/composer.lock | 1294 ++++++++ instafeed/foo | 0 instafeed/instafeed.pl | 261 ++ instafeed/log/dreamyourmansion.log | 23 + instafeed/log/vstbestprices.log | 23 + instafeed/src/db/db_dreamyourmansion.dat | 1 + instafeed/src/db/db_vstbestprices.dat | 1 + .../images/dreamyourmansion/7VPFyhB_j8Y.jpg | Bin 0 -> 271284 bytes .../images/dreamyourmansion/RKdLlTyjm5g.jpg | Bin 0 -> 142895 bytes .../images/dreamyourmansion/UV81E0oXXWQ.jpg | Bin 0 -> 267946 bytes instafeed/vendor/autoload.php | 7 + instafeed/vendor/bin/lazydoctor | 738 +++++ .../binsoul/net-mqtt-client-react/LICENSE.md | 21 + .../binsoul/net-mqtt-client-react/README.md | 145 + .../net-mqtt-client-react/composer.json | 51 + .../net-mqtt-client-react/src/ReactFlow.php | 112 + .../src/ReactMqttClient.php | 701 +++++ instafeed/vendor/binsoul/net-mqtt/LICENSE.md | 21 + instafeed/vendor/binsoul/net-mqtt/README.md | 36 + .../vendor/binsoul/net-mqtt/composer.json | 47 + .../binsoul/net-mqtt/src/Connection.php | 90 + .../net-mqtt/src/DefaultConnection.php | 129 + .../src/DefaultIdentifierGenerator.php | 38 + .../binsoul/net-mqtt/src/DefaultMessage.php | 119 + .../net-mqtt/src/DefaultSubscription.php | 52 + .../src/Exception/EndOfStreamException.php | 10 + .../Exception/MalformedPacketException.php | 10 + .../Exception/UnknownPacketTypeException.php | 10 + .../vendor/binsoul/net-mqtt/src/Flow.php | 71 + .../net-mqtt/src/Flow/AbstractFlow.php | 74 + .../net-mqtt/src/Flow/IncomingPingFlow.php | 23 + .../net-mqtt/src/Flow/IncomingPublishFlow.php | 80 + .../net-mqtt/src/Flow/OutgoingConnectFlow.php | 70 + .../src/Flow/OutgoingDisconnectFlow.php | 37 + .../net-mqtt/src/Flow/OutgoingPingFlow.php | 32 + .../net-mqtt/src/Flow/OutgoingPublishFlow.php | 102 + .../src/Flow/OutgoingSubscribeFlow.php | 82 + .../src/Flow/OutgoingUnsubscribeFlow.php | 61 + .../net-mqtt/src/IdentifierGenerator.php | 23 + .../vendor/binsoul/net-mqtt/src/Message.php | 99 + .../vendor/binsoul/net-mqtt/src/Packet.php | 52 + .../net-mqtt/src/Packet/BasePacket.php | 279 ++ .../src/Packet/ConnectRequestPacket.php | 405 +++ .../src/Packet/ConnectResponsePacket.php | 111 + .../src/Packet/DisconnectRequestPacket.php | 22 + .../src/Packet/IdentifiablePacket.php | 62 + .../src/Packet/IdentifierOnlyPacket.php | 42 + .../net-mqtt/src/Packet/PingRequestPacket.php | 22 + .../src/Packet/PingResponsePacket.php | 22 + .../net-mqtt/src/Packet/PublishAckPacket.php | 13 + .../src/Packet/PublishCompletePacket.php | 13 + .../src/Packet/PublishReceivedPacket.php | 13 + .../src/Packet/PublishReleasePacket.php | 19 + .../src/Packet/PublishRequestPacket.php | 176 ++ .../src/Packet/StrictConnectRequestPacket.php | 66 + .../src/Packet/SubscribeRequestPacket.php | 101 + .../src/Packet/SubscribeResponsePacket.php | 132 + .../src/Packet/UnsubscribeRequestPacket.php | 68 + .../src/Packet/UnsubscribeResponsePacket.php | 13 + .../binsoul/net-mqtt/src/PacketFactory.php | 67 + .../binsoul/net-mqtt/src/PacketStream.php | 216 ++ .../binsoul/net-mqtt/src/StreamParser.php | 90 + .../binsoul/net-mqtt/src/Subscription.php | 41 + .../binsoul/net-mqtt/src/TopicMatcher.php | 53 + .../vendor/clue/http-proxy-react/.gitignore | 2 + .../vendor/clue/http-proxy-react/.travis.yml | 27 + .../vendor/clue/http-proxy-react/CHANGELOG.md | 103 + .../vendor/clue/http-proxy-react/LICENSE | 21 + .../vendor/clue/http-proxy-react/README.md | 422 +++ .../clue/http-proxy-react/composer.json | 30 + .../examples/01-proxy-https.php | 30 + .../examples/02-optional-proxy-https.php | 37 + .../examples/11-proxy-smtp.php | 32 + .../examples/12-proxy-smtps.php | 35 + .../clue/http-proxy-react/phpunit.xml.dist | 14 + .../http-proxy-react/src/ProxyConnector.php | 213 ++ .../tests/AbstractTestCase.php | 80 + .../http-proxy-react/tests/FunctionalTest.php | 75 + .../tests/ProxyConnectorTest.php | 333 ++ instafeed/vendor/clue/socks-react/.gitignore | 2 + instafeed/vendor/clue/socks-react/.travis.yml | 27 + .../vendor/clue/socks-react/CHANGELOG.md | 338 +++ instafeed/vendor/clue/socks-react/LICENSE | 21 + instafeed/vendor/clue/socks-react/README.md | 1017 +++++++ .../vendor/clue/socks-react/composer.json | 28 + .../clue/socks-react/examples/01-http.php | 30 + .../clue/socks-react/examples/02-https.php | 30 + .../examples/03-proxy-chaining.php | 46 + .../socks-react/examples/04-local-dns.php | 31 + .../clue/socks-react/examples/11-server.php | 19 + .../examples/12-server-with-password.php | 24 + .../examples/13-server-blacklist.php | 40 + .../examples/21-server-proxy-chaining.php | 42 + ...server-proxy-chaining-from-random-pool.php | 46 + .../socks-react/examples/31-server-secure.php | 21 + .../socks-react/examples/32-http-secure.php | 33 + .../clue/socks-react/examples/localhost.pem | 49 + .../vendor/clue/socks-react/phpunit.xml.dist | 14 + .../vendor/clue/socks-react/src/Client.php | 382 +++ .../vendor/clue/socks-react/src/Server.php | 422 +++ .../clue/socks-react/src/StreamReader.php | 149 + .../clue/socks-react/tests/ClientTest.php | 403 +++ .../clue/socks-react/tests/FunctionalTest.php | 437 +++ .../clue/socks-react/tests/ServerTest.php | 428 +++ .../socks-react/tests/StreamReaderTest.php | 82 + .../clue/socks-react/tests/bootstrap.php | 103 + instafeed/vendor/composer/ClassLoader.php | 445 +++ instafeed/vendor/composer/LICENSE | 56 + .../vendor/composer/autoload_classmap.php | 9 + instafeed/vendor/composer/autoload_files.php | 16 + .../vendor/composer/autoload_namespaces.php | 10 + instafeed/vendor/composer/autoload_psr4.php | 32 + instafeed/vendor/composer/autoload_real.php | 70 + instafeed/vendor/composer/autoload_static.php | 189 ++ instafeed/vendor/composer/installed.json | 1328 ++++++++ .../vendor/corneltek/getoptionkit/.gitignore | 3 + .../vendor/corneltek/getoptionkit/.travis.yml | 29 + .../corneltek/getoptionkit/CHANGELOG.md | 56 + .../corneltek/getoptionkit/CONTRIBUTORS.txt | 11 + .../vendor/corneltek/getoptionkit/LICENSE | 19 + .../vendor/corneltek/getoptionkit/README.md | 370 +++ .../vendor/corneltek/getoptionkit/build.xml | 185 ++ .../corneltek/getoptionkit/composer.json | 16 + .../corneltek/getoptionkit/composer.lock | 19 + .../corneltek/getoptionkit/examples/demo.php | 76 + .../vendor/corneltek/getoptionkit/package.ini | 15 + .../vendor/corneltek/getoptionkit/phpdox.xml | 16 + .../corneltek/getoptionkit/phprelease.ini | 2 + .../corneltek/getoptionkit/phpunit-ci.xml | 29 + .../corneltek/getoptionkit/phpunit.xml.dist | 29 + .../corneltek/getoptionkit/src/Argument.php | 119 + .../src/ContinuousOptionParser.php | 201 ++ .../src/Exception/InvalidOptionException.php | 18 + .../Exception/InvalidOptionValueException.php | 18 + .../src/Exception/NonNumericException.php | 18 + .../src/Exception/OptionConflictException.php | 18 + .../src/Exception/RequireValueException.php | 18 + .../corneltek/getoptionkit/src/Option.php | 557 ++++ .../getoptionkit/src/OptionCollection.php | 207 ++ .../getoptionkit/src/OptionParser.php | 193 ++ .../OptionPrinter/ConsoleOptionPrinter.php | 56 + .../src/OptionPrinter/OptionPrinter.php | 12 + .../getoptionkit/src/OptionResult.php | 157 + .../getoptionkit/src/ValueType/BaseType.php | 34 + .../getoptionkit/src/ValueType/BoolType.php | 10 + .../src/ValueType/BooleanType.php | 30 + .../src/ValueType/DateTimeType.php | 22 + .../getoptionkit/src/ValueType/DateType.php | 20 + .../getoptionkit/src/ValueType/DirType.php | 18 + .../getoptionkit/src/ValueType/EmailType.php | 16 + .../getoptionkit/src/ValueType/FileType.php | 18 + .../getoptionkit/src/ValueType/IpType.php | 16 + .../getoptionkit/src/ValueType/Ipv4Type.php | 16 + .../getoptionkit/src/ValueType/Ipv6Type.php | 16 + .../getoptionkit/src/ValueType/NumberType.php | 16 + .../getoptionkit/src/ValueType/PathType.php | 18 + .../getoptionkit/src/ValueType/RegexType.php | 24 + .../getoptionkit/src/ValueType/StringType.php | 16 + .../getoptionkit/src/ValueType/UrlType.php | 16 + .../getoptionkit/tests/ArgumentTest.php | 56 + .../tests/ContinuousOptionParserTest.php | 335 ++ .../tests/OptionCollectionTest.php | 46 + .../getoptionkit/tests/OptionParserTest.php | 477 +++ .../ConsoleOptionPrinterTest.php | 32 + .../getoptionkit/tests/OptionResultTest.php | 32 + .../getoptionkit/tests/OptionTest.php | 227 ++ .../getoptionkit/tests/RegexValueTypeTest.php | 26 + .../getoptionkit/tests/ValueTypeTest.php | 200 ++ .../vendor/evenement/evenement/.gitignore | 2 + .../vendor/evenement/evenement/.travis.yml | 24 + .../vendor/evenement/evenement/CHANGELOG.md | 35 + instafeed/vendor/evenement/evenement/LICENSE | 19 + .../vendor/evenement/evenement/README.md | 83 + .../vendor/evenement/evenement/composer.json | 29 + .../evenement/evenement/doc/00-intro.md | 28 + .../vendor/evenement/evenement/doc/01-api.md | 91 + .../evenement/doc/02-plugin-system.md | 155 + .../examples/benchmark-emit-no-arguments.php | 28 + .../examples/benchmark-emit-once.php | 30 + .../examples/benchmark-emit-one-argument.php | 28 + .../evenement/examples/benchmark-emit.php | 28 + .../benchmark-remove-listener-once.php | 39 + .../evenement/evenement/phpunit.xml.dist | 24 + .../evenement/src/Evenement/EventEmitter.php | 17 + .../src/Evenement/EventEmitterInterface.php | 22 + .../src/Evenement/EventEmitterTrait.php | 135 + .../Evenement/Tests/EventEmitterTest.php | 438 +++ .../tests/Evenement/Tests/Listener.php | 51 + .../tests/Evenement/Tests/functions.php | 17 + instafeed/vendor/guzzlehttp/guzzle/.php_cs | 21 + .../vendor/guzzlehttp/guzzle/CHANGELOG.md | 1304 ++++++++ instafeed/vendor/guzzlehttp/guzzle/Dockerfile | 18 + instafeed/vendor/guzzlehttp/guzzle/LICENSE | 19 + instafeed/vendor/guzzlehttp/guzzle/README.md | 90 + .../vendor/guzzlehttp/guzzle/UPGRADING.md | 1203 ++++++++ .../vendor/guzzlehttp/guzzle/composer.json | 58 + .../guzzlehttp/guzzle/phpstan.neon.dist | 9 + .../vendor/guzzlehttp/guzzle/src/Client.php | 422 +++ .../guzzlehttp/guzzle/src/ClientInterface.php | 84 + .../guzzle/src/Cookie/CookieJar.php | 314 ++ .../guzzle/src/Cookie/CookieJarInterface.php | 84 + .../guzzle/src/Cookie/FileCookieJar.php | 91 + .../guzzle/src/Cookie/SessionCookieJar.php | 72 + .../guzzle/src/Cookie/SetCookie.php | 403 +++ .../src/Exception/BadResponseException.php | 27 + .../guzzle/src/Exception/ClientException.php | 9 + .../guzzle/src/Exception/ConnectException.php | 37 + .../guzzle/src/Exception/GuzzleException.php | 23 + .../Exception/InvalidArgumentException.php | 7 + .../guzzle/src/Exception/RequestException.php | 217 ++ .../guzzle/src/Exception/SeekException.php | 27 + .../guzzle/src/Exception/ServerException.php | 9 + .../Exception/TooManyRedirectsException.php | 6 + .../src/Exception/TransferException.php | 6 + .../guzzle/src/Handler/CurlFactory.php | 580 ++++ .../src/Handler/CurlFactoryInterface.php | 27 + .../guzzle/src/Handler/CurlHandler.php | 45 + .../guzzle/src/Handler/CurlMultiHandler.php | 205 ++ .../guzzle/src/Handler/EasyHandle.php | 92 + .../guzzle/src/Handler/MockHandler.php | 190 ++ .../guzzlehttp/guzzle/src/Handler/Proxy.php | 55 + .../guzzle/src/Handler/StreamHandler.php | 544 ++++ .../guzzlehttp/guzzle/src/HandlerStack.php | 273 ++ .../guzzle/src/MessageFormatter.php | 180 ++ .../guzzlehttp/guzzle/src/Middleware.php | 254 ++ .../vendor/guzzlehttp/guzzle/src/Pool.php | 123 + .../guzzle/src/PrepareBodyMiddleware.php | 106 + .../guzzle/src/RedirectMiddleware.php | 237 ++ .../guzzlehttp/guzzle/src/RequestOptions.php | 255 ++ .../guzzlehttp/guzzle/src/RetryMiddleware.php | 115 + .../guzzlehttp/guzzle/src/TransferStats.php | 126 + .../guzzlehttp/guzzle/src/UriTemplate.php | 237 ++ .../guzzlehttp/guzzle/src/functions.php | 346 +++ .../guzzle/src/functions_include.php | 6 + .../vendor/guzzlehttp/promises/CHANGELOG.md | 65 + instafeed/vendor/guzzlehttp/promises/LICENSE | 19 + instafeed/vendor/guzzlehttp/promises/Makefile | 13 + .../vendor/guzzlehttp/promises/README.md | 504 +++ .../vendor/guzzlehttp/promises/composer.json | 34 + .../promises/src/AggregateException.php | 16 + .../promises/src/CancellationException.php | 9 + .../guzzlehttp/promises/src/Coroutine.php | 151 + .../guzzlehttp/promises/src/EachPromise.php | 229 ++ .../promises/src/FulfilledPromise.php | 82 + .../guzzlehttp/promises/src/Promise.php | 280 ++ .../promises/src/PromiseInterface.php | 93 + .../promises/src/PromisorInterface.php | 15 + .../promises/src/RejectedPromise.php | 87 + .../promises/src/RejectionException.php | 47 + .../guzzlehttp/promises/src/TaskQueue.php | 66 + .../promises/src/TaskQueueInterface.php | 25 + .../guzzlehttp/promises/src/functions.php | 457 +++ .../promises/src/functions_include.php | 6 + instafeed/vendor/guzzlehttp/psr7/CHANGELOG.md | 246 ++ instafeed/vendor/guzzlehttp/psr7/LICENSE | 19 + instafeed/vendor/guzzlehttp/psr7/README.md | 745 +++++ .../vendor/guzzlehttp/psr7/composer.json | 49 + .../guzzlehttp/psr7/src/AppendStream.php | 241 ++ .../guzzlehttp/psr7/src/BufferStream.php | 137 + .../guzzlehttp/psr7/src/CachingStream.php | 138 + .../guzzlehttp/psr7/src/DroppingStream.php | 42 + .../vendor/guzzlehttp/psr7/src/FnStream.php | 158 + .../guzzlehttp/psr7/src/InflateStream.php | 52 + .../guzzlehttp/psr7/src/LazyOpenStream.php | 39 + .../guzzlehttp/psr7/src/LimitStream.php | 155 + .../guzzlehttp/psr7/src/MessageTrait.php | 213 ++ .../guzzlehttp/psr7/src/MultipartStream.php | 153 + .../guzzlehttp/psr7/src/NoSeekStream.php | 22 + .../vendor/guzzlehttp/psr7/src/PumpStream.php | 165 + .../vendor/guzzlehttp/psr7/src/Request.php | 151 + .../vendor/guzzlehttp/psr7/src/Response.php | 154 + .../vendor/guzzlehttp/psr7/src/Rfc7230.php | 18 + .../guzzlehttp/psr7/src/ServerRequest.php | 376 +++ .../vendor/guzzlehttp/psr7/src/Stream.php | 267 ++ .../psr7/src/StreamDecoratorTrait.php | 149 + .../guzzlehttp/psr7/src/StreamWrapper.php | 161 + .../guzzlehttp/psr7/src/UploadedFile.php | 316 ++ instafeed/vendor/guzzlehttp/psr7/src/Uri.php | 760 +++++ .../guzzlehttp/psr7/src/UriNormalizer.php | 216 ++ .../guzzlehttp/psr7/src/UriResolver.php | 219 ++ .../vendor/guzzlehttp/psr7/src/functions.php | 899 ++++++ .../guzzlehttp/psr7/src/functions_include.php | 6 + .../lazyjsonmapper/.ac-php-conf.json | 14 + .../lazyjsonmapper/lazyjsonmapper/.gitignore | 40 + .../lazyjsonmapper/.php_cs.dist | 54 + .../lazyjsonmapper/.pre-commit.hook | 67 + .../lazyjsonmapper/lazyjsonmapper/LICENSE | 201 ++ .../lazyjsonmapper/lazyjsonmapper/NOTICE | 5 + .../lazyjsonmapper/lazyjsonmapper/README.md | 211 ++ .../lazyjsonmapper/bin/lazydoctor | 738 +++++ .../lazyjsonmapper/composer.json | 48 + .../lazyjsonmapper/devtools/checkStyle.php | 225 ++ .../devtools/funcListData.serialized | 1 + .../devtools/junk/testLazyJsonMapper.php | 1897 ++++++++++++ .../junk/testPropertyDefinitionNamespaces.php | 173 ++ .../devtools/junk/testUserFeatureToggling.php | 205 ++ .../devtools/nonRecursiveArrays.php | 402 +++ .../devtools/prefixSplitAlgorithms.php | 270 ++ .../lazyjsonmapper/examples/basic_example.php | 103 + .../examples/import_example.php | 42 + .../examples/inheritance_example.php | 51 + .../examples/unpredictable_data.php | 705 +++++ .../lazyjsonmapper/phpdoc.dist.xml | 24 + .../lazyjsonmapper/phpunit.xml.dist | 9 + .../BadPropertyDefinitionException.php | 29 + .../src/Exception/BadPropertyMapException.php | 29 + .../CircularPropertyMapException.php | 100 + .../src/Exception/LazyJsonMapperException.php | 29 + .../Exception/LazySerializationException.php | 40 + .../src/Exception/LazyUserException.php | 42 + .../src/Exception/LazyUserOptionException.php | 95 + .../Exception/MagicTranslationException.php | 29 + .../Exception/SpanishInquisitionException.php | 33 + .../src/Export/ClassAnalysis.php | 208 ++ .../src/Export/PropertyDescription.php | 250 ++ .../lazyjsonmapper/src/LazyJsonMapper.php | 2692 +++++++++++++++++ .../src/Magic/FunctionTranslation.php | 314 ++ .../src/Magic/PropertyTranslation.php | 191 ++ .../src/Magic/SpecialOperators.php | 169 ++ .../src/Property/PropertyDefinition.php | 325 ++ .../src/Property/PropertyMapCache.php | 73 + .../src/Property/PropertyMapCompiler.php | 1274 ++++++++ .../src/Property/UndefinedProperty.php | 79 + .../src/Property/ValueConverter.php | 441 +++ .../lazyjsonmapper/src/Utilities.php | 180 ++ .../lazyjsonmapper/tests/bootstrap.php | 18 + .../mgp25/instagram-php/.ac-php-conf.json | 17 + .../instagram-php/.github/ISSUE_TEMPLATE.md | 112 + .../.github/ISSUE_TEMPLATE/bug-report.md | 42 + .../.github/ISSUE_TEMPLATE/feature-request.md | 26 + .../.github/ISSUE_TEMPLATE/question.md | 42 + .../vendor/mgp25/instagram-php/.gitignore | 49 + .../vendor/mgp25/instagram-php/.php_cs.dist | 38 + .../mgp25/instagram-php/.pre-commit.hook | 58 + .../mgp25/instagram-php/CODE_OF_CONDUCT.md | 46 + .../mgp25/instagram-php/CONTRIBUTING.md | 488 +++ .../vendor/mgp25/instagram-php/Dockerfile | 37 + instafeed/vendor/mgp25/instagram-php/LICENSE | 546 ++++ .../mgp25/instagram-php/LICENSE_PREMIUM | 16 + .../vendor/mgp25/instagram-php/README.md | 135 + .../vendor/mgp25/instagram-php/composer.json | 81 + .../mgp25/instagram-php/devtools/README.md | 7 + .../instagram-php/devtools/checkDevices.php | 229 ++ .../devtools/checkExperiments.php | 150 + .../instagram-php/devtools/checkStyle.php | 203 ++ .../devtools/testInstagramPhoto.php | 66 + .../mgp25/instagram-php/examples/README.md | 17 + .../examples/accessingValues.php | 74 + .../examples/assets/instagram.png | Bin 0 -> 7810 bytes .../instagram-php/examples/customSettings.php | 147 + .../examples/exceptionDetailsExample.php | 83 + .../instagram-php/examples/liveBroadcast.php | 137 + .../examples/paginateWithExclusion.php | 57 + .../examples/paginationExample.php | 53 + .../instagram-php/examples/pushReceiver.php | 80 + .../instagram-php/examples/rankTokenUsage.php | 57 + .../instagram-php/examples/realtimeClient.php | 100 + .../instagram-php/examples/realtimeHttp.php | 287 ++ .../examples/sharePhotoToStoryFeed.php | 71 + .../examples/shortcodeConverter.php | 29 + .../instagram-php/examples/twoFactorLogin.php | 31 + .../instagram-php/examples/uploadAlbum.php | 109 + .../instagram-php/examples/uploadPhoto.php | 62 + .../instagram-php/examples/uploadStory.php | 102 + .../examples/uploadStoryCountdown.php | 67 + .../examples/uploadStoryFundraiser.php | 54 + .../examples/uploadStoryPoll.php | 78 + .../examples/uploadStoryQuestion.php | 69 + .../examples/uploadStorySlider.php | 71 + .../instagram-php/examples/uploadVideo.php | 46 + .../extradocs/Push_setPreferences.txt | 90 + .../instagram-php/src/AutoPropertyMapper.php | 22 + .../vendor/mgp25/instagram-php/src/Client.php | 850 ++++++ .../mgp25/instagram-php/src/Constants.php | 103 + .../vendor/mgp25/instagram-php/src/Debug.php | 67 + .../instagram-php/src/Devices/Device.php | 268 ++ .../src/Devices/DeviceInterface.php | 93 + .../instagram-php/src/Devices/GoodDevices.php | 190 ++ .../instagram-php/src/Devices/UserAgent.php | 129 + .../Exception/AccountDisabledException.php | 7 + .../src/Exception/BadRequestException.php | 11 + .../Exception/ChallengeRequiredException.php | 7 + .../Exception/CheckpointRequiredException.php | 7 + .../Exception/ConsentRequiredException.php | 7 + .../src/Exception/EmptyResponseException.php | 10 + .../src/Exception/EndpointException.php | 21 + .../Exception/FeedbackRequiredException.php | 7 + .../ForcedPasswordResetException.php | 7 + .../Exception/IncorrectPasswordException.php | 7 + .../src/Exception/InstagramException.php | 53 + .../src/Exception/InternalException.php | 10 + .../src/Exception/InvalidSmsCodeException.php | 7 + .../src/Exception/InvalidUserException.php | 7 + .../src/Exception/LoginRequiredException.php | 11 + .../src/Exception/NetworkException.php | 63 + .../src/Exception/NotFoundException.php | 11 + .../src/Exception/RequestException.php | 10 + .../RequestHeadersTooLargeException.php | 11 + .../src/Exception/SentryBlockException.php | 7 + .../src/Exception/ServerMessageThrower.php | 235 ++ .../src/Exception/SettingsException.php | 10 + .../src/Exception/ThrottledException.php | 11 + .../src/Exception/UploadFailedException.php | 13 + .../src/ExperimentsInterface.php | 34 + .../mgp25/instagram-php/src/Instagram.php | 1246 ++++++++ .../mgp25/instagram-php/src/InstagramID.php | 249 ++ .../Media/Constraints/AlbumConstraints.php | 10 + .../Media/Constraints/ConstraintsFactory.php | 45 + .../Media/Constraints/DirectConstraints.php | 41 + .../Constraints/DirectStoryConstraints.php | 27 + .../Media/Constraints/StoryConstraints.php | 137 + .../Media/Constraints/TimelineConstraints.php | 115 + .../src/Media/Constraints/TvConstraints.php | 83 + .../src/Media/ConstraintsInterface.php | 65 + .../src/Media/Geometry/Dimensions.php | 98 + .../src/Media/Geometry/Rectangle.php | 179 ++ .../src/Media/InstagramMedia.php | 1456 +++++++++ .../instagram-php/src/Media/MediaDetails.php | 172 ++ .../src/Media/Photo/InstagramPhoto.php | 326 ++ .../src/Media/Photo/PhotoDetails.php | 177 ++ .../instagram-php/src/Media/Video/FFmpeg.php | 244 ++ .../src/Media/Video/InstagramThumbnail.php | 155 + .../src/Media/Video/InstagramVideo.php | 263 ++ .../src/Media/Video/VideoDetails.php | 348 +++ .../src/Middleware/FakeCookies.php | 172 ++ .../src/Middleware/ZeroRating.php | 120 + .../vendor/mgp25/instagram-php/src/Push.php | 286 ++ .../mgp25/instagram-php/src/Push/Fbns.php | 194 ++ .../instagram-php/src/Push/Fbns/Auth.php | 89 + .../instagram-php/src/Push/Notification.php | 316 ++ .../src/Push/Payload/BadgeCount.php | 89 + .../instagram-php/src/React/Connector.php | 223 ++ .../src/React/PersistentInterface.php | 49 + .../src/React/PersistentTrait.php | 79 + .../mgp25/instagram-php/src/Realtime.php | 495 +++ .../Command/Direct/IndicateActivity.php | 35 + .../src/Realtime/Command/Direct/MarkSeen.php | 35 + .../Realtime/Command/Direct/SendHashtag.php | 42 + .../src/Realtime/Command/Direct/SendItem.php | 58 + .../src/Realtime/Command/Direct/SendLike.php | 23 + .../Realtime/Command/Direct/SendLocation.php | 32 + .../src/Realtime/Command/Direct/SendPost.php | 32 + .../Realtime/Command/Direct/SendProfile.php | 32 + .../Realtime/Command/Direct/SendReaction.php | 75 + .../src/Realtime/Command/Direct/SendStory.php | 32 + .../src/Realtime/Command/Direct/SendText.php | 34 + .../src/Realtime/Command/Direct/ShareItem.php | 30 + .../src/Realtime/Command/DirectCommand.php | 191 ++ .../src/Realtime/Command/IrisSubscribe.php | 50 + .../Realtime/Command/UpdateSubscriptions.php | 93 + .../src/Realtime/CommandInterface.php | 20 + .../src/Realtime/Handler/AbstractHandler.php | 37 + .../src/Realtime/Handler/DirectHandler.php | 543 ++++ .../src/Realtime/Handler/HandlerException.php | 7 + .../src/Realtime/Handler/IrisHandler.php | 27 + .../src/Realtime/Handler/LiveHandler.php | 81 + .../src/Realtime/Handler/PresenceHandler.php | 25 + .../Realtime/Handler/RegionHintHandler.php | 22 + .../Realtime/Handler/ZeroProvisionHandler.php | 24 + .../src/Realtime/HandlerInterface.php | 18 + .../instagram-php/src/Realtime/Message.php | 46 + .../mgp25/instagram-php/src/Realtime/Mqtt.php | 803 +++++ .../instagram-php/src/Realtime/Mqtt/Auth.php | 74 + .../src/Realtime/Mqtt/Capabilities.php | 33 + .../src/Realtime/Mqtt/Config.php | 20 + .../src/Realtime/Mqtt/PacketFactory.php | 77 + .../src/Realtime/Mqtt/QosLevel.php | 9 + .../src/Realtime/Mqtt/StreamParser.php | 107 + .../src/Realtime/Mqtt/Topics.php | 57 + .../src/Realtime/Parser/GraphQlParser.php | 82 + .../src/Realtime/Parser/IrisParser.php | 34 + .../src/Realtime/Parser/JsonParser.php | 41 + .../src/Realtime/Parser/RegionHintParser.php | 54 + .../src/Realtime/Parser/SkywalkerParser.php | 82 + .../src/Realtime/ParserInterface.php | 19 + .../src/Realtime/Payload/Action/AckAction.php | 33 + .../src/Realtime/Payload/Event/PatchEvent.php | 44 + .../Realtime/Payload/Event/PatchEventOp.php | 45 + .../src/Realtime/Payload/IrisSubscribeAck.php | 35 + .../src/Realtime/Payload/LiveBroadcast.php | 40 + .../src/Realtime/Payload/RealtimeAction.php | 29 + .../src/Realtime/Payload/RealtimeEvent.php | 27 + .../src/Realtime/Payload/StoryScreenshot.php | 28 + .../src/Realtime/Payload/ThreadAction.php | 25 + .../src/Realtime/Payload/ThreadActivity.php | 35 + .../Realtime/Payload/ZeroProvisionEvent.php | 30 + .../GraphQl/AppPresenceSubscription.php | 30 + .../GraphQl/DirectTypingSubscription.php | 29 + .../GraphQl/ZeroProvisionSubscription.php | 32 + .../Subscription/GraphQlSubscription.php | 46 + .../Skywalker/DirectSubscription.php | 23 + .../Skywalker/LiveSubscription.php | 23 + .../Subscription/SkywalkerSubscription.php | 35 + .../src/Realtime/SubscriptionInterface.php | 27 + .../mgp25/instagram-php/src/Request.php | 837 +++++ .../instagram-php/src/Request/Account.php | 779 +++++ .../instagram-php/src/Request/Business.php | 85 + .../instagram-php/src/Request/Collection.php | 181 ++ .../instagram-php/src/Request/Creative.php | 123 + .../instagram-php/src/Request/Direct.php | 1550 ++++++++++ .../instagram-php/src/Request/Discover.php | 192 ++ .../instagram-php/src/Request/Hashtag.php | 375 +++ .../instagram-php/src/Request/Highlight.php | 173 ++ .../instagram-php/src/Request/Internal.php | 2596 ++++++++++++++++ .../mgp25/instagram-php/src/Request/Live.php | 696 +++++ .../instagram-php/src/Request/Location.php | 329 ++ .../mgp25/instagram-php/src/Request/Media.php | 848 ++++++ .../src/Request/Metadata/Internal.php | 291 ++ .../instagram-php/src/Request/People.php | 1265 ++++++++ .../mgp25/instagram-php/src/Request/Push.php | 78 + .../src/Request/RequestCollection.php | 104 + .../instagram-php/src/Request/Shopping.php | 123 + .../mgp25/instagram-php/src/Request/Story.php | 693 +++++ .../mgp25/instagram-php/src/Request/TV.php | 171 ++ .../instagram-php/src/Request/Timeline.php | 512 ++++ .../instagram-php/src/Request/Usertag.php | 144 + .../mgp25/instagram-php/src/Response.php | 141 + .../src/Response/AccountCreateResponse.php | 37 + .../src/Response/AccountDetailsResponse.php | 52 + .../Response/AccountSecurityInfoResponse.php | 57 + .../src/Response/ActiveFeedAdsResponse.php | 42 + .../src/Response/ActiveReelAdsResponse.php | 42 + .../src/Response/ActivityNewsResponse.php | 77 + .../src/Response/ArchiveMediaResponse.php | 25 + .../Response/ArchivedStoriesFeedResponse.php | 47 + .../Response/ArlinkDownloadInfoResponse.php | 47 + .../Response/BadgeNotificationsResponse.php | 37 + .../src/Response/BlockedListResponse.php | 42 + .../src/Response/BlockedMediaResponse.php | 32 + .../src/Response/BlockedReelsResponse.php | 45 + .../src/Response/BootstrapUsersResponse.php | 37 + .../Response/BroadcastCommentsResponse.php | 95 + ...oadcastHeartbeatAndViewerCountResponse.php | 67 + .../src/Response/BroadcastInfoResponse.php | 132 + .../BroadcastJoinRequestCountResponse.php | 52 + .../Response/BroadcastLikeCountResponse.php | 47 + .../src/Response/BroadcastLikeResponse.php | 32 + .../Response/BroadcastQuestionsResponse.php | 32 + .../CapabilitiesDecisionsResponse.php | 32 + .../src/Response/ChallengeResponse.php | 25 + .../src/Response/ChangePasswordResponse.php | 25 + .../src/Response/CharitiesListResponse.php | 42 + .../src/Response/CheckEmailResponse.php | 52 + .../src/Response/CheckUsernameResponse.php | 47 + .../src/Response/CloseFriendsResponse.php | 49 + .../src/Response/CollectionFeedResponse.php | 67 + .../src/Response/CommentBroadcastResponse.php | 32 + .../CommentCategoryFilterResponse.php | 32 + .../CommentFilterKeywordsResponse.php | 32 + .../src/Response/CommentFilterResponse.php | 32 + .../src/Response/CommentFilterSetResponse.php | 25 + .../Response/CommentLikeUnlikeResponse.php | 25 + .../src/Response/CommentLikersResponse.php | 32 + .../src/Response/CommentResponse.php | 32 + .../src/Response/ConfigureResponse.php | 47 + .../Response/CreateBusinessInfoResponse.php | 32 + .../src/Response/CreateCollectionResponse.php | 40 + .../src/Response/CreateHighlightResponse.php | 32 + .../src/Response/CreateLiveResponse.php | 157 + .../src/Response/DeleteCollectionResponse.php | 25 + .../src/Response/DeleteCommentResponse.php | 25 + .../DirectCreateGroupThreadResponse.php | 112 + .../src/Response/DirectInboxResponse.php | 67 + .../Response/DirectPendingInboxResponse.php | 42 + .../DirectRankedRecipientsResponse.php | 52 + .../DirectRecentRecipientsResponse.php | 37 + .../src/Response/DirectSeenItemResponse.php | 37 + .../src/Response/DirectSendItemResponse.php | 42 + .../src/Response/DirectSendItemsResponse.php | 42 + .../src/Response/DirectShareInboxResponse.php | 57 + .../src/Response/DirectThreadResponse.php | 32 + .../Response/DirectVisualThreadResponse.php | 192 ++ .../Response/DisableTwoFactorSMSResponse.php | 25 + .../src/Response/DiscoverChannelsResponse.php | 47 + .../src/Response/DiscoverPeopleResponse.php | 47 + .../src/Response/DiscoverTopLiveResponse.php | 57 + .../src/Response/EditCollectionResponse.php | 40 + .../src/Response/EditMediaResponse.php | 32 + .../EnableDisableLiveCommentsResponse.php | 32 + .../Response/EnableTwoFactorSMSResponse.php | 32 + .../src/Response/ExploreResponse.php | 67 + .../src/Response/FBLocationResponse.php | 42 + .../src/Response/FBSearchResponse.php | 48 + .../src/Response/FaceEffectsResponse.php | 42 + .../src/Response/FaceModelsResponse.php | 32 + .../FacebookHiddenEntitiesResponse.php | 32 + .../src/Response/FacebookOTAResponse.php | 37 + .../src/Response/FetchQPDataResponse.php | 52 + .../src/Response/FinalViewerListResponse.php | 37 + .../Response/FollowerAndFollowingResponse.php | 57 + .../FollowingRecentActivityResponse.php | 47 + .../src/Response/FormerUsernamesResponse.php | 32 + .../src/Response/FriendshipResponse.php | 32 + .../Response/FriendshipsShowManyResponse.php | 32 + .../src/Response/FriendshipsShowResponse.php | 72 + .../src/Response/GenericResponse.php | 27 + .../Response/GetCollectionsListResponse.php | 47 + .../src/Response/GraphqlResponse.php | 82 + .../src/Response/HashtagsResponse.php | 32 + .../src/Response/HighlightFeedResponse.php | 57 + .../src/Response/InsightsResponse.php | 32 + .../src/Response/LauncherSyncResponse.php | 32 + .../src/Response/LikeFeedResponse.php | 62 + .../src/Response/LinkAddressBookResponse.php | 32 + .../src/Response/LinkageStatusResponse.php | 32 + .../src/Response/LocationFeedResponse.php | 52 + .../src/Response/LocationResponse.php | 37 + .../src/Response/LocationStoryResponse.php | 32 + .../src/Response/LoginResponse.php | 157 + .../src/Response/LogoutResponse.php | 25 + .../src/Response/LoomFetchConfigResponse.php | 47 + .../Response/MediaCommentRepliesResponse.php | 85 + .../src/Response/MediaCommentsResponse.php | 87 + .../src/Response/MediaDeleteResponse.php | 32 + .../src/Response/MediaInfoResponse.php | 47 + .../src/Response/MediaInsightsResponse.php | 32 + .../src/Response/MediaLikersResponse.php | 37 + .../src/Response/MediaSeenResponse.php | 25 + .../src/Response/MegaphoneLogResponse.php | 32 + .../Model/AccountAccessToolConfig.php | 30 + .../src/Response/Model/AccountSummaryUnit.php | 20 + .../src/Response/Model/Action.php | 35 + .../src/Response/Model/ActionBadge.php | 41 + .../src/Response/Model/ActionLog.php | 25 + .../src/Response/Model/Ad4ad.php | 45 + .../src/Response/Model/AdMetadata.php | 25 + .../src/Response/Model/AdsInfo.php | 25 + .../src/Response/Model/AndroidLinks.php | 75 + .../src/Response/Model/AnimatedMedia.php | 25 + .../src/Response/Model/AnimatedMediaImage.php | 20 + .../Model/AnimatedMediaImageFixedHeigth.php | 55 + .../Model/ArchivedStoriesFeedItem.php | 40 + .../instagram-php/src/Response/Model/Args.php | 135 + .../src/Response/Model/AssetModel.php | 25 + .../src/Response/Model/Attribution.php | 20 + .../src/Response/Model/AudioContext.php | 25 + .../instagram-php/src/Response/Model/Aymf.php | 25 + .../src/Response/Model/AymfItem.php | 731 +++++ .../src/Response/Model/Badging.php | 25 + .../src/Response/Model/BiographyEntities.php | 30 + .../src/Response/Model/BlockedReels.php | 30 + .../instagram-php/src/Response/Model/Bold.php | 25 + .../src/Response/Model/Broadcast.php | 151 + .../src/Response/Model/BroadcastQuestion.php | 45 + .../Response/Model/BroadcastStatusItem.php | 40 + .../src/Response/Model/BusinessEdge.php | 25 + .../src/Response/Model/BusinessFeed.php | 20 + .../src/Response/Model/BusinessManager.php | 50 + .../Response/Model/BusinessManagerStatus.php | 25 + .../src/Response/Model/BusinessNode.php | 190 ++ .../src/Response/Model/Button.php | 50 + .../src/Response/Model/Caption.php | 85 + .../src/Response/Model/CarouselMedia.php | 196 ++ .../src/Response/Model/CatalogData.php | 25 + .../src/Response/Model/CatalogEdge.php | 20 + .../src/Response/Model/CatalogNode.php | 50 + .../src/Response/Model/ChainingInfo.php | 20 + .../src/Response/Model/ChainingSuggestion.php | 587 ++++ .../src/Response/Model/Challenge.php | 45 + .../src/Response/Model/Channel.php | 50 + .../src/Response/Model/CloseFriends.php | 35 + .../src/Response/Model/Collection.php | 30 + .../src/Response/Model/Comment.php | 196 ++ .../src/Response/Model/CommentInfo.php | 60 + .../Response/Model/CommentTranslations.php | 25 + .../src/Response/Model/Composer.php | 25 + .../src/Response/Model/ContextualFilters.php | 30 + .../src/Response/Model/CountdownSticker.php | 90 + .../src/Response/Model/Counts.php | 55 + .../src/Response/Model/CoverMedia.php | 63 + .../src/Response/Model/Creative.php | 56 + .../src/Response/Model/DataGraph.php | 25 + .../src/Response/Model/DataPoints.php | 25 + .../src/Response/Model/DirectCursor.php | 25 + .../Response/Model/DirectExpiringSummary.php | 30 + .../src/Response/Model/DirectInbox.php | 50 + .../src/Response/Model/DirectLink.php | 25 + .../Response/Model/DirectMessageMetadata.php | 35 + .../Response/Model/DirectRankedRecipient.php | 25 + .../src/Response/Model/DirectReaction.php | 50 + .../src/Response/Model/DirectReactions.php | 25 + .../Response/Model/DirectSeenItemPayload.php | 25 + .../Response/Model/DirectSendItemPayload.php | 55 + .../src/Response/Model/DirectThread.php | 220 ++ .../src/Response/Model/DirectThreadItem.php | 185 ++ .../Response/Model/DirectThreadItemMedia.php | 54 + .../Response/Model/DirectThreadLastSeenAt.php | 25 + .../src/Response/Model/DismissCard.php | 50 + .../src/Response/Model/Edges.php | 30 + .../src/Response/Model/Effect.php | 50 + .../src/Response/Model/EligiblePromotions.php | 20 + .../Response/Model/EndOfFeedDemarcator.php | 30 + .../src/Response/Model/Experiment.php | 45 + .../src/Response/Model/Explore.php | 30 + .../src/Response/Model/ExploreItem.php | 35 + .../src/Response/Model/ExploreItemInfo.php | 40 + .../src/Response/Model/FaceModels.php | 30 + .../src/Response/Model/FacebookUser.php | 25 + .../src/Response/Model/FeedAysf.php | 75 + .../src/Response/Model/FeedItem.php | 45 + .../src/Response/Model/FelixShare.php | 25 + .../src/Response/Model/FillItems.php | 20 + .../src/Response/Model/FollowersUnit.php | 60 + .../src/Response/Model/FormerUsername.php | 25 + .../src/Response/Model/FormerUsernameInfo.php | 20 + .../src/Response/Model/FriendshipStatus.php | 70 + .../src/Response/Model/FullItem.php | 20 + .../src/Response/Model/Gating.php | 35 + .../src/Response/Model/GenericMegaphone.php | 85 + .../src/Response/Model/GraphData.php | 50 + .../src/Response/Model/GraphNode.php | 30 + .../src/Response/Model/Groups.php | 25 + .../src/Response/Model/Hashtag.php | 65 + .../src/Response/Model/Headline.php | 70 + .../src/Response/Model/HiddenEntities.php | 34 + .../src/Response/Model/HideReason.php | 31 + .../src/Response/Model/IOSLinks.php | 25 + .../Response/Model/IabAutofillOptoutInfo.php | 25 + .../src/Response/Model/Image.php | 30 + .../src/Response/Model/ImageCandidate.php | 35 + .../src/Response/Model/Image_Versions2.php | 25 + .../instagram-php/src/Response/Model/In.php | 45 + .../src/Response/Model/Injected.php | 120 + .../src/Response/Model/InlineFollow.php | 30 + .../src/Response/Model/Insights.php | 20 + .../instagram-php/src/Response/Model/Item.php | 959 ++++++ .../src/Response/Model/LayoutContent.php | 55 + .../instagram-php/src/Response/Model/Link.php | 45 + .../src/Response/Model/LinkContext.php | 35 + .../src/Response/Model/LiveComment.php | 30 + .../src/Response/Model/LiveVideoShare.php | 30 + .../src/Response/Model/LiveViewerInvite.php | 40 + .../src/Response/Model/Location.php | 157 + .../src/Response/Model/LocationItem.php | 35 + .../src/Response/Model/MeGraphData.php | 25 + .../src/Response/Model/Media.php | 40 + .../src/Response/Model/MediaCroppingInfo.php | 20 + .../src/Response/Model/MediaData.php | 43 + .../src/Response/Model/MediaInsights.php | 50 + .../src/Response/Model/MediaShare.php | 25 + .../src/Response/Model/Megaphone.php | 20 + .../src/Response/Model/Nametag.php | 40 + .../src/Response/Model/Owner.php | 60 + .../src/Response/Model/PageInfo.php | 30 + .../src/Response/Model/Param.php | 25 + .../src/Response/Model/Participants.php | 30 + .../src/Response/Model/PermanentItem.php | 90 + .../Model/PhoneVerificationSettings.php | 35 + .../src/Response/Model/Placeholder.php | 30 + .../src/Response/Model/PostLive.php | 20 + .../src/Response/Model/PostLiveItem.php | 65 + .../src/Response/Model/Prefill.php | 25 + .../src/Response/Model/PrimaryCountryInfo.php | 30 + .../src/Response/Model/Product.php | 84 + .../src/Response/Model/ProductImage.php | 20 + .../src/Response/Model/ProductShare.php | 30 + .../src/Response/Model/ProductTags.php | 20 + .../src/Response/Model/PromotionsUnit.php | 20 + .../src/Response/Model/PushSettings.php | 45 + .../src/Response/Model/QPData.php | 25 + .../src/Response/Model/QPExtraInfo.php | 25 + .../src/Response/Model/QPNode.php | 50 + .../src/Response/Model/QPSurface.php | 25 + .../src/Response/Model/QPViewerData.php | 20 + .../src/Response/Model/QueryResponse.php | 20 + .../src/Response/Model/QuestionSticker.php | 56 + .../src/Response/Model/QuizSticker.php | 70 + .../src/Response/Model/Ranking.php | 30 + .../instagram-php/src/Response/Model/Reel.php | 107 + .../src/Response/Model/ReelMention.php | 65 + .../src/Response/Model/ReelShare.php | 70 + .../src/Response/Model/Related.php | 30 + .../src/Response/Model/Responder.php | 40 + .../src/Response/Model/RewriteRule.php | 25 + .../src/Response/Model/SavedFeedItem.php | 20 + .../src/Response/Model/Section.php | 50 + .../src/Response/Model/SectionMedia.php | 20 + .../src/Response/Model/ServerDataInfo.php | 30 + .../Response/Model/ShadowInstagramUser.php | 50 + .../Response/Model/SharePrefillEntities.php | 20 + .../src/Response/Model/SharedFollower.php | 65 + .../Model/SharedFollowerAccountsInfo.php | 20 + .../instagram-php/src/Response/Model/Slot.php | 25 + .../src/Response/Model/StaticStickers.php | 30 + .../src/Response/Model/StepData.php | 80 + .../src/Response/Model/Stickers.php | 55 + .../src/Response/Model/Stories.php | 35 + .../src/Response/Model/StoriesNetego.php | 30 + .../src/Response/Model/Story.php | 40 + .../Response/Model/StoryAppAttribution.php | 45 + .../src/Response/Model/StoryCountdowns.php | 60 + .../src/Response/Model/StoryCta.php | 25 + .../src/Response/Model/StoryHashtag.php | 70 + .../src/Response/Model/StoryLocation.php | 65 + .../Model/StoryQuestionResponderInfos.php | 65 + .../src/Response/Model/StoryQuestions.php | 60 + .../Model/StoryQuizParticipantInfo.php | 35 + .../src/Response/Model/StoryQuizs.php | 65 + .../src/Response/Model/StoryShare.php | 40 + .../src/Response/Model/StoryTray.php | 162 + .../src/Response/Model/StoryTvChannel.php | 55 + .../src/Response/Model/Subscription.php | 35 + .../src/Response/Model/Suggested.php | 40 + .../src/Response/Model/SuggestedUsers.php | 75 + .../src/Response/Model/Suggestion.php | 75 + .../src/Response/Model/SuggestionCard.php | 30 + .../src/Response/Model/SummaryPromotions.php | 25 + .../Response/Model/SupportedCapabilities.php | 25 + .../src/Response/Model/Surface.php | 39 + .../src/Response/Model/SystemControl.php | 30 + .../src/Response/Model/TVChannel.php | 55 + .../src/Response/Model/TVSearchResult.php | 40 + .../instagram-php/src/Response/Model/Tab.php | 25 + .../src/Response/Model/TabsInfo.php | 25 + .../instagram-php/src/Response/Model/Tag.php | 105 + .../src/Response/Model/Tallies.php | 25 + .../src/Response/Model/Template.php | 25 + .../instagram-php/src/Response/Model/Text.php | 20 + .../src/Response/Model/Thumbnail.php | 65 + .../src/Response/Model/TimeRange.php | 25 + .../src/Response/Model/Token.php | 82 + .../src/Response/Model/TopLive.php | 25 + .../src/Response/Model/TraceControl.php | 35 + .../src/Response/Model/TraySuggestions.php | 40 + .../src/Response/Model/TwoFactorInfo.php | 35 + .../CoreUnpredictableContainer.php | 95 + ...ThreadLastSeenAtUnpredictableContainer.php | 13 + ...FriendshipStatusUnpredictableContainer.php | 13 + .../MediaUnpredictableContainer.php | 13 + .../PresenceUnpredictableContainer.php | 11 + .../ReelUnpredictableContainer.php | 11 + .../UserUnpredictableContainer.php | 13 + .../instagram-php/src/Response/Model/User.php | 726 +++++ .../src/Response/Model/UserCard.php | 80 + .../src/Response/Model/UserList.php | 25 + .../src/Response/Model/UserPresence.php | 35 + .../src/Response/Model/Usertag.php | 25 + .../src/Response/Model/VideoCallEvent.php | 31 + .../src/Response/Model/VideoUploadUrl.php | 30 + .../src/Response/Model/VideoVersions.php | 40 + .../src/Response/Model/Viewer.php | 20 + .../src/Response/Model/VoiceMedia.php | 20 + .../src/Response/Model/Voter.php | 25 + .../src/Response/Model/VoterInfo.php | 35 + .../src/Response/Model/_Message.php | 25 + .../src/Response/MsisdnHeaderResponse.php | 47 + .../MultipleAccountFamilyResponse.php | 37 + .../src/Response/MutedReelsResponse.php | 47 + .../src/Response/OnBoardCatalogResponse.php | 42 + .../src/Response/OnTagProductResponse.php | 42 + .../src/Response/PermalinkResponse.php | 32 + .../Response/PinCommentBroadcastResponse.php | 32 + .../src/Response/PopularFeedResponse.php | 57 + .../src/Response/PostLiveCommentsResponse.php | 52 + .../src/Response/PostLiveLikesResponse.php | 47 + .../Response/PostLiveViewerListResponse.php | 42 + .../Response/PrefillCandidatesResponse.php | 32 + .../src/Response/PresenceStatusResponse.php | 37 + .../src/Response/PresencesResponse.php | 32 + .../src/Response/ProfileNoticeResponse.php | 32 + .../Response/PropertyCollection/Sticker.php | 53 + .../src/Response/PushPreferencesResponse.php | 117 + .../src/Response/PushRegisterResponse.php | 25 + .../src/Response/QPCooldownsResponse.php | 52 + .../src/Response/RecentSearchesResponse.php | 32 + .../src/Response/RecoveryResponse.php | 42 + .../src/Response/ReelMediaViewerResponse.php | 62 + .../src/Response/ReelSettingsResponse.php | 37 + .../src/Response/ReelsMediaResponse.php | 37 + .../src/Response/ReelsTrayFeedResponse.php | 72 + .../src/Response/RelatedLocationResponse.php | 32 + .../Response/ReportExploreMediaResponse.php | 32 + .../src/Response/ResumableOffsetResponse.php | 52 + .../src/Response/ResumableUploadResponse.php | 37 + .../src/Response/ReviewPreferenceResponse.php | 32 + .../src/Response/SaveAndUnsaveMedia.php | 25 + .../src/Response/SavedFeedResponse.php | 52 + .../src/Response/SearchTagResponse.php | 42 + .../src/Response/SearchUserResponse.php | 47 + .../src/Response/SegmentedStartResponse.php | 52 + .../src/Response/SendConfirmEmailResponse.php | 42 + .../src/Response/SendSMSCodeResponse.php | 37 + .../SendTwoFactorEnableSMSResponse.php | 37 + .../src/Response/SharePrefillResponse.php | 42 + .../src/Response/SharedFollowersResponse.php | 32 + .../src/Response/StartLiveResponse.php | 32 + .../src/Response/StickerAssetsResponse.php | 37 + .../src/Response/StoryAnswersResponse.php | 32 + .../src/Response/StoryCountdownsResponse.php | 32 + .../src/Response/StoryPollVotersResponse.php | 32 + .../Response/SuggestedBroadcastsResponse.php | 32 + .../Response/SuggestedSearchesResponse.php | 37 + .../Response/SuggestedUsersBadgeResponse.php | 37 + .../src/Response/SuggestedUsersResponse.php | 37 + .../SwitchBusinessProfileResponse.php | 32 + .../SwitchPersonalProfileResponse.php | 32 + .../src/Response/SyncResponse.php | 32 + .../src/Response/TVChannelsResponse.php | 67 + .../src/Response/TVGuideResponse.php | 52 + .../src/Response/TVSearchResponse.php | 42 + .../src/Response/TagFeedResponse.php | 77 + .../src/Response/TagInfoResponse.php | 68 + .../src/Response/TagRelatedResponse.php | 32 + .../src/Response/TagsStoryResponse.php | 32 + .../src/Response/TimelineFeedResponse.php | 98 + .../src/Response/TokenResultResponse.php | 32 + .../src/Response/TopLiveStatusResponse.php | 32 + .../src/Response/TranslateResponse.php | 32 + .../Response/TwoFactorLoginSMSResponse.php | 37 + .../Response/UnlinkAddressBookResponse.php | 25 + .../UnpinCommentBroadcastResponse.php | 32 + .../src/Response/UploadJobVideoResponse.php | 37 + .../src/Response/UploadPhotoResponse.php | 37 + .../src/Response/UploadVideoResponse.php | 42 + .../src/Response/UserFeedResponse.php | 57 + .../src/Response/UserInfoResponse.php | 42 + .../Response/UserReelMediaFeedResponse.php | 96 + .../src/Response/UserStoryFeedResponse.php | 42 + .../src/Response/UsersLookupResponse.php | 77 + .../src/Response/UsertagsResponse.php | 67 + .../src/Response/ValidateURLResponse.php | 25 + .../src/Response/VerifySMSCodeResponse.php | 37 + .../src/Response/ViewerListResponse.php | 32 + .../WriteSuppotedCapabilitiesResponse.php | 32 + .../instagram-php/src/Settings/Factory.php | 262 ++ .../Storage/Components/PDOStorage.php | 394 +++ .../src/Settings/Storage/File.php | 385 +++ .../src/Settings/Storage/Memcached.php | 345 +++ .../src/Settings/Storage/MySQL.php | 101 + .../src/Settings/Storage/SQLite.php | 115 + .../src/Settings/StorageHandler.php | 803 +++++ .../src/Settings/StorageInterface.php | 264 ++ .../mgp25/instagram-php/src/Signatures.php | 111 + .../vendor/mgp25/instagram-php/src/Utils.php | 1515 ++++++++++ .../tests/React/ConnectorTest.php | 211 ++ .../Realtime/Command/IndicateActivityTest.php | 57 + .../Realtime/Command/IrisSubscribeTest.php | 22 + .../tests/Realtime/Command/MarkSeenTest.php | 55 + .../Realtime/Command/SendHashtagTest.php | 105 + .../tests/Realtime/Command/SendLikeTest.php | 48 + .../Realtime/Command/SendLocationTest.php | 75 + .../tests/Realtime/Command/SendPostTest.php | 75 + .../Realtime/Command/SendProfileTest.php | 75 + .../Realtime/Command/SendReactionTest.php | 85 + .../tests/Realtime/Command/SendStoryTest.php | 75 + .../tests/Realtime/Command/SendTextTest.php | 62 + .../Command/UpdateSubscriptionsTest.php | 22 + .../tests/Realtime/Handler/DirectTest.php | 308 ++ .../Realtime/Handler/IrisHandlerTest.php | 77 + .../tests/Realtime/Handler/LiveTest.php | 74 + .../tests/Realtime/Handler/PresenceTest.php | 63 + .../tests/Realtime/Handler/RegionHintTest.php | 71 + .../Realtime/Subscription/AppPresenceTest.php | 18 + .../Subscription/ZeroProvisionTest.php | 18 + .../tests/Response/ExceptionsTest.php | 112 + .../vendor/mgp25/instagram-php/webwarning.htm | 9 + .../vendor/psr/http-message/CHANGELOG.md | 36 + instafeed/vendor/psr/http-message/LICENSE | 19 + instafeed/vendor/psr/http-message/README.md | 13 + .../vendor/psr/http-message/composer.json | 26 + .../psr/http-message/src/MessageInterface.php | 187 ++ .../psr/http-message/src/RequestInterface.php | 129 + .../http-message/src/ResponseInterface.php | 68 + .../src/ServerRequestInterface.php | 261 ++ .../psr/http-message/src/StreamInterface.php | 158 + .../src/UploadedFileInterface.php | 123 + .../psr/http-message/src/UriInterface.php | 323 ++ instafeed/vendor/psr/log/.gitignore | 1 + instafeed/vendor/psr/log/LICENSE | 19 + .../vendor/psr/log/Psr/Log/AbstractLogger.php | 128 + .../log/Psr/Log/InvalidArgumentException.php | 7 + instafeed/vendor/psr/log/Psr/Log/LogLevel.php | 18 + .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 + .../psr/log/Psr/Log/LoggerAwareTrait.php | 26 + .../psr/log/Psr/Log/LoggerInterface.php | 125 + .../vendor/psr/log/Psr/Log/LoggerTrait.php | 142 + .../vendor/psr/log/Psr/Log/NullLogger.php | 30 + .../log/Psr/Log/Test/LoggerInterfaceTest.php | 145 + .../psr/log/Psr/Log/Test/TestLogger.php | 147 + instafeed/vendor/psr/log/README.md | 52 + instafeed/vendor/psr/log/composer.json | 26 + .../vendor/ralouphie/getallheaders/LICENSE | 21 + .../vendor/ralouphie/getallheaders/README.md | 27 + .../ralouphie/getallheaders/composer.json | 26 + .../getallheaders/src/getallheaders.php | 46 + instafeed/vendor/react/cache/.gitignore | 2 + instafeed/vendor/react/cache/.travis.yml | 32 + instafeed/vendor/react/cache/CHANGELOG.md | 74 + instafeed/vendor/react/cache/LICENSE | 19 + instafeed/vendor/react/cache/README.md | 366 +++ instafeed/vendor/react/cache/composer.json | 19 + instafeed/vendor/react/cache/phpunit.xml.dist | 20 + .../vendor/react/cache/src/ArrayCache.php | 181 ++ .../vendor/react/cache/src/CacheInterface.php | 194 ++ .../react/cache/tests/ArrayCacheTest.php | 322 ++ .../vendor/react/cache/tests/CallableStub.php | 10 + .../vendor/react/cache/tests/TestCase.php | 54 + instafeed/vendor/react/dns/.gitignore | 2 + instafeed/vendor/react/dns/.travis.yml | 32 + instafeed/vendor/react/dns/CHANGELOG.md | 261 ++ instafeed/vendor/react/dns/LICENSE | 19 + instafeed/vendor/react/dns/README.md | 344 +++ instafeed/vendor/react/dns/composer.json | 24 + .../vendor/react/dns/examples/01-one.php | 22 + .../react/dns/examples/02-concurrent.php | 27 + .../vendor/react/dns/examples/03-cached.php | 40 + .../vendor/react/dns/examples/11-all-ips.php | 31 + .../react/dns/examples/12-all-types.php | 25 + .../react/dns/examples/13-reverse-dns.php | 35 + .../dns/examples/91-query-a-and-aaaa.php | 29 + .../react/dns/examples/92-query-any.php | 71 + instafeed/vendor/react/dns/phpunit.xml.dist | 24 + .../react/dns/src/BadServerException.php | 7 + .../vendor/react/dns/src/Config/Config.php | 127 + .../dns/src/Config/FilesystemFactory.php | 73 + .../vendor/react/dns/src/Config/HostsFile.php | 151 + .../vendor/react/dns/src/Model/HeaderBag.php | 59 + .../vendor/react/dns/src/Model/Message.php | 188 ++ .../vendor/react/dns/src/Model/Record.php | 105 + .../react/dns/src/Protocol/BinaryDumper.php | 163 + .../vendor/react/dns/src/Protocol/Parser.php | 395 +++ .../react/dns/src/Query/CachedExecutor.php | 59 + .../react/dns/src/Query/CachingExecutor.php | 88 + .../dns/src/Query/CancellationException.php | 7 + .../react/dns/src/Query/CoopExecutor.php | 92 + .../vendor/react/dns/src/Query/Executor.php | 160 + .../react/dns/src/Query/ExecutorInterface.php | 8 + .../react/dns/src/Query/HostsFileExecutor.php | 89 + .../vendor/react/dns/src/Query/Query.php | 33 + .../vendor/react/dns/src/Query/RecordBag.php | 30 + .../react/dns/src/Query/RecordCache.php | 122 + .../react/dns/src/Query/RetryExecutor.php | 79 + .../react/dns/src/Query/TimeoutException.php | 7 + .../react/dns/src/Query/TimeoutExecutor.php | 32 + .../dns/src/Query/UdpTransportExecutor.php | 181 ++ .../react/dns/src/RecordNotFoundException.php | 7 + .../vendor/react/dns/src/Resolver/Factory.php | 102 + .../react/dns/src/Resolver/Resolver.php | 250 ++ .../vendor/react/dns/tests/CallableStub.php | 10 + .../react/dns/tests/Config/ConfigTest.php | 189 ++ .../tests/Config/FilesystemFactoryTest.php | 70 + .../react/dns/tests/Config/HostsFileTest.php | 170 ++ .../react/dns/tests/Fixtures/etc/resolv.conf | 1 + .../dns/tests/FunctionalResolverTest.php | 171 ++ .../react/dns/tests/Model/MessageTest.php | 31 + .../dns/tests/Protocol/BinaryDumperTest.php | 278 ++ .../react/dns/tests/Protocol/ParserTest.php | 1033 +++++++ .../dns/tests/Query/CachedExecutorTest.php | 100 + .../dns/tests/Query/CachingExecutorTest.php | 183 ++ .../dns/tests/Query/CoopExecutorTest.php | 233 ++ .../react/dns/tests/Query/ExecutorTest.php | 308 ++ .../dns/tests/Query/HostsFileExecutorTest.php | 126 + .../react/dns/tests/Query/RecordBagTest.php | 83 + .../react/dns/tests/Query/RecordCacheTest.php | 160 + .../dns/tests/Query/RetryExecutorTest.php | 350 +++ .../dns/tests/Query/TimeoutExecutorTest.php | 115 + .../tests/Query/UdpTransportExecutorTest.php | 215 ++ .../react/dns/tests/Resolver/FactoryTest.php | 120 + .../dns/tests/Resolver/ResolveAliasesTest.php | 101 + .../react/dns/tests/Resolver/ResolverTest.php | 251 ++ instafeed/vendor/react/dns/tests/TestCase.php | 61 + instafeed/vendor/react/event-loop/.gitignore | 3 + instafeed/vendor/react/event-loop/.travis.yml | 27 + .../vendor/react/event-loop/CHANGELOG.md | 79 + instafeed/vendor/react/event-loop/LICENSE | 19 + instafeed/vendor/react/event-loop/README.md | 143 + .../vendor/react/event-loop/composer.json | 22 + .../vendor/react/event-loop/phpunit.xml.dist | 25 + .../react/event-loop/src/ExtEventLoop.php | 326 ++ .../vendor/react/event-loop/src/Factory.php | 21 + .../vendor/react/event-loop/src/LibEvLoop.php | 226 ++ .../react/event-loop/src/LibEventLoop.php | 343 +++ .../react/event-loop/src/LoopInterface.php | 121 + .../react/event-loop/src/StreamSelectLoop.php | 273 ++ .../event-loop/src/Tick/FutureTickQueue.php | 59 + .../event-loop/src/Tick/NextTickQueue.php | 57 + .../react/event-loop/src/Timer/Timer.php | 102 + .../event-loop/src/Timer/TimerInterface.php | 62 + .../react/event-loop/src/Timer/Timers.php | 100 + .../event-loop/tests/AbstractLoopTest.php | 539 ++++ .../react/event-loop/tests/CallableStub.php | 10 + .../event-loop/tests/ExtEventLoopTest.php | 90 + .../react/event-loop/tests/LibEvLoopTest.php | 22 + .../event-loop/tests/LibEventLoopTest.php | 58 + .../event-loop/tests/StreamSelectLoopTest.php | 179 ++ .../react/event-loop/tests/TestCase.php | 41 + .../tests/Timer/AbstractTimerTest.php | 97 + .../tests/Timer/ExtEventTimerTest.php | 17 + .../event-loop/tests/Timer/LibEvTimerTest.php | 17 + .../tests/Timer/LibEventTimerTest.php | 17 + .../tests/Timer/StreamSelectTimerTest.php | 13 + .../event-loop/tests/Timer/TimersTest.php | 29 + .../react/event-loop/tests/bootstrap.php | 7 + .../vendor/react/event-loop/travis-init.sh | 37 + .../vendor/react/promise-timer/.gitignore | 2 + .../vendor/react/promise-timer/.travis.yml | 26 + .../vendor/react/promise-timer/CHANGELOG.md | 63 + instafeed/vendor/react/promise-timer/LICENSE | 21 + .../vendor/react/promise-timer/README.md | 372 +++ .../vendor/react/promise-timer/composer.json | 28 + .../react/promise-timer/phpunit.xml.dist | 19 + .../promise-timer/src/TimeoutException.php | 22 + .../react/promise-timer/src/functions.php | 81 + .../promise-timer/src/functions_include.php | 7 + .../promise-timer/tests/CallableStub.php | 10 + .../tests/FunctionRejectTest.php | 79 + .../tests/FunctionResolveTest.php | 101 + .../tests/FunctionTimeoutTest.php | 286 ++ .../react/promise-timer/tests/TestCase.php | 61 + .../tests/TimeoutExceptionTest.php | 15 + instafeed/vendor/react/promise/.gitignore | 5 + instafeed/vendor/react/promise/.travis.yml | 28 + instafeed/vendor/react/promise/CHANGELOG.md | 135 + instafeed/vendor/react/promise/LICENSE | 22 + instafeed/vendor/react/promise/README.md | 870 ++++++ instafeed/vendor/react/promise/composer.json | 29 + .../vendor/react/promise/phpunit.xml.dist | 28 + .../src/CancellablePromiseInterface.php | 11 + .../react/promise/src/CancellationQueue.php | 55 + .../vendor/react/promise/src/Deferred.php | 65 + .../promise/src/Exception/LengthException.php | 7 + .../promise/src/ExtendedPromiseInterface.php | 30 + .../react/promise/src/FulfilledPromise.php | 68 + .../vendor/react/promise/src/LazyPromise.php | 63 + .../vendor/react/promise/src/Promise.php | 256 ++ .../react/promise/src/PromiseInterface.php | 14 + .../react/promise/src/PromisorInterface.php | 11 + .../react/promise/src/RejectedPromise.php | 76 + .../src/UnhandledRejectionException.php | 31 + .../vendor/react/promise/src/functions.php | 246 ++ .../react/promise/src/functions_include.php | 5 + .../promise/tests/CancellationQueueTest.php | 100 + .../react/promise/tests/DeferredTest.php | 112 + .../promise/tests/FulfilledPromiseTest.php | 76 + .../react/promise/tests/FunctionAllTest.php | 114 + .../react/promise/tests/FunctionAnyTest.php | 204 ++ .../tests/FunctionCheckTypehintTest.php | 118 + .../react/promise/tests/FunctionMapTest.php | 198 ++ .../react/promise/tests/FunctionRaceTest.php | 211 ++ .../promise/tests/FunctionReduceTest.php | 347 +++ .../promise/tests/FunctionRejectTest.php | 64 + .../promise/tests/FunctionResolveTest.php | 171 ++ .../react/promise/tests/FunctionSomeTest.php | 258 ++ .../react/promise/tests/LazyPromiseTest.php | 107 + .../PromiseAdapter/CallbackPromiseAdapter.php | 40 + .../PromiseAdapterInterface.php | 14 + .../react/promise/tests/PromiseTest.php | 293 ++ .../tests/PromiseTest/CancelTestTrait.php | 246 ++ .../tests/PromiseTest/FullTestTrait.php | 15 + .../tests/PromiseTest/NotifyTestTrait.php | 336 ++ .../PromiseTest/PromiseFulfilledTestTrait.php | 351 +++ .../PromiseTest/PromisePendingTestTrait.php | 68 + .../PromiseTest/PromiseRejectedTestTrait.php | 512 ++++ .../PromiseTest/PromiseSettledTestTrait.php | 86 + .../tests/PromiseTest/RejectTestTrait.php | 368 +++ .../tests/PromiseTest/ResolveTestTrait.php | 312 ++ .../promise/tests/RejectedPromiseTest.php | 76 + .../react/promise/tests/Stub/CallableStub.php | 10 + .../vendor/react/promise/tests/TestCase.php | 43 + .../vendor/react/promise/tests/bootstrap.php | 7 + .../fixtures/SimpleFulfilledTestPromise.php | 21 + .../fixtures/SimpleFulfilledTestThenable.php | 21 + .../fixtures/SimpleRejectedTestPromise.php | 21 + .../tests/fixtures/SimpleTestCancellable.php | 13 + .../SimpleTestCancellableThenable.php | 18 + instafeed/vendor/react/socket/.gitignore | 2 + instafeed/vendor/react/socket/.travis.yml | 48 + instafeed/vendor/react/socket/CHANGELOG.md | 465 +++ instafeed/vendor/react/socket/LICENSE | 19 + instafeed/vendor/react/socket/README.md | 1419 +++++++++ instafeed/vendor/react/socket/composer.json | 29 + .../react/socket/examples/01-echo-server.php | 42 + .../react/socket/examples/02-chat-server.php | 59 + .../react/socket/examples/03-http-server.php | 57 + .../react/socket/examples/11-http-client.php | 36 + .../react/socket/examples/12-https-client.php | 36 + .../socket/examples/21-netcat-client.php | 68 + .../react/socket/examples/22-http-client.php | 60 + .../socket/examples/91-benchmark-server.php | 60 + .../examples/99-generate-self-signed.php | 31 + .../react/socket/examples/localhost.pem | 49 + .../socket/examples/localhost_swordfish.pem | 51 + .../vendor/react/socket/phpunit.xml.dist | 25 + .../vendor/react/socket/src/Connection.php | 178 ++ .../react/socket/src/ConnectionInterface.php | 119 + .../vendor/react/socket/src/Connector.php | 136 + .../react/socket/src/ConnectorInterface.php | 58 + .../vendor/react/socket/src/DnsConnector.php | 112 + .../react/socket/src/FixedUriConnector.php | 41 + .../react/socket/src/LimitingServer.php | 203 ++ .../react/socket/src/SecureConnector.php | 64 + .../vendor/react/socket/src/SecureServer.php | 192 ++ instafeed/vendor/react/socket/src/Server.php | 73 + .../react/socket/src/ServerInterface.php | 151 + .../react/socket/src/StreamEncryption.php | 146 + .../vendor/react/socket/src/TcpConnector.php | 129 + .../vendor/react/socket/src/TcpServer.php | 236 ++ .../react/socket/src/TimeoutConnector.php | 25 + .../vendor/react/socket/src/UnixConnector.php | 44 + .../vendor/react/socket/src/UnixServer.php | 130 + .../react/socket/tests/ConnectionTest.php | 47 + .../react/socket/tests/ConnectorTest.php | 128 + .../react/socket/tests/DnsConnectorTest.php | 111 + .../socket/tests/FixedUriConnectorTest.php | 19 + .../socket/tests/FunctionalConnectorTest.php | 32 + .../tests/FunctionalSecureServerTest.php | 438 +++ .../socket/tests/FunctionalTcpServerTest.php | 324 ++ .../react/socket/tests/IntegrationTest.php | 328 ++ .../react/socket/tests/LimitingServerTest.php | 195 ++ .../socket/tests/SecureConnectorTest.php | 74 + .../socket/tests/SecureIntegrationTest.php | 204 ++ .../react/socket/tests/SecureServerTest.php | 105 + .../vendor/react/socket/tests/ServerTest.php | 173 ++ .../react/socket/tests/Stub/CallableStub.php | 10 + .../socket/tests/Stub/ConnectionStub.php | 63 + .../react/socket/tests/Stub/ServerStub.php | 18 + .../react/socket/tests/TcpConnectorTest.php | 260 ++ .../react/socket/tests/TcpServerTest.php | 285 ++ .../vendor/react/socket/tests/TestCase.php | 101 + .../socket/tests/TimeoutConnectorTest.php | 103 + .../react/socket/tests/UnixConnectorTest.php | 64 + .../react/socket/tests/UnixServerTest.php | 283 ++ instafeed/vendor/react/stream/.gitignore | 2 + instafeed/vendor/react/stream/.travis.yml | 51 + instafeed/vendor/react/stream/CHANGELOG.md | 398 +++ instafeed/vendor/react/stream/LICENSE | 19 + instafeed/vendor/react/stream/README.md | 1225 ++++++++ instafeed/vendor/react/stream/composer.json | 25 + .../vendor/react/stream/examples/01-http.php | 40 + .../vendor/react/stream/examples/02-https.php | 40 + .../vendor/react/stream/examples/11-cat.php | 28 + .../examples/91-benchmark-throughput.php | 62 + .../vendor/react/stream/phpunit.xml.dist | 25 + .../react/stream/src/CompositeStream.php | 82 + .../react/stream/src/DuplexResourceStream.php | 224 ++ .../stream/src/DuplexStreamInterface.php | 39 + .../stream/src/ReadableResourceStream.php | 177 ++ .../stream/src/ReadableStreamInterface.php | 362 +++ .../vendor/react/stream/src/ThroughStream.php | 190 ++ instafeed/vendor/react/stream/src/Util.php | 75 + .../stream/src/WritableResourceStream.php | 171 ++ .../stream/src/WritableStreamInterface.php | 347 +++ .../react/stream/tests/CallableStub.php | 10 + .../stream/tests/CompositeStreamTest.php | 267 ++ .../DuplexResourceStreamIntegrationTest.php | 390 +++ .../stream/tests/DuplexResourceStreamTest.php | 495 +++ .../stream/tests/EnforceBlockingWrapper.php | 35 + .../stream/tests/FunctionalInternetTest.php | 122 + .../tests/ReadableResourceStreamTest.php | 391 +++ .../stream/tests/Stub/ReadableStreamStub.php | 61 + .../vendor/react/stream/tests/TestCase.php | 54 + .../react/stream/tests/ThroughStreamTest.php | 267 ++ .../vendor/react/stream/tests/UtilTest.php | 273 ++ .../tests/WritableStreamResourceTest.php | 534 ++++ instafeed/vendor/ringcentral/psr7/.gitignore | 11 + instafeed/vendor/ringcentral/psr7/.travis.yml | 21 + .../vendor/ringcentral/psr7/CHANGELOG.md | 28 + instafeed/vendor/ringcentral/psr7/Dockerfile | 5 + instafeed/vendor/ringcentral/psr7/LICENSE | 19 + instafeed/vendor/ringcentral/psr7/Makefile | 21 + instafeed/vendor/ringcentral/psr7/README.md | 587 ++++ .../vendor/ringcentral/psr7/composer.json | 35 + .../vendor/ringcentral/psr7/phpunit.xml.dist | 17 + .../ringcentral/psr7/src/AppendStream.php | 233 ++ .../ringcentral/psr7/src/BufferStream.php | 137 + .../ringcentral/psr7/src/CachingStream.php | 135 + .../ringcentral/psr7/src/DroppingStream.php | 41 + .../vendor/ringcentral/psr7/src/FnStream.php | 163 + .../ringcentral/psr7/src/InflateStream.php | 27 + .../ringcentral/psr7/src/LazyOpenStream.php | 39 + .../ringcentral/psr7/src/LimitStream.php | 154 + .../ringcentral/psr7/src/MessageTrait.php | 167 + .../ringcentral/psr7/src/MultipartStream.php | 152 + .../ringcentral/psr7/src/NoSeekStream.php | 21 + .../ringcentral/psr7/src/PumpStream.php | 165 + .../vendor/ringcentral/psr7/src/Request.php | 146 + .../vendor/ringcentral/psr7/src/Response.php | 129 + .../ringcentral/psr7/src/ServerRequest.php | 122 + .../vendor/ringcentral/psr7/src/Stream.php | 245 ++ .../psr7/src/StreamDecoratorTrait.php | 139 + .../ringcentral/psr7/src/StreamWrapper.php | 121 + instafeed/vendor/ringcentral/psr7/src/Uri.php | 601 ++++ .../vendor/ringcentral/psr7/src/functions.php | 832 +++++ .../psr7/src/functions_include.php | 6 + .../psr7/tests/AppendStreamTest.php | 186 ++ .../psr7/tests/BufferStreamTest.php | 63 + .../psr7/tests/CachingStreamTest.php | 166 + .../psr7/tests/DroppingStreamTest.php | 26 + .../ringcentral/psr7/tests/FnStreamTest.php | 92 + .../ringcentral/psr7/tests/FunctionsTest.php | 604 ++++ .../psr7/tests/InflateStreamTest.php | 21 + .../psr7/tests/LazyOpenStreamTest.php | 64 + .../psr7/tests/LimitStreamTest.php | 166 + .../psr7/tests/MultipartStreamTest.php | 214 ++ .../psr7/tests/NoSeekStreamTest.php | 40 + .../ringcentral/psr7/tests/PumpStreamTest.php | 72 + .../ringcentral/psr7/tests/RequestTest.php | 157 + .../ringcentral/psr7/tests/ResponseTest.php | 154 + .../psr7/tests/ServerRequestTest.php | 85 + .../psr7/tests/StreamDecoratorTraitTest.php | 123 + .../ringcentral/psr7/tests/StreamTest.php | 163 + .../psr7/tests/StreamWrapperTest.php | 100 + .../vendor/ringcentral/psr7/tests/UriTest.php | 258 ++ .../ringcentral/psr7/tests/bootstrap.php | 13 + instafeed/vendor/symfony/process/.gitignore | 3 + instafeed/vendor/symfony/process/CHANGELOG.md | 90 + .../process/Exception/ExceptionInterface.php | 21 + .../Exception/InvalidArgumentException.php | 21 + .../process/Exception/LogicException.php | 21 + .../Exception/ProcessFailedException.php | 54 + .../Exception/ProcessSignaledException.php | 41 + .../Exception/ProcessTimedOutException.php | 69 + .../process/Exception/RuntimeException.php | 21 + .../symfony/process/ExecutableFinder.php | 88 + .../vendor/symfony/process/InputStream.php | 90 + instafeed/vendor/symfony/process/LICENSE | 19 + .../symfony/process/PhpExecutableFinder.php | 101 + .../vendor/symfony/process/PhpProcess.php | 75 + .../symfony/process/Pipes/AbstractPipes.php | 182 ++ .../symfony/process/Pipes/PipesInterface.php | 67 + .../symfony/process/Pipes/UnixPipes.php | 153 + .../symfony/process/Pipes/WindowsPipes.php | 191 ++ instafeed/vendor/symfony/process/Process.php | 1645 ++++++++++ .../vendor/symfony/process/ProcessUtils.php | 69 + instafeed/vendor/symfony/process/README.md | 13 + .../process/Tests/ErrorProcessInitiator.php | 36 + .../process/Tests/ExecutableFinderTest.php | 178 ++ .../Tests/KillableProcessWithOutput.php | 25 + .../process/Tests/NonStopableProcess.php | 47 + .../process/Tests/PhpExecutableFinderTest.php | 49 + .../symfony/process/Tests/PhpProcessTest.php | 63 + .../PipeStdinInStdoutStdErrStreamSelect.php | 72 + .../Tests/ProcessFailedExceptionTest.php | 133 + .../symfony/process/Tests/ProcessTest.php | 1515 ++++++++++ .../symfony/process/Tests/SignalListener.php | 21 + .../vendor/symfony/process/composer.json | 33 + .../vendor/symfony/process/phpunit.xml.dist | 30 + instafeed/vendor/valga/fbns-react/.gitignore | 4 + instafeed/vendor/valga/fbns-react/.php_cs | 20 + instafeed/vendor/valga/fbns-react/LICENSE | 21 + instafeed/vendor/valga/fbns-react/README.md | 84 + .../vendor/valga/fbns-react/bin/thrift_debug | 33 + .../vendor/valga/fbns-react/composer.json | 45 + .../valga/fbns-react/src/Auth/DeviceAuth.php | 162 + .../valga/fbns-react/src/AuthInterface.php | 41 + .../src/Common/PublishAckPacket.php | 30 + .../valga/fbns-react/src/Connection.php | 339 +++ .../vendor/valga/fbns-react/src/Json.php | 28 + .../vendor/valga/fbns-react/src/Lite.php | 379 +++ .../src/Lite/ConnectRequestPacket.php | 198 ++ .../src/Lite/ConnectResponsePacket.php | 145 + .../src/Lite/OutgoingConnectFlow.php | 74 + .../fbns-react/src/Lite/PacketFactory.php | 74 + .../valga/fbns-react/src/Lite/ReactFlow.php | 120 + .../fbns-react/src/Lite/ReactMqttClient.php | 695 +++++ .../fbns-react/src/Lite/StreamParser.php | 102 + .../valga/fbns-react/src/Message/Push.php | 153 + .../valga/fbns-react/src/Message/Register.php | 89 + .../valga/fbns-react/src/Thrift/Compact.php | 24 + .../valga/fbns-react/src/Thrift/Debug.php | 52 + .../valga/fbns-react/src/Thrift/Reader.php | 263 ++ .../valga/fbns-react/src/Thrift/Writer.php | 279 ++ instafeed/vendor/winbox/args/LICENSE | 19 + instafeed/vendor/winbox/args/README.md | 50 + instafeed/vendor/winbox/args/appveyor.yml | 22 + instafeed/vendor/winbox/args/composer.json | 22 + instafeed/vendor/winbox/args/src/Args.php | 57 + log/dreamyourmansion.log | 23 + log/vstbestprices.log | 23 + selenium/__pycache__/pyautogui.cpython-38.pyc | Bin 0 -> 305 bytes selenium/autogui.py | 37 + selenium/cat.jpg | Bin 0 -> 37876 bytes selenium/geckodriver | Bin 0 -> 11222548 bytes selenium/geckodriver.exe | Bin 0 -> 3531472 bytes selenium/get_page_source | 299 ++ .../adobebestprices/db/db_adobebestprices.dat | 1 + ...m Monroe Music Mark 73 v2.5 VST AU AAX.jpg | Bin 0 -> 68203 bytes .../images/Algonaut Atlas v1.4.4 VST WIN.jpg | Bin 0 -> 42009 bytes ... Bass Metal Ray5 v3.1.0 [WIN & MACOSX].jpg | Bin 0 -> 48089 bytes .../images/Ample Bass P v3.2 WIN & MacOS.jpg | Bin 0 -> 45104 bytes ... Ethno Ukulele III v3.2 [WIN & MACOSX].jpg | Bin 0 -> 42894 bytes .../Ample Guitar L v3.3.0 [WIN & MACOSX].jpg | Bin 0 -> 43059 bytes .../Ample Guitar LP v3.2 [WIN & MACOSX].jpg | Bin 0 -> 44292 bytes .../Ample Guitar VC v3.2.0 WIN & MacOSX.jpg | Bin 0 -> 42986 bytes .../Lindell Plugins Bundle 2020 WIN.jpg | Bin 0 -> 75172 bytes ...truments Guitar Rig 6 Pro v6.0.2 [WIN].jpg | Bin 0 -> 58635 bytes ...s Kontakt 6.4.2 [Full Installer] [WIN].jpg | Bin 0 -> 40601 bytes ...ents Traktor Pro 3 v3.4.0 WIN & MACOSX.jpg | Bin 0 -> 49470 bytes ...ler 2 v2.1 VST VST3 AU AAX (WIN & MAC).jpg | Bin 0 -> 37535 bytes .../Scavenger Hunt – Future Nostalgia WAV.jpg | Bin 0 -> 24426 bytes ...emn Tones The Odin II VST2 VST3 AU AAX.jpg | Bin 0 -> 60200 bytes .../StudioLinked Bit Machine VST AU.jpg | Bin 0 -> 23326 bytes ...StudioLinked Dope FX v1.0 [WIN MACOSX].jpg | Bin 0 -> 41180 bytes ...nked Reverse Station v1.0 [WIN MACOSX].png | Bin 0 -> 107074 bytes ...ioLinked Trap Plucks v1.0 [WIN MACOSX].jpg | Bin 0 -> 37156 bytes ...UJAM Beatmaker Bundle 2 VST2 AAX [WIN].jpg | Bin 0 -> 26464 bytes .../UJAM Finisher Bundle VST AAX [WIN].jpg | Bin 0 -> 57544 bytes ...ual Bassist DANDY v2.1.1 VST AAX [WIN].jpg | Bin 0 -> 44314 bytes ...al Bassist MELLOW v2.1.1 VST AAX [WIN].jpg | Bin 0 -> 40757 bytes ...ual Bassist ROWDY v2.1.1 VST AAX [WIN].jpg | Bin 0 -> 40971 bytes ...ual Bassist ROYAL v2.1.1 VST AAX [WIN].jpg | Bin 0 -> 42052 bytes ... Guitarist CARBON v1.0.1 VST AAX [WIN].jpg | Bin 0 -> 47779 bytes .../selenium-server-standalone-3.141.59.jar | Bin 0 -> 10649948 bytes selenium/selenium.pl | 356 +++ src/db/db_dreamyourmansion.dat | 1 + src/db/db_vstbestprices.dat | 1 + src/images/dreamyourmansion/7VPFyhB_j8Y.jpg | Bin 0 -> 271284 bytes src/images/dreamyourmansion/RKdLlTyjm5g.jpg | Bin 0 -> 142895 bytes src/images/dreamyourmansion/UV81E0oXXWQ.jpg | Bin 0 -> 267946 bytes src/mpg25-instagram-api/vendor/autoload.php | 7 + .../binsoul/net-mqtt-client-react/LICENSE.md | 21 + .../binsoul/net-mqtt-client-react/README.md | 145 + .../net-mqtt-client-react/composer.json | 51 + .../net-mqtt-client-react/src/ReactFlow.php | 112 + .../src/ReactMqttClient.php | 701 +++++ .../vendor/binsoul/net-mqtt/LICENSE.md | 21 + .../vendor/binsoul/net-mqtt/README.md | 36 + .../vendor/binsoul/net-mqtt/composer.json | 47 + .../binsoul/net-mqtt/src/Connection.php | 90 + .../net-mqtt/src/DefaultConnection.php | 129 + .../src/DefaultIdentifierGenerator.php | 38 + .../binsoul/net-mqtt/src/DefaultMessage.php | 119 + .../net-mqtt/src/DefaultSubscription.php | 52 + .../src/Exception/EndOfStreamException.php | 10 + .../Exception/MalformedPacketException.php | 10 + .../Exception/UnknownPacketTypeException.php | 10 + .../vendor/binsoul/net-mqtt/src/Flow.php | 71 + .../net-mqtt/src/Flow/AbstractFlow.php | 74 + .../net-mqtt/src/Flow/IncomingPingFlow.php | 23 + .../net-mqtt/src/Flow/IncomingPublishFlow.php | 80 + .../net-mqtt/src/Flow/OutgoingConnectFlow.php | 70 + .../src/Flow/OutgoingDisconnectFlow.php | 37 + .../net-mqtt/src/Flow/OutgoingPingFlow.php | 32 + .../net-mqtt/src/Flow/OutgoingPublishFlow.php | 102 + .../src/Flow/OutgoingSubscribeFlow.php | 82 + .../src/Flow/OutgoingUnsubscribeFlow.php | 61 + .../net-mqtt/src/IdentifierGenerator.php | 23 + .../vendor/binsoul/net-mqtt/src/Message.php | 99 + .../vendor/binsoul/net-mqtt/src/Packet.php | 52 + .../net-mqtt/src/Packet/BasePacket.php | 279 ++ .../src/Packet/ConnectRequestPacket.php | 405 +++ .../src/Packet/ConnectResponsePacket.php | 111 + .../src/Packet/DisconnectRequestPacket.php | 22 + .../src/Packet/IdentifiablePacket.php | 62 + .../src/Packet/IdentifierOnlyPacket.php | 42 + .../net-mqtt/src/Packet/PingRequestPacket.php | 22 + .../src/Packet/PingResponsePacket.php | 22 + .../net-mqtt/src/Packet/PublishAckPacket.php | 13 + .../src/Packet/PublishCompletePacket.php | 13 + .../src/Packet/PublishReceivedPacket.php | 13 + .../src/Packet/PublishReleasePacket.php | 19 + .../src/Packet/PublishRequestPacket.php | 176 ++ .../src/Packet/StrictConnectRequestPacket.php | 66 + .../src/Packet/SubscribeRequestPacket.php | 101 + .../src/Packet/SubscribeResponsePacket.php | 132 + .../src/Packet/UnsubscribeRequestPacket.php | 68 + .../src/Packet/UnsubscribeResponsePacket.php | 13 + .../binsoul/net-mqtt/src/PacketFactory.php | 67 + .../binsoul/net-mqtt/src/PacketStream.php | 216 ++ .../binsoul/net-mqtt/src/StreamParser.php | 90 + .../binsoul/net-mqtt/src/Subscription.php | 41 + .../binsoul/net-mqtt/src/TopicMatcher.php | 53 + .../vendor/clue/http-proxy-react/.gitignore | 2 + .../vendor/clue/http-proxy-react/.travis.yml | 27 + .../vendor/clue/http-proxy-react/CHANGELOG.md | 103 + .../vendor/clue/http-proxy-react/LICENSE | 21 + .../vendor/clue/http-proxy-react/README.md | 422 +++ .../clue/http-proxy-react/composer.json | 30 + .../examples/01-proxy-https.php | 30 + .../examples/02-optional-proxy-https.php | 37 + .../examples/11-proxy-smtp.php | 32 + .../examples/12-proxy-smtps.php | 35 + .../clue/http-proxy-react/phpunit.xml.dist | 14 + .../http-proxy-react/src/ProxyConnector.php | 213 ++ .../tests/AbstractTestCase.php | 80 + .../http-proxy-react/tests/FunctionalTest.php | 75 + .../tests/ProxyConnectorTest.php | 333 ++ .../vendor/clue/socks-react/.gitignore | 2 + .../vendor/clue/socks-react/.travis.yml | 27 + .../vendor/clue/socks-react/CHANGELOG.md | 338 +++ .../vendor/clue/socks-react/LICENSE | 21 + .../vendor/clue/socks-react/README.md | 1017 +++++++ .../vendor/clue/socks-react/composer.json | 28 + .../clue/socks-react/examples/01-http.php | 30 + .../clue/socks-react/examples/02-https.php | 30 + .../examples/03-proxy-chaining.php | 46 + .../socks-react/examples/04-local-dns.php | 31 + .../clue/socks-react/examples/11-server.php | 19 + .../examples/12-server-with-password.php | 24 + .../examples/13-server-blacklist.php | 40 + .../examples/21-server-proxy-chaining.php | 42 + ...server-proxy-chaining-from-random-pool.php | 46 + .../socks-react/examples/31-server-secure.php | 21 + .../socks-react/examples/32-http-secure.php | 33 + .../clue/socks-react/examples/localhost.pem | 49 + .../vendor/clue/socks-react/phpunit.xml.dist | 14 + .../vendor/clue/socks-react/src/Client.php | 382 +++ .../vendor/clue/socks-react/src/Server.php | 422 +++ .../clue/socks-react/src/StreamReader.php | 149 + .../clue/socks-react/tests/ClientTest.php | 403 +++ .../clue/socks-react/tests/FunctionalTest.php | 437 +++ .../clue/socks-react/tests/ServerTest.php | 428 +++ .../socks-react/tests/StreamReaderTest.php | 82 + .../clue/socks-react/tests/bootstrap.php | 103 + .../vendor/composer/ClassLoader.php | 445 +++ .../vendor/composer/LICENSE | 56 + .../vendor/composer/autoload_classmap.php | 9 + .../vendor/composer/autoload_files.php | 16 + .../vendor/composer/autoload_namespaces.php | 10 + .../vendor/composer/autoload_psr4.php | 32 + .../vendor/composer/autoload_real.php | 70 + .../vendor/composer/autoload_static.php | 189 ++ .../vendor/composer/installed.json | 1328 ++++++++ .../vendor/corneltek/getoptionkit/.gitignore | 3 + .../vendor/corneltek/getoptionkit/.travis.yml | 29 + .../corneltek/getoptionkit/CHANGELOG.md | 56 + .../corneltek/getoptionkit/CONTRIBUTORS.txt | 11 + .../vendor/corneltek/getoptionkit/LICENSE | 19 + .../vendor/corneltek/getoptionkit/README.md | 370 +++ .../vendor/corneltek/getoptionkit/build.xml | 185 ++ .../corneltek/getoptionkit/composer.json | 16 + .../corneltek/getoptionkit/composer.lock | 19 + .../corneltek/getoptionkit/examples/demo.php | 76 + .../vendor/corneltek/getoptionkit/package.ini | 15 + .../vendor/corneltek/getoptionkit/phpdox.xml | 16 + .../corneltek/getoptionkit/phprelease.ini | 2 + .../corneltek/getoptionkit/phpunit-ci.xml | 29 + .../corneltek/getoptionkit/phpunit.xml.dist | 29 + .../corneltek/getoptionkit/src/Argument.php | 119 + .../src/ContinuousOptionParser.php | 201 ++ .../src/Exception/InvalidOptionException.php | 18 + .../Exception/InvalidOptionValueException.php | 18 + .../src/Exception/NonNumericException.php | 18 + .../src/Exception/OptionConflictException.php | 18 + .../src/Exception/RequireValueException.php | 18 + .../corneltek/getoptionkit/src/Option.php | 557 ++++ .../getoptionkit/src/OptionCollection.php | 207 ++ .../getoptionkit/src/OptionParser.php | 193 ++ .../OptionPrinter/ConsoleOptionPrinter.php | 56 + .../src/OptionPrinter/OptionPrinter.php | 12 + .../getoptionkit/src/OptionResult.php | 157 + .../getoptionkit/src/ValueType/BaseType.php | 34 + .../getoptionkit/src/ValueType/BoolType.php | 10 + .../src/ValueType/BooleanType.php | 30 + .../src/ValueType/DateTimeType.php | 22 + .../getoptionkit/src/ValueType/DateType.php | 20 + .../getoptionkit/src/ValueType/DirType.php | 18 + .../getoptionkit/src/ValueType/EmailType.php | 16 + .../getoptionkit/src/ValueType/FileType.php | 18 + .../getoptionkit/src/ValueType/IpType.php | 16 + .../getoptionkit/src/ValueType/Ipv4Type.php | 16 + .../getoptionkit/src/ValueType/Ipv6Type.php | 16 + .../getoptionkit/src/ValueType/NumberType.php | 16 + .../getoptionkit/src/ValueType/PathType.php | 18 + .../getoptionkit/src/ValueType/RegexType.php | 24 + .../getoptionkit/src/ValueType/StringType.php | 16 + .../getoptionkit/src/ValueType/UrlType.php | 16 + .../getoptionkit/tests/ArgumentTest.php | 56 + .../tests/ContinuousOptionParserTest.php | 335 ++ .../tests/OptionCollectionTest.php | 46 + .../getoptionkit/tests/OptionParserTest.php | 477 +++ .../ConsoleOptionPrinterTest.php | 32 + .../getoptionkit/tests/OptionResultTest.php | 32 + .../getoptionkit/tests/OptionTest.php | 227 ++ .../getoptionkit/tests/RegexValueTypeTest.php | 26 + .../getoptionkit/tests/ValueTypeTest.php | 200 ++ .../vendor/evenement/evenement/.gitignore | 2 + .../vendor/evenement/evenement/.travis.yml | 24 + .../vendor/evenement/evenement/CHANGELOG.md | 35 + .../vendor/evenement/evenement/LICENSE | 19 + .../vendor/evenement/evenement/README.md | 83 + .../vendor/evenement/evenement/composer.json | 29 + .../evenement/evenement/doc/00-intro.md | 28 + .../vendor/evenement/evenement/doc/01-api.md | 91 + .../evenement/doc/02-plugin-system.md | 155 + .../examples/benchmark-emit-no-arguments.php | 28 + .../examples/benchmark-emit-once.php | 30 + .../examples/benchmark-emit-one-argument.php | 28 + .../evenement/examples/benchmark-emit.php | 28 + .../benchmark-remove-listener-once.php | 39 + .../evenement/evenement/phpunit.xml.dist | 24 + .../evenement/src/Evenement/EventEmitter.php | 17 + .../src/Evenement/EventEmitterInterface.php | 22 + .../src/Evenement/EventEmitterTrait.php | 135 + .../Evenement/Tests/EventEmitterTest.php | 438 +++ .../tests/Evenement/Tests/Listener.php | 51 + .../tests/Evenement/Tests/functions.php | 17 + .../vendor/guzzlehttp/guzzle/.php_cs | 21 + .../vendor/guzzlehttp/guzzle/CHANGELOG.md | 1304 ++++++++ .../vendor/guzzlehttp/guzzle/Dockerfile | 18 + .../vendor/guzzlehttp/guzzle/LICENSE | 19 + .../vendor/guzzlehttp/guzzle/README.md | 90 + .../vendor/guzzlehttp/guzzle/UPGRADING.md | 1203 ++++++++ .../vendor/guzzlehttp/guzzle/composer.json | 58 + .../guzzlehttp/guzzle/phpstan.neon.dist | 9 + .../vendor/guzzlehttp/guzzle/src/Client.php | 422 +++ .../guzzlehttp/guzzle/src/ClientInterface.php | 84 + .../guzzle/src/Cookie/CookieJar.php | 314 ++ .../guzzle/src/Cookie/CookieJarInterface.php | 84 + .../guzzle/src/Cookie/FileCookieJar.php | 91 + .../guzzle/src/Cookie/SessionCookieJar.php | 72 + .../guzzle/src/Cookie/SetCookie.php | 403 +++ .../src/Exception/BadResponseException.php | 27 + .../guzzle/src/Exception/ClientException.php | 9 + .../guzzle/src/Exception/ConnectException.php | 37 + .../guzzle/src/Exception/GuzzleException.php | 23 + .../Exception/InvalidArgumentException.php | 7 + .../guzzle/src/Exception/RequestException.php | 217 ++ .../guzzle/src/Exception/SeekException.php | 27 + .../guzzle/src/Exception/ServerException.php | 9 + .../Exception/TooManyRedirectsException.php | 6 + .../src/Exception/TransferException.php | 6 + .../guzzle/src/Handler/CurlFactory.php | 580 ++++ .../src/Handler/CurlFactoryInterface.php | 27 + .../guzzle/src/Handler/CurlHandler.php | 45 + .../guzzle/src/Handler/CurlMultiHandler.php | 205 ++ .../guzzle/src/Handler/EasyHandle.php | 92 + .../guzzle/src/Handler/MockHandler.php | 190 ++ .../guzzlehttp/guzzle/src/Handler/Proxy.php | 55 + .../guzzle/src/Handler/StreamHandler.php | 544 ++++ .../guzzlehttp/guzzle/src/HandlerStack.php | 273 ++ .../guzzle/src/MessageFormatter.php | 180 ++ .../guzzlehttp/guzzle/src/Middleware.php | 254 ++ .../vendor/guzzlehttp/guzzle/src/Pool.php | 123 + .../guzzle/src/PrepareBodyMiddleware.php | 106 + .../guzzle/src/RedirectMiddleware.php | 237 ++ .../guzzlehttp/guzzle/src/RequestOptions.php | 255 ++ .../guzzlehttp/guzzle/src/RetryMiddleware.php | 115 + .../guzzlehttp/guzzle/src/TransferStats.php | 126 + .../guzzlehttp/guzzle/src/UriTemplate.php | 237 ++ .../guzzlehttp/guzzle/src/functions.php | 346 +++ .../guzzle/src/functions_include.php | 6 + .../vendor/guzzlehttp/promises/CHANGELOG.md | 65 + .../vendor/guzzlehttp/promises/LICENSE | 19 + .../vendor/guzzlehttp/promises/Makefile | 13 + .../vendor/guzzlehttp/promises/README.md | 504 +++ .../vendor/guzzlehttp/promises/composer.json | 34 + .../promises/src/AggregateException.php | 16 + .../promises/src/CancellationException.php | 9 + .../guzzlehttp/promises/src/Coroutine.php | 151 + .../guzzlehttp/promises/src/EachPromise.php | 229 ++ .../promises/src/FulfilledPromise.php | 82 + .../guzzlehttp/promises/src/Promise.php | 280 ++ .../promises/src/PromiseInterface.php | 93 + .../promises/src/PromisorInterface.php | 15 + .../promises/src/RejectedPromise.php | 87 + .../promises/src/RejectionException.php | 47 + .../guzzlehttp/promises/src/TaskQueue.php | 66 + .../promises/src/TaskQueueInterface.php | 25 + .../guzzlehttp/promises/src/functions.php | 457 +++ .../promises/src/functions_include.php | 6 + .../vendor/guzzlehttp/psr7/CHANGELOG.md | 246 ++ .../vendor/guzzlehttp/psr7/LICENSE | 19 + .../vendor/guzzlehttp/psr7/README.md | 745 +++++ .../vendor/guzzlehttp/psr7/composer.json | 49 + .../guzzlehttp/psr7/src/AppendStream.php | 241 ++ .../guzzlehttp/psr7/src/BufferStream.php | 137 + .../guzzlehttp/psr7/src/CachingStream.php | 138 + .../guzzlehttp/psr7/src/DroppingStream.php | 42 + .../vendor/guzzlehttp/psr7/src/FnStream.php | 158 + .../guzzlehttp/psr7/src/InflateStream.php | 52 + .../guzzlehttp/psr7/src/LazyOpenStream.php | 39 + .../guzzlehttp/psr7/src/LimitStream.php | 155 + .../guzzlehttp/psr7/src/MessageTrait.php | 213 ++ .../guzzlehttp/psr7/src/MultipartStream.php | 153 + .../guzzlehttp/psr7/src/NoSeekStream.php | 22 + .../vendor/guzzlehttp/psr7/src/PumpStream.php | 165 + .../vendor/guzzlehttp/psr7/src/Request.php | 151 + .../vendor/guzzlehttp/psr7/src/Response.php | 154 + .../vendor/guzzlehttp/psr7/src/Rfc7230.php | 18 + .../guzzlehttp/psr7/src/ServerRequest.php | 376 +++ .../vendor/guzzlehttp/psr7/src/Stream.php | 267 ++ .../psr7/src/StreamDecoratorTrait.php | 149 + .../guzzlehttp/psr7/src/StreamWrapper.php | 161 + .../guzzlehttp/psr7/src/UploadedFile.php | 316 ++ .../vendor/guzzlehttp/psr7/src/Uri.php | 760 +++++ .../guzzlehttp/psr7/src/UriNormalizer.php | 216 ++ .../guzzlehttp/psr7/src/UriResolver.php | 219 ++ .../vendor/guzzlehttp/psr7/src/functions.php | 899 ++++++ .../guzzlehttp/psr7/src/functions_include.php | 6 + .../lazyjsonmapper/.ac-php-conf.json | 14 + .../lazyjsonmapper/lazyjsonmapper/.gitignore | 40 + .../lazyjsonmapper/.php_cs.dist | 54 + .../lazyjsonmapper/.pre-commit.hook | 67 + .../lazyjsonmapper/lazyjsonmapper/LICENSE | 201 ++ .../lazyjsonmapper/lazyjsonmapper/NOTICE | 5 + .../lazyjsonmapper/lazyjsonmapper/README.md | 211 ++ .../lazyjsonmapper/bin/lazydoctor | 738 +++++ .../lazyjsonmapper/composer.json | 48 + .../lazyjsonmapper/devtools/checkStyle.php | 225 ++ .../devtools/funcListData.serialized | 1 + .../devtools/junk/testLazyJsonMapper.php | 1897 ++++++++++++ .../junk/testPropertyDefinitionNamespaces.php | 173 ++ .../devtools/junk/testUserFeatureToggling.php | 205 ++ .../devtools/nonRecursiveArrays.php | 402 +++ .../devtools/prefixSplitAlgorithms.php | 270 ++ .../lazyjsonmapper/examples/basic_example.php | 103 + .../examples/import_example.php | 42 + .../examples/inheritance_example.php | 51 + .../examples/unpredictable_data.php | 705 +++++ .../lazyjsonmapper/phpdoc.dist.xml | 24 + .../lazyjsonmapper/phpunit.xml.dist | 9 + .../BadPropertyDefinitionException.php | 29 + .../src/Exception/BadPropertyMapException.php | 29 + .../CircularPropertyMapException.php | 100 + .../src/Exception/LazyJsonMapperException.php | 29 + .../Exception/LazySerializationException.php | 40 + .../src/Exception/LazyUserException.php | 42 + .../src/Exception/LazyUserOptionException.php | 95 + .../Exception/MagicTranslationException.php | 29 + .../Exception/SpanishInquisitionException.php | 33 + .../src/Export/ClassAnalysis.php | 208 ++ .../src/Export/PropertyDescription.php | 250 ++ .../lazyjsonmapper/src/LazyJsonMapper.php | 2692 +++++++++++++++++ .../src/Magic/FunctionTranslation.php | 314 ++ .../src/Magic/PropertyTranslation.php | 191 ++ .../src/Magic/SpecialOperators.php | 169 ++ .../src/Property/PropertyDefinition.php | 325 ++ .../src/Property/PropertyMapCache.php | 73 + .../src/Property/PropertyMapCompiler.php | 1274 ++++++++ .../src/Property/UndefinedProperty.php | 79 + .../src/Property/ValueConverter.php | 441 +++ .../lazyjsonmapper/src/Utilities.php | 180 ++ .../lazyjsonmapper/tests/bootstrap.php | 18 + .../mgp25/instagram-php/.ac-php-conf.json | 17 + .../instagram-php/.github/ISSUE_TEMPLATE.md | 112 + .../.github/ISSUE_TEMPLATE/bug-report.md | 42 + .../.github/ISSUE_TEMPLATE/feature-request.md | 26 + .../.github/ISSUE_TEMPLATE/question.md | 42 + .../vendor/mgp25/instagram-php/.gitignore | 49 + .../vendor/mgp25/instagram-php/.php_cs.dist | 38 + .../mgp25/instagram-php/.pre-commit.hook | 58 + .../mgp25/instagram-php/CODE_OF_CONDUCT.md | 46 + .../mgp25/instagram-php/CONTRIBUTING.md | 488 +++ .../vendor/mgp25/instagram-php/Dockerfile | 37 + .../vendor/mgp25/instagram-php/LICENSE | 546 ++++ .../mgp25/instagram-php/LICENSE_PREMIUM | 16 + .../vendor/mgp25/instagram-php/README.md | 135 + .../vendor/mgp25/instagram-php/composer.json | 81 + .../mgp25/instagram-php/devtools/README.md | 7 + .../instagram-php/devtools/checkDevices.php | 229 ++ .../devtools/checkExperiments.php | 150 + .../instagram-php/devtools/checkStyle.php | 203 ++ .../devtools/testInstagramPhoto.php | 66 + .../mgp25/instagram-php/examples/README.md | 17 + .../examples/accessingValues.php | 74 + .../examples/assets/instagram.png | Bin 0 -> 7810 bytes .../instagram-php/examples/customSettings.php | 147 + .../examples/exceptionDetailsExample.php | 83 + .../instagram-php/examples/liveBroadcast.php | 137 + .../examples/paginateWithExclusion.php | 57 + .../examples/paginationExample.php | 53 + .../instagram-php/examples/pushReceiver.php | 80 + .../instagram-php/examples/rankTokenUsage.php | 57 + .../instagram-php/examples/realtimeClient.php | 100 + .../instagram-php/examples/realtimeHttp.php | 287 ++ .../examples/sharePhotoToStoryFeed.php | 71 + .../examples/shortcodeConverter.php | 29 + .../instagram-php/examples/twoFactorLogin.php | 31 + .../instagram-php/examples/uploadAlbum.php | 109 + .../instagram-php/examples/uploadPhoto.php | 62 + .../instagram-php/examples/uploadStory.php | 102 + .../examples/uploadStoryCountdown.php | 67 + .../examples/uploadStoryFundraiser.php | 54 + .../examples/uploadStoryPoll.php | 78 + .../examples/uploadStoryQuestion.php | 69 + .../examples/uploadStorySlider.php | 71 + .../instagram-php/examples/uploadVideo.php | 46 + .../extradocs/Push_setPreferences.txt | 90 + .../instagram-php/src/AutoPropertyMapper.php | 22 + .../vendor/mgp25/instagram-php/src/Client.php | 850 ++++++ .../mgp25/instagram-php/src/Constants.php | 103 + .../vendor/mgp25/instagram-php/src/Debug.php | 67 + .../instagram-php/src/Devices/Device.php | 268 ++ .../src/Devices/DeviceInterface.php | 93 + .../instagram-php/src/Devices/GoodDevices.php | 190 ++ .../instagram-php/src/Devices/UserAgent.php | 129 + .../Exception/AccountDisabledException.php | 7 + .../src/Exception/BadRequestException.php | 11 + .../Exception/ChallengeRequiredException.php | 7 + .../Exception/CheckpointRequiredException.php | 7 + .../Exception/ConsentRequiredException.php | 7 + .../src/Exception/EmptyResponseException.php | 10 + .../src/Exception/EndpointException.php | 21 + .../Exception/FeedbackRequiredException.php | 7 + .../ForcedPasswordResetException.php | 7 + .../Exception/IncorrectPasswordException.php | 7 + .../src/Exception/InstagramException.php | 53 + .../src/Exception/InternalException.php | 10 + .../src/Exception/InvalidSmsCodeException.php | 7 + .../src/Exception/InvalidUserException.php | 7 + .../src/Exception/LoginRequiredException.php | 11 + .../src/Exception/NetworkException.php | 63 + .../src/Exception/NotFoundException.php | 11 + .../src/Exception/RequestException.php | 10 + .../RequestHeadersTooLargeException.php | 11 + .../src/Exception/SentryBlockException.php | 7 + .../src/Exception/ServerMessageThrower.php | 235 ++ .../src/Exception/SettingsException.php | 10 + .../src/Exception/ThrottledException.php | 11 + .../src/Exception/UploadFailedException.php | 13 + .../src/ExperimentsInterface.php | 34 + .../mgp25/instagram-php/src/Instagram.php | 1246 ++++++++ .../mgp25/instagram-php/src/InstagramID.php | 249 ++ .../Media/Constraints/AlbumConstraints.php | 10 + .../Media/Constraints/ConstraintsFactory.php | 45 + .../Media/Constraints/DirectConstraints.php | 41 + .../Constraints/DirectStoryConstraints.php | 27 + .../Media/Constraints/StoryConstraints.php | 137 + .../Media/Constraints/TimelineConstraints.php | 115 + .../src/Media/Constraints/TvConstraints.php | 83 + .../src/Media/ConstraintsInterface.php | 65 + .../src/Media/Geometry/Dimensions.php | 98 + .../src/Media/Geometry/Rectangle.php | 179 ++ .../src/Media/InstagramMedia.php | 1456 +++++++++ .../instagram-php/src/Media/MediaDetails.php | 172 ++ .../src/Media/Photo/InstagramPhoto.php | 326 ++ .../src/Media/Photo/PhotoDetails.php | 177 ++ .../instagram-php/src/Media/Video/FFmpeg.php | 244 ++ .../src/Media/Video/InstagramThumbnail.php | 155 + .../src/Media/Video/InstagramVideo.php | 263 ++ .../src/Media/Video/VideoDetails.php | 348 +++ .../src/Middleware/FakeCookies.php | 172 ++ .../src/Middleware/ZeroRating.php | 120 + .../vendor/mgp25/instagram-php/src/Push.php | 286 ++ .../mgp25/instagram-php/src/Push/Fbns.php | 194 ++ .../instagram-php/src/Push/Fbns/Auth.php | 89 + .../instagram-php/src/Push/Notification.php | 316 ++ .../src/Push/Payload/BadgeCount.php | 89 + .../instagram-php/src/React/Connector.php | 223 ++ .../src/React/PersistentInterface.php | 49 + .../src/React/PersistentTrait.php | 79 + .../mgp25/instagram-php/src/Realtime.php | 495 +++ .../Command/Direct/IndicateActivity.php | 35 + .../src/Realtime/Command/Direct/MarkSeen.php | 35 + .../Realtime/Command/Direct/SendHashtag.php | 42 + .../src/Realtime/Command/Direct/SendItem.php | 58 + .../src/Realtime/Command/Direct/SendLike.php | 23 + .../Realtime/Command/Direct/SendLocation.php | 32 + .../src/Realtime/Command/Direct/SendPost.php | 32 + .../Realtime/Command/Direct/SendProfile.php | 32 + .../Realtime/Command/Direct/SendReaction.php | 75 + .../src/Realtime/Command/Direct/SendStory.php | 32 + .../src/Realtime/Command/Direct/SendText.php | 34 + .../src/Realtime/Command/Direct/ShareItem.php | 30 + .../src/Realtime/Command/DirectCommand.php | 191 ++ .../src/Realtime/Command/IrisSubscribe.php | 50 + .../Realtime/Command/UpdateSubscriptions.php | 93 + .../src/Realtime/CommandInterface.php | 20 + .../src/Realtime/Handler/AbstractHandler.php | 37 + .../src/Realtime/Handler/DirectHandler.php | 543 ++++ .../src/Realtime/Handler/HandlerException.php | 7 + .../src/Realtime/Handler/IrisHandler.php | 27 + .../src/Realtime/Handler/LiveHandler.php | 81 + .../src/Realtime/Handler/PresenceHandler.php | 25 + .../Realtime/Handler/RegionHintHandler.php | 22 + .../Realtime/Handler/ZeroProvisionHandler.php | 24 + .../src/Realtime/HandlerInterface.php | 18 + .../instagram-php/src/Realtime/Message.php | 46 + .../mgp25/instagram-php/src/Realtime/Mqtt.php | 803 +++++ .../instagram-php/src/Realtime/Mqtt/Auth.php | 74 + .../src/Realtime/Mqtt/Capabilities.php | 33 + .../src/Realtime/Mqtt/Config.php | 20 + .../src/Realtime/Mqtt/PacketFactory.php | 77 + .../src/Realtime/Mqtt/QosLevel.php | 9 + .../src/Realtime/Mqtt/StreamParser.php | 107 + .../src/Realtime/Mqtt/Topics.php | 57 + .../src/Realtime/Parser/GraphQlParser.php | 82 + .../src/Realtime/Parser/IrisParser.php | 34 + .../src/Realtime/Parser/JsonParser.php | 41 + .../src/Realtime/Parser/RegionHintParser.php | 54 + .../src/Realtime/Parser/SkywalkerParser.php | 82 + .../src/Realtime/ParserInterface.php | 19 + .../src/Realtime/Payload/Action/AckAction.php | 33 + .../src/Realtime/Payload/Event/PatchEvent.php | 44 + .../Realtime/Payload/Event/PatchEventOp.php | 45 + .../src/Realtime/Payload/IrisSubscribeAck.php | 35 + .../src/Realtime/Payload/LiveBroadcast.php | 40 + .../src/Realtime/Payload/RealtimeAction.php | 29 + .../src/Realtime/Payload/RealtimeEvent.php | 27 + .../src/Realtime/Payload/StoryScreenshot.php | 28 + .../src/Realtime/Payload/ThreadAction.php | 25 + .../src/Realtime/Payload/ThreadActivity.php | 35 + .../Realtime/Payload/ZeroProvisionEvent.php | 30 + .../GraphQl/AppPresenceSubscription.php | 30 + .../GraphQl/DirectTypingSubscription.php | 29 + .../GraphQl/ZeroProvisionSubscription.php | 32 + .../Subscription/GraphQlSubscription.php | 46 + .../Skywalker/DirectSubscription.php | 23 + .../Skywalker/LiveSubscription.php | 23 + .../Subscription/SkywalkerSubscription.php | 35 + .../src/Realtime/SubscriptionInterface.php | 27 + .../mgp25/instagram-php/src/Request.php | 837 +++++ .../instagram-php/src/Request/Account.php | 779 +++++ .../instagram-php/src/Request/Business.php | 85 + .../instagram-php/src/Request/Collection.php | 181 ++ .../instagram-php/src/Request/Creative.php | 123 + .../instagram-php/src/Request/Direct.php | 1550 ++++++++++ .../instagram-php/src/Request/Discover.php | 192 ++ .../instagram-php/src/Request/Hashtag.php | 375 +++ .../instagram-php/src/Request/Highlight.php | 173 ++ .../instagram-php/src/Request/Internal.php | 2596 ++++++++++++++++ .../mgp25/instagram-php/src/Request/Live.php | 696 +++++ .../instagram-php/src/Request/Location.php | 329 ++ .../mgp25/instagram-php/src/Request/Media.php | 848 ++++++ .../src/Request/Metadata/Internal.php | 291 ++ .../instagram-php/src/Request/People.php | 1265 ++++++++ .../mgp25/instagram-php/src/Request/Push.php | 78 + .../src/Request/RequestCollection.php | 104 + .../instagram-php/src/Request/Shopping.php | 123 + .../mgp25/instagram-php/src/Request/Story.php | 693 +++++ .../mgp25/instagram-php/src/Request/TV.php | 171 ++ .../instagram-php/src/Request/Timeline.php | 512 ++++ .../instagram-php/src/Request/Usertag.php | 144 + .../mgp25/instagram-php/src/Response.php | 141 + .../src/Response/AccountCreateResponse.php | 37 + .../src/Response/AccountDetailsResponse.php | 52 + .../Response/AccountSecurityInfoResponse.php | 57 + .../src/Response/ActiveFeedAdsResponse.php | 42 + .../src/Response/ActiveReelAdsResponse.php | 42 + .../src/Response/ActivityNewsResponse.php | 77 + .../src/Response/ArchiveMediaResponse.php | 25 + .../Response/ArchivedStoriesFeedResponse.php | 47 + .../Response/ArlinkDownloadInfoResponse.php | 47 + .../Response/BadgeNotificationsResponse.php | 37 + .../src/Response/BlockedListResponse.php | 42 + .../src/Response/BlockedMediaResponse.php | 32 + .../src/Response/BlockedReelsResponse.php | 45 + .../src/Response/BootstrapUsersResponse.php | 37 + .../Response/BroadcastCommentsResponse.php | 95 + ...oadcastHeartbeatAndViewerCountResponse.php | 67 + .../src/Response/BroadcastInfoResponse.php | 132 + .../BroadcastJoinRequestCountResponse.php | 52 + .../Response/BroadcastLikeCountResponse.php | 47 + .../src/Response/BroadcastLikeResponse.php | 32 + .../Response/BroadcastQuestionsResponse.php | 32 + .../CapabilitiesDecisionsResponse.php | 32 + .../src/Response/ChallengeResponse.php | 25 + .../src/Response/ChangePasswordResponse.php | 25 + .../src/Response/CharitiesListResponse.php | 42 + .../src/Response/CheckEmailResponse.php | 52 + .../src/Response/CheckUsernameResponse.php | 47 + .../src/Response/CloseFriendsResponse.php | 49 + .../src/Response/CollectionFeedResponse.php | 67 + .../src/Response/CommentBroadcastResponse.php | 32 + .../CommentCategoryFilterResponse.php | 32 + .../CommentFilterKeywordsResponse.php | 32 + .../src/Response/CommentFilterResponse.php | 32 + .../src/Response/CommentFilterSetResponse.php | 25 + .../Response/CommentLikeUnlikeResponse.php | 25 + .../src/Response/CommentLikersResponse.php | 32 + .../src/Response/CommentResponse.php | 32 + .../src/Response/ConfigureResponse.php | 47 + .../Response/CreateBusinessInfoResponse.php | 32 + .../src/Response/CreateCollectionResponse.php | 40 + .../src/Response/CreateHighlightResponse.php | 32 + .../src/Response/CreateLiveResponse.php | 157 + .../src/Response/DeleteCollectionResponse.php | 25 + .../src/Response/DeleteCommentResponse.php | 25 + .../DirectCreateGroupThreadResponse.php | 112 + .../src/Response/DirectInboxResponse.php | 67 + .../Response/DirectPendingInboxResponse.php | 42 + .../DirectRankedRecipientsResponse.php | 52 + .../DirectRecentRecipientsResponse.php | 37 + .../src/Response/DirectSeenItemResponse.php | 37 + .../src/Response/DirectSendItemResponse.php | 42 + .../src/Response/DirectSendItemsResponse.php | 42 + .../src/Response/DirectShareInboxResponse.php | 57 + .../src/Response/DirectThreadResponse.php | 32 + .../Response/DirectVisualThreadResponse.php | 192 ++ .../Response/DisableTwoFactorSMSResponse.php | 25 + .../src/Response/DiscoverChannelsResponse.php | 47 + .../src/Response/DiscoverPeopleResponse.php | 47 + .../src/Response/DiscoverTopLiveResponse.php | 57 + .../src/Response/EditCollectionResponse.php | 40 + .../src/Response/EditMediaResponse.php | 32 + .../EnableDisableLiveCommentsResponse.php | 32 + .../Response/EnableTwoFactorSMSResponse.php | 32 + .../src/Response/ExploreResponse.php | 67 + .../src/Response/FBLocationResponse.php | 42 + .../src/Response/FBSearchResponse.php | 48 + .../src/Response/FaceEffectsResponse.php | 42 + .../src/Response/FaceModelsResponse.php | 32 + .../FacebookHiddenEntitiesResponse.php | 32 + .../src/Response/FacebookOTAResponse.php | 37 + .../src/Response/FetchQPDataResponse.php | 52 + .../src/Response/FinalViewerListResponse.php | 37 + .../Response/FollowerAndFollowingResponse.php | 57 + .../FollowingRecentActivityResponse.php | 47 + .../src/Response/FormerUsernamesResponse.php | 32 + .../src/Response/FriendshipResponse.php | 32 + .../Response/FriendshipsShowManyResponse.php | 32 + .../src/Response/FriendshipsShowResponse.php | 72 + .../src/Response/GenericResponse.php | 27 + .../Response/GetCollectionsListResponse.php | 47 + .../src/Response/GraphqlResponse.php | 82 + .../src/Response/HashtagsResponse.php | 32 + .../src/Response/HighlightFeedResponse.php | 57 + .../src/Response/InsightsResponse.php | 32 + .../src/Response/LauncherSyncResponse.php | 32 + .../src/Response/LikeFeedResponse.php | 62 + .../src/Response/LinkAddressBookResponse.php | 32 + .../src/Response/LinkageStatusResponse.php | 32 + .../src/Response/LocationFeedResponse.php | 52 + .../src/Response/LocationResponse.php | 37 + .../src/Response/LocationStoryResponse.php | 32 + .../src/Response/LoginResponse.php | 157 + .../src/Response/LogoutResponse.php | 25 + .../src/Response/LoomFetchConfigResponse.php | 47 + .../Response/MediaCommentRepliesResponse.php | 85 + .../src/Response/MediaCommentsResponse.php | 87 + .../src/Response/MediaDeleteResponse.php | 32 + .../src/Response/MediaInfoResponse.php | 47 + .../src/Response/MediaInsightsResponse.php | 32 + .../src/Response/MediaLikersResponse.php | 37 + .../src/Response/MediaSeenResponse.php | 25 + .../src/Response/MegaphoneLogResponse.php | 32 + .../Model/AccountAccessToolConfig.php | 30 + .../src/Response/Model/AccountSummaryUnit.php | 20 + .../src/Response/Model/Action.php | 35 + .../src/Response/Model/ActionBadge.php | 41 + .../src/Response/Model/ActionLog.php | 25 + .../src/Response/Model/Ad4ad.php | 45 + .../src/Response/Model/AdMetadata.php | 25 + .../src/Response/Model/AdsInfo.php | 25 + .../src/Response/Model/AndroidLinks.php | 75 + .../src/Response/Model/AnimatedMedia.php | 25 + .../src/Response/Model/AnimatedMediaImage.php | 20 + .../Model/AnimatedMediaImageFixedHeigth.php | 55 + .../Model/ArchivedStoriesFeedItem.php | 40 + .../instagram-php/src/Response/Model/Args.php | 135 + .../src/Response/Model/AssetModel.php | 25 + .../src/Response/Model/Attribution.php | 20 + .../src/Response/Model/AudioContext.php | 25 + .../instagram-php/src/Response/Model/Aymf.php | 25 + .../src/Response/Model/AymfItem.php | 731 +++++ .../src/Response/Model/Badging.php | 25 + .../src/Response/Model/BiographyEntities.php | 30 + .../src/Response/Model/BlockedReels.php | 30 + .../instagram-php/src/Response/Model/Bold.php | 25 + .../src/Response/Model/Broadcast.php | 151 + .../src/Response/Model/BroadcastQuestion.php | 45 + .../Response/Model/BroadcastStatusItem.php | 40 + .../src/Response/Model/BusinessEdge.php | 25 + .../src/Response/Model/BusinessFeed.php | 20 + .../src/Response/Model/BusinessManager.php | 50 + .../Response/Model/BusinessManagerStatus.php | 25 + .../src/Response/Model/BusinessNode.php | 190 ++ .../src/Response/Model/Button.php | 50 + .../src/Response/Model/Caption.php | 85 + .../src/Response/Model/CarouselMedia.php | 196 ++ .../src/Response/Model/CatalogData.php | 25 + .../src/Response/Model/CatalogEdge.php | 20 + .../src/Response/Model/CatalogNode.php | 50 + .../src/Response/Model/ChainingInfo.php | 20 + .../src/Response/Model/ChainingSuggestion.php | 587 ++++ .../src/Response/Model/Challenge.php | 45 + .../src/Response/Model/Channel.php | 50 + .../src/Response/Model/CloseFriends.php | 35 + .../src/Response/Model/Collection.php | 30 + .../src/Response/Model/Comment.php | 196 ++ .../src/Response/Model/CommentInfo.php | 60 + .../Response/Model/CommentTranslations.php | 25 + .../src/Response/Model/Composer.php | 25 + .../src/Response/Model/ContextualFilters.php | 30 + .../src/Response/Model/CountdownSticker.php | 90 + .../src/Response/Model/Counts.php | 55 + .../src/Response/Model/CoverMedia.php | 63 + .../src/Response/Model/Creative.php | 56 + .../src/Response/Model/DataGraph.php | 25 + .../src/Response/Model/DataPoints.php | 25 + .../src/Response/Model/DirectCursor.php | 25 + .../Response/Model/DirectExpiringSummary.php | 30 + .../src/Response/Model/DirectInbox.php | 50 + .../src/Response/Model/DirectLink.php | 25 + .../Response/Model/DirectMessageMetadata.php | 35 + .../Response/Model/DirectRankedRecipient.php | 25 + .../src/Response/Model/DirectReaction.php | 50 + .../src/Response/Model/DirectReactions.php | 25 + .../Response/Model/DirectSeenItemPayload.php | 25 + .../Response/Model/DirectSendItemPayload.php | 55 + .../src/Response/Model/DirectThread.php | 220 ++ .../src/Response/Model/DirectThreadItem.php | 185 ++ .../Response/Model/DirectThreadItemMedia.php | 54 + .../Response/Model/DirectThreadLastSeenAt.php | 25 + .../src/Response/Model/DismissCard.php | 50 + .../src/Response/Model/Edges.php | 30 + .../src/Response/Model/Effect.php | 50 + .../src/Response/Model/EligiblePromotions.php | 20 + .../Response/Model/EndOfFeedDemarcator.php | 30 + .../src/Response/Model/Experiment.php | 45 + .../src/Response/Model/Explore.php | 30 + .../src/Response/Model/ExploreItem.php | 35 + .../src/Response/Model/ExploreItemInfo.php | 40 + .../src/Response/Model/FaceModels.php | 30 + .../src/Response/Model/FacebookUser.php | 25 + .../src/Response/Model/FeedAysf.php | 75 + .../src/Response/Model/FeedItem.php | 45 + .../src/Response/Model/FelixShare.php | 25 + .../src/Response/Model/FillItems.php | 20 + .../src/Response/Model/FollowersUnit.php | 60 + .../src/Response/Model/FormerUsername.php | 25 + .../src/Response/Model/FormerUsernameInfo.php | 20 + .../src/Response/Model/FriendshipStatus.php | 70 + .../src/Response/Model/FullItem.php | 20 + .../src/Response/Model/Gating.php | 35 + .../src/Response/Model/GenericMegaphone.php | 85 + .../src/Response/Model/GraphData.php | 50 + .../src/Response/Model/GraphNode.php | 30 + .../src/Response/Model/Groups.php | 25 + .../src/Response/Model/Hashtag.php | 65 + .../src/Response/Model/Headline.php | 70 + .../src/Response/Model/HiddenEntities.php | 34 + .../src/Response/Model/HideReason.php | 31 + .../src/Response/Model/IOSLinks.php | 25 + .../Response/Model/IabAutofillOptoutInfo.php | 25 + .../src/Response/Model/Image.php | 30 + .../src/Response/Model/ImageCandidate.php | 35 + .../src/Response/Model/Image_Versions2.php | 25 + .../instagram-php/src/Response/Model/In.php | 45 + .../src/Response/Model/Injected.php | 120 + .../src/Response/Model/InlineFollow.php | 30 + .../src/Response/Model/Insights.php | 20 + .../instagram-php/src/Response/Model/Item.php | 959 ++++++ .../src/Response/Model/LayoutContent.php | 55 + .../instagram-php/src/Response/Model/Link.php | 45 + .../src/Response/Model/LinkContext.php | 35 + .../src/Response/Model/LiveComment.php | 30 + .../src/Response/Model/LiveVideoShare.php | 30 + .../src/Response/Model/LiveViewerInvite.php | 40 + .../src/Response/Model/Location.php | 157 + .../src/Response/Model/LocationItem.php | 35 + .../src/Response/Model/MeGraphData.php | 25 + .../src/Response/Model/Media.php | 40 + .../src/Response/Model/MediaCroppingInfo.php | 20 + .../src/Response/Model/MediaData.php | 43 + .../src/Response/Model/MediaInsights.php | 50 + .../src/Response/Model/MediaShare.php | 25 + .../src/Response/Model/Megaphone.php | 20 + .../src/Response/Model/Nametag.php | 40 + .../src/Response/Model/Owner.php | 60 + .../src/Response/Model/PageInfo.php | 30 + .../src/Response/Model/Param.php | 25 + .../src/Response/Model/Participants.php | 30 + .../src/Response/Model/PermanentItem.php | 90 + .../Model/PhoneVerificationSettings.php | 35 + .../src/Response/Model/Placeholder.php | 30 + .../src/Response/Model/PostLive.php | 20 + .../src/Response/Model/PostLiveItem.php | 65 + .../src/Response/Model/Prefill.php | 25 + .../src/Response/Model/PrimaryCountryInfo.php | 30 + .../src/Response/Model/Product.php | 84 + .../src/Response/Model/ProductImage.php | 20 + .../src/Response/Model/ProductShare.php | 30 + .../src/Response/Model/ProductTags.php | 20 + .../src/Response/Model/PromotionsUnit.php | 20 + .../src/Response/Model/PushSettings.php | 45 + .../src/Response/Model/QPData.php | 25 + .../src/Response/Model/QPExtraInfo.php | 25 + .../src/Response/Model/QPNode.php | 50 + .../src/Response/Model/QPSurface.php | 25 + .../src/Response/Model/QPViewerData.php | 20 + .../src/Response/Model/QueryResponse.php | 20 + .../src/Response/Model/QuestionSticker.php | 56 + .../src/Response/Model/QuizSticker.php | 70 + .../src/Response/Model/Ranking.php | 30 + .../instagram-php/src/Response/Model/Reel.php | 107 + .../src/Response/Model/ReelMention.php | 65 + .../src/Response/Model/ReelShare.php | 70 + .../src/Response/Model/Related.php | 30 + .../src/Response/Model/Responder.php | 40 + .../src/Response/Model/RewriteRule.php | 25 + .../src/Response/Model/SavedFeedItem.php | 20 + .../src/Response/Model/Section.php | 50 + .../src/Response/Model/SectionMedia.php | 20 + .../src/Response/Model/ServerDataInfo.php | 30 + .../Response/Model/ShadowInstagramUser.php | 50 + .../Response/Model/SharePrefillEntities.php | 20 + .../src/Response/Model/SharedFollower.php | 65 + .../Model/SharedFollowerAccountsInfo.php | 20 + .../instagram-php/src/Response/Model/Slot.php | 25 + .../src/Response/Model/StaticStickers.php | 30 + .../src/Response/Model/StepData.php | 80 + .../src/Response/Model/Stickers.php | 55 + .../src/Response/Model/Stories.php | 35 + .../src/Response/Model/StoriesNetego.php | 30 + .../src/Response/Model/Story.php | 40 + .../Response/Model/StoryAppAttribution.php | 45 + .../src/Response/Model/StoryCountdowns.php | 60 + .../src/Response/Model/StoryCta.php | 25 + .../src/Response/Model/StoryHashtag.php | 70 + .../src/Response/Model/StoryLocation.php | 65 + .../Model/StoryQuestionResponderInfos.php | 65 + .../src/Response/Model/StoryQuestions.php | 60 + .../Model/StoryQuizParticipantInfo.php | 35 + .../src/Response/Model/StoryQuizs.php | 65 + .../src/Response/Model/StoryShare.php | 40 + .../src/Response/Model/StoryTray.php | 162 + .../src/Response/Model/StoryTvChannel.php | 55 + .../src/Response/Model/Subscription.php | 35 + .../src/Response/Model/Suggested.php | 40 + .../src/Response/Model/SuggestedUsers.php | 75 + .../src/Response/Model/Suggestion.php | 75 + .../src/Response/Model/SuggestionCard.php | 30 + .../src/Response/Model/SummaryPromotions.php | 25 + .../Response/Model/SupportedCapabilities.php | 25 + .../src/Response/Model/Surface.php | 39 + .../src/Response/Model/SystemControl.php | 30 + .../src/Response/Model/TVChannel.php | 55 + .../src/Response/Model/TVSearchResult.php | 40 + .../instagram-php/src/Response/Model/Tab.php | 25 + .../src/Response/Model/TabsInfo.php | 25 + .../instagram-php/src/Response/Model/Tag.php | 105 + .../src/Response/Model/Tallies.php | 25 + .../src/Response/Model/Template.php | 25 + .../instagram-php/src/Response/Model/Text.php | 20 + .../src/Response/Model/Thumbnail.php | 65 + .../src/Response/Model/TimeRange.php | 25 + .../src/Response/Model/Token.php | 82 + .../src/Response/Model/TopLive.php | 25 + .../src/Response/Model/TraceControl.php | 35 + .../src/Response/Model/TraySuggestions.php | 40 + .../src/Response/Model/TwoFactorInfo.php | 35 + .../CoreUnpredictableContainer.php | 95 + ...ThreadLastSeenAtUnpredictableContainer.php | 13 + ...FriendshipStatusUnpredictableContainer.php | 13 + .../MediaUnpredictableContainer.php | 13 + .../PresenceUnpredictableContainer.php | 11 + .../ReelUnpredictableContainer.php | 11 + .../UserUnpredictableContainer.php | 13 + .../instagram-php/src/Response/Model/User.php | 726 +++++ .../src/Response/Model/UserCard.php | 80 + .../src/Response/Model/UserList.php | 25 + .../src/Response/Model/UserPresence.php | 35 + .../src/Response/Model/Usertag.php | 25 + .../src/Response/Model/VideoCallEvent.php | 31 + .../src/Response/Model/VideoUploadUrl.php | 30 + .../src/Response/Model/VideoVersions.php | 40 + .../src/Response/Model/Viewer.php | 20 + .../src/Response/Model/VoiceMedia.php | 20 + .../src/Response/Model/Voter.php | 25 + .../src/Response/Model/VoterInfo.php | 35 + .../src/Response/Model/_Message.php | 25 + .../src/Response/MsisdnHeaderResponse.php | 47 + .../MultipleAccountFamilyResponse.php | 37 + .../src/Response/MutedReelsResponse.php | 47 + .../src/Response/OnBoardCatalogResponse.php | 42 + .../src/Response/OnTagProductResponse.php | 42 + .../src/Response/PermalinkResponse.php | 32 + .../Response/PinCommentBroadcastResponse.php | 32 + .../src/Response/PopularFeedResponse.php | 57 + .../src/Response/PostLiveCommentsResponse.php | 52 + .../src/Response/PostLiveLikesResponse.php | 47 + .../Response/PostLiveViewerListResponse.php | 42 + .../Response/PrefillCandidatesResponse.php | 32 + .../src/Response/PresenceStatusResponse.php | 37 + .../src/Response/PresencesResponse.php | 32 + .../src/Response/ProfileNoticeResponse.php | 32 + .../Response/PropertyCollection/Sticker.php | 53 + .../src/Response/PushPreferencesResponse.php | 117 + .../src/Response/PushRegisterResponse.php | 25 + .../src/Response/QPCooldownsResponse.php | 52 + .../src/Response/RecentSearchesResponse.php | 32 + .../src/Response/RecoveryResponse.php | 42 + .../src/Response/ReelMediaViewerResponse.php | 62 + .../src/Response/ReelSettingsResponse.php | 37 + .../src/Response/ReelsMediaResponse.php | 37 + .../src/Response/ReelsTrayFeedResponse.php | 72 + .../src/Response/RelatedLocationResponse.php | 32 + .../Response/ReportExploreMediaResponse.php | 32 + .../src/Response/ResumableOffsetResponse.php | 52 + .../src/Response/ResumableUploadResponse.php | 37 + .../src/Response/ReviewPreferenceResponse.php | 32 + .../src/Response/SaveAndUnsaveMedia.php | 25 + .../src/Response/SavedFeedResponse.php | 52 + .../src/Response/SearchTagResponse.php | 42 + .../src/Response/SearchUserResponse.php | 47 + .../src/Response/SegmentedStartResponse.php | 52 + .../src/Response/SendConfirmEmailResponse.php | 42 + .../src/Response/SendSMSCodeResponse.php | 37 + .../SendTwoFactorEnableSMSResponse.php | 37 + .../src/Response/SharePrefillResponse.php | 42 + .../src/Response/SharedFollowersResponse.php | 32 + .../src/Response/StartLiveResponse.php | 32 + .../src/Response/StickerAssetsResponse.php | 37 + .../src/Response/StoryAnswersResponse.php | 32 + .../src/Response/StoryCountdownsResponse.php | 32 + .../src/Response/StoryPollVotersResponse.php | 32 + .../Response/SuggestedBroadcastsResponse.php | 32 + .../Response/SuggestedSearchesResponse.php | 37 + .../Response/SuggestedUsersBadgeResponse.php | 37 + .../src/Response/SuggestedUsersResponse.php | 37 + .../SwitchBusinessProfileResponse.php | 32 + .../SwitchPersonalProfileResponse.php | 32 + .../src/Response/SyncResponse.php | 32 + .../src/Response/TVChannelsResponse.php | 67 + .../src/Response/TVGuideResponse.php | 52 + .../src/Response/TVSearchResponse.php | 42 + .../src/Response/TagFeedResponse.php | 77 + .../src/Response/TagInfoResponse.php | 68 + .../src/Response/TagRelatedResponse.php | 32 + .../src/Response/TagsStoryResponse.php | 32 + .../src/Response/TimelineFeedResponse.php | 98 + .../src/Response/TokenResultResponse.php | 32 + .../src/Response/TopLiveStatusResponse.php | 32 + .../src/Response/TranslateResponse.php | 32 + .../Response/TwoFactorLoginSMSResponse.php | 37 + .../Response/UnlinkAddressBookResponse.php | 25 + .../UnpinCommentBroadcastResponse.php | 32 + .../src/Response/UploadJobVideoResponse.php | 37 + .../src/Response/UploadPhotoResponse.php | 37 + .../src/Response/UploadVideoResponse.php | 42 + .../src/Response/UserFeedResponse.php | 57 + .../src/Response/UserInfoResponse.php | 42 + .../Response/UserReelMediaFeedResponse.php | 96 + .../src/Response/UserStoryFeedResponse.php | 42 + .../src/Response/UsersLookupResponse.php | 77 + .../src/Response/UsertagsResponse.php | 67 + .../src/Response/ValidateURLResponse.php | 25 + .../src/Response/VerifySMSCodeResponse.php | 37 + .../src/Response/ViewerListResponse.php | 32 + .../WriteSuppotedCapabilitiesResponse.php | 32 + .../instagram-php/src/Settings/Factory.php | 262 ++ .../Storage/Components/PDOStorage.php | 394 +++ .../src/Settings/Storage/File.php | 385 +++ .../src/Settings/Storage/Memcached.php | 345 +++ .../src/Settings/Storage/MySQL.php | 101 + .../src/Settings/Storage/SQLite.php | 115 + .../src/Settings/StorageHandler.php | 803 +++++ .../src/Settings/StorageInterface.php | 264 ++ .../mgp25/instagram-php/src/Signatures.php | 111 + .../vendor/mgp25/instagram-php/src/Utils.php | 1515 ++++++++++ .../tests/React/ConnectorTest.php | 211 ++ .../Realtime/Command/IndicateActivityTest.php | 57 + .../Realtime/Command/IrisSubscribeTest.php | 22 + .../tests/Realtime/Command/MarkSeenTest.php | 55 + .../Realtime/Command/SendHashtagTest.php | 105 + .../tests/Realtime/Command/SendLikeTest.php | 48 + .../Realtime/Command/SendLocationTest.php | 75 + .../tests/Realtime/Command/SendPostTest.php | 75 + .../Realtime/Command/SendProfileTest.php | 75 + .../Realtime/Command/SendReactionTest.php | 85 + .../tests/Realtime/Command/SendStoryTest.php | 75 + .../tests/Realtime/Command/SendTextTest.php | 62 + .../Command/UpdateSubscriptionsTest.php | 22 + .../tests/Realtime/Handler/DirectTest.php | 308 ++ .../Realtime/Handler/IrisHandlerTest.php | 77 + .../tests/Realtime/Handler/LiveTest.php | 74 + .../tests/Realtime/Handler/PresenceTest.php | 63 + .../tests/Realtime/Handler/RegionHintTest.php | 71 + .../Realtime/Subscription/AppPresenceTest.php | 18 + .../Subscription/ZeroProvisionTest.php | 18 + .../tests/Response/ExceptionsTest.php | 112 + .../vendor/mgp25/instagram-php/webwarning.htm | 9 + .../vendor/psr/http-message/CHANGELOG.md | 36 + .../vendor/psr/http-message/LICENSE | 19 + .../vendor/psr/http-message/README.md | 13 + .../vendor/psr/http-message/composer.json | 26 + .../psr/http-message/src/MessageInterface.php | 187 ++ .../psr/http-message/src/RequestInterface.php | 129 + .../http-message/src/ResponseInterface.php | 68 + .../src/ServerRequestInterface.php | 261 ++ .../psr/http-message/src/StreamInterface.php | 158 + .../src/UploadedFileInterface.php | 123 + .../psr/http-message/src/UriInterface.php | 323 ++ .../vendor/psr/log/.gitignore | 1 + .../vendor/psr/log/LICENSE | 19 + .../vendor/psr/log/Psr/Log/AbstractLogger.php | 128 + .../log/Psr/Log/InvalidArgumentException.php | 7 + .../vendor/psr/log/Psr/Log/LogLevel.php | 18 + .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 + .../psr/log/Psr/Log/LoggerAwareTrait.php | 26 + .../psr/log/Psr/Log/LoggerInterface.php | 125 + .../vendor/psr/log/Psr/Log/LoggerTrait.php | 142 + .../vendor/psr/log/Psr/Log/NullLogger.php | 30 + .../log/Psr/Log/Test/LoggerInterfaceTest.php | 145 + .../psr/log/Psr/Log/Test/TestLogger.php | 147 + .../vendor/psr/log/README.md | 52 + .../vendor/psr/log/composer.json | 26 + .../vendor/ralouphie/getallheaders/LICENSE | 21 + .../vendor/ralouphie/getallheaders/README.md | 27 + .../ralouphie/getallheaders/composer.json | 26 + .../getallheaders/src/getallheaders.php | 46 + .../vendor/react/cache/.gitignore | 2 + .../vendor/react/cache/.travis.yml | 32 + .../vendor/react/cache/CHANGELOG.md | 74 + .../vendor/react/cache/LICENSE | 19 + .../vendor/react/cache/README.md | 366 +++ .../vendor/react/cache/composer.json | 19 + .../vendor/react/cache/phpunit.xml.dist | 20 + .../vendor/react/cache/src/ArrayCache.php | 181 ++ .../vendor/react/cache/src/CacheInterface.php | 194 ++ .../react/cache/tests/ArrayCacheTest.php | 322 ++ .../vendor/react/cache/tests/CallableStub.php | 10 + .../vendor/react/cache/tests/TestCase.php | 54 + .../vendor/react/dns/.gitignore | 2 + .../vendor/react/dns/.travis.yml | 32 + .../vendor/react/dns/CHANGELOG.md | 261 ++ .../vendor/react/dns/LICENSE | 19 + .../vendor/react/dns/README.md | 344 +++ .../vendor/react/dns/composer.json | 24 + .../vendor/react/dns/examples/01-one.php | 22 + .../react/dns/examples/02-concurrent.php | 27 + .../vendor/react/dns/examples/03-cached.php | 40 + .../vendor/react/dns/examples/11-all-ips.php | 31 + .../react/dns/examples/12-all-types.php | 25 + .../react/dns/examples/13-reverse-dns.php | 35 + .../dns/examples/91-query-a-and-aaaa.php | 29 + .../react/dns/examples/92-query-any.php | 71 + .../vendor/react/dns/phpunit.xml.dist | 24 + .../react/dns/src/BadServerException.php | 7 + .../vendor/react/dns/src/Config/Config.php | 127 + .../dns/src/Config/FilesystemFactory.php | 73 + .../vendor/react/dns/src/Config/HostsFile.php | 151 + .../vendor/react/dns/src/Model/HeaderBag.php | 59 + .../vendor/react/dns/src/Model/Message.php | 188 ++ .../vendor/react/dns/src/Model/Record.php | 105 + .../react/dns/src/Protocol/BinaryDumper.php | 163 + .../vendor/react/dns/src/Protocol/Parser.php | 395 +++ .../react/dns/src/Query/CachedExecutor.php | 59 + .../react/dns/src/Query/CachingExecutor.php | 88 + .../dns/src/Query/CancellationException.php | 7 + .../react/dns/src/Query/CoopExecutor.php | 92 + .../vendor/react/dns/src/Query/Executor.php | 160 + .../react/dns/src/Query/ExecutorInterface.php | 8 + .../react/dns/src/Query/HostsFileExecutor.php | 89 + .../vendor/react/dns/src/Query/Query.php | 33 + .../vendor/react/dns/src/Query/RecordBag.php | 30 + .../react/dns/src/Query/RecordCache.php | 122 + .../react/dns/src/Query/RetryExecutor.php | 79 + .../react/dns/src/Query/TimeoutException.php | 7 + .../react/dns/src/Query/TimeoutExecutor.php | 32 + .../dns/src/Query/UdpTransportExecutor.php | 181 ++ .../react/dns/src/RecordNotFoundException.php | 7 + .../vendor/react/dns/src/Resolver/Factory.php | 102 + .../react/dns/src/Resolver/Resolver.php | 250 ++ .../vendor/react/dns/tests/CallableStub.php | 10 + .../react/dns/tests/Config/ConfigTest.php | 189 ++ .../tests/Config/FilesystemFactoryTest.php | 70 + .../react/dns/tests/Config/HostsFileTest.php | 170 ++ .../react/dns/tests/Fixtures/etc/resolv.conf | 1 + .../dns/tests/FunctionalResolverTest.php | 171 ++ .../react/dns/tests/Model/MessageTest.php | 31 + .../dns/tests/Protocol/BinaryDumperTest.php | 278 ++ .../react/dns/tests/Protocol/ParserTest.php | 1033 +++++++ .../dns/tests/Query/CachedExecutorTest.php | 100 + .../dns/tests/Query/CachingExecutorTest.php | 183 ++ .../dns/tests/Query/CoopExecutorTest.php | 233 ++ .../react/dns/tests/Query/ExecutorTest.php | 308 ++ .../dns/tests/Query/HostsFileExecutorTest.php | 126 + .../react/dns/tests/Query/RecordBagTest.php | 83 + .../react/dns/tests/Query/RecordCacheTest.php | 160 + .../dns/tests/Query/RetryExecutorTest.php | 350 +++ .../dns/tests/Query/TimeoutExecutorTest.php | 115 + .../tests/Query/UdpTransportExecutorTest.php | 215 ++ .../react/dns/tests/Resolver/FactoryTest.php | 120 + .../dns/tests/Resolver/ResolveAliasesTest.php | 101 + .../react/dns/tests/Resolver/ResolverTest.php | 251 ++ .../vendor/react/dns/tests/TestCase.php | 61 + .../vendor/react/event-loop/.gitignore | 3 + .../vendor/react/event-loop/.travis.yml | 27 + .../vendor/react/event-loop/CHANGELOG.md | 79 + .../vendor/react/event-loop/LICENSE | 19 + .../vendor/react/event-loop/README.md | 143 + .../vendor/react/event-loop/composer.json | 22 + .../vendor/react/event-loop/phpunit.xml.dist | 25 + .../react/event-loop/src/ExtEventLoop.php | 326 ++ .../vendor/react/event-loop/src/Factory.php | 21 + .../vendor/react/event-loop/src/LibEvLoop.php | 226 ++ .../react/event-loop/src/LibEventLoop.php | 343 +++ .../react/event-loop/src/LoopInterface.php | 121 + .../react/event-loop/src/StreamSelectLoop.php | 273 ++ .../event-loop/src/Tick/FutureTickQueue.php | 59 + .../event-loop/src/Tick/NextTickQueue.php | 57 + .../react/event-loop/src/Timer/Timer.php | 102 + .../event-loop/src/Timer/TimerInterface.php | 62 + .../react/event-loop/src/Timer/Timers.php | 100 + .../event-loop/tests/AbstractLoopTest.php | 539 ++++ .../react/event-loop/tests/CallableStub.php | 10 + .../event-loop/tests/ExtEventLoopTest.php | 90 + .../react/event-loop/tests/LibEvLoopTest.php | 22 + .../event-loop/tests/LibEventLoopTest.php | 58 + .../event-loop/tests/StreamSelectLoopTest.php | 179 ++ .../react/event-loop/tests/TestCase.php | 41 + .../tests/Timer/AbstractTimerTest.php | 97 + .../tests/Timer/ExtEventTimerTest.php | 17 + .../event-loop/tests/Timer/LibEvTimerTest.php | 17 + .../tests/Timer/LibEventTimerTest.php | 17 + .../tests/Timer/StreamSelectTimerTest.php | 13 + .../event-loop/tests/Timer/TimersTest.php | 29 + .../react/event-loop/tests/bootstrap.php | 7 + .../vendor/react/event-loop/travis-init.sh | 37 + .../vendor/react/promise-timer/.gitignore | 2 + .../vendor/react/promise-timer/.travis.yml | 26 + .../vendor/react/promise-timer/CHANGELOG.md | 63 + .../vendor/react/promise-timer/LICENSE | 21 + .../vendor/react/promise-timer/README.md | 372 +++ .../vendor/react/promise-timer/composer.json | 28 + .../react/promise-timer/phpunit.xml.dist | 19 + .../promise-timer/src/TimeoutException.php | 22 + .../react/promise-timer/src/functions.php | 81 + .../promise-timer/src/functions_include.php | 7 + .../promise-timer/tests/CallableStub.php | 10 + .../tests/FunctionRejectTest.php | 79 + .../tests/FunctionResolveTest.php | 101 + .../tests/FunctionTimeoutTest.php | 286 ++ .../react/promise-timer/tests/TestCase.php | 61 + .../tests/TimeoutExceptionTest.php | 15 + .../vendor/react/promise/.gitignore | 5 + .../vendor/react/promise/.travis.yml | 28 + .../vendor/react/promise/CHANGELOG.md | 135 + .../vendor/react/promise/LICENSE | 22 + .../vendor/react/promise/README.md | 870 ++++++ .../vendor/react/promise/composer.json | 29 + .../vendor/react/promise/phpunit.xml.dist | 28 + .../src/CancellablePromiseInterface.php | 11 + .../react/promise/src/CancellationQueue.php | 55 + .../vendor/react/promise/src/Deferred.php | 65 + .../promise/src/Exception/LengthException.php | 7 + .../promise/src/ExtendedPromiseInterface.php | 30 + .../react/promise/src/FulfilledPromise.php | 68 + .../vendor/react/promise/src/LazyPromise.php | 63 + .../vendor/react/promise/src/Promise.php | 256 ++ .../react/promise/src/PromiseInterface.php | 14 + .../react/promise/src/PromisorInterface.php | 11 + .../react/promise/src/RejectedPromise.php | 76 + .../src/UnhandledRejectionException.php | 31 + .../vendor/react/promise/src/functions.php | 246 ++ .../react/promise/src/functions_include.php | 5 + .../promise/tests/CancellationQueueTest.php | 100 + .../react/promise/tests/DeferredTest.php | 112 + .../promise/tests/FulfilledPromiseTest.php | 76 + .../react/promise/tests/FunctionAllTest.php | 114 + .../react/promise/tests/FunctionAnyTest.php | 204 ++ .../tests/FunctionCheckTypehintTest.php | 118 + .../react/promise/tests/FunctionMapTest.php | 198 ++ .../react/promise/tests/FunctionRaceTest.php | 211 ++ .../promise/tests/FunctionReduceTest.php | 347 +++ .../promise/tests/FunctionRejectTest.php | 64 + .../promise/tests/FunctionResolveTest.php | 171 ++ .../react/promise/tests/FunctionSomeTest.php | 258 ++ .../react/promise/tests/LazyPromiseTest.php | 107 + .../PromiseAdapter/CallbackPromiseAdapter.php | 40 + .../PromiseAdapterInterface.php | 14 + .../react/promise/tests/PromiseTest.php | 293 ++ .../tests/PromiseTest/CancelTestTrait.php | 246 ++ .../tests/PromiseTest/FullTestTrait.php | 15 + .../tests/PromiseTest/NotifyTestTrait.php | 336 ++ .../PromiseTest/PromiseFulfilledTestTrait.php | 351 +++ .../PromiseTest/PromisePendingTestTrait.php | 68 + .../PromiseTest/PromiseRejectedTestTrait.php | 512 ++++ .../PromiseTest/PromiseSettledTestTrait.php | 86 + .../tests/PromiseTest/RejectTestTrait.php | 368 +++ .../tests/PromiseTest/ResolveTestTrait.php | 312 ++ .../promise/tests/RejectedPromiseTest.php | 76 + .../react/promise/tests/Stub/CallableStub.php | 10 + .../vendor/react/promise/tests/TestCase.php | 43 + .../vendor/react/promise/tests/bootstrap.php | 7 + .../fixtures/SimpleFulfilledTestPromise.php | 21 + .../fixtures/SimpleFulfilledTestThenable.php | 21 + .../fixtures/SimpleRejectedTestPromise.php | 21 + .../tests/fixtures/SimpleTestCancellable.php | 13 + .../SimpleTestCancellableThenable.php | 18 + .../vendor/react/socket/.gitignore | 2 + .../vendor/react/socket/.travis.yml | 48 + .../vendor/react/socket/CHANGELOG.md | 465 +++ .../vendor/react/socket/LICENSE | 19 + .../vendor/react/socket/README.md | 1419 +++++++++ .../vendor/react/socket/composer.json | 29 + .../react/socket/examples/01-echo-server.php | 42 + .../react/socket/examples/02-chat-server.php | 59 + .../react/socket/examples/03-http-server.php | 57 + .../react/socket/examples/11-http-client.php | 36 + .../react/socket/examples/12-https-client.php | 36 + .../socket/examples/21-netcat-client.php | 68 + .../react/socket/examples/22-http-client.php | 60 + .../socket/examples/91-benchmark-server.php | 60 + .../examples/99-generate-self-signed.php | 31 + .../react/socket/examples/localhost.pem | 49 + .../socket/examples/localhost_swordfish.pem | 51 + .../vendor/react/socket/phpunit.xml.dist | 25 + .../vendor/react/socket/src/Connection.php | 178 ++ .../react/socket/src/ConnectionInterface.php | 119 + .../vendor/react/socket/src/Connector.php | 136 + .../react/socket/src/ConnectorInterface.php | 58 + .../vendor/react/socket/src/DnsConnector.php | 112 + .../react/socket/src/FixedUriConnector.php | 41 + .../react/socket/src/LimitingServer.php | 203 ++ .../react/socket/src/SecureConnector.php | 64 + .../vendor/react/socket/src/SecureServer.php | 192 ++ .../vendor/react/socket/src/Server.php | 73 + .../react/socket/src/ServerInterface.php | 151 + .../react/socket/src/StreamEncryption.php | 146 + .../vendor/react/socket/src/TcpConnector.php | 129 + .../vendor/react/socket/src/TcpServer.php | 236 ++ .../react/socket/src/TimeoutConnector.php | 25 + .../vendor/react/socket/src/UnixConnector.php | 44 + .../vendor/react/socket/src/UnixServer.php | 130 + .../react/socket/tests/ConnectionTest.php | 47 + .../react/socket/tests/ConnectorTest.php | 128 + .../react/socket/tests/DnsConnectorTest.php | 111 + .../socket/tests/FixedUriConnectorTest.php | 19 + .../socket/tests/FunctionalConnectorTest.php | 32 + .../tests/FunctionalSecureServerTest.php | 438 +++ .../socket/tests/FunctionalTcpServerTest.php | 324 ++ .../react/socket/tests/IntegrationTest.php | 328 ++ .../react/socket/tests/LimitingServerTest.php | 195 ++ .../socket/tests/SecureConnectorTest.php | 74 + .../socket/tests/SecureIntegrationTest.php | 204 ++ .../react/socket/tests/SecureServerTest.php | 105 + .../vendor/react/socket/tests/ServerTest.php | 173 ++ .../react/socket/tests/Stub/CallableStub.php | 10 + .../socket/tests/Stub/ConnectionStub.php | 63 + .../react/socket/tests/Stub/ServerStub.php | 18 + .../react/socket/tests/TcpConnectorTest.php | 260 ++ .../react/socket/tests/TcpServerTest.php | 285 ++ .../vendor/react/socket/tests/TestCase.php | 101 + .../socket/tests/TimeoutConnectorTest.php | 103 + .../react/socket/tests/UnixConnectorTest.php | 64 + .../react/socket/tests/UnixServerTest.php | 283 ++ .../vendor/react/stream/.gitignore | 2 + .../vendor/react/stream/.travis.yml | 51 + .../vendor/react/stream/CHANGELOG.md | 398 +++ .../vendor/react/stream/LICENSE | 19 + .../vendor/react/stream/README.md | 1225 ++++++++ .../vendor/react/stream/composer.json | 25 + .../vendor/react/stream/examples/01-http.php | 40 + .../vendor/react/stream/examples/02-https.php | 40 + .../vendor/react/stream/examples/11-cat.php | 28 + .../examples/91-benchmark-throughput.php | 62 + .../vendor/react/stream/phpunit.xml.dist | 25 + .../react/stream/src/CompositeStream.php | 82 + .../react/stream/src/DuplexResourceStream.php | 224 ++ .../stream/src/DuplexStreamInterface.php | 39 + .../stream/src/ReadableResourceStream.php | 177 ++ .../stream/src/ReadableStreamInterface.php | 362 +++ .../vendor/react/stream/src/ThroughStream.php | 190 ++ .../vendor/react/stream/src/Util.php | 75 + .../stream/src/WritableResourceStream.php | 171 ++ .../stream/src/WritableStreamInterface.php | 347 +++ .../react/stream/tests/CallableStub.php | 10 + .../stream/tests/CompositeStreamTest.php | 267 ++ .../DuplexResourceStreamIntegrationTest.php | 390 +++ .../stream/tests/DuplexResourceStreamTest.php | 495 +++ .../stream/tests/EnforceBlockingWrapper.php | 35 + .../stream/tests/FunctionalInternetTest.php | 122 + .../tests/ReadableResourceStreamTest.php | 391 +++ .../stream/tests/Stub/ReadableStreamStub.php | 61 + .../vendor/react/stream/tests/TestCase.php | 54 + .../react/stream/tests/ThroughStreamTest.php | 267 ++ .../vendor/react/stream/tests/UtilTest.php | 273 ++ .../tests/WritableStreamResourceTest.php | 534 ++++ .../vendor/ringcentral/psr7/.gitignore | 11 + .../vendor/ringcentral/psr7/.travis.yml | 21 + .../vendor/ringcentral/psr7/CHANGELOG.md | 28 + .../vendor/ringcentral/psr7/Dockerfile | 5 + .../vendor/ringcentral/psr7/LICENSE | 19 + .../vendor/ringcentral/psr7/Makefile | 21 + .../vendor/ringcentral/psr7/README.md | 587 ++++ .../vendor/ringcentral/psr7/composer.json | 35 + .../vendor/ringcentral/psr7/phpunit.xml.dist | 17 + .../ringcentral/psr7/src/AppendStream.php | 233 ++ .../ringcentral/psr7/src/BufferStream.php | 137 + .../ringcentral/psr7/src/CachingStream.php | 135 + .../ringcentral/psr7/src/DroppingStream.php | 41 + .../vendor/ringcentral/psr7/src/FnStream.php | 163 + .../ringcentral/psr7/src/InflateStream.php | 27 + .../ringcentral/psr7/src/LazyOpenStream.php | 39 + .../ringcentral/psr7/src/LimitStream.php | 154 + .../ringcentral/psr7/src/MessageTrait.php | 167 + .../ringcentral/psr7/src/MultipartStream.php | 152 + .../ringcentral/psr7/src/NoSeekStream.php | 21 + .../ringcentral/psr7/src/PumpStream.php | 165 + .../vendor/ringcentral/psr7/src/Request.php | 146 + .../vendor/ringcentral/psr7/src/Response.php | 129 + .../ringcentral/psr7/src/ServerRequest.php | 122 + .../vendor/ringcentral/psr7/src/Stream.php | 245 ++ .../psr7/src/StreamDecoratorTrait.php | 139 + .../ringcentral/psr7/src/StreamWrapper.php | 121 + .../vendor/ringcentral/psr7/src/Uri.php | 601 ++++ .../vendor/ringcentral/psr7/src/functions.php | 832 +++++ .../psr7/src/functions_include.php | 6 + .../psr7/tests/AppendStreamTest.php | 186 ++ .../psr7/tests/BufferStreamTest.php | 63 + .../psr7/tests/CachingStreamTest.php | 166 + .../psr7/tests/DroppingStreamTest.php | 26 + .../ringcentral/psr7/tests/FnStreamTest.php | 92 + .../ringcentral/psr7/tests/FunctionsTest.php | 604 ++++ .../psr7/tests/InflateStreamTest.php | 21 + .../psr7/tests/LazyOpenStreamTest.php | 64 + .../psr7/tests/LimitStreamTest.php | 166 + .../psr7/tests/MultipartStreamTest.php | 214 ++ .../psr7/tests/NoSeekStreamTest.php | 40 + .../ringcentral/psr7/tests/PumpStreamTest.php | 72 + .../ringcentral/psr7/tests/RequestTest.php | 157 + .../ringcentral/psr7/tests/ResponseTest.php | 154 + .../psr7/tests/ServerRequestTest.php | 85 + .../psr7/tests/StreamDecoratorTraitTest.php | 123 + .../ringcentral/psr7/tests/StreamTest.php | 163 + .../psr7/tests/StreamWrapperTest.php | 100 + .../vendor/ringcentral/psr7/tests/UriTest.php | 258 ++ .../ringcentral/psr7/tests/bootstrap.php | 13 + .../vendor/symfony/process/.gitignore | 3 + .../vendor/symfony/process/CHANGELOG.md | 90 + .../process/Exception/ExceptionInterface.php | 21 + .../Exception/InvalidArgumentException.php | 21 + .../process/Exception/LogicException.php | 21 + .../Exception/ProcessFailedException.php | 54 + .../Exception/ProcessSignaledException.php | 41 + .../Exception/ProcessTimedOutException.php | 69 + .../process/Exception/RuntimeException.php | 21 + .../symfony/process/ExecutableFinder.php | 88 + .../vendor/symfony/process/InputStream.php | 90 + .../vendor/symfony/process/LICENSE | 19 + .../symfony/process/PhpExecutableFinder.php | 101 + .../vendor/symfony/process/PhpProcess.php | 75 + .../symfony/process/Pipes/AbstractPipes.php | 182 ++ .../symfony/process/Pipes/PipesInterface.php | 67 + .../symfony/process/Pipes/UnixPipes.php | 153 + .../symfony/process/Pipes/WindowsPipes.php | 191 ++ .../vendor/symfony/process/Process.php | 1645 ++++++++++ .../vendor/symfony/process/ProcessUtils.php | 69 + .../vendor/symfony/process/README.md | 13 + .../process/Tests/ErrorProcessInitiator.php | 36 + .../process/Tests/ExecutableFinderTest.php | 178 ++ .../Tests/KillableProcessWithOutput.php | 25 + .../process/Tests/NonStopableProcess.php | 47 + .../process/Tests/PhpExecutableFinderTest.php | 49 + .../symfony/process/Tests/PhpProcessTest.php | 63 + .../PipeStdinInStdoutStdErrStreamSelect.php | 72 + .../Tests/ProcessFailedExceptionTest.php | 133 + .../symfony/process/Tests/ProcessTest.php | 1515 ++++++++++ .../symfony/process/Tests/SignalListener.php | 21 + .../vendor/symfony/process/composer.json | 33 + .../vendor/symfony/process/phpunit.xml.dist | 30 + .../vendor/valga/fbns-react/.gitignore | 4 + .../vendor/valga/fbns-react/.php_cs | 20 + .../vendor/valga/fbns-react/LICENSE | 21 + .../vendor/valga/fbns-react/README.md | 84 + .../vendor/valga/fbns-react/bin/thrift_debug | 33 + .../vendor/valga/fbns-react/composer.json | 45 + .../valga/fbns-react/src/Auth/DeviceAuth.php | 162 + .../valga/fbns-react/src/AuthInterface.php | 41 + .../src/Common/PublishAckPacket.php | 30 + .../valga/fbns-react/src/Connection.php | 339 +++ .../vendor/valga/fbns-react/src/Json.php | 28 + .../vendor/valga/fbns-react/src/Lite.php | 379 +++ .../src/Lite/ConnectRequestPacket.php | 198 ++ .../src/Lite/ConnectResponsePacket.php | 145 + .../src/Lite/OutgoingConnectFlow.php | 74 + .../fbns-react/src/Lite/PacketFactory.php | 74 + .../valga/fbns-react/src/Lite/ReactFlow.php | 120 + .../fbns-react/src/Lite/ReactMqttClient.php | 695 +++++ .../fbns-react/src/Lite/StreamParser.php | 102 + .../valga/fbns-react/src/Message/Push.php | 153 + .../valga/fbns-react/src/Message/Register.php | 89 + .../valga/fbns-react/src/Thrift/Compact.php | 24 + .../valga/fbns-react/src/Thrift/Debug.php | 52 + .../valga/fbns-react/src/Thrift/Reader.php | 263 ++ .../valga/fbns-react/src/Thrift/Writer.php | 279 ++ .../vendor/winbox/args/LICENSE | 19 + .../vendor/winbox/args/README.md | 50 + .../vendor/winbox/args/appveyor.yml | 22 + .../vendor/winbox/args/composer.json | 22 + .../vendor/winbox/args/src/Args.php | 57 + vendor/autoload.php | 7 + .../binsoul/net-mqtt-client-react/LICENSE.md | 21 + .../binsoul/net-mqtt-client-react/README.md | 145 + .../net-mqtt-client-react/composer.json | 51 + .../net-mqtt-client-react/src/ReactFlow.php | 112 + .../src/ReactMqttClient.php | 701 +++++ vendor/binsoul/net-mqtt/LICENSE.md | 21 + vendor/binsoul/net-mqtt/README.md | 36 + vendor/binsoul/net-mqtt/composer.json | 47 + vendor/binsoul/net-mqtt/src/Connection.php | 90 + .../net-mqtt/src/DefaultConnection.php | 129 + .../src/DefaultIdentifierGenerator.php | 38 + .../binsoul/net-mqtt/src/DefaultMessage.php | 119 + .../net-mqtt/src/DefaultSubscription.php | 52 + .../src/Exception/EndOfStreamException.php | 10 + .../Exception/MalformedPacketException.php | 10 + .../Exception/UnknownPacketTypeException.php | 10 + vendor/binsoul/net-mqtt/src/Flow.php | 71 + .../net-mqtt/src/Flow/AbstractFlow.php | 74 + .../net-mqtt/src/Flow/IncomingPingFlow.php | 23 + .../net-mqtt/src/Flow/IncomingPublishFlow.php | 80 + .../net-mqtt/src/Flow/OutgoingConnectFlow.php | 70 + .../src/Flow/OutgoingDisconnectFlow.php | 37 + .../net-mqtt/src/Flow/OutgoingPingFlow.php | 32 + .../net-mqtt/src/Flow/OutgoingPublishFlow.php | 102 + .../src/Flow/OutgoingSubscribeFlow.php | 82 + .../src/Flow/OutgoingUnsubscribeFlow.php | 61 + .../net-mqtt/src/IdentifierGenerator.php | 23 + vendor/binsoul/net-mqtt/src/Message.php | 99 + vendor/binsoul/net-mqtt/src/Packet.php | 52 + .../net-mqtt/src/Packet/BasePacket.php | 279 ++ .../src/Packet/ConnectRequestPacket.php | 405 +++ .../src/Packet/ConnectResponsePacket.php | 111 + .../src/Packet/DisconnectRequestPacket.php | 22 + .../src/Packet/IdentifiablePacket.php | 62 + .../src/Packet/IdentifierOnlyPacket.php | 42 + .../net-mqtt/src/Packet/PingRequestPacket.php | 22 + .../src/Packet/PingResponsePacket.php | 22 + .../net-mqtt/src/Packet/PublishAckPacket.php | 13 + .../src/Packet/PublishCompletePacket.php | 13 + .../src/Packet/PublishReceivedPacket.php | 13 + .../src/Packet/PublishReleasePacket.php | 19 + .../src/Packet/PublishRequestPacket.php | 176 ++ .../src/Packet/StrictConnectRequestPacket.php | 66 + .../src/Packet/SubscribeRequestPacket.php | 101 + .../src/Packet/SubscribeResponsePacket.php | 132 + .../src/Packet/UnsubscribeRequestPacket.php | 68 + .../src/Packet/UnsubscribeResponsePacket.php | 13 + vendor/binsoul/net-mqtt/src/PacketFactory.php | 67 + vendor/binsoul/net-mqtt/src/PacketStream.php | 216 ++ vendor/binsoul/net-mqtt/src/StreamParser.php | 90 + vendor/binsoul/net-mqtt/src/Subscription.php | 41 + vendor/binsoul/net-mqtt/src/TopicMatcher.php | 53 + vendor/clue/http-proxy-react/.gitignore | 2 + vendor/clue/http-proxy-react/.travis.yml | 27 + vendor/clue/http-proxy-react/CHANGELOG.md | 103 + vendor/clue/http-proxy-react/LICENSE | 21 + vendor/clue/http-proxy-react/README.md | 422 +++ vendor/clue/http-proxy-react/composer.json | 30 + .../examples/01-proxy-https.php | 30 + .../examples/02-optional-proxy-https.php | 37 + .../examples/11-proxy-smtp.php | 32 + .../examples/12-proxy-smtps.php | 35 + vendor/clue/http-proxy-react/phpunit.xml.dist | 14 + .../http-proxy-react/src/ProxyConnector.php | 213 ++ .../tests/AbstractTestCase.php | 80 + .../http-proxy-react/tests/FunctionalTest.php | 75 + .../tests/ProxyConnectorTest.php | 333 ++ vendor/clue/socks-react/.gitignore | 2 + vendor/clue/socks-react/.travis.yml | 27 + vendor/clue/socks-react/CHANGELOG.md | 338 +++ vendor/clue/socks-react/LICENSE | 21 + vendor/clue/socks-react/README.md | 1017 +++++++ vendor/clue/socks-react/composer.json | 28 + vendor/clue/socks-react/examples/01-http.php | 30 + vendor/clue/socks-react/examples/02-https.php | 30 + .../examples/03-proxy-chaining.php | 46 + .../socks-react/examples/04-local-dns.php | 31 + .../clue/socks-react/examples/11-server.php | 19 + .../examples/12-server-with-password.php | 24 + .../examples/13-server-blacklist.php | 40 + .../examples/21-server-proxy-chaining.php | 42 + ...server-proxy-chaining-from-random-pool.php | 46 + .../socks-react/examples/31-server-secure.php | 21 + .../socks-react/examples/32-http-secure.php | 33 + .../clue/socks-react/examples/localhost.pem | 49 + vendor/clue/socks-react/phpunit.xml.dist | 14 + vendor/clue/socks-react/src/Client.php | 382 +++ vendor/clue/socks-react/src/Server.php | 422 +++ vendor/clue/socks-react/src/StreamReader.php | 149 + vendor/clue/socks-react/tests/ClientTest.php | 403 +++ .../clue/socks-react/tests/FunctionalTest.php | 437 +++ vendor/clue/socks-react/tests/ServerTest.php | 428 +++ .../socks-react/tests/StreamReaderTest.php | 82 + vendor/clue/socks-react/tests/bootstrap.php | 103 + vendor/composer/ClassLoader.php | 445 +++ vendor/composer/LICENSE | 56 + vendor/composer/autoload_classmap.php | 9 + vendor/composer/autoload_files.php | 16 + vendor/composer/autoload_namespaces.php | 10 + vendor/composer/autoload_psr4.php | 32 + vendor/composer/autoload_real.php | 70 + vendor/composer/autoload_static.php | 189 ++ vendor/composer/installed.json | 1328 ++++++++ vendor/corneltek/getoptionkit/.gitignore | 3 + vendor/corneltek/getoptionkit/.travis.yml | 29 + vendor/corneltek/getoptionkit/CHANGELOG.md | 56 + .../corneltek/getoptionkit/CONTRIBUTORS.txt | 11 + vendor/corneltek/getoptionkit/LICENSE | 19 + vendor/corneltek/getoptionkit/README.md | 370 +++ vendor/corneltek/getoptionkit/build.xml | 185 ++ vendor/corneltek/getoptionkit/composer.json | 16 + vendor/corneltek/getoptionkit/composer.lock | 19 + .../corneltek/getoptionkit/examples/demo.php | 76 + vendor/corneltek/getoptionkit/package.ini | 15 + vendor/corneltek/getoptionkit/phpdox.xml | 16 + vendor/corneltek/getoptionkit/phprelease.ini | 2 + vendor/corneltek/getoptionkit/phpunit-ci.xml | 29 + .../corneltek/getoptionkit/phpunit.xml.dist | 29 + .../corneltek/getoptionkit/src/Argument.php | 119 + .../src/ContinuousOptionParser.php | 201 ++ .../src/Exception/InvalidOptionException.php | 18 + .../Exception/InvalidOptionValueException.php | 18 + .../src/Exception/NonNumericException.php | 18 + .../src/Exception/OptionConflictException.php | 18 + .../src/Exception/RequireValueException.php | 18 + vendor/corneltek/getoptionkit/src/Option.php | 557 ++++ .../getoptionkit/src/OptionCollection.php | 207 ++ .../getoptionkit/src/OptionParser.php | 193 ++ .../OptionPrinter/ConsoleOptionPrinter.php | 56 + .../src/OptionPrinter/OptionPrinter.php | 12 + .../getoptionkit/src/OptionResult.php | 157 + .../getoptionkit/src/ValueType/BaseType.php | 34 + .../getoptionkit/src/ValueType/BoolType.php | 10 + .../src/ValueType/BooleanType.php | 30 + .../src/ValueType/DateTimeType.php | 22 + .../getoptionkit/src/ValueType/DateType.php | 20 + .../getoptionkit/src/ValueType/DirType.php | 18 + .../getoptionkit/src/ValueType/EmailType.php | 16 + .../getoptionkit/src/ValueType/FileType.php | 18 + .../getoptionkit/src/ValueType/IpType.php | 16 + .../getoptionkit/src/ValueType/Ipv4Type.php | 16 + .../getoptionkit/src/ValueType/Ipv6Type.php | 16 + .../getoptionkit/src/ValueType/NumberType.php | 16 + .../getoptionkit/src/ValueType/PathType.php | 18 + .../getoptionkit/src/ValueType/RegexType.php | 24 + .../getoptionkit/src/ValueType/StringType.php | 16 + .../getoptionkit/src/ValueType/UrlType.php | 16 + .../getoptionkit/tests/ArgumentTest.php | 56 + .../tests/ContinuousOptionParserTest.php | 335 ++ .../tests/OptionCollectionTest.php | 46 + .../getoptionkit/tests/OptionParserTest.php | 477 +++ .../ConsoleOptionPrinterTest.php | 32 + .../getoptionkit/tests/OptionResultTest.php | 32 + .../getoptionkit/tests/OptionTest.php | 227 ++ .../getoptionkit/tests/RegexValueTypeTest.php | 26 + .../getoptionkit/tests/ValueTypeTest.php | 200 ++ vendor/evenement/evenement/.gitignore | 2 + vendor/evenement/evenement/.travis.yml | 24 + vendor/evenement/evenement/CHANGELOG.md | 35 + vendor/evenement/evenement/LICENSE | 19 + vendor/evenement/evenement/README.md | 83 + vendor/evenement/evenement/composer.json | 29 + vendor/evenement/evenement/doc/00-intro.md | 28 + vendor/evenement/evenement/doc/01-api.md | 91 + .../evenement/doc/02-plugin-system.md | 155 + .../examples/benchmark-emit-no-arguments.php | 28 + .../examples/benchmark-emit-once.php | 30 + .../examples/benchmark-emit-one-argument.php | 28 + .../evenement/examples/benchmark-emit.php | 28 + .../benchmark-remove-listener-once.php | 39 + vendor/evenement/evenement/phpunit.xml.dist | 24 + .../evenement/src/Evenement/EventEmitter.php | 17 + .../src/Evenement/EventEmitterInterface.php | 22 + .../src/Evenement/EventEmitterTrait.php | 135 + .../Evenement/Tests/EventEmitterTest.php | 438 +++ .../tests/Evenement/Tests/Listener.php | 51 + .../tests/Evenement/Tests/functions.php | 17 + vendor/guzzlehttp/guzzle/.php_cs | 21 + vendor/guzzlehttp/guzzle/CHANGELOG.md | 1304 ++++++++ vendor/guzzlehttp/guzzle/Dockerfile | 18 + vendor/guzzlehttp/guzzle/LICENSE | 19 + vendor/guzzlehttp/guzzle/README.md | 90 + vendor/guzzlehttp/guzzle/UPGRADING.md | 1203 ++++++++ vendor/guzzlehttp/guzzle/composer.json | 58 + vendor/guzzlehttp/guzzle/phpstan.neon.dist | 9 + vendor/guzzlehttp/guzzle/src/Client.php | 422 +++ .../guzzlehttp/guzzle/src/ClientInterface.php | 84 + .../guzzle/src/Cookie/CookieJar.php | 314 ++ .../guzzle/src/Cookie/CookieJarInterface.php | 84 + .../guzzle/src/Cookie/FileCookieJar.php | 91 + .../guzzle/src/Cookie/SessionCookieJar.php | 72 + .../guzzle/src/Cookie/SetCookie.php | 403 +++ .../src/Exception/BadResponseException.php | 27 + .../guzzle/src/Exception/ClientException.php | 9 + .../guzzle/src/Exception/ConnectException.php | 37 + .../guzzle/src/Exception/GuzzleException.php | 23 + .../Exception/InvalidArgumentException.php | 7 + .../guzzle/src/Exception/RequestException.php | 217 ++ .../guzzle/src/Exception/SeekException.php | 27 + .../guzzle/src/Exception/ServerException.php | 9 + .../Exception/TooManyRedirectsException.php | 6 + .../src/Exception/TransferException.php | 6 + .../guzzle/src/Handler/CurlFactory.php | 580 ++++ .../src/Handler/CurlFactoryInterface.php | 27 + .../guzzle/src/Handler/CurlHandler.php | 45 + .../guzzle/src/Handler/CurlMultiHandler.php | 205 ++ .../guzzle/src/Handler/EasyHandle.php | 92 + .../guzzle/src/Handler/MockHandler.php | 190 ++ .../guzzlehttp/guzzle/src/Handler/Proxy.php | 55 + .../guzzle/src/Handler/StreamHandler.php | 544 ++++ vendor/guzzlehttp/guzzle/src/HandlerStack.php | 273 ++ .../guzzle/src/MessageFormatter.php | 180 ++ vendor/guzzlehttp/guzzle/src/Middleware.php | 254 ++ vendor/guzzlehttp/guzzle/src/Pool.php | 123 + .../guzzle/src/PrepareBodyMiddleware.php | 106 + .../guzzle/src/RedirectMiddleware.php | 237 ++ .../guzzlehttp/guzzle/src/RequestOptions.php | 255 ++ .../guzzlehttp/guzzle/src/RetryMiddleware.php | 115 + .../guzzlehttp/guzzle/src/TransferStats.php | 126 + vendor/guzzlehttp/guzzle/src/UriTemplate.php | 237 ++ vendor/guzzlehttp/guzzle/src/functions.php | 346 +++ .../guzzle/src/functions_include.php | 6 + vendor/guzzlehttp/promises/CHANGELOG.md | 65 + vendor/guzzlehttp/promises/LICENSE | 19 + vendor/guzzlehttp/promises/Makefile | 13 + vendor/guzzlehttp/promises/README.md | 504 +++ vendor/guzzlehttp/promises/composer.json | 34 + .../promises/src/AggregateException.php | 16 + .../promises/src/CancellationException.php | 9 + vendor/guzzlehttp/promises/src/Coroutine.php | 151 + .../guzzlehttp/promises/src/EachPromise.php | 229 ++ .../promises/src/FulfilledPromise.php | 82 + vendor/guzzlehttp/promises/src/Promise.php | 280 ++ .../promises/src/PromiseInterface.php | 93 + .../promises/src/PromisorInterface.php | 15 + .../promises/src/RejectedPromise.php | 87 + .../promises/src/RejectionException.php | 47 + vendor/guzzlehttp/promises/src/TaskQueue.php | 66 + .../promises/src/TaskQueueInterface.php | 25 + vendor/guzzlehttp/promises/src/functions.php | 457 +++ .../promises/src/functions_include.php | 6 + vendor/guzzlehttp/psr7/CHANGELOG.md | 246 ++ vendor/guzzlehttp/psr7/LICENSE | 19 + vendor/guzzlehttp/psr7/README.md | 745 +++++ vendor/guzzlehttp/psr7/composer.json | 49 + vendor/guzzlehttp/psr7/src/AppendStream.php | 241 ++ vendor/guzzlehttp/psr7/src/BufferStream.php | 137 + vendor/guzzlehttp/psr7/src/CachingStream.php | 138 + vendor/guzzlehttp/psr7/src/DroppingStream.php | 42 + vendor/guzzlehttp/psr7/src/FnStream.php | 158 + vendor/guzzlehttp/psr7/src/InflateStream.php | 52 + vendor/guzzlehttp/psr7/src/LazyOpenStream.php | 39 + vendor/guzzlehttp/psr7/src/LimitStream.php | 155 + vendor/guzzlehttp/psr7/src/MessageTrait.php | 213 ++ .../guzzlehttp/psr7/src/MultipartStream.php | 153 + vendor/guzzlehttp/psr7/src/NoSeekStream.php | 22 + vendor/guzzlehttp/psr7/src/PumpStream.php | 165 + vendor/guzzlehttp/psr7/src/Request.php | 151 + vendor/guzzlehttp/psr7/src/Response.php | 154 + vendor/guzzlehttp/psr7/src/Rfc7230.php | 18 + vendor/guzzlehttp/psr7/src/ServerRequest.php | 376 +++ vendor/guzzlehttp/psr7/src/Stream.php | 267 ++ .../psr7/src/StreamDecoratorTrait.php | 149 + vendor/guzzlehttp/psr7/src/StreamWrapper.php | 161 + vendor/guzzlehttp/psr7/src/UploadedFile.php | 316 ++ vendor/guzzlehttp/psr7/src/Uri.php | 760 +++++ vendor/guzzlehttp/psr7/src/UriNormalizer.php | 216 ++ vendor/guzzlehttp/psr7/src/UriResolver.php | 219 ++ vendor/guzzlehttp/psr7/src/functions.php | 899 ++++++ .../guzzlehttp/psr7/src/functions_include.php | 6 + .../lazyjsonmapper/.ac-php-conf.json | 14 + .../lazyjsonmapper/lazyjsonmapper/.gitignore | 40 + .../lazyjsonmapper/.php_cs.dist | 54 + .../lazyjsonmapper/.pre-commit.hook | 67 + vendor/lazyjsonmapper/lazyjsonmapper/LICENSE | 201 ++ vendor/lazyjsonmapper/lazyjsonmapper/NOTICE | 5 + .../lazyjsonmapper/lazyjsonmapper/README.md | 211 ++ .../lazyjsonmapper/bin/lazydoctor | 738 +++++ .../lazyjsonmapper/composer.json | 48 + .../lazyjsonmapper/devtools/checkStyle.php | 225 ++ .../devtools/funcListData.serialized | 1 + .../devtools/junk/testLazyJsonMapper.php | 1897 ++++++++++++ .../junk/testPropertyDefinitionNamespaces.php | 173 ++ .../devtools/junk/testUserFeatureToggling.php | 205 ++ .../devtools/nonRecursiveArrays.php | 402 +++ .../devtools/prefixSplitAlgorithms.php | 270 ++ .../lazyjsonmapper/examples/basic_example.php | 103 + .../examples/import_example.php | 42 + .../examples/inheritance_example.php | 51 + .../examples/unpredictable_data.php | 705 +++++ .../lazyjsonmapper/phpdoc.dist.xml | 24 + .../lazyjsonmapper/phpunit.xml.dist | 9 + .../BadPropertyDefinitionException.php | 29 + .../src/Exception/BadPropertyMapException.php | 29 + .../CircularPropertyMapException.php | 100 + .../src/Exception/LazyJsonMapperException.php | 29 + .../Exception/LazySerializationException.php | 40 + .../src/Exception/LazyUserException.php | 42 + .../src/Exception/LazyUserOptionException.php | 95 + .../Exception/MagicTranslationException.php | 29 + .../Exception/SpanishInquisitionException.php | 33 + .../src/Export/ClassAnalysis.php | 208 ++ .../src/Export/PropertyDescription.php | 250 ++ .../lazyjsonmapper/src/LazyJsonMapper.php | 2692 +++++++++++++++++ .../src/Magic/FunctionTranslation.php | 314 ++ .../src/Magic/PropertyTranslation.php | 191 ++ .../src/Magic/SpecialOperators.php | 169 ++ .../src/Property/PropertyDefinition.php | 325 ++ .../src/Property/PropertyMapCache.php | 73 + .../src/Property/PropertyMapCompiler.php | 1274 ++++++++ .../src/Property/UndefinedProperty.php | 79 + .../src/Property/ValueConverter.php | 441 +++ .../lazyjsonmapper/src/Utilities.php | 180 ++ .../lazyjsonmapper/tests/bootstrap.php | 18 + vendor/mgp25/instagram-php/.ac-php-conf.json | 17 + .../instagram-php/.github/ISSUE_TEMPLATE.md | 112 + .../.github/ISSUE_TEMPLATE/bug-report.md | 42 + .../.github/ISSUE_TEMPLATE/feature-request.md | 26 + .../.github/ISSUE_TEMPLATE/question.md | 42 + vendor/mgp25/instagram-php/.gitignore | 49 + vendor/mgp25/instagram-php/.php_cs.dist | 38 + vendor/mgp25/instagram-php/.pre-commit.hook | 58 + vendor/mgp25/instagram-php/CODE_OF_CONDUCT.md | 46 + vendor/mgp25/instagram-php/CONTRIBUTING.md | 488 +++ vendor/mgp25/instagram-php/Dockerfile | 37 + vendor/mgp25/instagram-php/LICENSE | 546 ++++ vendor/mgp25/instagram-php/LICENSE_PREMIUM | 16 + vendor/mgp25/instagram-php/README.md | 135 + vendor/mgp25/instagram-php/composer.json | 81 + vendor/mgp25/instagram-php/devtools/README.md | 7 + .../instagram-php/devtools/checkDevices.php | 229 ++ .../devtools/checkExperiments.php | 150 + .../instagram-php/devtools/checkStyle.php | 203 ++ .../devtools/testInstagramPhoto.php | 66 + vendor/mgp25/instagram-php/examples/README.md | 17 + .../examples/accessingValues.php | 74 + .../examples/assets/instagram.png | Bin 0 -> 7810 bytes .../instagram-php/examples/customSettings.php | 147 + .../examples/exceptionDetailsExample.php | 83 + .../instagram-php/examples/liveBroadcast.php | 137 + .../examples/paginateWithExclusion.php | 57 + .../examples/paginationExample.php | 53 + .../instagram-php/examples/pushReceiver.php | 80 + .../instagram-php/examples/rankTokenUsage.php | 57 + .../instagram-php/examples/realtimeClient.php | 100 + .../instagram-php/examples/realtimeHttp.php | 287 ++ .../examples/sharePhotoToStoryFeed.php | 71 + .../examples/shortcodeConverter.php | 29 + .../instagram-php/examples/twoFactorLogin.php | 31 + .../instagram-php/examples/uploadAlbum.php | 109 + .../instagram-php/examples/uploadPhoto.php | 62 + .../instagram-php/examples/uploadStory.php | 102 + .../examples/uploadStoryCountdown.php | 67 + .../examples/uploadStoryFundraiser.php | 54 + .../examples/uploadStoryPoll.php | 78 + .../examples/uploadStoryQuestion.php | 69 + .../examples/uploadStorySlider.php | 71 + .../instagram-php/examples/uploadVideo.php | 46 + .../extradocs/Push_setPreferences.txt | 90 + .../instagram-php/src/AutoPropertyMapper.php | 22 + vendor/mgp25/instagram-php/src/Client.php | 850 ++++++ vendor/mgp25/instagram-php/src/Constants.php | 103 + vendor/mgp25/instagram-php/src/Debug.php | 67 + .../instagram-php/src/Devices/Device.php | 268 ++ .../src/Devices/DeviceInterface.php | 93 + .../instagram-php/src/Devices/GoodDevices.php | 190 ++ .../instagram-php/src/Devices/UserAgent.php | 129 + .../Exception/AccountDisabledException.php | 7 + .../src/Exception/BadRequestException.php | 11 + .../Exception/ChallengeRequiredException.php | 7 + .../Exception/CheckpointRequiredException.php | 7 + .../Exception/ConsentRequiredException.php | 7 + .../src/Exception/EmptyResponseException.php | 10 + .../src/Exception/EndpointException.php | 21 + .../Exception/FeedbackRequiredException.php | 7 + .../ForcedPasswordResetException.php | 7 + .../Exception/IncorrectPasswordException.php | 7 + .../src/Exception/InstagramException.php | 53 + .../src/Exception/InternalException.php | 10 + .../src/Exception/InvalidSmsCodeException.php | 7 + .../src/Exception/InvalidUserException.php | 7 + .../src/Exception/LoginRequiredException.php | 11 + .../src/Exception/NetworkException.php | 63 + .../src/Exception/NotFoundException.php | 11 + .../src/Exception/RequestException.php | 10 + .../RequestHeadersTooLargeException.php | 11 + .../src/Exception/SentryBlockException.php | 7 + .../src/Exception/ServerMessageThrower.php | 235 ++ .../src/Exception/SettingsException.php | 10 + .../src/Exception/ThrottledException.php | 11 + .../src/Exception/UploadFailedException.php | 13 + .../src/ExperimentsInterface.php | 34 + vendor/mgp25/instagram-php/src/Instagram.php | 1246 ++++++++ .../mgp25/instagram-php/src/InstagramID.php | 249 ++ .../Media/Constraints/AlbumConstraints.php | 10 + .../Media/Constraints/ConstraintsFactory.php | 45 + .../Media/Constraints/DirectConstraints.php | 41 + .../Constraints/DirectStoryConstraints.php | 27 + .../Media/Constraints/StoryConstraints.php | 137 + .../Media/Constraints/TimelineConstraints.php | 115 + .../src/Media/Constraints/TvConstraints.php | 83 + .../src/Media/ConstraintsInterface.php | 65 + .../src/Media/Geometry/Dimensions.php | 98 + .../src/Media/Geometry/Rectangle.php | 179 ++ .../src/Media/InstagramMedia.php | 1456 +++++++++ .../instagram-php/src/Media/MediaDetails.php | 172 ++ .../src/Media/Photo/InstagramPhoto.php | 326 ++ .../src/Media/Photo/PhotoDetails.php | 177 ++ .../instagram-php/src/Media/Video/FFmpeg.php | 244 ++ .../src/Media/Video/InstagramThumbnail.php | 155 + .../src/Media/Video/InstagramVideo.php | 263 ++ .../src/Media/Video/VideoDetails.php | 348 +++ .../src/Middleware/FakeCookies.php | 172 ++ .../src/Middleware/ZeroRating.php | 120 + vendor/mgp25/instagram-php/src/Push.php | 286 ++ vendor/mgp25/instagram-php/src/Push/Fbns.php | 194 ++ .../instagram-php/src/Push/Fbns/Auth.php | 89 + .../instagram-php/src/Push/Notification.php | 316 ++ .../src/Push/Payload/BadgeCount.php | 89 + .../instagram-php/src/React/Connector.php | 223 ++ .../src/React/PersistentInterface.php | 49 + .../src/React/PersistentTrait.php | 79 + vendor/mgp25/instagram-php/src/Realtime.php | 495 +++ .../Command/Direct/IndicateActivity.php | 35 + .../src/Realtime/Command/Direct/MarkSeen.php | 35 + .../Realtime/Command/Direct/SendHashtag.php | 42 + .../src/Realtime/Command/Direct/SendItem.php | 58 + .../src/Realtime/Command/Direct/SendLike.php | 23 + .../Realtime/Command/Direct/SendLocation.php | 32 + .../src/Realtime/Command/Direct/SendPost.php | 32 + .../Realtime/Command/Direct/SendProfile.php | 32 + .../Realtime/Command/Direct/SendReaction.php | 75 + .../src/Realtime/Command/Direct/SendStory.php | 32 + .../src/Realtime/Command/Direct/SendText.php | 34 + .../src/Realtime/Command/Direct/ShareItem.php | 30 + .../src/Realtime/Command/DirectCommand.php | 191 ++ .../src/Realtime/Command/IrisSubscribe.php | 50 + .../Realtime/Command/UpdateSubscriptions.php | 93 + .../src/Realtime/CommandInterface.php | 20 + .../src/Realtime/Handler/AbstractHandler.php | 37 + .../src/Realtime/Handler/DirectHandler.php | 543 ++++ .../src/Realtime/Handler/HandlerException.php | 7 + .../src/Realtime/Handler/IrisHandler.php | 27 + .../src/Realtime/Handler/LiveHandler.php | 81 + .../src/Realtime/Handler/PresenceHandler.php | 25 + .../Realtime/Handler/RegionHintHandler.php | 22 + .../Realtime/Handler/ZeroProvisionHandler.php | 24 + .../src/Realtime/HandlerInterface.php | 18 + .../instagram-php/src/Realtime/Message.php | 46 + .../mgp25/instagram-php/src/Realtime/Mqtt.php | 803 +++++ .../instagram-php/src/Realtime/Mqtt/Auth.php | 74 + .../src/Realtime/Mqtt/Capabilities.php | 33 + .../src/Realtime/Mqtt/Config.php | 20 + .../src/Realtime/Mqtt/PacketFactory.php | 77 + .../src/Realtime/Mqtt/QosLevel.php | 9 + .../src/Realtime/Mqtt/StreamParser.php | 107 + .../src/Realtime/Mqtt/Topics.php | 57 + .../src/Realtime/Parser/GraphQlParser.php | 82 + .../src/Realtime/Parser/IrisParser.php | 34 + .../src/Realtime/Parser/JsonParser.php | 41 + .../src/Realtime/Parser/RegionHintParser.php | 54 + .../src/Realtime/Parser/SkywalkerParser.php | 82 + .../src/Realtime/ParserInterface.php | 19 + .../src/Realtime/Payload/Action/AckAction.php | 33 + .../src/Realtime/Payload/Event/PatchEvent.php | 44 + .../Realtime/Payload/Event/PatchEventOp.php | 45 + .../src/Realtime/Payload/IrisSubscribeAck.php | 35 + .../src/Realtime/Payload/LiveBroadcast.php | 40 + .../src/Realtime/Payload/RealtimeAction.php | 29 + .../src/Realtime/Payload/RealtimeEvent.php | 27 + .../src/Realtime/Payload/StoryScreenshot.php | 28 + .../src/Realtime/Payload/ThreadAction.php | 25 + .../src/Realtime/Payload/ThreadActivity.php | 35 + .../Realtime/Payload/ZeroProvisionEvent.php | 30 + .../GraphQl/AppPresenceSubscription.php | 30 + .../GraphQl/DirectTypingSubscription.php | 29 + .../GraphQl/ZeroProvisionSubscription.php | 32 + .../Subscription/GraphQlSubscription.php | 46 + .../Skywalker/DirectSubscription.php | 23 + .../Skywalker/LiveSubscription.php | 23 + .../Subscription/SkywalkerSubscription.php | 35 + .../src/Realtime/SubscriptionInterface.php | 27 + vendor/mgp25/instagram-php/src/Request.php | 837 +++++ .../instagram-php/src/Request/Account.php | 779 +++++ .../instagram-php/src/Request/Business.php | 85 + .../instagram-php/src/Request/Collection.php | 181 ++ .../instagram-php/src/Request/Creative.php | 123 + .../instagram-php/src/Request/Direct.php | 1550 ++++++++++ .../instagram-php/src/Request/Discover.php | 192 ++ .../instagram-php/src/Request/Hashtag.php | 375 +++ .../instagram-php/src/Request/Highlight.php | 173 ++ .../instagram-php/src/Request/Internal.php | 2596 ++++++++++++++++ .../mgp25/instagram-php/src/Request/Live.php | 696 +++++ .../instagram-php/src/Request/Location.php | 329 ++ .../mgp25/instagram-php/src/Request/Media.php | 848 ++++++ .../src/Request/Metadata/Internal.php | 291 ++ .../instagram-php/src/Request/People.php | 1265 ++++++++ .../mgp25/instagram-php/src/Request/Push.php | 78 + .../src/Request/RequestCollection.php | 104 + .../instagram-php/src/Request/Shopping.php | 123 + .../mgp25/instagram-php/src/Request/Story.php | 693 +++++ vendor/mgp25/instagram-php/src/Request/TV.php | 171 ++ .../instagram-php/src/Request/Timeline.php | 512 ++++ .../instagram-php/src/Request/Usertag.php | 144 + vendor/mgp25/instagram-php/src/Response.php | 141 + .../src/Response/AccountCreateResponse.php | 37 + .../src/Response/AccountDetailsResponse.php | 52 + .../Response/AccountSecurityInfoResponse.php | 57 + .../src/Response/ActiveFeedAdsResponse.php | 42 + .../src/Response/ActiveReelAdsResponse.php | 42 + .../src/Response/ActivityNewsResponse.php | 77 + .../src/Response/ArchiveMediaResponse.php | 25 + .../Response/ArchivedStoriesFeedResponse.php | 47 + .../Response/ArlinkDownloadInfoResponse.php | 47 + .../Response/BadgeNotificationsResponse.php | 37 + .../src/Response/BlockedListResponse.php | 42 + .../src/Response/BlockedMediaResponse.php | 32 + .../src/Response/BlockedReelsResponse.php | 45 + .../src/Response/BootstrapUsersResponse.php | 37 + .../Response/BroadcastCommentsResponse.php | 95 + ...oadcastHeartbeatAndViewerCountResponse.php | 67 + .../src/Response/BroadcastInfoResponse.php | 132 + .../BroadcastJoinRequestCountResponse.php | 52 + .../Response/BroadcastLikeCountResponse.php | 47 + .../src/Response/BroadcastLikeResponse.php | 32 + .../Response/BroadcastQuestionsResponse.php | 32 + .../CapabilitiesDecisionsResponse.php | 32 + .../src/Response/ChallengeResponse.php | 25 + .../src/Response/ChangePasswordResponse.php | 25 + .../src/Response/CharitiesListResponse.php | 42 + .../src/Response/CheckEmailResponse.php | 52 + .../src/Response/CheckUsernameResponse.php | 47 + .../src/Response/CloseFriendsResponse.php | 49 + .../src/Response/CollectionFeedResponse.php | 67 + .../src/Response/CommentBroadcastResponse.php | 32 + .../CommentCategoryFilterResponse.php | 32 + .../CommentFilterKeywordsResponse.php | 32 + .../src/Response/CommentFilterResponse.php | 32 + .../src/Response/CommentFilterSetResponse.php | 25 + .../Response/CommentLikeUnlikeResponse.php | 25 + .../src/Response/CommentLikersResponse.php | 32 + .../src/Response/CommentResponse.php | 32 + .../src/Response/ConfigureResponse.php | 47 + .../Response/CreateBusinessInfoResponse.php | 32 + .../src/Response/CreateCollectionResponse.php | 40 + .../src/Response/CreateHighlightResponse.php | 32 + .../src/Response/CreateLiveResponse.php | 157 + .../src/Response/DeleteCollectionResponse.php | 25 + .../src/Response/DeleteCommentResponse.php | 25 + .../DirectCreateGroupThreadResponse.php | 112 + .../src/Response/DirectInboxResponse.php | 67 + .../Response/DirectPendingInboxResponse.php | 42 + .../DirectRankedRecipientsResponse.php | 52 + .../DirectRecentRecipientsResponse.php | 37 + .../src/Response/DirectSeenItemResponse.php | 37 + .../src/Response/DirectSendItemResponse.php | 42 + .../src/Response/DirectSendItemsResponse.php | 42 + .../src/Response/DirectShareInboxResponse.php | 57 + .../src/Response/DirectThreadResponse.php | 32 + .../Response/DirectVisualThreadResponse.php | 192 ++ .../Response/DisableTwoFactorSMSResponse.php | 25 + .../src/Response/DiscoverChannelsResponse.php | 47 + .../src/Response/DiscoverPeopleResponse.php | 47 + .../src/Response/DiscoverTopLiveResponse.php | 57 + .../src/Response/EditCollectionResponse.php | 40 + .../src/Response/EditMediaResponse.php | 32 + .../EnableDisableLiveCommentsResponse.php | 32 + .../Response/EnableTwoFactorSMSResponse.php | 32 + .../src/Response/ExploreResponse.php | 67 + .../src/Response/FBLocationResponse.php | 42 + .../src/Response/FBSearchResponse.php | 48 + .../src/Response/FaceEffectsResponse.php | 42 + .../src/Response/FaceModelsResponse.php | 32 + .../FacebookHiddenEntitiesResponse.php | 32 + .../src/Response/FacebookOTAResponse.php | 37 + .../src/Response/FetchQPDataResponse.php | 52 + .../src/Response/FinalViewerListResponse.php | 37 + .../Response/FollowerAndFollowingResponse.php | 57 + .../FollowingRecentActivityResponse.php | 47 + .../src/Response/FormerUsernamesResponse.php | 32 + .../src/Response/FriendshipResponse.php | 32 + .../Response/FriendshipsShowManyResponse.php | 32 + .../src/Response/FriendshipsShowResponse.php | 72 + .../src/Response/GenericResponse.php | 27 + .../Response/GetCollectionsListResponse.php | 47 + .../src/Response/GraphqlResponse.php | 82 + .../src/Response/HashtagsResponse.php | 32 + .../src/Response/HighlightFeedResponse.php | 57 + .../src/Response/InsightsResponse.php | 32 + .../src/Response/LauncherSyncResponse.php | 32 + .../src/Response/LikeFeedResponse.php | 62 + .../src/Response/LinkAddressBookResponse.php | 32 + .../src/Response/LinkageStatusResponse.php | 32 + .../src/Response/LocationFeedResponse.php | 52 + .../src/Response/LocationResponse.php | 37 + .../src/Response/LocationStoryResponse.php | 32 + .../src/Response/LoginResponse.php | 157 + .../src/Response/LogoutResponse.php | 25 + .../src/Response/LoomFetchConfigResponse.php | 47 + .../Response/MediaCommentRepliesResponse.php | 85 + .../src/Response/MediaCommentsResponse.php | 87 + .../src/Response/MediaDeleteResponse.php | 32 + .../src/Response/MediaInfoResponse.php | 47 + .../src/Response/MediaInsightsResponse.php | 32 + .../src/Response/MediaLikersResponse.php | 37 + .../src/Response/MediaSeenResponse.php | 25 + .../src/Response/MegaphoneLogResponse.php | 32 + .../Model/AccountAccessToolConfig.php | 30 + .../src/Response/Model/AccountSummaryUnit.php | 20 + .../src/Response/Model/Action.php | 35 + .../src/Response/Model/ActionBadge.php | 41 + .../src/Response/Model/ActionLog.php | 25 + .../src/Response/Model/Ad4ad.php | 45 + .../src/Response/Model/AdMetadata.php | 25 + .../src/Response/Model/AdsInfo.php | 25 + .../src/Response/Model/AndroidLinks.php | 75 + .../src/Response/Model/AnimatedMedia.php | 25 + .../src/Response/Model/AnimatedMediaImage.php | 20 + .../Model/AnimatedMediaImageFixedHeigth.php | 55 + .../Model/ArchivedStoriesFeedItem.php | 40 + .../instagram-php/src/Response/Model/Args.php | 135 + .../src/Response/Model/AssetModel.php | 25 + .../src/Response/Model/Attribution.php | 20 + .../src/Response/Model/AudioContext.php | 25 + .../instagram-php/src/Response/Model/Aymf.php | 25 + .../src/Response/Model/AymfItem.php | 731 +++++ .../src/Response/Model/Badging.php | 25 + .../src/Response/Model/BiographyEntities.php | 30 + .../src/Response/Model/BlockedReels.php | 30 + .../instagram-php/src/Response/Model/Bold.php | 25 + .../src/Response/Model/Broadcast.php | 151 + .../src/Response/Model/BroadcastQuestion.php | 45 + .../Response/Model/BroadcastStatusItem.php | 40 + .../src/Response/Model/BusinessEdge.php | 25 + .../src/Response/Model/BusinessFeed.php | 20 + .../src/Response/Model/BusinessManager.php | 50 + .../Response/Model/BusinessManagerStatus.php | 25 + .../src/Response/Model/BusinessNode.php | 190 ++ .../src/Response/Model/Button.php | 50 + .../src/Response/Model/Caption.php | 85 + .../src/Response/Model/CarouselMedia.php | 196 ++ .../src/Response/Model/CatalogData.php | 25 + .../src/Response/Model/CatalogEdge.php | 20 + .../src/Response/Model/CatalogNode.php | 50 + .../src/Response/Model/ChainingInfo.php | 20 + .../src/Response/Model/ChainingSuggestion.php | 587 ++++ .../src/Response/Model/Challenge.php | 45 + .../src/Response/Model/Channel.php | 50 + .../src/Response/Model/CloseFriends.php | 35 + .../src/Response/Model/Collection.php | 30 + .../src/Response/Model/Comment.php | 196 ++ .../src/Response/Model/CommentInfo.php | 60 + .../Response/Model/CommentTranslations.php | 25 + .../src/Response/Model/Composer.php | 25 + .../src/Response/Model/ContextualFilters.php | 30 + .../src/Response/Model/CountdownSticker.php | 90 + .../src/Response/Model/Counts.php | 55 + .../src/Response/Model/CoverMedia.php | 63 + .../src/Response/Model/Creative.php | 56 + .../src/Response/Model/DataGraph.php | 25 + .../src/Response/Model/DataPoints.php | 25 + .../src/Response/Model/DirectCursor.php | 25 + .../Response/Model/DirectExpiringSummary.php | 30 + .../src/Response/Model/DirectInbox.php | 50 + .../src/Response/Model/DirectLink.php | 25 + .../Response/Model/DirectMessageMetadata.php | 35 + .../Response/Model/DirectRankedRecipient.php | 25 + .../src/Response/Model/DirectReaction.php | 50 + .../src/Response/Model/DirectReactions.php | 25 + .../Response/Model/DirectSeenItemPayload.php | 25 + .../Response/Model/DirectSendItemPayload.php | 55 + .../src/Response/Model/DirectThread.php | 220 ++ .../src/Response/Model/DirectThreadItem.php | 185 ++ .../Response/Model/DirectThreadItemMedia.php | 54 + .../Response/Model/DirectThreadLastSeenAt.php | 25 + .../src/Response/Model/DismissCard.php | 50 + .../src/Response/Model/Edges.php | 30 + .../src/Response/Model/Effect.php | 50 + .../src/Response/Model/EligiblePromotions.php | 20 + .../Response/Model/EndOfFeedDemarcator.php | 30 + .../src/Response/Model/Experiment.php | 45 + .../src/Response/Model/Explore.php | 30 + .../src/Response/Model/ExploreItem.php | 35 + .../src/Response/Model/ExploreItemInfo.php | 40 + .../src/Response/Model/FaceModels.php | 30 + .../src/Response/Model/FacebookUser.php | 25 + .../src/Response/Model/FeedAysf.php | 75 + .../src/Response/Model/FeedItem.php | 45 + .../src/Response/Model/FelixShare.php | 25 + .../src/Response/Model/FillItems.php | 20 + .../src/Response/Model/FollowersUnit.php | 60 + .../src/Response/Model/FormerUsername.php | 25 + .../src/Response/Model/FormerUsernameInfo.php | 20 + .../src/Response/Model/FriendshipStatus.php | 70 + .../src/Response/Model/FullItem.php | 20 + .../src/Response/Model/Gating.php | 35 + .../src/Response/Model/GenericMegaphone.php | 85 + .../src/Response/Model/GraphData.php | 50 + .../src/Response/Model/GraphNode.php | 30 + .../src/Response/Model/Groups.php | 25 + .../src/Response/Model/Hashtag.php | 65 + .../src/Response/Model/Headline.php | 70 + .../src/Response/Model/HiddenEntities.php | 34 + .../src/Response/Model/HideReason.php | 31 + .../src/Response/Model/IOSLinks.php | 25 + .../Response/Model/IabAutofillOptoutInfo.php | 25 + .../src/Response/Model/Image.php | 30 + .../src/Response/Model/ImageCandidate.php | 35 + .../src/Response/Model/Image_Versions2.php | 25 + .../instagram-php/src/Response/Model/In.php | 45 + .../src/Response/Model/Injected.php | 120 + .../src/Response/Model/InlineFollow.php | 30 + .../src/Response/Model/Insights.php | 20 + .../instagram-php/src/Response/Model/Item.php | 959 ++++++ .../src/Response/Model/LayoutContent.php | 55 + .../instagram-php/src/Response/Model/Link.php | 45 + .../src/Response/Model/LinkContext.php | 35 + .../src/Response/Model/LiveComment.php | 30 + .../src/Response/Model/LiveVideoShare.php | 30 + .../src/Response/Model/LiveViewerInvite.php | 40 + .../src/Response/Model/Location.php | 157 + .../src/Response/Model/LocationItem.php | 35 + .../src/Response/Model/MeGraphData.php | 25 + .../src/Response/Model/Media.php | 40 + .../src/Response/Model/MediaCroppingInfo.php | 20 + .../src/Response/Model/MediaData.php | 43 + .../src/Response/Model/MediaInsights.php | 50 + .../src/Response/Model/MediaShare.php | 25 + .../src/Response/Model/Megaphone.php | 20 + .../src/Response/Model/Nametag.php | 40 + .../src/Response/Model/Owner.php | 60 + .../src/Response/Model/PageInfo.php | 30 + .../src/Response/Model/Param.php | 25 + .../src/Response/Model/Participants.php | 30 + .../src/Response/Model/PermanentItem.php | 90 + .../Model/PhoneVerificationSettings.php | 35 + .../src/Response/Model/Placeholder.php | 30 + .../src/Response/Model/PostLive.php | 20 + .../src/Response/Model/PostLiveItem.php | 65 + .../src/Response/Model/Prefill.php | 25 + .../src/Response/Model/PrimaryCountryInfo.php | 30 + .../src/Response/Model/Product.php | 84 + .../src/Response/Model/ProductImage.php | 20 + .../src/Response/Model/ProductShare.php | 30 + .../src/Response/Model/ProductTags.php | 20 + .../src/Response/Model/PromotionsUnit.php | 20 + .../src/Response/Model/PushSettings.php | 45 + .../src/Response/Model/QPData.php | 25 + .../src/Response/Model/QPExtraInfo.php | 25 + .../src/Response/Model/QPNode.php | 50 + .../src/Response/Model/QPSurface.php | 25 + .../src/Response/Model/QPViewerData.php | 20 + .../src/Response/Model/QueryResponse.php | 20 + .../src/Response/Model/QuestionSticker.php | 56 + .../src/Response/Model/QuizSticker.php | 70 + .../src/Response/Model/Ranking.php | 30 + .../instagram-php/src/Response/Model/Reel.php | 107 + .../src/Response/Model/ReelMention.php | 65 + .../src/Response/Model/ReelShare.php | 70 + .../src/Response/Model/Related.php | 30 + .../src/Response/Model/Responder.php | 40 + .../src/Response/Model/RewriteRule.php | 25 + .../src/Response/Model/SavedFeedItem.php | 20 + .../src/Response/Model/Section.php | 50 + .../src/Response/Model/SectionMedia.php | 20 + .../src/Response/Model/ServerDataInfo.php | 30 + .../Response/Model/ShadowInstagramUser.php | 50 + .../Response/Model/SharePrefillEntities.php | 20 + .../src/Response/Model/SharedFollower.php | 65 + .../Model/SharedFollowerAccountsInfo.php | 20 + .../instagram-php/src/Response/Model/Slot.php | 25 + .../src/Response/Model/StaticStickers.php | 30 + .../src/Response/Model/StepData.php | 80 + .../src/Response/Model/Stickers.php | 55 + .../src/Response/Model/Stories.php | 35 + .../src/Response/Model/StoriesNetego.php | 30 + .../src/Response/Model/Story.php | 40 + .../Response/Model/StoryAppAttribution.php | 45 + .../src/Response/Model/StoryCountdowns.php | 60 + .../src/Response/Model/StoryCta.php | 25 + .../src/Response/Model/StoryHashtag.php | 70 + .../src/Response/Model/StoryLocation.php | 65 + .../Model/StoryQuestionResponderInfos.php | 65 + .../src/Response/Model/StoryQuestions.php | 60 + .../Model/StoryQuizParticipantInfo.php | 35 + .../src/Response/Model/StoryQuizs.php | 65 + .../src/Response/Model/StoryShare.php | 40 + .../src/Response/Model/StoryTray.php | 162 + .../src/Response/Model/StoryTvChannel.php | 55 + .../src/Response/Model/Subscription.php | 35 + .../src/Response/Model/Suggested.php | 40 + .../src/Response/Model/SuggestedUsers.php | 75 + .../src/Response/Model/Suggestion.php | 75 + .../src/Response/Model/SuggestionCard.php | 30 + .../src/Response/Model/SummaryPromotions.php | 25 + .../Response/Model/SupportedCapabilities.php | 25 + .../src/Response/Model/Surface.php | 39 + .../src/Response/Model/SystemControl.php | 30 + .../src/Response/Model/TVChannel.php | 55 + .../src/Response/Model/TVSearchResult.php | 40 + .../instagram-php/src/Response/Model/Tab.php | 25 + .../src/Response/Model/TabsInfo.php | 25 + .../instagram-php/src/Response/Model/Tag.php | 105 + .../src/Response/Model/Tallies.php | 25 + .../src/Response/Model/Template.php | 25 + .../instagram-php/src/Response/Model/Text.php | 20 + .../src/Response/Model/Thumbnail.php | 65 + .../src/Response/Model/TimeRange.php | 25 + .../src/Response/Model/Token.php | 82 + .../src/Response/Model/TopLive.php | 25 + .../src/Response/Model/TraceControl.php | 35 + .../src/Response/Model/TraySuggestions.php | 40 + .../src/Response/Model/TwoFactorInfo.php | 35 + .../CoreUnpredictableContainer.php | 95 + ...ThreadLastSeenAtUnpredictableContainer.php | 13 + ...FriendshipStatusUnpredictableContainer.php | 13 + .../MediaUnpredictableContainer.php | 13 + .../PresenceUnpredictableContainer.php | 11 + .../ReelUnpredictableContainer.php | 11 + .../UserUnpredictableContainer.php | 13 + .../instagram-php/src/Response/Model/User.php | 726 +++++ .../src/Response/Model/UserCard.php | 80 + .../src/Response/Model/UserList.php | 25 + .../src/Response/Model/UserPresence.php | 35 + .../src/Response/Model/Usertag.php | 25 + .../src/Response/Model/VideoCallEvent.php | 31 + .../src/Response/Model/VideoUploadUrl.php | 30 + .../src/Response/Model/VideoVersions.php | 40 + .../src/Response/Model/Viewer.php | 20 + .../src/Response/Model/VoiceMedia.php | 20 + .../src/Response/Model/Voter.php | 25 + .../src/Response/Model/VoterInfo.php | 35 + .../src/Response/Model/_Message.php | 25 + .../src/Response/MsisdnHeaderResponse.php | 47 + .../MultipleAccountFamilyResponse.php | 37 + .../src/Response/MutedReelsResponse.php | 47 + .../src/Response/OnBoardCatalogResponse.php | 42 + .../src/Response/OnTagProductResponse.php | 42 + .../src/Response/PermalinkResponse.php | 32 + .../Response/PinCommentBroadcastResponse.php | 32 + .../src/Response/PopularFeedResponse.php | 57 + .../src/Response/PostLiveCommentsResponse.php | 52 + .../src/Response/PostLiveLikesResponse.php | 47 + .../Response/PostLiveViewerListResponse.php | 42 + .../Response/PrefillCandidatesResponse.php | 32 + .../src/Response/PresenceStatusResponse.php | 37 + .../src/Response/PresencesResponse.php | 32 + .../src/Response/ProfileNoticeResponse.php | 32 + .../Response/PropertyCollection/Sticker.php | 53 + .../src/Response/PushPreferencesResponse.php | 117 + .../src/Response/PushRegisterResponse.php | 25 + .../src/Response/QPCooldownsResponse.php | 52 + .../src/Response/RecentSearchesResponse.php | 32 + .../src/Response/RecoveryResponse.php | 42 + .../src/Response/ReelMediaViewerResponse.php | 62 + .../src/Response/ReelSettingsResponse.php | 37 + .../src/Response/ReelsMediaResponse.php | 37 + .../src/Response/ReelsTrayFeedResponse.php | 72 + .../src/Response/RelatedLocationResponse.php | 32 + .../Response/ReportExploreMediaResponse.php | 32 + .../src/Response/ResumableOffsetResponse.php | 52 + .../src/Response/ResumableUploadResponse.php | 37 + .../src/Response/ReviewPreferenceResponse.php | 32 + .../src/Response/SaveAndUnsaveMedia.php | 25 + .../src/Response/SavedFeedResponse.php | 52 + .../src/Response/SearchTagResponse.php | 42 + .../src/Response/SearchUserResponse.php | 47 + .../src/Response/SegmentedStartResponse.php | 52 + .../src/Response/SendConfirmEmailResponse.php | 42 + .../src/Response/SendSMSCodeResponse.php | 37 + .../SendTwoFactorEnableSMSResponse.php | 37 + .../src/Response/SharePrefillResponse.php | 42 + .../src/Response/SharedFollowersResponse.php | 32 + .../src/Response/StartLiveResponse.php | 32 + .../src/Response/StickerAssetsResponse.php | 37 + .../src/Response/StoryAnswersResponse.php | 32 + .../src/Response/StoryCountdownsResponse.php | 32 + .../src/Response/StoryPollVotersResponse.php | 32 + .../Response/SuggestedBroadcastsResponse.php | 32 + .../Response/SuggestedSearchesResponse.php | 37 + .../Response/SuggestedUsersBadgeResponse.php | 37 + .../src/Response/SuggestedUsersResponse.php | 37 + .../SwitchBusinessProfileResponse.php | 32 + .../SwitchPersonalProfileResponse.php | 32 + .../src/Response/SyncResponse.php | 32 + .../src/Response/TVChannelsResponse.php | 67 + .../src/Response/TVGuideResponse.php | 52 + .../src/Response/TVSearchResponse.php | 42 + .../src/Response/TagFeedResponse.php | 77 + .../src/Response/TagInfoResponse.php | 68 + .../src/Response/TagRelatedResponse.php | 32 + .../src/Response/TagsStoryResponse.php | 32 + .../src/Response/TimelineFeedResponse.php | 98 + .../src/Response/TokenResultResponse.php | 32 + .../src/Response/TopLiveStatusResponse.php | 32 + .../src/Response/TranslateResponse.php | 32 + .../Response/TwoFactorLoginSMSResponse.php | 37 + .../Response/UnlinkAddressBookResponse.php | 25 + .../UnpinCommentBroadcastResponse.php | 32 + .../src/Response/UploadJobVideoResponse.php | 37 + .../src/Response/UploadPhotoResponse.php | 37 + .../src/Response/UploadVideoResponse.php | 42 + .../src/Response/UserFeedResponse.php | 57 + .../src/Response/UserInfoResponse.php | 42 + .../Response/UserReelMediaFeedResponse.php | 96 + .../src/Response/UserStoryFeedResponse.php | 42 + .../src/Response/UsersLookupResponse.php | 77 + .../src/Response/UsertagsResponse.php | 67 + .../src/Response/ValidateURLResponse.php | 25 + .../src/Response/VerifySMSCodeResponse.php | 37 + .../src/Response/ViewerListResponse.php | 32 + .../WriteSuppotedCapabilitiesResponse.php | 32 + .../instagram-php/src/Settings/Factory.php | 262 ++ .../Storage/Components/PDOStorage.php | 394 +++ .../src/Settings/Storage/File.php | 385 +++ .../src/Settings/Storage/Memcached.php | 345 +++ .../src/Settings/Storage/MySQL.php | 101 + .../src/Settings/Storage/SQLite.php | 115 + .../src/Settings/StorageHandler.php | 803 +++++ .../src/Settings/StorageInterface.php | 264 ++ vendor/mgp25/instagram-php/src/Signatures.php | 111 + vendor/mgp25/instagram-php/src/Utils.php | 1515 ++++++++++ .../tests/React/ConnectorTest.php | 211 ++ .../Realtime/Command/IndicateActivityTest.php | 57 + .../Realtime/Command/IrisSubscribeTest.php | 22 + .../tests/Realtime/Command/MarkSeenTest.php | 55 + .../Realtime/Command/SendHashtagTest.php | 105 + .../tests/Realtime/Command/SendLikeTest.php | 48 + .../Realtime/Command/SendLocationTest.php | 75 + .../tests/Realtime/Command/SendPostTest.php | 75 + .../Realtime/Command/SendProfileTest.php | 75 + .../Realtime/Command/SendReactionTest.php | 85 + .../tests/Realtime/Command/SendStoryTest.php | 75 + .../tests/Realtime/Command/SendTextTest.php | 62 + .../Command/UpdateSubscriptionsTest.php | 22 + .../tests/Realtime/Handler/DirectTest.php | 308 ++ .../Realtime/Handler/IrisHandlerTest.php | 77 + .../tests/Realtime/Handler/LiveTest.php | 74 + .../tests/Realtime/Handler/PresenceTest.php | 63 + .../tests/Realtime/Handler/RegionHintTest.php | 71 + .../Realtime/Subscription/AppPresenceTest.php | 18 + .../Subscription/ZeroProvisionTest.php | 18 + .../tests/Response/ExceptionsTest.php | 112 + vendor/mgp25/instagram-php/webwarning.htm | 9 + vendor/psr/http-message/CHANGELOG.md | 36 + vendor/psr/http-message/LICENSE | 19 + vendor/psr/http-message/README.md | 13 + vendor/psr/http-message/composer.json | 26 + .../psr/http-message/src/MessageInterface.php | 187 ++ .../psr/http-message/src/RequestInterface.php | 129 + .../http-message/src/ResponseInterface.php | 68 + .../src/ServerRequestInterface.php | 261 ++ .../psr/http-message/src/StreamInterface.php | 158 + .../src/UploadedFileInterface.php | 123 + vendor/psr/http-message/src/UriInterface.php | 323 ++ vendor/psr/log/.gitignore | 1 + vendor/psr/log/LICENSE | 19 + vendor/psr/log/Psr/Log/AbstractLogger.php | 128 + .../log/Psr/Log/InvalidArgumentException.php | 7 + vendor/psr/log/Psr/Log/LogLevel.php | 18 + .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 + vendor/psr/log/Psr/Log/LoggerAwareTrait.php | 26 + vendor/psr/log/Psr/Log/LoggerInterface.php | 125 + vendor/psr/log/Psr/Log/LoggerTrait.php | 142 + vendor/psr/log/Psr/Log/NullLogger.php | 30 + .../log/Psr/Log/Test/LoggerInterfaceTest.php | 145 + vendor/psr/log/Psr/Log/Test/TestLogger.php | 147 + vendor/psr/log/README.md | 52 + vendor/psr/log/composer.json | 26 + vendor/ralouphie/getallheaders/LICENSE | 21 + vendor/ralouphie/getallheaders/README.md | 27 + vendor/ralouphie/getallheaders/composer.json | 26 + .../getallheaders/src/getallheaders.php | 46 + vendor/react/cache/.gitignore | 2 + vendor/react/cache/.travis.yml | 32 + vendor/react/cache/CHANGELOG.md | 74 + vendor/react/cache/LICENSE | 19 + vendor/react/cache/README.md | 366 +++ vendor/react/cache/composer.json | 19 + vendor/react/cache/phpunit.xml.dist | 20 + vendor/react/cache/src/ArrayCache.php | 181 ++ vendor/react/cache/src/CacheInterface.php | 194 ++ vendor/react/cache/tests/ArrayCacheTest.php | 322 ++ vendor/react/cache/tests/CallableStub.php | 10 + vendor/react/cache/tests/TestCase.php | 54 + vendor/react/dns/.gitignore | 2 + vendor/react/dns/.travis.yml | 32 + vendor/react/dns/CHANGELOG.md | 261 ++ vendor/react/dns/LICENSE | 19 + vendor/react/dns/README.md | 344 +++ vendor/react/dns/composer.json | 24 + vendor/react/dns/examples/01-one.php | 22 + vendor/react/dns/examples/02-concurrent.php | 27 + vendor/react/dns/examples/03-cached.php | 40 + vendor/react/dns/examples/11-all-ips.php | 31 + vendor/react/dns/examples/12-all-types.php | 25 + vendor/react/dns/examples/13-reverse-dns.php | 35 + .../dns/examples/91-query-a-and-aaaa.php | 29 + vendor/react/dns/examples/92-query-any.php | 71 + vendor/react/dns/phpunit.xml.dist | 24 + vendor/react/dns/src/BadServerException.php | 7 + vendor/react/dns/src/Config/Config.php | 127 + .../dns/src/Config/FilesystemFactory.php | 73 + vendor/react/dns/src/Config/HostsFile.php | 151 + vendor/react/dns/src/Model/HeaderBag.php | 59 + vendor/react/dns/src/Model/Message.php | 188 ++ vendor/react/dns/src/Model/Record.php | 105 + .../react/dns/src/Protocol/BinaryDumper.php | 163 + vendor/react/dns/src/Protocol/Parser.php | 395 +++ vendor/react/dns/src/Query/CachedExecutor.php | 59 + .../react/dns/src/Query/CachingExecutor.php | 88 + .../dns/src/Query/CancellationException.php | 7 + vendor/react/dns/src/Query/CoopExecutor.php | 92 + vendor/react/dns/src/Query/Executor.php | 160 + .../react/dns/src/Query/ExecutorInterface.php | 8 + .../react/dns/src/Query/HostsFileExecutor.php | 89 + vendor/react/dns/src/Query/Query.php | 33 + vendor/react/dns/src/Query/RecordBag.php | 30 + vendor/react/dns/src/Query/RecordCache.php | 122 + vendor/react/dns/src/Query/RetryExecutor.php | 79 + .../react/dns/src/Query/TimeoutException.php | 7 + .../react/dns/src/Query/TimeoutExecutor.php | 32 + .../dns/src/Query/UdpTransportExecutor.php | 181 ++ .../react/dns/src/RecordNotFoundException.php | 7 + vendor/react/dns/src/Resolver/Factory.php | 102 + vendor/react/dns/src/Resolver/Resolver.php | 250 ++ vendor/react/dns/tests/CallableStub.php | 10 + vendor/react/dns/tests/Config/ConfigTest.php | 189 ++ .../tests/Config/FilesystemFactoryTest.php | 70 + .../react/dns/tests/Config/HostsFileTest.php | 170 ++ .../react/dns/tests/Fixtures/etc/resolv.conf | 1 + .../dns/tests/FunctionalResolverTest.php | 171 ++ vendor/react/dns/tests/Model/MessageTest.php | 31 + .../dns/tests/Protocol/BinaryDumperTest.php | 278 ++ .../react/dns/tests/Protocol/ParserTest.php | 1033 +++++++ .../dns/tests/Query/CachedExecutorTest.php | 100 + .../dns/tests/Query/CachingExecutorTest.php | 183 ++ .../dns/tests/Query/CoopExecutorTest.php | 233 ++ vendor/react/dns/tests/Query/ExecutorTest.php | 308 ++ .../dns/tests/Query/HostsFileExecutorTest.php | 126 + .../react/dns/tests/Query/RecordBagTest.php | 83 + .../react/dns/tests/Query/RecordCacheTest.php | 160 + .../dns/tests/Query/RetryExecutorTest.php | 350 +++ .../dns/tests/Query/TimeoutExecutorTest.php | 115 + .../tests/Query/UdpTransportExecutorTest.php | 215 ++ .../react/dns/tests/Resolver/FactoryTest.php | 120 + .../dns/tests/Resolver/ResolveAliasesTest.php | 101 + .../react/dns/tests/Resolver/ResolverTest.php | 251 ++ vendor/react/dns/tests/TestCase.php | 61 + vendor/react/event-loop/.gitignore | 3 + vendor/react/event-loop/.travis.yml | 27 + vendor/react/event-loop/CHANGELOG.md | 79 + vendor/react/event-loop/LICENSE | 19 + vendor/react/event-loop/README.md | 143 + vendor/react/event-loop/composer.json | 22 + vendor/react/event-loop/phpunit.xml.dist | 25 + vendor/react/event-loop/src/ExtEventLoop.php | 326 ++ vendor/react/event-loop/src/Factory.php | 21 + vendor/react/event-loop/src/LibEvLoop.php | 226 ++ vendor/react/event-loop/src/LibEventLoop.php | 343 +++ vendor/react/event-loop/src/LoopInterface.php | 121 + .../react/event-loop/src/StreamSelectLoop.php | 273 ++ .../event-loop/src/Tick/FutureTickQueue.php | 59 + .../event-loop/src/Tick/NextTickQueue.php | 57 + vendor/react/event-loop/src/Timer/Timer.php | 102 + .../event-loop/src/Timer/TimerInterface.php | 62 + vendor/react/event-loop/src/Timer/Timers.php | 100 + .../event-loop/tests/AbstractLoopTest.php | 539 ++++ .../react/event-loop/tests/CallableStub.php | 10 + .../event-loop/tests/ExtEventLoopTest.php | 90 + .../react/event-loop/tests/LibEvLoopTest.php | 22 + .../event-loop/tests/LibEventLoopTest.php | 58 + .../event-loop/tests/StreamSelectLoopTest.php | 179 ++ vendor/react/event-loop/tests/TestCase.php | 41 + .../tests/Timer/AbstractTimerTest.php | 97 + .../tests/Timer/ExtEventTimerTest.php | 17 + .../event-loop/tests/Timer/LibEvTimerTest.php | 17 + .../tests/Timer/LibEventTimerTest.php | 17 + .../tests/Timer/StreamSelectTimerTest.php | 13 + .../event-loop/tests/Timer/TimersTest.php | 29 + vendor/react/event-loop/tests/bootstrap.php | 7 + vendor/react/event-loop/travis-init.sh | 37 + vendor/react/promise-timer/.gitignore | 2 + vendor/react/promise-timer/.travis.yml | 26 + vendor/react/promise-timer/CHANGELOG.md | 63 + vendor/react/promise-timer/LICENSE | 21 + vendor/react/promise-timer/README.md | 372 +++ vendor/react/promise-timer/composer.json | 28 + vendor/react/promise-timer/phpunit.xml.dist | 19 + .../promise-timer/src/TimeoutException.php | 22 + vendor/react/promise-timer/src/functions.php | 81 + .../promise-timer/src/functions_include.php | 7 + .../promise-timer/tests/CallableStub.php | 10 + .../tests/FunctionRejectTest.php | 79 + .../tests/FunctionResolveTest.php | 101 + .../tests/FunctionTimeoutTest.php | 286 ++ vendor/react/promise-timer/tests/TestCase.php | 61 + .../tests/TimeoutExceptionTest.php | 15 + vendor/react/promise/.gitignore | 5 + vendor/react/promise/.travis.yml | 28 + vendor/react/promise/CHANGELOG.md | 135 + vendor/react/promise/LICENSE | 22 + vendor/react/promise/README.md | 870 ++++++ vendor/react/promise/composer.json | 29 + vendor/react/promise/phpunit.xml.dist | 28 + .../src/CancellablePromiseInterface.php | 11 + .../react/promise/src/CancellationQueue.php | 55 + vendor/react/promise/src/Deferred.php | 65 + .../promise/src/Exception/LengthException.php | 7 + .../promise/src/ExtendedPromiseInterface.php | 30 + vendor/react/promise/src/FulfilledPromise.php | 68 + vendor/react/promise/src/LazyPromise.php | 63 + vendor/react/promise/src/Promise.php | 256 ++ vendor/react/promise/src/PromiseInterface.php | 14 + .../react/promise/src/PromisorInterface.php | 11 + vendor/react/promise/src/RejectedPromise.php | 76 + .../src/UnhandledRejectionException.php | 31 + vendor/react/promise/src/functions.php | 246 ++ .../react/promise/src/functions_include.php | 5 + .../promise/tests/CancellationQueueTest.php | 100 + vendor/react/promise/tests/DeferredTest.php | 112 + .../promise/tests/FulfilledPromiseTest.php | 76 + .../react/promise/tests/FunctionAllTest.php | 114 + .../react/promise/tests/FunctionAnyTest.php | 204 ++ .../tests/FunctionCheckTypehintTest.php | 118 + .../react/promise/tests/FunctionMapTest.php | 198 ++ .../react/promise/tests/FunctionRaceTest.php | 211 ++ .../promise/tests/FunctionReduceTest.php | 347 +++ .../promise/tests/FunctionRejectTest.php | 64 + .../promise/tests/FunctionResolveTest.php | 171 ++ .../react/promise/tests/FunctionSomeTest.php | 258 ++ .../react/promise/tests/LazyPromiseTest.php | 107 + .../PromiseAdapter/CallbackPromiseAdapter.php | 40 + .../PromiseAdapterInterface.php | 14 + vendor/react/promise/tests/PromiseTest.php | 293 ++ .../tests/PromiseTest/CancelTestTrait.php | 246 ++ .../tests/PromiseTest/FullTestTrait.php | 15 + .../tests/PromiseTest/NotifyTestTrait.php | 336 ++ .../PromiseTest/PromiseFulfilledTestTrait.php | 351 +++ .../PromiseTest/PromisePendingTestTrait.php | 68 + .../PromiseTest/PromiseRejectedTestTrait.php | 512 ++++ .../PromiseTest/PromiseSettledTestTrait.php | 86 + .../tests/PromiseTest/RejectTestTrait.php | 368 +++ .../tests/PromiseTest/ResolveTestTrait.php | 312 ++ .../promise/tests/RejectedPromiseTest.php | 76 + .../react/promise/tests/Stub/CallableStub.php | 10 + vendor/react/promise/tests/TestCase.php | 43 + vendor/react/promise/tests/bootstrap.php | 7 + .../fixtures/SimpleFulfilledTestPromise.php | 21 + .../fixtures/SimpleFulfilledTestThenable.php | 21 + .../fixtures/SimpleRejectedTestPromise.php | 21 + .../tests/fixtures/SimpleTestCancellable.php | 13 + .../SimpleTestCancellableThenable.php | 18 + vendor/react/socket/.gitignore | 2 + vendor/react/socket/.travis.yml | 48 + vendor/react/socket/CHANGELOG.md | 465 +++ vendor/react/socket/LICENSE | 19 + vendor/react/socket/README.md | 1419 +++++++++ vendor/react/socket/composer.json | 29 + .../react/socket/examples/01-echo-server.php | 42 + .../react/socket/examples/02-chat-server.php | 59 + .../react/socket/examples/03-http-server.php | 57 + .../react/socket/examples/11-http-client.php | 36 + .../react/socket/examples/12-https-client.php | 36 + .../socket/examples/21-netcat-client.php | 68 + .../react/socket/examples/22-http-client.php | 60 + .../socket/examples/91-benchmark-server.php | 60 + .../examples/99-generate-self-signed.php | 31 + vendor/react/socket/examples/localhost.pem | 49 + .../socket/examples/localhost_swordfish.pem | 51 + vendor/react/socket/phpunit.xml.dist | 25 + vendor/react/socket/src/Connection.php | 178 ++ .../react/socket/src/ConnectionInterface.php | 119 + vendor/react/socket/src/Connector.php | 136 + .../react/socket/src/ConnectorInterface.php | 58 + vendor/react/socket/src/DnsConnector.php | 112 + vendor/react/socket/src/FixedUriConnector.php | 41 + vendor/react/socket/src/LimitingServer.php | 203 ++ vendor/react/socket/src/SecureConnector.php | 64 + vendor/react/socket/src/SecureServer.php | 192 ++ vendor/react/socket/src/Server.php | 73 + vendor/react/socket/src/ServerInterface.php | 151 + vendor/react/socket/src/StreamEncryption.php | 146 + vendor/react/socket/src/TcpConnector.php | 129 + vendor/react/socket/src/TcpServer.php | 236 ++ vendor/react/socket/src/TimeoutConnector.php | 25 + vendor/react/socket/src/UnixConnector.php | 44 + vendor/react/socket/src/UnixServer.php | 130 + vendor/react/socket/tests/ConnectionTest.php | 47 + vendor/react/socket/tests/ConnectorTest.php | 128 + .../react/socket/tests/DnsConnectorTest.php | 111 + .../socket/tests/FixedUriConnectorTest.php | 19 + .../socket/tests/FunctionalConnectorTest.php | 32 + .../tests/FunctionalSecureServerTest.php | 438 +++ .../socket/tests/FunctionalTcpServerTest.php | 324 ++ vendor/react/socket/tests/IntegrationTest.php | 328 ++ .../react/socket/tests/LimitingServerTest.php | 195 ++ .../socket/tests/SecureConnectorTest.php | 74 + .../socket/tests/SecureIntegrationTest.php | 204 ++ .../react/socket/tests/SecureServerTest.php | 105 + vendor/react/socket/tests/ServerTest.php | 173 ++ .../react/socket/tests/Stub/CallableStub.php | 10 + .../socket/tests/Stub/ConnectionStub.php | 63 + vendor/react/socket/tests/Stub/ServerStub.php | 18 + .../react/socket/tests/TcpConnectorTest.php | 260 ++ vendor/react/socket/tests/TcpServerTest.php | 285 ++ vendor/react/socket/tests/TestCase.php | 101 + .../socket/tests/TimeoutConnectorTest.php | 103 + .../react/socket/tests/UnixConnectorTest.php | 64 + vendor/react/socket/tests/UnixServerTest.php | 283 ++ vendor/react/stream/.gitignore | 2 + vendor/react/stream/.travis.yml | 51 + vendor/react/stream/CHANGELOG.md | 398 +++ vendor/react/stream/LICENSE | 19 + vendor/react/stream/README.md | 1225 ++++++++ vendor/react/stream/composer.json | 25 + vendor/react/stream/examples/01-http.php | 40 + vendor/react/stream/examples/02-https.php | 40 + vendor/react/stream/examples/11-cat.php | 28 + .../examples/91-benchmark-throughput.php | 62 + vendor/react/stream/phpunit.xml.dist | 25 + vendor/react/stream/src/CompositeStream.php | 82 + .../react/stream/src/DuplexResourceStream.php | 224 ++ .../stream/src/DuplexStreamInterface.php | 39 + .../stream/src/ReadableResourceStream.php | 177 ++ .../stream/src/ReadableStreamInterface.php | 362 +++ vendor/react/stream/src/ThroughStream.php | 190 ++ vendor/react/stream/src/Util.php | 75 + .../stream/src/WritableResourceStream.php | 171 ++ .../stream/src/WritableStreamInterface.php | 347 +++ vendor/react/stream/tests/CallableStub.php | 10 + .../stream/tests/CompositeStreamTest.php | 267 ++ .../DuplexResourceStreamIntegrationTest.php | 390 +++ .../stream/tests/DuplexResourceStreamTest.php | 495 +++ .../stream/tests/EnforceBlockingWrapper.php | 35 + .../stream/tests/FunctionalInternetTest.php | 122 + .../tests/ReadableResourceStreamTest.php | 391 +++ .../stream/tests/Stub/ReadableStreamStub.php | 61 + vendor/react/stream/tests/TestCase.php | 54 + .../react/stream/tests/ThroughStreamTest.php | 267 ++ vendor/react/stream/tests/UtilTest.php | 273 ++ .../tests/WritableStreamResourceTest.php | 534 ++++ vendor/ringcentral/psr7/.gitignore | 11 + vendor/ringcentral/psr7/.travis.yml | 21 + vendor/ringcentral/psr7/CHANGELOG.md | 28 + vendor/ringcentral/psr7/Dockerfile | 5 + vendor/ringcentral/psr7/LICENSE | 19 + vendor/ringcentral/psr7/Makefile | 21 + vendor/ringcentral/psr7/README.md | 587 ++++ vendor/ringcentral/psr7/composer.json | 35 + vendor/ringcentral/psr7/phpunit.xml.dist | 17 + vendor/ringcentral/psr7/src/AppendStream.php | 233 ++ vendor/ringcentral/psr7/src/BufferStream.php | 137 + vendor/ringcentral/psr7/src/CachingStream.php | 135 + .../ringcentral/psr7/src/DroppingStream.php | 41 + vendor/ringcentral/psr7/src/FnStream.php | 163 + vendor/ringcentral/psr7/src/InflateStream.php | 27 + .../ringcentral/psr7/src/LazyOpenStream.php | 39 + vendor/ringcentral/psr7/src/LimitStream.php | 154 + vendor/ringcentral/psr7/src/MessageTrait.php | 167 + .../ringcentral/psr7/src/MultipartStream.php | 152 + vendor/ringcentral/psr7/src/NoSeekStream.php | 21 + vendor/ringcentral/psr7/src/PumpStream.php | 165 + vendor/ringcentral/psr7/src/Request.php | 146 + vendor/ringcentral/psr7/src/Response.php | 129 + vendor/ringcentral/psr7/src/ServerRequest.php | 122 + vendor/ringcentral/psr7/src/Stream.php | 245 ++ .../psr7/src/StreamDecoratorTrait.php | 139 + vendor/ringcentral/psr7/src/StreamWrapper.php | 121 + vendor/ringcentral/psr7/src/Uri.php | 601 ++++ vendor/ringcentral/psr7/src/functions.php | 832 +++++ .../psr7/src/functions_include.php | 6 + .../psr7/tests/AppendStreamTest.php | 186 ++ .../psr7/tests/BufferStreamTest.php | 63 + .../psr7/tests/CachingStreamTest.php | 166 + .../psr7/tests/DroppingStreamTest.php | 26 + .../ringcentral/psr7/tests/FnStreamTest.php | 92 + .../ringcentral/psr7/tests/FunctionsTest.php | 604 ++++ .../psr7/tests/InflateStreamTest.php | 21 + .../psr7/tests/LazyOpenStreamTest.php | 64 + .../psr7/tests/LimitStreamTest.php | 166 + .../psr7/tests/MultipartStreamTest.php | 214 ++ .../psr7/tests/NoSeekStreamTest.php | 40 + .../ringcentral/psr7/tests/PumpStreamTest.php | 72 + vendor/ringcentral/psr7/tests/RequestTest.php | 157 + .../ringcentral/psr7/tests/ResponseTest.php | 154 + .../psr7/tests/ServerRequestTest.php | 85 + .../psr7/tests/StreamDecoratorTraitTest.php | 123 + vendor/ringcentral/psr7/tests/StreamTest.php | 163 + .../psr7/tests/StreamWrapperTest.php | 100 + vendor/ringcentral/psr7/tests/UriTest.php | 258 ++ vendor/ringcentral/psr7/tests/bootstrap.php | 13 + vendor/symfony/process/.gitignore | 3 + vendor/symfony/process/CHANGELOG.md | 90 + .../process/Exception/ExceptionInterface.php | 21 + .../Exception/InvalidArgumentException.php | 21 + .../process/Exception/LogicException.php | 21 + .../Exception/ProcessFailedException.php | 54 + .../Exception/ProcessSignaledException.php | 41 + .../Exception/ProcessTimedOutException.php | 69 + .../process/Exception/RuntimeException.php | 21 + vendor/symfony/process/ExecutableFinder.php | 88 + vendor/symfony/process/InputStream.php | 90 + vendor/symfony/process/LICENSE | 19 + .../symfony/process/PhpExecutableFinder.php | 101 + vendor/symfony/process/PhpProcess.php | 75 + .../symfony/process/Pipes/AbstractPipes.php | 182 ++ .../symfony/process/Pipes/PipesInterface.php | 67 + vendor/symfony/process/Pipes/UnixPipes.php | 153 + vendor/symfony/process/Pipes/WindowsPipes.php | 191 ++ vendor/symfony/process/Process.php | 1645 ++++++++++ vendor/symfony/process/ProcessUtils.php | 69 + vendor/symfony/process/README.md | 13 + .../process/Tests/ErrorProcessInitiator.php | 36 + .../process/Tests/ExecutableFinderTest.php | 178 ++ .../Tests/KillableProcessWithOutput.php | 25 + .../process/Tests/NonStopableProcess.php | 47 + .../process/Tests/PhpExecutableFinderTest.php | 49 + .../symfony/process/Tests/PhpProcessTest.php | 63 + .../PipeStdinInStdoutStdErrStreamSelect.php | 72 + .../Tests/ProcessFailedExceptionTest.php | 133 + vendor/symfony/process/Tests/ProcessTest.php | 1515 ++++++++++ .../symfony/process/Tests/SignalListener.php | 21 + vendor/symfony/process/composer.json | 33 + vendor/symfony/process/phpunit.xml.dist | 30 + vendor/valga/fbns-react/.gitignore | 4 + vendor/valga/fbns-react/.php_cs | 20 + vendor/valga/fbns-react/LICENSE | 21 + vendor/valga/fbns-react/README.md | 84 + vendor/valga/fbns-react/bin/thrift_debug | 33 + vendor/valga/fbns-react/composer.json | 45 + .../valga/fbns-react/src/Auth/DeviceAuth.php | 162 + vendor/valga/fbns-react/src/AuthInterface.php | 41 + .../src/Common/PublishAckPacket.php | 30 + vendor/valga/fbns-react/src/Connection.php | 339 +++ vendor/valga/fbns-react/src/Json.php | 28 + vendor/valga/fbns-react/src/Lite.php | 379 +++ .../src/Lite/ConnectRequestPacket.php | 198 ++ .../src/Lite/ConnectResponsePacket.php | 145 + .../src/Lite/OutgoingConnectFlow.php | 74 + .../fbns-react/src/Lite/PacketFactory.php | 74 + .../valga/fbns-react/src/Lite/ReactFlow.php | 120 + .../fbns-react/src/Lite/ReactMqttClient.php | 695 +++++ .../fbns-react/src/Lite/StreamParser.php | 102 + vendor/valga/fbns-react/src/Message/Push.php | 153 + .../valga/fbns-react/src/Message/Register.php | 89 + .../valga/fbns-react/src/Thrift/Compact.php | 24 + vendor/valga/fbns-react/src/Thrift/Debug.php | 52 + vendor/valga/fbns-react/src/Thrift/Reader.php | 263 ++ vendor/valga/fbns-react/src/Thrift/Writer.php | 279 ++ vendor/winbox/args/LICENSE | 19 + vendor/winbox/args/README.md | 50 + vendor/winbox/args/appveyor.yml | 22 + vendor/winbox/args/composer.json | 22 + vendor/winbox/args/src/Args.php | 57 + 4130 files changed, 479334 insertions(+) create mode 100755 code_depricated/instafeed.1.pl create mode 100755 code_depricated/instafeed.pl create mode 100755 composer.json create mode 100755 composer.lock create mode 100755 foo create mode 100755 instafeed.pl create mode 100755 instafeed/code_depricated/instafeed.1.pl create mode 100755 instafeed/code_depricated/instafeed.pl create mode 100755 instafeed/composer.json create mode 100755 instafeed/composer.lock create mode 100755 instafeed/foo create mode 100755 instafeed/instafeed.pl create mode 100755 instafeed/log/dreamyourmansion.log create mode 100755 instafeed/log/vstbestprices.log create mode 100755 instafeed/src/db/db_dreamyourmansion.dat create mode 100755 instafeed/src/db/db_vstbestprices.dat create mode 100755 instafeed/src/images/dreamyourmansion/7VPFyhB_j8Y.jpg create mode 100755 instafeed/src/images/dreamyourmansion/RKdLlTyjm5g.jpg create mode 100755 instafeed/src/images/dreamyourmansion/UV81E0oXXWQ.jpg create mode 100755 instafeed/vendor/autoload.php create mode 100755 instafeed/vendor/bin/lazydoctor create mode 100755 instafeed/vendor/binsoul/net-mqtt-client-react/LICENSE.md create mode 100755 instafeed/vendor/binsoul/net-mqtt-client-react/README.md create mode 100755 instafeed/vendor/binsoul/net-mqtt-client-react/composer.json create mode 100755 instafeed/vendor/binsoul/net-mqtt-client-react/src/ReactFlow.php create mode 100755 instafeed/vendor/binsoul/net-mqtt-client-react/src/ReactMqttClient.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/LICENSE.md create mode 100755 instafeed/vendor/binsoul/net-mqtt/README.md create mode 100755 instafeed/vendor/binsoul/net-mqtt/composer.json create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Connection.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/DefaultConnection.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/DefaultIdentifierGenerator.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/DefaultMessage.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/DefaultSubscription.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Exception/EndOfStreamException.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Exception/MalformedPacketException.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Exception/UnknownPacketTypeException.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Flow.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Flow/AbstractFlow.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Flow/IncomingPingFlow.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Flow/IncomingPublishFlow.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingConnectFlow.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingDisconnectFlow.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingPingFlow.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingPublishFlow.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingSubscribeFlow.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingUnsubscribeFlow.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/IdentifierGenerator.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Message.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/BasePacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/ConnectRequestPacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/ConnectResponsePacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/DisconnectRequestPacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/IdentifiablePacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/IdentifierOnlyPacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/PingRequestPacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/PingResponsePacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/PublishAckPacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/PublishCompletePacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/PublishReceivedPacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/PublishReleasePacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/PublishRequestPacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/StrictConnectRequestPacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/SubscribeRequestPacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/SubscribeResponsePacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/UnsubscribeRequestPacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Packet/UnsubscribeResponsePacket.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/PacketFactory.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/PacketStream.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/StreamParser.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/Subscription.php create mode 100755 instafeed/vendor/binsoul/net-mqtt/src/TopicMatcher.php create mode 100755 instafeed/vendor/clue/http-proxy-react/.gitignore create mode 100755 instafeed/vendor/clue/http-proxy-react/.travis.yml create mode 100755 instafeed/vendor/clue/http-proxy-react/CHANGELOG.md create mode 100755 instafeed/vendor/clue/http-proxy-react/LICENSE create mode 100755 instafeed/vendor/clue/http-proxy-react/README.md create mode 100755 instafeed/vendor/clue/http-proxy-react/composer.json create mode 100755 instafeed/vendor/clue/http-proxy-react/examples/01-proxy-https.php create mode 100755 instafeed/vendor/clue/http-proxy-react/examples/02-optional-proxy-https.php create mode 100755 instafeed/vendor/clue/http-proxy-react/examples/11-proxy-smtp.php create mode 100755 instafeed/vendor/clue/http-proxy-react/examples/12-proxy-smtps.php create mode 100755 instafeed/vendor/clue/http-proxy-react/phpunit.xml.dist create mode 100755 instafeed/vendor/clue/http-proxy-react/src/ProxyConnector.php create mode 100755 instafeed/vendor/clue/http-proxy-react/tests/AbstractTestCase.php create mode 100755 instafeed/vendor/clue/http-proxy-react/tests/FunctionalTest.php create mode 100755 instafeed/vendor/clue/http-proxy-react/tests/ProxyConnectorTest.php create mode 100755 instafeed/vendor/clue/socks-react/.gitignore create mode 100755 instafeed/vendor/clue/socks-react/.travis.yml create mode 100755 instafeed/vendor/clue/socks-react/CHANGELOG.md create mode 100755 instafeed/vendor/clue/socks-react/LICENSE create mode 100755 instafeed/vendor/clue/socks-react/README.md create mode 100755 instafeed/vendor/clue/socks-react/composer.json create mode 100755 instafeed/vendor/clue/socks-react/examples/01-http.php create mode 100755 instafeed/vendor/clue/socks-react/examples/02-https.php create mode 100755 instafeed/vendor/clue/socks-react/examples/03-proxy-chaining.php create mode 100755 instafeed/vendor/clue/socks-react/examples/04-local-dns.php create mode 100755 instafeed/vendor/clue/socks-react/examples/11-server.php create mode 100755 instafeed/vendor/clue/socks-react/examples/12-server-with-password.php create mode 100755 instafeed/vendor/clue/socks-react/examples/13-server-blacklist.php create mode 100755 instafeed/vendor/clue/socks-react/examples/21-server-proxy-chaining.php create mode 100755 instafeed/vendor/clue/socks-react/examples/22-server-proxy-chaining-from-random-pool.php create mode 100755 instafeed/vendor/clue/socks-react/examples/31-server-secure.php create mode 100755 instafeed/vendor/clue/socks-react/examples/32-http-secure.php create mode 100755 instafeed/vendor/clue/socks-react/examples/localhost.pem create mode 100755 instafeed/vendor/clue/socks-react/phpunit.xml.dist create mode 100755 instafeed/vendor/clue/socks-react/src/Client.php create mode 100755 instafeed/vendor/clue/socks-react/src/Server.php create mode 100755 instafeed/vendor/clue/socks-react/src/StreamReader.php create mode 100755 instafeed/vendor/clue/socks-react/tests/ClientTest.php create mode 100755 instafeed/vendor/clue/socks-react/tests/FunctionalTest.php create mode 100755 instafeed/vendor/clue/socks-react/tests/ServerTest.php create mode 100755 instafeed/vendor/clue/socks-react/tests/StreamReaderTest.php create mode 100755 instafeed/vendor/clue/socks-react/tests/bootstrap.php create mode 100755 instafeed/vendor/composer/ClassLoader.php create mode 100755 instafeed/vendor/composer/LICENSE create mode 100755 instafeed/vendor/composer/autoload_classmap.php create mode 100755 instafeed/vendor/composer/autoload_files.php create mode 100755 instafeed/vendor/composer/autoload_namespaces.php create mode 100755 instafeed/vendor/composer/autoload_psr4.php create mode 100755 instafeed/vendor/composer/autoload_real.php create mode 100755 instafeed/vendor/composer/autoload_static.php create mode 100755 instafeed/vendor/composer/installed.json create mode 100755 instafeed/vendor/corneltek/getoptionkit/.gitignore create mode 100755 instafeed/vendor/corneltek/getoptionkit/.travis.yml create mode 100755 instafeed/vendor/corneltek/getoptionkit/CHANGELOG.md create mode 100755 instafeed/vendor/corneltek/getoptionkit/CONTRIBUTORS.txt create mode 100755 instafeed/vendor/corneltek/getoptionkit/LICENSE create mode 100755 instafeed/vendor/corneltek/getoptionkit/README.md create mode 100755 instafeed/vendor/corneltek/getoptionkit/build.xml create mode 100755 instafeed/vendor/corneltek/getoptionkit/composer.json create mode 100755 instafeed/vendor/corneltek/getoptionkit/composer.lock create mode 100755 instafeed/vendor/corneltek/getoptionkit/examples/demo.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/package.ini create mode 100755 instafeed/vendor/corneltek/getoptionkit/phpdox.xml create mode 100755 instafeed/vendor/corneltek/getoptionkit/phprelease.ini create mode 100755 instafeed/vendor/corneltek/getoptionkit/phpunit-ci.xml create mode 100755 instafeed/vendor/corneltek/getoptionkit/phpunit.xml.dist create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/Argument.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ContinuousOptionParser.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/Exception/InvalidOptionException.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/Exception/InvalidOptionValueException.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/Exception/NonNumericException.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/Exception/OptionConflictException.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/Exception/RequireValueException.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/Option.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/OptionCollection.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/OptionParser.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/OptionPrinter/ConsoleOptionPrinter.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/OptionPrinter/OptionPrinter.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/OptionResult.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/BaseType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/BoolType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/BooleanType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/DateTimeType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/DateType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/DirType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/EmailType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/FileType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/IpType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/Ipv4Type.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/Ipv6Type.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/NumberType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/PathType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/RegexType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/StringType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/src/ValueType/UrlType.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/tests/ArgumentTest.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/tests/ContinuousOptionParserTest.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/tests/OptionCollectionTest.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/tests/OptionParserTest.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/tests/OptionPrinter/ConsoleOptionPrinterTest.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/tests/OptionResultTest.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/tests/OptionTest.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/tests/RegexValueTypeTest.php create mode 100755 instafeed/vendor/corneltek/getoptionkit/tests/ValueTypeTest.php create mode 100755 instafeed/vendor/evenement/evenement/.gitignore create mode 100755 instafeed/vendor/evenement/evenement/.travis.yml create mode 100755 instafeed/vendor/evenement/evenement/CHANGELOG.md create mode 100755 instafeed/vendor/evenement/evenement/LICENSE create mode 100755 instafeed/vendor/evenement/evenement/README.md create mode 100755 instafeed/vendor/evenement/evenement/composer.json create mode 100755 instafeed/vendor/evenement/evenement/doc/00-intro.md create mode 100755 instafeed/vendor/evenement/evenement/doc/01-api.md create mode 100755 instafeed/vendor/evenement/evenement/doc/02-plugin-system.md create mode 100755 instafeed/vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php create mode 100755 instafeed/vendor/evenement/evenement/examples/benchmark-emit-once.php create mode 100755 instafeed/vendor/evenement/evenement/examples/benchmark-emit-one-argument.php create mode 100755 instafeed/vendor/evenement/evenement/examples/benchmark-emit.php create mode 100755 instafeed/vendor/evenement/evenement/examples/benchmark-remove-listener-once.php create mode 100755 instafeed/vendor/evenement/evenement/phpunit.xml.dist create mode 100755 instafeed/vendor/evenement/evenement/src/Evenement/EventEmitter.php create mode 100755 instafeed/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php create mode 100755 instafeed/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php create mode 100755 instafeed/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php create mode 100755 instafeed/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php create mode 100755 instafeed/vendor/evenement/evenement/tests/Evenement/Tests/functions.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/.php_cs create mode 100755 instafeed/vendor/guzzlehttp/guzzle/CHANGELOG.md create mode 100755 instafeed/vendor/guzzlehttp/guzzle/Dockerfile create mode 100755 instafeed/vendor/guzzlehttp/guzzle/LICENSE create mode 100755 instafeed/vendor/guzzlehttp/guzzle/README.md create mode 100755 instafeed/vendor/guzzlehttp/guzzle/UPGRADING.md create mode 100755 instafeed/vendor/guzzlehttp/guzzle/composer.json create mode 100755 instafeed/vendor/guzzlehttp/guzzle/phpstan.neon.dist create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Client.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/ClientInterface.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/HandlerStack.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/MessageFormatter.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Middleware.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/Pool.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/RequestOptions.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/TransferStats.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/UriTemplate.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/functions.php create mode 100755 instafeed/vendor/guzzlehttp/guzzle/src/functions_include.php create mode 100755 instafeed/vendor/guzzlehttp/promises/CHANGELOG.md create mode 100755 instafeed/vendor/guzzlehttp/promises/LICENSE create mode 100755 instafeed/vendor/guzzlehttp/promises/Makefile create mode 100755 instafeed/vendor/guzzlehttp/promises/README.md create mode 100755 instafeed/vendor/guzzlehttp/promises/composer.json create mode 100755 instafeed/vendor/guzzlehttp/promises/src/AggregateException.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/CancellationException.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/Coroutine.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/EachPromise.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/FulfilledPromise.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/Promise.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/PromiseInterface.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/PromisorInterface.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/RejectedPromise.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/RejectionException.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/TaskQueue.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/TaskQueueInterface.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/functions.php create mode 100755 instafeed/vendor/guzzlehttp/promises/src/functions_include.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/CHANGELOG.md create mode 100755 instafeed/vendor/guzzlehttp/psr7/LICENSE create mode 100755 instafeed/vendor/guzzlehttp/psr7/README.md create mode 100755 instafeed/vendor/guzzlehttp/psr7/composer.json create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/AppendStream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/BufferStream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/CachingStream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/DroppingStream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/FnStream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/InflateStream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/LazyOpenStream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/LimitStream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/MessageTrait.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/MultipartStream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/NoSeekStream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/PumpStream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/Request.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/Response.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/Rfc7230.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/ServerRequest.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/Stream.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/StreamWrapper.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/UploadedFile.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/Uri.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/UriNormalizer.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/UriResolver.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/functions.php create mode 100755 instafeed/vendor/guzzlehttp/psr7/src/functions_include.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/.ac-php-conf.json create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/.gitignore create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/.php_cs.dist create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/.pre-commit.hook create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/LICENSE create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/NOTICE create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/README.md create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/bin/lazydoctor create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/composer.json create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/checkStyle.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/funcListData.serialized create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testLazyJsonMapper.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testPropertyDefinitionNamespaces.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testUserFeatureToggling.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/nonRecursiveArrays.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/prefixSplitAlgorithms.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/basic_example.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/import_example.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/inheritance_example.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/unpredictable_data.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/phpdoc.dist.xml create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/phpunit.xml.dist create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/BadPropertyDefinitionException.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/BadPropertyMapException.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/CircularPropertyMapException.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazyJsonMapperException.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazySerializationException.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazyUserException.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazyUserOptionException.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/MagicTranslationException.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/SpanishInquisitionException.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Export/ClassAnalysis.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Export/PropertyDescription.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/LazyJsonMapper.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Magic/FunctionTranslation.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Magic/PropertyTranslation.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Magic/SpecialOperators.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Property/PropertyDefinition.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Property/PropertyMapCache.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Property/PropertyMapCompiler.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Property/UndefinedProperty.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Property/ValueConverter.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/src/Utilities.php create mode 100755 instafeed/vendor/lazyjsonmapper/lazyjsonmapper/tests/bootstrap.php create mode 100755 instafeed/vendor/mgp25/instagram-php/.ac-php-conf.json create mode 100755 instafeed/vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE.md create mode 100755 instafeed/vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE/bug-report.md create mode 100755 instafeed/vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE/feature-request.md create mode 100755 instafeed/vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE/question.md create mode 100755 instafeed/vendor/mgp25/instagram-php/.gitignore create mode 100755 instafeed/vendor/mgp25/instagram-php/.php_cs.dist create mode 100755 instafeed/vendor/mgp25/instagram-php/.pre-commit.hook create mode 100755 instafeed/vendor/mgp25/instagram-php/CODE_OF_CONDUCT.md create mode 100755 instafeed/vendor/mgp25/instagram-php/CONTRIBUTING.md create mode 100755 instafeed/vendor/mgp25/instagram-php/Dockerfile create mode 100755 instafeed/vendor/mgp25/instagram-php/LICENSE create mode 100755 instafeed/vendor/mgp25/instagram-php/LICENSE_PREMIUM create mode 100755 instafeed/vendor/mgp25/instagram-php/README.md create mode 100755 instafeed/vendor/mgp25/instagram-php/composer.json create mode 100755 instafeed/vendor/mgp25/instagram-php/devtools/README.md create mode 100755 instafeed/vendor/mgp25/instagram-php/devtools/checkDevices.php create mode 100755 instafeed/vendor/mgp25/instagram-php/devtools/checkExperiments.php create mode 100755 instafeed/vendor/mgp25/instagram-php/devtools/checkStyle.php create mode 100755 instafeed/vendor/mgp25/instagram-php/devtools/testInstagramPhoto.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/README.md create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/accessingValues.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/assets/instagram.png create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/customSettings.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/exceptionDetailsExample.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/liveBroadcast.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/paginateWithExclusion.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/paginationExample.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/pushReceiver.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/rankTokenUsage.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/realtimeClient.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/realtimeHttp.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/sharePhotoToStoryFeed.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/shortcodeConverter.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/twoFactorLogin.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/uploadAlbum.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/uploadPhoto.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/uploadStory.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/uploadStoryCountdown.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/uploadStoryFundraiser.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/uploadStoryPoll.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/uploadStoryQuestion.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/uploadStorySlider.php create mode 100755 instafeed/vendor/mgp25/instagram-php/examples/uploadVideo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/extradocs/Push_setPreferences.txt create mode 100755 instafeed/vendor/mgp25/instagram-php/src/AutoPropertyMapper.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Client.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Constants.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Debug.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Devices/Device.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Devices/DeviceInterface.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Devices/GoodDevices.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Devices/UserAgent.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/AccountDisabledException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/BadRequestException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/ChallengeRequiredException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/CheckpointRequiredException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/ConsentRequiredException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/EmptyResponseException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/EndpointException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/FeedbackRequiredException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/ForcedPasswordResetException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/IncorrectPasswordException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/InstagramException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/InternalException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/InvalidSmsCodeException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/InvalidUserException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/LoginRequiredException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/NetworkException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/NotFoundException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/RequestException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/RequestHeadersTooLargeException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/SentryBlockException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/ServerMessageThrower.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/SettingsException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/ThrottledException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Exception/UploadFailedException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/ExperimentsInterface.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Instagram.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/InstagramID.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Constraints/AlbumConstraints.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Constraints/ConstraintsFactory.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Constraints/DirectConstraints.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Constraints/DirectStoryConstraints.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Constraints/StoryConstraints.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Constraints/TimelineConstraints.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Constraints/TvConstraints.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/ConstraintsInterface.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Geometry/Dimensions.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Geometry/Rectangle.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/InstagramMedia.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/MediaDetails.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Photo/InstagramPhoto.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Photo/PhotoDetails.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Video/FFmpeg.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Video/InstagramThumbnail.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Video/InstagramVideo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Media/Video/VideoDetails.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Middleware/FakeCookies.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Middleware/ZeroRating.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Push.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Push/Fbns.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Push/Fbns/Auth.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Push/Notification.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Push/Payload/BadgeCount.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/React/Connector.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/React/PersistentInterface.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/React/PersistentTrait.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/IndicateActivity.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/MarkSeen.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendHashtag.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendLike.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendLocation.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendPost.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendProfile.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendReaction.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendStory.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendText.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/ShareItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/DirectCommand.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/IrisSubscribe.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Command/UpdateSubscriptions.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/CommandInterface.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Handler/AbstractHandler.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Handler/DirectHandler.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Handler/HandlerException.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Handler/IrisHandler.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Handler/LiveHandler.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Handler/PresenceHandler.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Handler/RegionHintHandler.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Handler/ZeroProvisionHandler.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/HandlerInterface.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Message.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Mqtt.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Mqtt/Auth.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Mqtt/Capabilities.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Mqtt/Config.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Mqtt/PacketFactory.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Mqtt/QosLevel.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Mqtt/StreamParser.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Mqtt/Topics.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Parser/GraphQlParser.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Parser/IrisParser.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Parser/JsonParser.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Parser/RegionHintParser.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Parser/SkywalkerParser.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/ParserInterface.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Payload/Action/AckAction.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Payload/Event/PatchEvent.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Payload/Event/PatchEventOp.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Payload/IrisSubscribeAck.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Payload/LiveBroadcast.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Payload/RealtimeAction.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Payload/RealtimeEvent.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Payload/StoryScreenshot.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Payload/ThreadAction.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Payload/ThreadActivity.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Payload/ZeroProvisionEvent.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQl/AppPresenceSubscription.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQl/DirectTypingSubscription.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQl/ZeroProvisionSubscription.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQlSubscription.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Subscription/Skywalker/DirectSubscription.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Subscription/Skywalker/LiveSubscription.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/Subscription/SkywalkerSubscription.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Realtime/SubscriptionInterface.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Account.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Business.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Collection.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Creative.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Direct.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Discover.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Hashtag.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Highlight.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Internal.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Live.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Location.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Media.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Metadata/Internal.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/People.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Push.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/RequestCollection.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Shopping.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Story.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/TV.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Timeline.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Request/Usertag.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/AccountCreateResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/AccountDetailsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/AccountSecurityInfoResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ActiveFeedAdsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ActiveReelAdsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ActivityNewsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ArchiveMediaResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ArchivedStoriesFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ArlinkDownloadInfoResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BadgeNotificationsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BlockedListResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BlockedMediaResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BlockedReelsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BootstrapUsersResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BroadcastCommentsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BroadcastHeartbeatAndViewerCountResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BroadcastInfoResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BroadcastJoinRequestCountResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BroadcastLikeCountResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BroadcastLikeResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/BroadcastQuestionsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CapabilitiesDecisionsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ChallengeResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ChangePasswordResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CharitiesListResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CheckEmailResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CheckUsernameResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CloseFriendsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CollectionFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CommentBroadcastResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CommentCategoryFilterResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CommentFilterKeywordsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CommentFilterResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CommentFilterSetResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CommentLikeUnlikeResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CommentLikersResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CommentResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ConfigureResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CreateBusinessInfoResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CreateCollectionResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CreateHighlightResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/CreateLiveResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DeleteCollectionResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DeleteCommentResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DirectCreateGroupThreadResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DirectInboxResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DirectPendingInboxResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DirectRankedRecipientsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DirectRecentRecipientsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DirectSeenItemResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DirectSendItemResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DirectSendItemsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DirectShareInboxResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DirectThreadResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DirectVisualThreadResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DisableTwoFactorSMSResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DiscoverChannelsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DiscoverPeopleResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/DiscoverTopLiveResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/EditCollectionResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/EditMediaResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/EnableDisableLiveCommentsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/EnableTwoFactorSMSResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ExploreResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FBLocationResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FBSearchResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FaceEffectsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FaceModelsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FacebookHiddenEntitiesResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FacebookOTAResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FetchQPDataResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FinalViewerListResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FollowerAndFollowingResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FollowingRecentActivityResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FormerUsernamesResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FriendshipResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FriendshipsShowManyResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/FriendshipsShowResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/GenericResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/GetCollectionsListResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/GraphqlResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/HashtagsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/HighlightFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/InsightsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/LauncherSyncResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/LikeFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/LinkAddressBookResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/LinkageStatusResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/LocationFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/LocationResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/LocationStoryResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/LoginResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/LogoutResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/LoomFetchConfigResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/MediaCommentRepliesResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/MediaCommentsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/MediaDeleteResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/MediaInfoResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/MediaInsightsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/MediaLikersResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/MediaSeenResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/MegaphoneLogResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/AccountAccessToolConfig.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/AccountSummaryUnit.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Action.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ActionBadge.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ActionLog.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Ad4ad.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/AdMetadata.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/AdsInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/AndroidLinks.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/AnimatedMedia.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/AnimatedMediaImage.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/AnimatedMediaImageFixedHeigth.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ArchivedStoriesFeedItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Args.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/AssetModel.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Attribution.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/AudioContext.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Aymf.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/AymfItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Badging.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/BiographyEntities.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/BlockedReels.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Bold.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Broadcast.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/BroadcastQuestion.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/BroadcastStatusItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/BusinessEdge.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/BusinessFeed.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/BusinessManager.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/BusinessManagerStatus.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/BusinessNode.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Button.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Caption.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/CarouselMedia.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/CatalogData.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/CatalogEdge.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/CatalogNode.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ChainingInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ChainingSuggestion.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Challenge.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Channel.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/CloseFriends.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Collection.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Comment.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/CommentInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/CommentTranslations.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Composer.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ContextualFilters.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/CountdownSticker.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Counts.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/CoverMedia.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Creative.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DataGraph.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DataPoints.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectCursor.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectExpiringSummary.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectInbox.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectLink.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectMessageMetadata.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectRankedRecipient.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectReaction.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectReactions.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectSeenItemPayload.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectSendItemPayload.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectThread.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectThreadItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectThreadItemMedia.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DirectThreadLastSeenAt.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/DismissCard.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Edges.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Effect.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/EligiblePromotions.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/EndOfFeedDemarcator.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Experiment.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Explore.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ExploreItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ExploreItemInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/FaceModels.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/FacebookUser.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/FeedAysf.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/FeedItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/FelixShare.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/FillItems.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/FollowersUnit.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/FormerUsername.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/FormerUsernameInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/FriendshipStatus.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/FullItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Gating.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/GenericMegaphone.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/GraphData.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/GraphNode.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Groups.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Hashtag.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Headline.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/HiddenEntities.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/HideReason.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/IOSLinks.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/IabAutofillOptoutInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Image.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ImageCandidate.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Image_Versions2.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/In.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Injected.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/InlineFollow.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Insights.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Item.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/LayoutContent.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Link.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/LinkContext.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/LiveComment.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/LiveVideoShare.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/LiveViewerInvite.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Location.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/LocationItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/MeGraphData.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Media.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/MediaCroppingInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/MediaData.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/MediaInsights.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/MediaShare.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Megaphone.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Nametag.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Owner.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/PageInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Param.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Participants.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/PermanentItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/PhoneVerificationSettings.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Placeholder.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/PostLive.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/PostLiveItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Prefill.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/PrimaryCountryInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Product.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ProductImage.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ProductShare.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ProductTags.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/PromotionsUnit.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/PushSettings.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/QPData.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/QPExtraInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/QPNode.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/QPSurface.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/QPViewerData.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/QueryResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/QuestionSticker.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/QuizSticker.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Ranking.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Reel.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ReelMention.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ReelShare.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Related.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Responder.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/RewriteRule.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/SavedFeedItem.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Section.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/SectionMedia.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ServerDataInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/ShadowInstagramUser.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/SharePrefillEntities.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/SharedFollower.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/SharedFollowerAccountsInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Slot.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StaticStickers.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StepData.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Stickers.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Stories.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoriesNetego.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Story.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryAppAttribution.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryCountdowns.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryCta.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryHashtag.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryLocation.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryQuestionResponderInfos.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryQuestions.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryQuizParticipantInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryQuizs.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryShare.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryTray.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/StoryTvChannel.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Subscription.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Suggested.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/SuggestedUsers.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Suggestion.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/SuggestionCard.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/SummaryPromotions.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/SupportedCapabilities.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Surface.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/SystemControl.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/TVChannel.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/TVSearchResult.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Tab.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/TabsInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Tag.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Tallies.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Template.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Text.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Thumbnail.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/TimeRange.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Token.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/TopLive.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/TraceControl.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/TraySuggestions.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/TwoFactorInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/CoreUnpredictableContainer.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/DirectThreadLastSeenAtUnpredictableContainer.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/FriendshipStatusUnpredictableContainer.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/MediaUnpredictableContainer.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/PresenceUnpredictableContainer.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/ReelUnpredictableContainer.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/UserUnpredictableContainer.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/User.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/UserCard.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/UserList.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/UserPresence.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Usertag.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/VideoCallEvent.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/VideoUploadUrl.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/VideoVersions.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Viewer.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/VoiceMedia.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/Voter.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/VoterInfo.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/Model/_Message.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/MsisdnHeaderResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/MultipleAccountFamilyResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/MutedReelsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/OnBoardCatalogResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/OnTagProductResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PermalinkResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PinCommentBroadcastResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PopularFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PostLiveCommentsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PostLiveLikesResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PostLiveViewerListResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PrefillCandidatesResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PresenceStatusResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PresencesResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ProfileNoticeResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PropertyCollection/Sticker.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PushPreferencesResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/PushRegisterResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/QPCooldownsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/RecentSearchesResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/RecoveryResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ReelMediaViewerResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ReelSettingsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ReelsMediaResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ReelsTrayFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/RelatedLocationResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ReportExploreMediaResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ResumableOffsetResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ResumableUploadResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ReviewPreferenceResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SaveAndUnsaveMedia.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SavedFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SearchTagResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SearchUserResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SegmentedStartResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SendConfirmEmailResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SendSMSCodeResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SendTwoFactorEnableSMSResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SharePrefillResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SharedFollowersResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/StartLiveResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/StickerAssetsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/StoryAnswersResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/StoryCountdownsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/StoryPollVotersResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SuggestedBroadcastsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SuggestedSearchesResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SuggestedUsersBadgeResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SuggestedUsersResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SwitchBusinessProfileResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SwitchPersonalProfileResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/SyncResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TVChannelsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TVGuideResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TVSearchResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TagFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TagInfoResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TagRelatedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TagsStoryResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TimelineFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TokenResultResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TopLiveStatusResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TranslateResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/TwoFactorLoginSMSResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/UnlinkAddressBookResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/UnpinCommentBroadcastResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/UploadJobVideoResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/UploadPhotoResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/UploadVideoResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/UserFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/UserInfoResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/UserReelMediaFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/UserStoryFeedResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/UsersLookupResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/UsertagsResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ValidateURLResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/VerifySMSCodeResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/ViewerListResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Response/WriteSuppotedCapabilitiesResponse.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Settings/Factory.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Settings/Storage/Components/PDOStorage.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Settings/Storage/File.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Settings/Storage/Memcached.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Settings/Storage/MySQL.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Settings/Storage/SQLite.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Settings/StorageHandler.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Settings/StorageInterface.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Signatures.php create mode 100755 instafeed/vendor/mgp25/instagram-php/src/Utils.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/React/ConnectorTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/IndicateActivityTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/IrisSubscribeTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/MarkSeenTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/SendHashtagTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/SendLikeTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/SendLocationTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/SendPostTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/SendProfileTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/SendReactionTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/SendStoryTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/SendTextTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Command/UpdateSubscriptionsTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Handler/DirectTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Handler/IrisHandlerTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Handler/LiveTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Handler/PresenceTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Handler/RegionHintTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Subscription/AppPresenceTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Realtime/Subscription/ZeroProvisionTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/tests/Response/ExceptionsTest.php create mode 100755 instafeed/vendor/mgp25/instagram-php/webwarning.htm create mode 100755 instafeed/vendor/psr/http-message/CHANGELOG.md create mode 100755 instafeed/vendor/psr/http-message/LICENSE create mode 100755 instafeed/vendor/psr/http-message/README.md create mode 100755 instafeed/vendor/psr/http-message/composer.json create mode 100755 instafeed/vendor/psr/http-message/src/MessageInterface.php create mode 100755 instafeed/vendor/psr/http-message/src/RequestInterface.php create mode 100755 instafeed/vendor/psr/http-message/src/ResponseInterface.php create mode 100755 instafeed/vendor/psr/http-message/src/ServerRequestInterface.php create mode 100755 instafeed/vendor/psr/http-message/src/StreamInterface.php create mode 100755 instafeed/vendor/psr/http-message/src/UploadedFileInterface.php create mode 100755 instafeed/vendor/psr/http-message/src/UriInterface.php create mode 100755 instafeed/vendor/psr/log/.gitignore create mode 100755 instafeed/vendor/psr/log/LICENSE create mode 100755 instafeed/vendor/psr/log/Psr/Log/AbstractLogger.php create mode 100755 instafeed/vendor/psr/log/Psr/Log/InvalidArgumentException.php create mode 100755 instafeed/vendor/psr/log/Psr/Log/LogLevel.php create mode 100755 instafeed/vendor/psr/log/Psr/Log/LoggerAwareInterface.php create mode 100755 instafeed/vendor/psr/log/Psr/Log/LoggerAwareTrait.php create mode 100755 instafeed/vendor/psr/log/Psr/Log/LoggerInterface.php create mode 100755 instafeed/vendor/psr/log/Psr/Log/LoggerTrait.php create mode 100755 instafeed/vendor/psr/log/Psr/Log/NullLogger.php create mode 100755 instafeed/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php create mode 100755 instafeed/vendor/psr/log/Psr/Log/Test/TestLogger.php create mode 100755 instafeed/vendor/psr/log/README.md create mode 100755 instafeed/vendor/psr/log/composer.json create mode 100755 instafeed/vendor/ralouphie/getallheaders/LICENSE create mode 100755 instafeed/vendor/ralouphie/getallheaders/README.md create mode 100755 instafeed/vendor/ralouphie/getallheaders/composer.json create mode 100755 instafeed/vendor/ralouphie/getallheaders/src/getallheaders.php create mode 100755 instafeed/vendor/react/cache/.gitignore create mode 100755 instafeed/vendor/react/cache/.travis.yml create mode 100755 instafeed/vendor/react/cache/CHANGELOG.md create mode 100755 instafeed/vendor/react/cache/LICENSE create mode 100755 instafeed/vendor/react/cache/README.md create mode 100755 instafeed/vendor/react/cache/composer.json create mode 100755 instafeed/vendor/react/cache/phpunit.xml.dist create mode 100755 instafeed/vendor/react/cache/src/ArrayCache.php create mode 100755 instafeed/vendor/react/cache/src/CacheInterface.php create mode 100755 instafeed/vendor/react/cache/tests/ArrayCacheTest.php create mode 100755 instafeed/vendor/react/cache/tests/CallableStub.php create mode 100755 instafeed/vendor/react/cache/tests/TestCase.php create mode 100755 instafeed/vendor/react/dns/.gitignore create mode 100755 instafeed/vendor/react/dns/.travis.yml create mode 100755 instafeed/vendor/react/dns/CHANGELOG.md create mode 100755 instafeed/vendor/react/dns/LICENSE create mode 100755 instafeed/vendor/react/dns/README.md create mode 100755 instafeed/vendor/react/dns/composer.json create mode 100755 instafeed/vendor/react/dns/examples/01-one.php create mode 100755 instafeed/vendor/react/dns/examples/02-concurrent.php create mode 100755 instafeed/vendor/react/dns/examples/03-cached.php create mode 100755 instafeed/vendor/react/dns/examples/11-all-ips.php create mode 100755 instafeed/vendor/react/dns/examples/12-all-types.php create mode 100755 instafeed/vendor/react/dns/examples/13-reverse-dns.php create mode 100755 instafeed/vendor/react/dns/examples/91-query-a-and-aaaa.php create mode 100755 instafeed/vendor/react/dns/examples/92-query-any.php create mode 100755 instafeed/vendor/react/dns/phpunit.xml.dist create mode 100755 instafeed/vendor/react/dns/src/BadServerException.php create mode 100755 instafeed/vendor/react/dns/src/Config/Config.php create mode 100755 instafeed/vendor/react/dns/src/Config/FilesystemFactory.php create mode 100755 instafeed/vendor/react/dns/src/Config/HostsFile.php create mode 100755 instafeed/vendor/react/dns/src/Model/HeaderBag.php create mode 100755 instafeed/vendor/react/dns/src/Model/Message.php create mode 100755 instafeed/vendor/react/dns/src/Model/Record.php create mode 100755 instafeed/vendor/react/dns/src/Protocol/BinaryDumper.php create mode 100755 instafeed/vendor/react/dns/src/Protocol/Parser.php create mode 100755 instafeed/vendor/react/dns/src/Query/CachedExecutor.php create mode 100755 instafeed/vendor/react/dns/src/Query/CachingExecutor.php create mode 100755 instafeed/vendor/react/dns/src/Query/CancellationException.php create mode 100755 instafeed/vendor/react/dns/src/Query/CoopExecutor.php create mode 100755 instafeed/vendor/react/dns/src/Query/Executor.php create mode 100755 instafeed/vendor/react/dns/src/Query/ExecutorInterface.php create mode 100755 instafeed/vendor/react/dns/src/Query/HostsFileExecutor.php create mode 100755 instafeed/vendor/react/dns/src/Query/Query.php create mode 100755 instafeed/vendor/react/dns/src/Query/RecordBag.php create mode 100755 instafeed/vendor/react/dns/src/Query/RecordCache.php create mode 100755 instafeed/vendor/react/dns/src/Query/RetryExecutor.php create mode 100755 instafeed/vendor/react/dns/src/Query/TimeoutException.php create mode 100755 instafeed/vendor/react/dns/src/Query/TimeoutExecutor.php create mode 100755 instafeed/vendor/react/dns/src/Query/UdpTransportExecutor.php create mode 100755 instafeed/vendor/react/dns/src/RecordNotFoundException.php create mode 100755 instafeed/vendor/react/dns/src/Resolver/Factory.php create mode 100755 instafeed/vendor/react/dns/src/Resolver/Resolver.php create mode 100755 instafeed/vendor/react/dns/tests/CallableStub.php create mode 100755 instafeed/vendor/react/dns/tests/Config/ConfigTest.php create mode 100755 instafeed/vendor/react/dns/tests/Config/FilesystemFactoryTest.php create mode 100755 instafeed/vendor/react/dns/tests/Config/HostsFileTest.php create mode 100755 instafeed/vendor/react/dns/tests/Fixtures/etc/resolv.conf create mode 100755 instafeed/vendor/react/dns/tests/FunctionalResolverTest.php create mode 100755 instafeed/vendor/react/dns/tests/Model/MessageTest.php create mode 100755 instafeed/vendor/react/dns/tests/Protocol/BinaryDumperTest.php create mode 100755 instafeed/vendor/react/dns/tests/Protocol/ParserTest.php create mode 100755 instafeed/vendor/react/dns/tests/Query/CachedExecutorTest.php create mode 100755 instafeed/vendor/react/dns/tests/Query/CachingExecutorTest.php create mode 100755 instafeed/vendor/react/dns/tests/Query/CoopExecutorTest.php create mode 100755 instafeed/vendor/react/dns/tests/Query/ExecutorTest.php create mode 100755 instafeed/vendor/react/dns/tests/Query/HostsFileExecutorTest.php create mode 100755 instafeed/vendor/react/dns/tests/Query/RecordBagTest.php create mode 100755 instafeed/vendor/react/dns/tests/Query/RecordCacheTest.php create mode 100755 instafeed/vendor/react/dns/tests/Query/RetryExecutorTest.php create mode 100755 instafeed/vendor/react/dns/tests/Query/TimeoutExecutorTest.php create mode 100755 instafeed/vendor/react/dns/tests/Query/UdpTransportExecutorTest.php create mode 100755 instafeed/vendor/react/dns/tests/Resolver/FactoryTest.php create mode 100755 instafeed/vendor/react/dns/tests/Resolver/ResolveAliasesTest.php create mode 100755 instafeed/vendor/react/dns/tests/Resolver/ResolverTest.php create mode 100755 instafeed/vendor/react/dns/tests/TestCase.php create mode 100755 instafeed/vendor/react/event-loop/.gitignore create mode 100755 instafeed/vendor/react/event-loop/.travis.yml create mode 100755 instafeed/vendor/react/event-loop/CHANGELOG.md create mode 100755 instafeed/vendor/react/event-loop/LICENSE create mode 100755 instafeed/vendor/react/event-loop/README.md create mode 100755 instafeed/vendor/react/event-loop/composer.json create mode 100755 instafeed/vendor/react/event-loop/phpunit.xml.dist create mode 100755 instafeed/vendor/react/event-loop/src/ExtEventLoop.php create mode 100755 instafeed/vendor/react/event-loop/src/Factory.php create mode 100755 instafeed/vendor/react/event-loop/src/LibEvLoop.php create mode 100755 instafeed/vendor/react/event-loop/src/LibEventLoop.php create mode 100755 instafeed/vendor/react/event-loop/src/LoopInterface.php create mode 100755 instafeed/vendor/react/event-loop/src/StreamSelectLoop.php create mode 100755 instafeed/vendor/react/event-loop/src/Tick/FutureTickQueue.php create mode 100755 instafeed/vendor/react/event-loop/src/Tick/NextTickQueue.php create mode 100755 instafeed/vendor/react/event-loop/src/Timer/Timer.php create mode 100755 instafeed/vendor/react/event-loop/src/Timer/TimerInterface.php create mode 100755 instafeed/vendor/react/event-loop/src/Timer/Timers.php create mode 100755 instafeed/vendor/react/event-loop/tests/AbstractLoopTest.php create mode 100755 instafeed/vendor/react/event-loop/tests/CallableStub.php create mode 100755 instafeed/vendor/react/event-loop/tests/ExtEventLoopTest.php create mode 100755 instafeed/vendor/react/event-loop/tests/LibEvLoopTest.php create mode 100755 instafeed/vendor/react/event-loop/tests/LibEventLoopTest.php create mode 100755 instafeed/vendor/react/event-loop/tests/StreamSelectLoopTest.php create mode 100755 instafeed/vendor/react/event-loop/tests/TestCase.php create mode 100755 instafeed/vendor/react/event-loop/tests/Timer/AbstractTimerTest.php create mode 100755 instafeed/vendor/react/event-loop/tests/Timer/ExtEventTimerTest.php create mode 100755 instafeed/vendor/react/event-loop/tests/Timer/LibEvTimerTest.php create mode 100755 instafeed/vendor/react/event-loop/tests/Timer/LibEventTimerTest.php create mode 100755 instafeed/vendor/react/event-loop/tests/Timer/StreamSelectTimerTest.php create mode 100755 instafeed/vendor/react/event-loop/tests/Timer/TimersTest.php create mode 100755 instafeed/vendor/react/event-loop/tests/bootstrap.php create mode 100755 instafeed/vendor/react/event-loop/travis-init.sh create mode 100755 instafeed/vendor/react/promise-timer/.gitignore create mode 100755 instafeed/vendor/react/promise-timer/.travis.yml create mode 100755 instafeed/vendor/react/promise-timer/CHANGELOG.md create mode 100755 instafeed/vendor/react/promise-timer/LICENSE create mode 100755 instafeed/vendor/react/promise-timer/README.md create mode 100755 instafeed/vendor/react/promise-timer/composer.json create mode 100755 instafeed/vendor/react/promise-timer/phpunit.xml.dist create mode 100755 instafeed/vendor/react/promise-timer/src/TimeoutException.php create mode 100755 instafeed/vendor/react/promise-timer/src/functions.php create mode 100755 instafeed/vendor/react/promise-timer/src/functions_include.php create mode 100755 instafeed/vendor/react/promise-timer/tests/CallableStub.php create mode 100755 instafeed/vendor/react/promise-timer/tests/FunctionRejectTest.php create mode 100755 instafeed/vendor/react/promise-timer/tests/FunctionResolveTest.php create mode 100755 instafeed/vendor/react/promise-timer/tests/FunctionTimeoutTest.php create mode 100755 instafeed/vendor/react/promise-timer/tests/TestCase.php create mode 100755 instafeed/vendor/react/promise-timer/tests/TimeoutExceptionTest.php create mode 100755 instafeed/vendor/react/promise/.gitignore create mode 100755 instafeed/vendor/react/promise/.travis.yml create mode 100755 instafeed/vendor/react/promise/CHANGELOG.md create mode 100755 instafeed/vendor/react/promise/LICENSE create mode 100755 instafeed/vendor/react/promise/README.md create mode 100755 instafeed/vendor/react/promise/composer.json create mode 100755 instafeed/vendor/react/promise/phpunit.xml.dist create mode 100755 instafeed/vendor/react/promise/src/CancellablePromiseInterface.php create mode 100755 instafeed/vendor/react/promise/src/CancellationQueue.php create mode 100755 instafeed/vendor/react/promise/src/Deferred.php create mode 100755 instafeed/vendor/react/promise/src/Exception/LengthException.php create mode 100755 instafeed/vendor/react/promise/src/ExtendedPromiseInterface.php create mode 100755 instafeed/vendor/react/promise/src/FulfilledPromise.php create mode 100755 instafeed/vendor/react/promise/src/LazyPromise.php create mode 100755 instafeed/vendor/react/promise/src/Promise.php create mode 100755 instafeed/vendor/react/promise/src/PromiseInterface.php create mode 100755 instafeed/vendor/react/promise/src/PromisorInterface.php create mode 100755 instafeed/vendor/react/promise/src/RejectedPromise.php create mode 100755 instafeed/vendor/react/promise/src/UnhandledRejectionException.php create mode 100755 instafeed/vendor/react/promise/src/functions.php create mode 100755 instafeed/vendor/react/promise/src/functions_include.php create mode 100755 instafeed/vendor/react/promise/tests/CancellationQueueTest.php create mode 100755 instafeed/vendor/react/promise/tests/DeferredTest.php create mode 100755 instafeed/vendor/react/promise/tests/FulfilledPromiseTest.php create mode 100755 instafeed/vendor/react/promise/tests/FunctionAllTest.php create mode 100755 instafeed/vendor/react/promise/tests/FunctionAnyTest.php create mode 100755 instafeed/vendor/react/promise/tests/FunctionCheckTypehintTest.php create mode 100755 instafeed/vendor/react/promise/tests/FunctionMapTest.php create mode 100755 instafeed/vendor/react/promise/tests/FunctionRaceTest.php create mode 100755 instafeed/vendor/react/promise/tests/FunctionReduceTest.php create mode 100755 instafeed/vendor/react/promise/tests/FunctionRejectTest.php create mode 100755 instafeed/vendor/react/promise/tests/FunctionResolveTest.php create mode 100755 instafeed/vendor/react/promise/tests/FunctionSomeTest.php create mode 100755 instafeed/vendor/react/promise/tests/LazyPromiseTest.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseAdapter/CallbackPromiseAdapter.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseAdapter/PromiseAdapterInterface.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseTest.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseTest/CancelTestTrait.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseTest/FullTestTrait.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseTest/NotifyTestTrait.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseTest/PromiseFulfilledTestTrait.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseTest/PromisePendingTestTrait.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseTest/PromiseRejectedTestTrait.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseTest/PromiseSettledTestTrait.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseTest/RejectTestTrait.php create mode 100755 instafeed/vendor/react/promise/tests/PromiseTest/ResolveTestTrait.php create mode 100755 instafeed/vendor/react/promise/tests/RejectedPromiseTest.php create mode 100755 instafeed/vendor/react/promise/tests/Stub/CallableStub.php create mode 100755 instafeed/vendor/react/promise/tests/TestCase.php create mode 100755 instafeed/vendor/react/promise/tests/bootstrap.php create mode 100755 instafeed/vendor/react/promise/tests/fixtures/SimpleFulfilledTestPromise.php create mode 100755 instafeed/vendor/react/promise/tests/fixtures/SimpleFulfilledTestThenable.php create mode 100755 instafeed/vendor/react/promise/tests/fixtures/SimpleRejectedTestPromise.php create mode 100755 instafeed/vendor/react/promise/tests/fixtures/SimpleTestCancellable.php create mode 100755 instafeed/vendor/react/promise/tests/fixtures/SimpleTestCancellableThenable.php create mode 100755 instafeed/vendor/react/socket/.gitignore create mode 100755 instafeed/vendor/react/socket/.travis.yml create mode 100755 instafeed/vendor/react/socket/CHANGELOG.md create mode 100755 instafeed/vendor/react/socket/LICENSE create mode 100755 instafeed/vendor/react/socket/README.md create mode 100755 instafeed/vendor/react/socket/composer.json create mode 100755 instafeed/vendor/react/socket/examples/01-echo-server.php create mode 100755 instafeed/vendor/react/socket/examples/02-chat-server.php create mode 100755 instafeed/vendor/react/socket/examples/03-http-server.php create mode 100755 instafeed/vendor/react/socket/examples/11-http-client.php create mode 100755 instafeed/vendor/react/socket/examples/12-https-client.php create mode 100755 instafeed/vendor/react/socket/examples/21-netcat-client.php create mode 100755 instafeed/vendor/react/socket/examples/22-http-client.php create mode 100755 instafeed/vendor/react/socket/examples/91-benchmark-server.php create mode 100755 instafeed/vendor/react/socket/examples/99-generate-self-signed.php create mode 100755 instafeed/vendor/react/socket/examples/localhost.pem create mode 100755 instafeed/vendor/react/socket/examples/localhost_swordfish.pem create mode 100755 instafeed/vendor/react/socket/phpunit.xml.dist create mode 100755 instafeed/vendor/react/socket/src/Connection.php create mode 100755 instafeed/vendor/react/socket/src/ConnectionInterface.php create mode 100755 instafeed/vendor/react/socket/src/Connector.php create mode 100755 instafeed/vendor/react/socket/src/ConnectorInterface.php create mode 100755 instafeed/vendor/react/socket/src/DnsConnector.php create mode 100755 instafeed/vendor/react/socket/src/FixedUriConnector.php create mode 100755 instafeed/vendor/react/socket/src/LimitingServer.php create mode 100755 instafeed/vendor/react/socket/src/SecureConnector.php create mode 100755 instafeed/vendor/react/socket/src/SecureServer.php create mode 100755 instafeed/vendor/react/socket/src/Server.php create mode 100755 instafeed/vendor/react/socket/src/ServerInterface.php create mode 100755 instafeed/vendor/react/socket/src/StreamEncryption.php create mode 100755 instafeed/vendor/react/socket/src/TcpConnector.php create mode 100755 instafeed/vendor/react/socket/src/TcpServer.php create mode 100755 instafeed/vendor/react/socket/src/TimeoutConnector.php create mode 100755 instafeed/vendor/react/socket/src/UnixConnector.php create mode 100755 instafeed/vendor/react/socket/src/UnixServer.php create mode 100755 instafeed/vendor/react/socket/tests/ConnectionTest.php create mode 100755 instafeed/vendor/react/socket/tests/ConnectorTest.php create mode 100755 instafeed/vendor/react/socket/tests/DnsConnectorTest.php create mode 100755 instafeed/vendor/react/socket/tests/FixedUriConnectorTest.php create mode 100755 instafeed/vendor/react/socket/tests/FunctionalConnectorTest.php create mode 100755 instafeed/vendor/react/socket/tests/FunctionalSecureServerTest.php create mode 100755 instafeed/vendor/react/socket/tests/FunctionalTcpServerTest.php create mode 100755 instafeed/vendor/react/socket/tests/IntegrationTest.php create mode 100755 instafeed/vendor/react/socket/tests/LimitingServerTest.php create mode 100755 instafeed/vendor/react/socket/tests/SecureConnectorTest.php create mode 100755 instafeed/vendor/react/socket/tests/SecureIntegrationTest.php create mode 100755 instafeed/vendor/react/socket/tests/SecureServerTest.php create mode 100755 instafeed/vendor/react/socket/tests/ServerTest.php create mode 100755 instafeed/vendor/react/socket/tests/Stub/CallableStub.php create mode 100755 instafeed/vendor/react/socket/tests/Stub/ConnectionStub.php create mode 100755 instafeed/vendor/react/socket/tests/Stub/ServerStub.php create mode 100755 instafeed/vendor/react/socket/tests/TcpConnectorTest.php create mode 100755 instafeed/vendor/react/socket/tests/TcpServerTest.php create mode 100755 instafeed/vendor/react/socket/tests/TestCase.php create mode 100755 instafeed/vendor/react/socket/tests/TimeoutConnectorTest.php create mode 100755 instafeed/vendor/react/socket/tests/UnixConnectorTest.php create mode 100755 instafeed/vendor/react/socket/tests/UnixServerTest.php create mode 100755 instafeed/vendor/react/stream/.gitignore create mode 100755 instafeed/vendor/react/stream/.travis.yml create mode 100755 instafeed/vendor/react/stream/CHANGELOG.md create mode 100755 instafeed/vendor/react/stream/LICENSE create mode 100755 instafeed/vendor/react/stream/README.md create mode 100755 instafeed/vendor/react/stream/composer.json create mode 100755 instafeed/vendor/react/stream/examples/01-http.php create mode 100755 instafeed/vendor/react/stream/examples/02-https.php create mode 100755 instafeed/vendor/react/stream/examples/11-cat.php create mode 100755 instafeed/vendor/react/stream/examples/91-benchmark-throughput.php create mode 100755 instafeed/vendor/react/stream/phpunit.xml.dist create mode 100755 instafeed/vendor/react/stream/src/CompositeStream.php create mode 100755 instafeed/vendor/react/stream/src/DuplexResourceStream.php create mode 100755 instafeed/vendor/react/stream/src/DuplexStreamInterface.php create mode 100755 instafeed/vendor/react/stream/src/ReadableResourceStream.php create mode 100755 instafeed/vendor/react/stream/src/ReadableStreamInterface.php create mode 100755 instafeed/vendor/react/stream/src/ThroughStream.php create mode 100755 instafeed/vendor/react/stream/src/Util.php create mode 100755 instafeed/vendor/react/stream/src/WritableResourceStream.php create mode 100755 instafeed/vendor/react/stream/src/WritableStreamInterface.php create mode 100755 instafeed/vendor/react/stream/tests/CallableStub.php create mode 100755 instafeed/vendor/react/stream/tests/CompositeStreamTest.php create mode 100755 instafeed/vendor/react/stream/tests/DuplexResourceStreamIntegrationTest.php create mode 100755 instafeed/vendor/react/stream/tests/DuplexResourceStreamTest.php create mode 100755 instafeed/vendor/react/stream/tests/EnforceBlockingWrapper.php create mode 100755 instafeed/vendor/react/stream/tests/FunctionalInternetTest.php create mode 100755 instafeed/vendor/react/stream/tests/ReadableResourceStreamTest.php create mode 100755 instafeed/vendor/react/stream/tests/Stub/ReadableStreamStub.php create mode 100755 instafeed/vendor/react/stream/tests/TestCase.php create mode 100755 instafeed/vendor/react/stream/tests/ThroughStreamTest.php create mode 100755 instafeed/vendor/react/stream/tests/UtilTest.php create mode 100755 instafeed/vendor/react/stream/tests/WritableStreamResourceTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/.gitignore create mode 100755 instafeed/vendor/ringcentral/psr7/.travis.yml create mode 100755 instafeed/vendor/ringcentral/psr7/CHANGELOG.md create mode 100755 instafeed/vendor/ringcentral/psr7/Dockerfile create mode 100755 instafeed/vendor/ringcentral/psr7/LICENSE create mode 100755 instafeed/vendor/ringcentral/psr7/Makefile create mode 100755 instafeed/vendor/ringcentral/psr7/README.md create mode 100755 instafeed/vendor/ringcentral/psr7/composer.json create mode 100755 instafeed/vendor/ringcentral/psr7/phpunit.xml.dist create mode 100755 instafeed/vendor/ringcentral/psr7/src/AppendStream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/BufferStream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/CachingStream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/DroppingStream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/FnStream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/InflateStream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/LazyOpenStream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/LimitStream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/MessageTrait.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/MultipartStream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/NoSeekStream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/PumpStream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/Request.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/Response.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/ServerRequest.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/Stream.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/StreamDecoratorTrait.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/StreamWrapper.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/Uri.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/functions.php create mode 100755 instafeed/vendor/ringcentral/psr7/src/functions_include.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/AppendStreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/BufferStreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/CachingStreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/DroppingStreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/FnStreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/FunctionsTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/InflateStreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/LazyOpenStreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/LimitStreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/MultipartStreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/NoSeekStreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/PumpStreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/RequestTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/ResponseTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/ServerRequestTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/StreamDecoratorTraitTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/StreamTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/StreamWrapperTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/UriTest.php create mode 100755 instafeed/vendor/ringcentral/psr7/tests/bootstrap.php create mode 100755 instafeed/vendor/symfony/process/.gitignore create mode 100755 instafeed/vendor/symfony/process/CHANGELOG.md create mode 100755 instafeed/vendor/symfony/process/Exception/ExceptionInterface.php create mode 100755 instafeed/vendor/symfony/process/Exception/InvalidArgumentException.php create mode 100755 instafeed/vendor/symfony/process/Exception/LogicException.php create mode 100755 instafeed/vendor/symfony/process/Exception/ProcessFailedException.php create mode 100755 instafeed/vendor/symfony/process/Exception/ProcessSignaledException.php create mode 100755 instafeed/vendor/symfony/process/Exception/ProcessTimedOutException.php create mode 100755 instafeed/vendor/symfony/process/Exception/RuntimeException.php create mode 100755 instafeed/vendor/symfony/process/ExecutableFinder.php create mode 100755 instafeed/vendor/symfony/process/InputStream.php create mode 100755 instafeed/vendor/symfony/process/LICENSE create mode 100755 instafeed/vendor/symfony/process/PhpExecutableFinder.php create mode 100755 instafeed/vendor/symfony/process/PhpProcess.php create mode 100755 instafeed/vendor/symfony/process/Pipes/AbstractPipes.php create mode 100755 instafeed/vendor/symfony/process/Pipes/PipesInterface.php create mode 100755 instafeed/vendor/symfony/process/Pipes/UnixPipes.php create mode 100755 instafeed/vendor/symfony/process/Pipes/WindowsPipes.php create mode 100755 instafeed/vendor/symfony/process/Process.php create mode 100755 instafeed/vendor/symfony/process/ProcessUtils.php create mode 100755 instafeed/vendor/symfony/process/README.md create mode 100755 instafeed/vendor/symfony/process/Tests/ErrorProcessInitiator.php create mode 100755 instafeed/vendor/symfony/process/Tests/ExecutableFinderTest.php create mode 100755 instafeed/vendor/symfony/process/Tests/KillableProcessWithOutput.php create mode 100755 instafeed/vendor/symfony/process/Tests/NonStopableProcess.php create mode 100755 instafeed/vendor/symfony/process/Tests/PhpExecutableFinderTest.php create mode 100755 instafeed/vendor/symfony/process/Tests/PhpProcessTest.php create mode 100755 instafeed/vendor/symfony/process/Tests/PipeStdinInStdoutStdErrStreamSelect.php create mode 100755 instafeed/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php create mode 100755 instafeed/vendor/symfony/process/Tests/ProcessTest.php create mode 100755 instafeed/vendor/symfony/process/Tests/SignalListener.php create mode 100755 instafeed/vendor/symfony/process/composer.json create mode 100755 instafeed/vendor/symfony/process/phpunit.xml.dist create mode 100755 instafeed/vendor/valga/fbns-react/.gitignore create mode 100755 instafeed/vendor/valga/fbns-react/.php_cs create mode 100755 instafeed/vendor/valga/fbns-react/LICENSE create mode 100755 instafeed/vendor/valga/fbns-react/README.md create mode 100755 instafeed/vendor/valga/fbns-react/bin/thrift_debug create mode 100755 instafeed/vendor/valga/fbns-react/composer.json create mode 100755 instafeed/vendor/valga/fbns-react/src/Auth/DeviceAuth.php create mode 100755 instafeed/vendor/valga/fbns-react/src/AuthInterface.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Common/PublishAckPacket.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Connection.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Json.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Lite.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Lite/ConnectRequestPacket.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Lite/ConnectResponsePacket.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Lite/OutgoingConnectFlow.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Lite/PacketFactory.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Lite/ReactFlow.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Lite/ReactMqttClient.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Lite/StreamParser.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Message/Push.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Message/Register.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Thrift/Compact.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Thrift/Debug.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Thrift/Reader.php create mode 100755 instafeed/vendor/valga/fbns-react/src/Thrift/Writer.php create mode 100755 instafeed/vendor/winbox/args/LICENSE create mode 100755 instafeed/vendor/winbox/args/README.md create mode 100755 instafeed/vendor/winbox/args/appveyor.yml create mode 100755 instafeed/vendor/winbox/args/composer.json create mode 100755 instafeed/vendor/winbox/args/src/Args.php create mode 100755 log/dreamyourmansion.log create mode 100755 log/vstbestprices.log create mode 100755 selenium/__pycache__/pyautogui.cpython-38.pyc create mode 100755 selenium/autogui.py create mode 100755 selenium/cat.jpg create mode 100755 selenium/geckodriver create mode 100755 selenium/geckodriver.exe create mode 100755 selenium/get_page_source create mode 100755 selenium/profiles/adobebestprices/db/db_adobebestprices.dat create mode 100755 selenium/profiles/adobebestprices/images/Adam Monroe Music Mark 73 v2.5 VST AU AAX.jpg create mode 100755 selenium/profiles/adobebestprices/images/Algonaut Atlas v1.4.4 VST WIN.jpg create mode 100755 selenium/profiles/adobebestprices/images/Ample Bass Metal Ray5 v3.1.0 [WIN & MACOSX].jpg create mode 100755 selenium/profiles/adobebestprices/images/Ample Bass P v3.2 WIN & MacOS.jpg create mode 100755 selenium/profiles/adobebestprices/images/Ample Ethno Ukulele III v3.2 [WIN & MACOSX].jpg create mode 100755 selenium/profiles/adobebestprices/images/Ample Guitar L v3.3.0 [WIN & MACOSX].jpg create mode 100755 selenium/profiles/adobebestprices/images/Ample Guitar LP v3.2 [WIN & MACOSX].jpg create mode 100755 selenium/profiles/adobebestprices/images/Ample Guitar VC v3.2.0 WIN & MacOSX.jpg create mode 100755 selenium/profiles/adobebestprices/images/Lindell Plugins Bundle 2020 WIN.jpg create mode 100755 selenium/profiles/adobebestprices/images/Native Instruments Guitar Rig 6 Pro v6.0.2 [WIN].jpg create mode 100755 selenium/profiles/adobebestprices/images/Native Instruments Kontakt 6.4.2 [Full Installer] [WIN].jpg create mode 100755 selenium/profiles/adobebestprices/images/Native Instruments Traktor Pro 3 v3.4.0 WIN & MACOSX.jpg create mode 100755 selenium/profiles/adobebestprices/images/Scaler 2 v2.1 VST VST3 AU AAX (WIN & MAC).jpg create mode 100755 selenium/profiles/adobebestprices/images/Scavenger Hunt – Future Nostalgia WAV.jpg create mode 100755 selenium/profiles/adobebestprices/images/Solemn Tones The Odin II VST2 VST3 AU AAX.jpg create mode 100755 selenium/profiles/adobebestprices/images/StudioLinked Bit Machine VST AU.jpg create mode 100755 selenium/profiles/adobebestprices/images/StudioLinked Dope FX v1.0 [WIN MACOSX].jpg create mode 100755 selenium/profiles/adobebestprices/images/StudioLinked Reverse Station v1.0 [WIN MACOSX].png create mode 100755 selenium/profiles/adobebestprices/images/StudioLinked Trap Plucks v1.0 [WIN MACOSX].jpg create mode 100755 selenium/profiles/adobebestprices/images/UJAM Beatmaker Bundle 2 VST2 AAX [WIN].jpg create mode 100755 selenium/profiles/adobebestprices/images/UJAM Finisher Bundle VST AAX [WIN].jpg create mode 100755 selenium/profiles/adobebestprices/images/UJAM Virtual Bassist DANDY v2.1.1 VST AAX [WIN].jpg create mode 100755 selenium/profiles/adobebestprices/images/UJAM Virtual Bassist MELLOW v2.1.1 VST AAX [WIN].jpg create mode 100755 selenium/profiles/adobebestprices/images/UJAM Virtual Bassist ROWDY v2.1.1 VST AAX [WIN].jpg create mode 100755 selenium/profiles/adobebestprices/images/UJAM Virtual Bassist ROYAL v2.1.1 VST AAX [WIN].jpg create mode 100755 selenium/profiles/adobebestprices/images/UJAM Virtual Guitarist CARBON v1.0.1 VST AAX [WIN].jpg create mode 100755 selenium/selenium-server-standalone-3.141.59.jar create mode 100755 selenium/selenium.pl create mode 100755 src/db/db_dreamyourmansion.dat create mode 100755 src/db/db_vstbestprices.dat create mode 100755 src/images/dreamyourmansion/7VPFyhB_j8Y.jpg create mode 100755 src/images/dreamyourmansion/RKdLlTyjm5g.jpg create mode 100755 src/images/dreamyourmansion/UV81E0oXXWQ.jpg create mode 100755 src/mpg25-instagram-api/vendor/autoload.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt-client-react/LICENSE.md create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt-client-react/README.md create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt-client-react/composer.json create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt-client-react/src/ReactFlow.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt-client-react/src/ReactMqttClient.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/LICENSE.md create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/README.md create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/composer.json create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Connection.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/DefaultConnection.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/DefaultIdentifierGenerator.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/DefaultMessage.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/DefaultSubscription.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Exception/EndOfStreamException.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Exception/MalformedPacketException.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Exception/UnknownPacketTypeException.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Flow.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Flow/AbstractFlow.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Flow/IncomingPingFlow.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Flow/IncomingPublishFlow.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Flow/OutgoingConnectFlow.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Flow/OutgoingDisconnectFlow.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Flow/OutgoingPingFlow.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Flow/OutgoingPublishFlow.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Flow/OutgoingSubscribeFlow.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Flow/OutgoingUnsubscribeFlow.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/IdentifierGenerator.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Message.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/BasePacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/ConnectRequestPacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/ConnectResponsePacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/DisconnectRequestPacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/IdentifiablePacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/IdentifierOnlyPacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/PingRequestPacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/PingResponsePacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/PublishAckPacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/PublishCompletePacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/PublishReceivedPacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/PublishReleasePacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/PublishRequestPacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/StrictConnectRequestPacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/SubscribeRequestPacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/SubscribeResponsePacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/UnsubscribeRequestPacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Packet/UnsubscribeResponsePacket.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/PacketFactory.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/PacketStream.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/StreamParser.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/Subscription.php create mode 100755 src/mpg25-instagram-api/vendor/binsoul/net-mqtt/src/TopicMatcher.php create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/README.md create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/composer.json create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/examples/01-proxy-https.php create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/examples/02-optional-proxy-https.php create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/examples/11-proxy-smtp.php create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/examples/12-proxy-smtps.php create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/src/ProxyConnector.php create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/tests/AbstractTestCase.php create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/tests/FunctionalTest.php create mode 100755 src/mpg25-instagram-api/vendor/clue/http-proxy-react/tests/ProxyConnectorTest.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/README.md create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/composer.json create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/01-http.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/02-https.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/03-proxy-chaining.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/04-local-dns.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/11-server.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/12-server-with-password.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/13-server-blacklist.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/21-server-proxy-chaining.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/22-server-proxy-chaining-from-random-pool.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/31-server-secure.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/32-http-secure.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/examples/localhost.pem create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/src/Client.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/src/Server.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/src/StreamReader.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/tests/ClientTest.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/tests/FunctionalTest.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/tests/ServerTest.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/tests/StreamReaderTest.php create mode 100755 src/mpg25-instagram-api/vendor/clue/socks-react/tests/bootstrap.php create mode 100755 src/mpg25-instagram-api/vendor/composer/ClassLoader.php create mode 100755 src/mpg25-instagram-api/vendor/composer/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/composer/autoload_classmap.php create mode 100755 src/mpg25-instagram-api/vendor/composer/autoload_files.php create mode 100755 src/mpg25-instagram-api/vendor/composer/autoload_namespaces.php create mode 100755 src/mpg25-instagram-api/vendor/composer/autoload_psr4.php create mode 100755 src/mpg25-instagram-api/vendor/composer/autoload_real.php create mode 100755 src/mpg25-instagram-api/vendor/composer/autoload_static.php create mode 100755 src/mpg25-instagram-api/vendor/composer/installed.json create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/CONTRIBUTORS.txt create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/README.md create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/build.xml create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/composer.json create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/composer.lock create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/examples/demo.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/package.ini create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/phpdox.xml create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/phprelease.ini create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/phpunit-ci.xml create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/Argument.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ContinuousOptionParser.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/Exception/InvalidOptionException.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/Exception/InvalidOptionValueException.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/Exception/NonNumericException.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/Exception/OptionConflictException.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/Exception/RequireValueException.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/Option.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/OptionCollection.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/OptionParser.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/OptionPrinter/ConsoleOptionPrinter.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/OptionPrinter/OptionPrinter.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/OptionResult.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/BaseType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/BoolType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/BooleanType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/DateTimeType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/DateType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/DirType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/EmailType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/FileType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/IpType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/Ipv4Type.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/Ipv6Type.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/NumberType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/PathType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/RegexType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/StringType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/src/ValueType/UrlType.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/tests/ArgumentTest.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/tests/ContinuousOptionParserTest.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/tests/OptionCollectionTest.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/tests/OptionParserTest.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/tests/OptionPrinter/ConsoleOptionPrinterTest.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/tests/OptionResultTest.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/tests/OptionTest.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/tests/RegexValueTypeTest.php create mode 100755 src/mpg25-instagram-api/vendor/corneltek/getoptionkit/tests/ValueTypeTest.php create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/README.md create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/composer.json create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/doc/00-intro.md create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/doc/01-api.md create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/doc/02-plugin-system.md create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/examples/benchmark-emit-once.php create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/examples/benchmark-emit-one-argument.php create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/examples/benchmark-emit.php create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/examples/benchmark-remove-listener-once.php create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/src/Evenement/EventEmitter.php create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php create mode 100755 src/mpg25-instagram-api/vendor/evenement/evenement/tests/Evenement/Tests/functions.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/.php_cs create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/Dockerfile create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/README.md create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/UPGRADING.md create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/composer.json create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/phpstan.neon.dist create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Client.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/ClientInterface.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/HandlerStack.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/MessageFormatter.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Middleware.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/Pool.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/RequestOptions.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/TransferStats.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/UriTemplate.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/functions.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/guzzle/src/functions_include.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/Makefile create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/README.md create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/composer.json create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/AggregateException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/CancellationException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/Coroutine.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/EachPromise.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/FulfilledPromise.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/Promise.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/PromiseInterface.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/PromisorInterface.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/RejectedPromise.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/RejectionException.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/TaskQueue.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/TaskQueueInterface.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/functions.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/promises/src/functions_include.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/README.md create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/composer.json create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/AppendStream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/BufferStream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/CachingStream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/DroppingStream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/FnStream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/InflateStream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/LazyOpenStream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/LimitStream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/MessageTrait.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/MultipartStream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/NoSeekStream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/PumpStream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/Request.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/Response.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/Rfc7230.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/ServerRequest.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/Stream.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/StreamWrapper.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/UploadedFile.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/Uri.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/UriNormalizer.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/UriResolver.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/functions.php create mode 100755 src/mpg25-instagram-api/vendor/guzzlehttp/psr7/src/functions_include.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/.ac-php-conf.json create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/.php_cs.dist create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/.pre-commit.hook create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/NOTICE create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/README.md create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/bin/lazydoctor create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/composer.json create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/devtools/checkStyle.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/devtools/funcListData.serialized create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testLazyJsonMapper.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testPropertyDefinitionNamespaces.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testUserFeatureToggling.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/devtools/nonRecursiveArrays.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/devtools/prefixSplitAlgorithms.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/examples/basic_example.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/examples/import_example.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/examples/inheritance_example.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/examples/unpredictable_data.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/phpdoc.dist.xml create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/BadPropertyDefinitionException.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/BadPropertyMapException.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/CircularPropertyMapException.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazyJsonMapperException.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazySerializationException.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazyUserException.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazyUserOptionException.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/MagicTranslationException.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/SpanishInquisitionException.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Export/ClassAnalysis.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Export/PropertyDescription.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/LazyJsonMapper.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Magic/FunctionTranslation.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Magic/PropertyTranslation.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Magic/SpecialOperators.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Property/PropertyDefinition.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Property/PropertyMapCache.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Property/PropertyMapCompiler.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Property/UndefinedProperty.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Property/ValueConverter.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/src/Utilities.php create mode 100755 src/mpg25-instagram-api/vendor/lazyjsonmapper/lazyjsonmapper/tests/bootstrap.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/.ac-php-conf.json create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE.md create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE/bug-report.md create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE/feature-request.md create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE/question.md create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/.php_cs.dist create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/.pre-commit.hook create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/CODE_OF_CONDUCT.md create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/CONTRIBUTING.md create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/Dockerfile create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/LICENSE_PREMIUM create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/README.md create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/composer.json create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/devtools/README.md create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/devtools/checkDevices.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/devtools/checkExperiments.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/devtools/checkStyle.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/devtools/testInstagramPhoto.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/README.md create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/accessingValues.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/assets/instagram.png create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/customSettings.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/exceptionDetailsExample.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/liveBroadcast.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/paginateWithExclusion.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/paginationExample.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/pushReceiver.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/rankTokenUsage.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/realtimeClient.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/realtimeHttp.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/sharePhotoToStoryFeed.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/shortcodeConverter.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/twoFactorLogin.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/uploadAlbum.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/uploadPhoto.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/uploadStory.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/uploadStoryCountdown.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/uploadStoryFundraiser.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/uploadStoryPoll.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/uploadStoryQuestion.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/uploadStorySlider.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/examples/uploadVideo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/extradocs/Push_setPreferences.txt create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/AutoPropertyMapper.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Client.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Constants.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Debug.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Devices/Device.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Devices/DeviceInterface.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Devices/GoodDevices.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Devices/UserAgent.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/AccountDisabledException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/BadRequestException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/ChallengeRequiredException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/CheckpointRequiredException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/ConsentRequiredException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/EmptyResponseException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/EndpointException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/FeedbackRequiredException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/ForcedPasswordResetException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/IncorrectPasswordException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/InstagramException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/InternalException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/InvalidSmsCodeException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/InvalidUserException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/LoginRequiredException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/NetworkException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/NotFoundException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/RequestException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/RequestHeadersTooLargeException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/SentryBlockException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/ServerMessageThrower.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/SettingsException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/ThrottledException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Exception/UploadFailedException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/ExperimentsInterface.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Instagram.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/InstagramID.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Constraints/AlbumConstraints.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Constraints/ConstraintsFactory.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Constraints/DirectConstraints.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Constraints/DirectStoryConstraints.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Constraints/StoryConstraints.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Constraints/TimelineConstraints.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Constraints/TvConstraints.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/ConstraintsInterface.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Geometry/Dimensions.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Geometry/Rectangle.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/InstagramMedia.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/MediaDetails.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Photo/InstagramPhoto.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Photo/PhotoDetails.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Video/FFmpeg.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Video/InstagramThumbnail.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Video/InstagramVideo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Media/Video/VideoDetails.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Middleware/FakeCookies.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Middleware/ZeroRating.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Push.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Push/Fbns.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Push/Fbns/Auth.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Push/Notification.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Push/Payload/BadgeCount.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/React/Connector.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/React/PersistentInterface.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/React/PersistentTrait.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/IndicateActivity.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/MarkSeen.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendHashtag.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendLike.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendLocation.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendPost.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendProfile.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendReaction.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendStory.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendText.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/Direct/ShareItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/DirectCommand.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/IrisSubscribe.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Command/UpdateSubscriptions.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/CommandInterface.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Handler/AbstractHandler.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Handler/DirectHandler.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Handler/HandlerException.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Handler/IrisHandler.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Handler/LiveHandler.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Handler/PresenceHandler.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Handler/RegionHintHandler.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Handler/ZeroProvisionHandler.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/HandlerInterface.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Message.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Mqtt.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Mqtt/Auth.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Mqtt/Capabilities.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Mqtt/Config.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Mqtt/PacketFactory.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Mqtt/QosLevel.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Mqtt/StreamParser.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Mqtt/Topics.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Parser/GraphQlParser.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Parser/IrisParser.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Parser/JsonParser.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Parser/RegionHintParser.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Parser/SkywalkerParser.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/ParserInterface.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Payload/Action/AckAction.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Payload/Event/PatchEvent.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Payload/Event/PatchEventOp.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Payload/IrisSubscribeAck.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Payload/LiveBroadcast.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Payload/RealtimeAction.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Payload/RealtimeEvent.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Payload/StoryScreenshot.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Payload/ThreadAction.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Payload/ThreadActivity.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Payload/ZeroProvisionEvent.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQl/AppPresenceSubscription.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQl/DirectTypingSubscription.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQl/ZeroProvisionSubscription.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQlSubscription.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Subscription/Skywalker/DirectSubscription.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Subscription/Skywalker/LiveSubscription.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/Subscription/SkywalkerSubscription.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Realtime/SubscriptionInterface.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Account.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Business.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Collection.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Creative.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Direct.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Discover.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Hashtag.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Highlight.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Internal.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Live.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Location.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Media.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Metadata/Internal.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/People.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Push.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/RequestCollection.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Shopping.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Story.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/TV.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Timeline.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Request/Usertag.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/AccountCreateResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/AccountDetailsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/AccountSecurityInfoResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ActiveFeedAdsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ActiveReelAdsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ActivityNewsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ArchiveMediaResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ArchivedStoriesFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ArlinkDownloadInfoResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BadgeNotificationsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BlockedListResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BlockedMediaResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BlockedReelsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BootstrapUsersResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BroadcastCommentsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BroadcastHeartbeatAndViewerCountResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BroadcastInfoResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BroadcastJoinRequestCountResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BroadcastLikeCountResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BroadcastLikeResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/BroadcastQuestionsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CapabilitiesDecisionsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ChallengeResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ChangePasswordResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CharitiesListResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CheckEmailResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CheckUsernameResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CloseFriendsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CollectionFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CommentBroadcastResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CommentCategoryFilterResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CommentFilterKeywordsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CommentFilterResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CommentFilterSetResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CommentLikeUnlikeResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CommentLikersResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CommentResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ConfigureResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CreateBusinessInfoResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CreateCollectionResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CreateHighlightResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/CreateLiveResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DeleteCollectionResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DeleteCommentResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DirectCreateGroupThreadResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DirectInboxResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DirectPendingInboxResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DirectRankedRecipientsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DirectRecentRecipientsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DirectSeenItemResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DirectSendItemResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DirectSendItemsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DirectShareInboxResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DirectThreadResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DirectVisualThreadResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DisableTwoFactorSMSResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DiscoverChannelsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DiscoverPeopleResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/DiscoverTopLiveResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/EditCollectionResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/EditMediaResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/EnableDisableLiveCommentsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/EnableTwoFactorSMSResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ExploreResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FBLocationResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FBSearchResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FaceEffectsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FaceModelsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FacebookHiddenEntitiesResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FacebookOTAResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FetchQPDataResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FinalViewerListResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FollowerAndFollowingResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FollowingRecentActivityResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FormerUsernamesResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FriendshipResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FriendshipsShowManyResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/FriendshipsShowResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/GenericResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/GetCollectionsListResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/GraphqlResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/HashtagsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/HighlightFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/InsightsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/LauncherSyncResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/LikeFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/LinkAddressBookResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/LinkageStatusResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/LocationFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/LocationResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/LocationStoryResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/LoginResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/LogoutResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/LoomFetchConfigResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/MediaCommentRepliesResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/MediaCommentsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/MediaDeleteResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/MediaInfoResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/MediaInsightsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/MediaLikersResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/MediaSeenResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/MegaphoneLogResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/AccountAccessToolConfig.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/AccountSummaryUnit.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Action.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ActionBadge.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ActionLog.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Ad4ad.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/AdMetadata.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/AdsInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/AndroidLinks.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/AnimatedMedia.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/AnimatedMediaImage.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/AnimatedMediaImageFixedHeigth.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ArchivedStoriesFeedItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Args.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/AssetModel.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Attribution.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/AudioContext.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Aymf.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/AymfItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Badging.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/BiographyEntities.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/BlockedReels.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Bold.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Broadcast.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/BroadcastQuestion.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/BroadcastStatusItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/BusinessEdge.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/BusinessFeed.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/BusinessManager.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/BusinessManagerStatus.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/BusinessNode.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Button.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Caption.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/CarouselMedia.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/CatalogData.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/CatalogEdge.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/CatalogNode.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ChainingInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ChainingSuggestion.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Challenge.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Channel.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/CloseFriends.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Collection.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Comment.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/CommentInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/CommentTranslations.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Composer.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ContextualFilters.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/CountdownSticker.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Counts.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/CoverMedia.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Creative.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DataGraph.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DataPoints.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectCursor.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectExpiringSummary.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectInbox.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectLink.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectMessageMetadata.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectRankedRecipient.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectReaction.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectReactions.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectSeenItemPayload.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectSendItemPayload.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectThread.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectThreadItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectThreadItemMedia.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DirectThreadLastSeenAt.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/DismissCard.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Edges.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Effect.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/EligiblePromotions.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/EndOfFeedDemarcator.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Experiment.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Explore.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ExploreItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ExploreItemInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/FaceModels.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/FacebookUser.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/FeedAysf.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/FeedItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/FelixShare.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/FillItems.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/FollowersUnit.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/FormerUsername.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/FormerUsernameInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/FriendshipStatus.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/FullItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Gating.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/GenericMegaphone.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/GraphData.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/GraphNode.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Groups.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Hashtag.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Headline.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/HiddenEntities.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/HideReason.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/IOSLinks.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/IabAutofillOptoutInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Image.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ImageCandidate.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Image_Versions2.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/In.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Injected.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/InlineFollow.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Insights.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Item.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/LayoutContent.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Link.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/LinkContext.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/LiveComment.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/LiveVideoShare.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/LiveViewerInvite.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Location.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/LocationItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/MeGraphData.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Media.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/MediaCroppingInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/MediaData.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/MediaInsights.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/MediaShare.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Megaphone.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Nametag.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Owner.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/PageInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Param.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Participants.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/PermanentItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/PhoneVerificationSettings.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Placeholder.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/PostLive.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/PostLiveItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Prefill.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/PrimaryCountryInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Product.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ProductImage.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ProductShare.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ProductTags.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/PromotionsUnit.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/PushSettings.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/QPData.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/QPExtraInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/QPNode.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/QPSurface.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/QPViewerData.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/QueryResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/QuestionSticker.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/QuizSticker.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Ranking.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Reel.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ReelMention.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ReelShare.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Related.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Responder.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/RewriteRule.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/SavedFeedItem.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Section.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/SectionMedia.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ServerDataInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/ShadowInstagramUser.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/SharePrefillEntities.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/SharedFollower.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/SharedFollowerAccountsInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Slot.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StaticStickers.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StepData.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Stickers.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Stories.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoriesNetego.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Story.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryAppAttribution.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryCountdowns.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryCta.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryHashtag.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryLocation.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryQuestionResponderInfos.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryQuestions.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryQuizParticipantInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryQuizs.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryShare.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryTray.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/StoryTvChannel.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Subscription.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Suggested.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/SuggestedUsers.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Suggestion.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/SuggestionCard.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/SummaryPromotions.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/SupportedCapabilities.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Surface.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/SystemControl.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/TVChannel.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/TVSearchResult.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Tab.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/TabsInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Tag.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Tallies.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Template.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Text.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Thumbnail.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/TimeRange.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Token.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/TopLive.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/TraceControl.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/TraySuggestions.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/TwoFactorInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/CoreUnpredictableContainer.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/DirectThreadLastSeenAtUnpredictableContainer.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/FriendshipStatusUnpredictableContainer.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/MediaUnpredictableContainer.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/PresenceUnpredictableContainer.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/ReelUnpredictableContainer.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/UserUnpredictableContainer.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/User.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/UserCard.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/UserList.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/UserPresence.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Usertag.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/VideoCallEvent.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/VideoUploadUrl.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/VideoVersions.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Viewer.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/VoiceMedia.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/Voter.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/VoterInfo.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/Model/_Message.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/MsisdnHeaderResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/MultipleAccountFamilyResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/MutedReelsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/OnBoardCatalogResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/OnTagProductResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PermalinkResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PinCommentBroadcastResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PopularFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PostLiveCommentsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PostLiveLikesResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PostLiveViewerListResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PrefillCandidatesResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PresenceStatusResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PresencesResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ProfileNoticeResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PropertyCollection/Sticker.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PushPreferencesResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/PushRegisterResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/QPCooldownsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/RecentSearchesResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/RecoveryResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ReelMediaViewerResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ReelSettingsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ReelsMediaResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ReelsTrayFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/RelatedLocationResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ReportExploreMediaResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ResumableOffsetResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ResumableUploadResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ReviewPreferenceResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SaveAndUnsaveMedia.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SavedFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SearchTagResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SearchUserResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SegmentedStartResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SendConfirmEmailResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SendSMSCodeResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SendTwoFactorEnableSMSResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SharePrefillResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SharedFollowersResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/StartLiveResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/StickerAssetsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/StoryAnswersResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/StoryCountdownsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/StoryPollVotersResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SuggestedBroadcastsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SuggestedSearchesResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SuggestedUsersBadgeResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SuggestedUsersResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SwitchBusinessProfileResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SwitchPersonalProfileResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/SyncResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TVChannelsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TVGuideResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TVSearchResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TagFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TagInfoResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TagRelatedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TagsStoryResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TimelineFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TokenResultResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TopLiveStatusResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TranslateResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/TwoFactorLoginSMSResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/UnlinkAddressBookResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/UnpinCommentBroadcastResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/UploadJobVideoResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/UploadPhotoResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/UploadVideoResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/UserFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/UserInfoResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/UserReelMediaFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/UserStoryFeedResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/UsersLookupResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/UsertagsResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ValidateURLResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/VerifySMSCodeResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/ViewerListResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Response/WriteSuppotedCapabilitiesResponse.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Settings/Factory.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Settings/Storage/Components/PDOStorage.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Settings/Storage/File.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Settings/Storage/Memcached.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Settings/Storage/MySQL.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Settings/Storage/SQLite.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Settings/StorageHandler.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Settings/StorageInterface.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Signatures.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/src/Utils.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/React/ConnectorTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/IndicateActivityTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/IrisSubscribeTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/MarkSeenTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/SendHashtagTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/SendLikeTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/SendLocationTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/SendPostTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/SendProfileTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/SendReactionTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/SendStoryTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/SendTextTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Command/UpdateSubscriptionsTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Handler/DirectTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Handler/IrisHandlerTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Handler/LiveTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Handler/PresenceTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Handler/RegionHintTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Subscription/AppPresenceTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Realtime/Subscription/ZeroProvisionTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/tests/Response/ExceptionsTest.php create mode 100755 src/mpg25-instagram-api/vendor/mgp25/instagram-php/webwarning.htm create mode 100755 src/mpg25-instagram-api/vendor/psr/http-message/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/psr/http-message/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/psr/http-message/README.md create mode 100755 src/mpg25-instagram-api/vendor/psr/http-message/composer.json create mode 100755 src/mpg25-instagram-api/vendor/psr/http-message/src/MessageInterface.php create mode 100755 src/mpg25-instagram-api/vendor/psr/http-message/src/RequestInterface.php create mode 100755 src/mpg25-instagram-api/vendor/psr/http-message/src/ResponseInterface.php create mode 100755 src/mpg25-instagram-api/vendor/psr/http-message/src/ServerRequestInterface.php create mode 100755 src/mpg25-instagram-api/vendor/psr/http-message/src/StreamInterface.php create mode 100755 src/mpg25-instagram-api/vendor/psr/http-message/src/UploadedFileInterface.php create mode 100755 src/mpg25-instagram-api/vendor/psr/http-message/src/UriInterface.php create mode 100755 src/mpg25-instagram-api/vendor/psr/log/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/psr/log/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/psr/log/Psr/Log/AbstractLogger.php create mode 100755 src/mpg25-instagram-api/vendor/psr/log/Psr/Log/InvalidArgumentException.php create mode 100755 src/mpg25-instagram-api/vendor/psr/log/Psr/Log/LogLevel.php create mode 100755 src/mpg25-instagram-api/vendor/psr/log/Psr/Log/LoggerAwareInterface.php create mode 100755 src/mpg25-instagram-api/vendor/psr/log/Psr/Log/LoggerAwareTrait.php create mode 100755 src/mpg25-instagram-api/vendor/psr/log/Psr/Log/LoggerInterface.php create mode 100755 src/mpg25-instagram-api/vendor/psr/log/Psr/Log/LoggerTrait.php create mode 100755 src/mpg25-instagram-api/vendor/psr/log/Psr/Log/NullLogger.php create mode 100755 src/mpg25-instagram-api/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php create mode 100755 src/mpg25-instagram-api/vendor/psr/log/Psr/Log/Test/TestLogger.php create mode 100755 src/mpg25-instagram-api/vendor/psr/log/README.md create mode 100755 src/mpg25-instagram-api/vendor/psr/log/composer.json create mode 100755 src/mpg25-instagram-api/vendor/ralouphie/getallheaders/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/ralouphie/getallheaders/README.md create mode 100755 src/mpg25-instagram-api/vendor/ralouphie/getallheaders/composer.json create mode 100755 src/mpg25-instagram-api/vendor/ralouphie/getallheaders/src/getallheaders.php create mode 100755 src/mpg25-instagram-api/vendor/react/cache/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/react/cache/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/react/cache/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/react/cache/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/react/cache/README.md create mode 100755 src/mpg25-instagram-api/vendor/react/cache/composer.json create mode 100755 src/mpg25-instagram-api/vendor/react/cache/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/react/cache/src/ArrayCache.php create mode 100755 src/mpg25-instagram-api/vendor/react/cache/src/CacheInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/cache/tests/ArrayCacheTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/cache/tests/CallableStub.php create mode 100755 src/mpg25-instagram-api/vendor/react/cache/tests/TestCase.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/react/dns/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/react/dns/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/react/dns/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/react/dns/README.md create mode 100755 src/mpg25-instagram-api/vendor/react/dns/composer.json create mode 100755 src/mpg25-instagram-api/vendor/react/dns/examples/01-one.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/examples/02-concurrent.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/examples/03-cached.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/examples/11-all-ips.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/examples/12-all-types.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/examples/13-reverse-dns.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/examples/91-query-a-and-aaaa.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/examples/92-query-any.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/BadServerException.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Config/Config.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Config/FilesystemFactory.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Config/HostsFile.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Model/HeaderBag.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Model/Message.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Model/Record.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Protocol/BinaryDumper.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Protocol/Parser.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/CachedExecutor.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/CachingExecutor.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/CancellationException.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/CoopExecutor.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/Executor.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/ExecutorInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/HostsFileExecutor.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/Query.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/RecordBag.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/RecordCache.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/RetryExecutor.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/TimeoutException.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/TimeoutExecutor.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Query/UdpTransportExecutor.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/RecordNotFoundException.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Resolver/Factory.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/src/Resolver/Resolver.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/CallableStub.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Config/ConfigTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Config/FilesystemFactoryTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Config/HostsFileTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Fixtures/etc/resolv.conf create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/FunctionalResolverTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Model/MessageTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Protocol/BinaryDumperTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Protocol/ParserTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Query/CachedExecutorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Query/CachingExecutorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Query/CoopExecutorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Query/ExecutorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Query/HostsFileExecutorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Query/RecordBagTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Query/RecordCacheTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Query/RetryExecutorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Query/TimeoutExecutorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Query/UdpTransportExecutorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Resolver/FactoryTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Resolver/ResolveAliasesTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/Resolver/ResolverTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/dns/tests/TestCase.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/README.md create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/composer.json create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/src/ExtEventLoop.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/src/Factory.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/src/LibEvLoop.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/src/LibEventLoop.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/src/LoopInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/src/StreamSelectLoop.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/src/Tick/FutureTickQueue.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/src/Tick/NextTickQueue.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/src/Timer/Timer.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/src/Timer/TimerInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/src/Timer/Timers.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/AbstractLoopTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/CallableStub.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/ExtEventLoopTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/LibEvLoopTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/LibEventLoopTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/StreamSelectLoopTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/TestCase.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/Timer/AbstractTimerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/Timer/ExtEventTimerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/Timer/LibEvTimerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/Timer/LibEventTimerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/Timer/StreamSelectTimerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/Timer/TimersTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/tests/bootstrap.php create mode 100755 src/mpg25-instagram-api/vendor/react/event-loop/travis-init.sh create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/README.md create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/composer.json create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/src/TimeoutException.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/src/functions.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/src/functions_include.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/tests/CallableStub.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/tests/FunctionRejectTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/tests/FunctionResolveTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/tests/FunctionTimeoutTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/tests/TestCase.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise-timer/tests/TimeoutExceptionTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/react/promise/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/react/promise/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/react/promise/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/react/promise/README.md create mode 100755 src/mpg25-instagram-api/vendor/react/promise/composer.json create mode 100755 src/mpg25-instagram-api/vendor/react/promise/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/CancellablePromiseInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/CancellationQueue.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/Deferred.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/Exception/LengthException.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/ExtendedPromiseInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/FulfilledPromise.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/LazyPromise.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/Promise.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/PromiseInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/PromisorInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/RejectedPromise.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/UnhandledRejectionException.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/functions.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/src/functions_include.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/CancellationQueueTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/DeferredTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/FulfilledPromiseTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/FunctionAllTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/FunctionAnyTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/FunctionCheckTypehintTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/FunctionMapTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/FunctionRaceTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/FunctionReduceTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/FunctionRejectTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/FunctionResolveTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/FunctionSomeTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/LazyPromiseTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseAdapter/CallbackPromiseAdapter.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseAdapter/PromiseAdapterInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseTest/CancelTestTrait.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseTest/FullTestTrait.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseTest/NotifyTestTrait.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseTest/PromiseFulfilledTestTrait.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseTest/PromisePendingTestTrait.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseTest/PromiseRejectedTestTrait.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseTest/PromiseSettledTestTrait.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseTest/RejectTestTrait.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/PromiseTest/ResolveTestTrait.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/RejectedPromiseTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/Stub/CallableStub.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/TestCase.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/bootstrap.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/fixtures/SimpleFulfilledTestPromise.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/fixtures/SimpleFulfilledTestThenable.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/fixtures/SimpleRejectedTestPromise.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/fixtures/SimpleTestCancellable.php create mode 100755 src/mpg25-instagram-api/vendor/react/promise/tests/fixtures/SimpleTestCancellableThenable.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/react/socket/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/react/socket/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/react/socket/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/react/socket/README.md create mode 100755 src/mpg25-instagram-api/vendor/react/socket/composer.json create mode 100755 src/mpg25-instagram-api/vendor/react/socket/examples/01-echo-server.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/examples/02-chat-server.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/examples/03-http-server.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/examples/11-http-client.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/examples/12-https-client.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/examples/21-netcat-client.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/examples/22-http-client.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/examples/91-benchmark-server.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/examples/99-generate-self-signed.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/examples/localhost.pem create mode 100755 src/mpg25-instagram-api/vendor/react/socket/examples/localhost_swordfish.pem create mode 100755 src/mpg25-instagram-api/vendor/react/socket/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/Connection.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/ConnectionInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/Connector.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/ConnectorInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/DnsConnector.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/FixedUriConnector.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/LimitingServer.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/SecureConnector.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/SecureServer.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/Server.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/ServerInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/StreamEncryption.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/TcpConnector.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/TcpServer.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/TimeoutConnector.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/UnixConnector.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/src/UnixServer.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/ConnectionTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/ConnectorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/DnsConnectorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/FixedUriConnectorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/FunctionalConnectorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/FunctionalSecureServerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/FunctionalTcpServerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/IntegrationTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/LimitingServerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/SecureConnectorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/SecureIntegrationTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/SecureServerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/ServerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/Stub/CallableStub.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/Stub/ConnectionStub.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/Stub/ServerStub.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/TcpConnectorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/TcpServerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/TestCase.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/TimeoutConnectorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/UnixConnectorTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/socket/tests/UnixServerTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/react/stream/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/react/stream/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/react/stream/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/react/stream/README.md create mode 100755 src/mpg25-instagram-api/vendor/react/stream/composer.json create mode 100755 src/mpg25-instagram-api/vendor/react/stream/examples/01-http.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/examples/02-https.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/examples/11-cat.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/examples/91-benchmark-throughput.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/react/stream/src/CompositeStream.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/src/DuplexResourceStream.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/src/DuplexStreamInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/src/ReadableResourceStream.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/src/ReadableStreamInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/src/ThroughStream.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/src/Util.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/src/WritableResourceStream.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/src/WritableStreamInterface.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/CallableStub.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/CompositeStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/DuplexResourceStreamIntegrationTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/DuplexResourceStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/EnforceBlockingWrapper.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/FunctionalInternetTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/ReadableResourceStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/Stub/ReadableStreamStub.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/TestCase.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/ThroughStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/UtilTest.php create mode 100755 src/mpg25-instagram-api/vendor/react/stream/tests/WritableStreamResourceTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/.travis.yml create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/Dockerfile create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/Makefile create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/README.md create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/composer.json create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/AppendStream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/BufferStream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/CachingStream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/DroppingStream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/FnStream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/InflateStream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/LazyOpenStream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/LimitStream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/MessageTrait.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/MultipartStream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/NoSeekStream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/PumpStream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/Request.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/Response.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/ServerRequest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/Stream.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/StreamDecoratorTrait.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/StreamWrapper.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/Uri.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/functions.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/src/functions_include.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/AppendStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/BufferStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/CachingStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/DroppingStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/FnStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/FunctionsTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/InflateStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/LazyOpenStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/LimitStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/MultipartStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/NoSeekStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/PumpStreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/RequestTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/ResponseTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/ServerRequestTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/StreamDecoratorTraitTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/StreamTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/StreamWrapperTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/UriTest.php create mode 100755 src/mpg25-instagram-api/vendor/ringcentral/psr7/tests/bootstrap.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/CHANGELOG.md create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Exception/ExceptionInterface.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Exception/InvalidArgumentException.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Exception/LogicException.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Exception/ProcessFailedException.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Exception/ProcessSignaledException.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Exception/ProcessTimedOutException.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Exception/RuntimeException.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/ExecutableFinder.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/InputStream.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/PhpExecutableFinder.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/PhpProcess.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Pipes/AbstractPipes.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Pipes/PipesInterface.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Pipes/UnixPipes.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Pipes/WindowsPipes.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Process.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/ProcessUtils.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/README.md create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Tests/ErrorProcessInitiator.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Tests/ExecutableFinderTest.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Tests/KillableProcessWithOutput.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Tests/NonStopableProcess.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Tests/PhpExecutableFinderTest.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Tests/PhpProcessTest.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Tests/PipeStdinInStdoutStdErrStreamSelect.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Tests/ProcessTest.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/Tests/SignalListener.php create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/composer.json create mode 100755 src/mpg25-instagram-api/vendor/symfony/process/phpunit.xml.dist create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/.gitignore create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/.php_cs create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/README.md create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/bin/thrift_debug create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/composer.json create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Auth/DeviceAuth.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/AuthInterface.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Common/PublishAckPacket.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Connection.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Json.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Lite.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Lite/ConnectRequestPacket.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Lite/ConnectResponsePacket.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Lite/OutgoingConnectFlow.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Lite/PacketFactory.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Lite/ReactFlow.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Lite/ReactMqttClient.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Lite/StreamParser.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Message/Push.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Message/Register.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Thrift/Compact.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Thrift/Debug.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Thrift/Reader.php create mode 100755 src/mpg25-instagram-api/vendor/valga/fbns-react/src/Thrift/Writer.php create mode 100755 src/mpg25-instagram-api/vendor/winbox/args/LICENSE create mode 100755 src/mpg25-instagram-api/vendor/winbox/args/README.md create mode 100755 src/mpg25-instagram-api/vendor/winbox/args/appveyor.yml create mode 100755 src/mpg25-instagram-api/vendor/winbox/args/composer.json create mode 100755 src/mpg25-instagram-api/vendor/winbox/args/src/Args.php create mode 100755 vendor/autoload.php create mode 100755 vendor/binsoul/net-mqtt-client-react/LICENSE.md create mode 100755 vendor/binsoul/net-mqtt-client-react/README.md create mode 100755 vendor/binsoul/net-mqtt-client-react/composer.json create mode 100755 vendor/binsoul/net-mqtt-client-react/src/ReactFlow.php create mode 100755 vendor/binsoul/net-mqtt-client-react/src/ReactMqttClient.php create mode 100755 vendor/binsoul/net-mqtt/LICENSE.md create mode 100755 vendor/binsoul/net-mqtt/README.md create mode 100755 vendor/binsoul/net-mqtt/composer.json create mode 100755 vendor/binsoul/net-mqtt/src/Connection.php create mode 100755 vendor/binsoul/net-mqtt/src/DefaultConnection.php create mode 100755 vendor/binsoul/net-mqtt/src/DefaultIdentifierGenerator.php create mode 100755 vendor/binsoul/net-mqtt/src/DefaultMessage.php create mode 100755 vendor/binsoul/net-mqtt/src/DefaultSubscription.php create mode 100755 vendor/binsoul/net-mqtt/src/Exception/EndOfStreamException.php create mode 100755 vendor/binsoul/net-mqtt/src/Exception/MalformedPacketException.php create mode 100755 vendor/binsoul/net-mqtt/src/Exception/UnknownPacketTypeException.php create mode 100755 vendor/binsoul/net-mqtt/src/Flow.php create mode 100755 vendor/binsoul/net-mqtt/src/Flow/AbstractFlow.php create mode 100755 vendor/binsoul/net-mqtt/src/Flow/IncomingPingFlow.php create mode 100755 vendor/binsoul/net-mqtt/src/Flow/IncomingPublishFlow.php create mode 100755 vendor/binsoul/net-mqtt/src/Flow/OutgoingConnectFlow.php create mode 100755 vendor/binsoul/net-mqtt/src/Flow/OutgoingDisconnectFlow.php create mode 100755 vendor/binsoul/net-mqtt/src/Flow/OutgoingPingFlow.php create mode 100755 vendor/binsoul/net-mqtt/src/Flow/OutgoingPublishFlow.php create mode 100755 vendor/binsoul/net-mqtt/src/Flow/OutgoingSubscribeFlow.php create mode 100755 vendor/binsoul/net-mqtt/src/Flow/OutgoingUnsubscribeFlow.php create mode 100755 vendor/binsoul/net-mqtt/src/IdentifierGenerator.php create mode 100755 vendor/binsoul/net-mqtt/src/Message.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/BasePacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/ConnectRequestPacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/ConnectResponsePacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/DisconnectRequestPacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/IdentifiablePacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/IdentifierOnlyPacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/PingRequestPacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/PingResponsePacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/PublishAckPacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/PublishCompletePacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/PublishReceivedPacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/PublishReleasePacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/PublishRequestPacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/StrictConnectRequestPacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/SubscribeRequestPacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/SubscribeResponsePacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/UnsubscribeRequestPacket.php create mode 100755 vendor/binsoul/net-mqtt/src/Packet/UnsubscribeResponsePacket.php create mode 100755 vendor/binsoul/net-mqtt/src/PacketFactory.php create mode 100755 vendor/binsoul/net-mqtt/src/PacketStream.php create mode 100755 vendor/binsoul/net-mqtt/src/StreamParser.php create mode 100755 vendor/binsoul/net-mqtt/src/Subscription.php create mode 100755 vendor/binsoul/net-mqtt/src/TopicMatcher.php create mode 100755 vendor/clue/http-proxy-react/.gitignore create mode 100755 vendor/clue/http-proxy-react/.travis.yml create mode 100755 vendor/clue/http-proxy-react/CHANGELOG.md create mode 100755 vendor/clue/http-proxy-react/LICENSE create mode 100755 vendor/clue/http-proxy-react/README.md create mode 100755 vendor/clue/http-proxy-react/composer.json create mode 100755 vendor/clue/http-proxy-react/examples/01-proxy-https.php create mode 100755 vendor/clue/http-proxy-react/examples/02-optional-proxy-https.php create mode 100755 vendor/clue/http-proxy-react/examples/11-proxy-smtp.php create mode 100755 vendor/clue/http-proxy-react/examples/12-proxy-smtps.php create mode 100755 vendor/clue/http-proxy-react/phpunit.xml.dist create mode 100755 vendor/clue/http-proxy-react/src/ProxyConnector.php create mode 100755 vendor/clue/http-proxy-react/tests/AbstractTestCase.php create mode 100755 vendor/clue/http-proxy-react/tests/FunctionalTest.php create mode 100755 vendor/clue/http-proxy-react/tests/ProxyConnectorTest.php create mode 100755 vendor/clue/socks-react/.gitignore create mode 100755 vendor/clue/socks-react/.travis.yml create mode 100755 vendor/clue/socks-react/CHANGELOG.md create mode 100755 vendor/clue/socks-react/LICENSE create mode 100755 vendor/clue/socks-react/README.md create mode 100755 vendor/clue/socks-react/composer.json create mode 100755 vendor/clue/socks-react/examples/01-http.php create mode 100755 vendor/clue/socks-react/examples/02-https.php create mode 100755 vendor/clue/socks-react/examples/03-proxy-chaining.php create mode 100755 vendor/clue/socks-react/examples/04-local-dns.php create mode 100755 vendor/clue/socks-react/examples/11-server.php create mode 100755 vendor/clue/socks-react/examples/12-server-with-password.php create mode 100755 vendor/clue/socks-react/examples/13-server-blacklist.php create mode 100755 vendor/clue/socks-react/examples/21-server-proxy-chaining.php create mode 100755 vendor/clue/socks-react/examples/22-server-proxy-chaining-from-random-pool.php create mode 100755 vendor/clue/socks-react/examples/31-server-secure.php create mode 100755 vendor/clue/socks-react/examples/32-http-secure.php create mode 100755 vendor/clue/socks-react/examples/localhost.pem create mode 100755 vendor/clue/socks-react/phpunit.xml.dist create mode 100755 vendor/clue/socks-react/src/Client.php create mode 100755 vendor/clue/socks-react/src/Server.php create mode 100755 vendor/clue/socks-react/src/StreamReader.php create mode 100755 vendor/clue/socks-react/tests/ClientTest.php create mode 100755 vendor/clue/socks-react/tests/FunctionalTest.php create mode 100755 vendor/clue/socks-react/tests/ServerTest.php create mode 100755 vendor/clue/socks-react/tests/StreamReaderTest.php create mode 100755 vendor/clue/socks-react/tests/bootstrap.php create mode 100755 vendor/composer/ClassLoader.php create mode 100755 vendor/composer/LICENSE create mode 100755 vendor/composer/autoload_classmap.php create mode 100755 vendor/composer/autoload_files.php create mode 100755 vendor/composer/autoload_namespaces.php create mode 100755 vendor/composer/autoload_psr4.php create mode 100755 vendor/composer/autoload_real.php create mode 100755 vendor/composer/autoload_static.php create mode 100755 vendor/composer/installed.json create mode 100755 vendor/corneltek/getoptionkit/.gitignore create mode 100755 vendor/corneltek/getoptionkit/.travis.yml create mode 100755 vendor/corneltek/getoptionkit/CHANGELOG.md create mode 100755 vendor/corneltek/getoptionkit/CONTRIBUTORS.txt create mode 100755 vendor/corneltek/getoptionkit/LICENSE create mode 100755 vendor/corneltek/getoptionkit/README.md create mode 100755 vendor/corneltek/getoptionkit/build.xml create mode 100755 vendor/corneltek/getoptionkit/composer.json create mode 100755 vendor/corneltek/getoptionkit/composer.lock create mode 100755 vendor/corneltek/getoptionkit/examples/demo.php create mode 100755 vendor/corneltek/getoptionkit/package.ini create mode 100755 vendor/corneltek/getoptionkit/phpdox.xml create mode 100755 vendor/corneltek/getoptionkit/phprelease.ini create mode 100755 vendor/corneltek/getoptionkit/phpunit-ci.xml create mode 100755 vendor/corneltek/getoptionkit/phpunit.xml.dist create mode 100755 vendor/corneltek/getoptionkit/src/Argument.php create mode 100755 vendor/corneltek/getoptionkit/src/ContinuousOptionParser.php create mode 100755 vendor/corneltek/getoptionkit/src/Exception/InvalidOptionException.php create mode 100755 vendor/corneltek/getoptionkit/src/Exception/InvalidOptionValueException.php create mode 100755 vendor/corneltek/getoptionkit/src/Exception/NonNumericException.php create mode 100755 vendor/corneltek/getoptionkit/src/Exception/OptionConflictException.php create mode 100755 vendor/corneltek/getoptionkit/src/Exception/RequireValueException.php create mode 100755 vendor/corneltek/getoptionkit/src/Option.php create mode 100755 vendor/corneltek/getoptionkit/src/OptionCollection.php create mode 100755 vendor/corneltek/getoptionkit/src/OptionParser.php create mode 100755 vendor/corneltek/getoptionkit/src/OptionPrinter/ConsoleOptionPrinter.php create mode 100755 vendor/corneltek/getoptionkit/src/OptionPrinter/OptionPrinter.php create mode 100755 vendor/corneltek/getoptionkit/src/OptionResult.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/BaseType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/BoolType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/BooleanType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/DateTimeType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/DateType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/DirType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/EmailType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/FileType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/IpType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/Ipv4Type.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/Ipv6Type.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/NumberType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/PathType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/RegexType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/StringType.php create mode 100755 vendor/corneltek/getoptionkit/src/ValueType/UrlType.php create mode 100755 vendor/corneltek/getoptionkit/tests/ArgumentTest.php create mode 100755 vendor/corneltek/getoptionkit/tests/ContinuousOptionParserTest.php create mode 100755 vendor/corneltek/getoptionkit/tests/OptionCollectionTest.php create mode 100755 vendor/corneltek/getoptionkit/tests/OptionParserTest.php create mode 100755 vendor/corneltek/getoptionkit/tests/OptionPrinter/ConsoleOptionPrinterTest.php create mode 100755 vendor/corneltek/getoptionkit/tests/OptionResultTest.php create mode 100755 vendor/corneltek/getoptionkit/tests/OptionTest.php create mode 100755 vendor/corneltek/getoptionkit/tests/RegexValueTypeTest.php create mode 100755 vendor/corneltek/getoptionkit/tests/ValueTypeTest.php create mode 100755 vendor/evenement/evenement/.gitignore create mode 100755 vendor/evenement/evenement/.travis.yml create mode 100755 vendor/evenement/evenement/CHANGELOG.md create mode 100755 vendor/evenement/evenement/LICENSE create mode 100755 vendor/evenement/evenement/README.md create mode 100755 vendor/evenement/evenement/composer.json create mode 100755 vendor/evenement/evenement/doc/00-intro.md create mode 100755 vendor/evenement/evenement/doc/01-api.md create mode 100755 vendor/evenement/evenement/doc/02-plugin-system.md create mode 100755 vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php create mode 100755 vendor/evenement/evenement/examples/benchmark-emit-once.php create mode 100755 vendor/evenement/evenement/examples/benchmark-emit-one-argument.php create mode 100755 vendor/evenement/evenement/examples/benchmark-emit.php create mode 100755 vendor/evenement/evenement/examples/benchmark-remove-listener-once.php create mode 100755 vendor/evenement/evenement/phpunit.xml.dist create mode 100755 vendor/evenement/evenement/src/Evenement/EventEmitter.php create mode 100755 vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php create mode 100755 vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php create mode 100755 vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php create mode 100755 vendor/evenement/evenement/tests/Evenement/Tests/Listener.php create mode 100755 vendor/evenement/evenement/tests/Evenement/Tests/functions.php create mode 100755 vendor/guzzlehttp/guzzle/.php_cs create mode 100755 vendor/guzzlehttp/guzzle/CHANGELOG.md create mode 100755 vendor/guzzlehttp/guzzle/Dockerfile create mode 100755 vendor/guzzlehttp/guzzle/LICENSE create mode 100755 vendor/guzzlehttp/guzzle/README.md create mode 100755 vendor/guzzlehttp/guzzle/UPGRADING.md create mode 100755 vendor/guzzlehttp/guzzle/composer.json create mode 100755 vendor/guzzlehttp/guzzle/phpstan.neon.dist create mode 100755 vendor/guzzlehttp/guzzle/src/Client.php create mode 100755 vendor/guzzlehttp/guzzle/src/ClientInterface.php create mode 100755 vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php create mode 100755 vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php create mode 100755 vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php create mode 100755 vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php create mode 100755 vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php create mode 100755 vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php create mode 100755 vendor/guzzlehttp/guzzle/src/Exception/ClientException.php create mode 100755 vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php create mode 100755 vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php create mode 100755 vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php create mode 100755 vendor/guzzlehttp/guzzle/src/Exception/RequestException.php create mode 100755 vendor/guzzlehttp/guzzle/src/Exception/SeekException.php create mode 100755 vendor/guzzlehttp/guzzle/src/Exception/ServerException.php create mode 100755 vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php create mode 100755 vendor/guzzlehttp/guzzle/src/Exception/TransferException.php create mode 100755 vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php create mode 100755 vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php create mode 100755 vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php create mode 100755 vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php create mode 100755 vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php create mode 100755 vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php create mode 100755 vendor/guzzlehttp/guzzle/src/Handler/Proxy.php create mode 100755 vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php create mode 100755 vendor/guzzlehttp/guzzle/src/HandlerStack.php create mode 100755 vendor/guzzlehttp/guzzle/src/MessageFormatter.php create mode 100755 vendor/guzzlehttp/guzzle/src/Middleware.php create mode 100755 vendor/guzzlehttp/guzzle/src/Pool.php create mode 100755 vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php create mode 100755 vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php create mode 100755 vendor/guzzlehttp/guzzle/src/RequestOptions.php create mode 100755 vendor/guzzlehttp/guzzle/src/RetryMiddleware.php create mode 100755 vendor/guzzlehttp/guzzle/src/TransferStats.php create mode 100755 vendor/guzzlehttp/guzzle/src/UriTemplate.php create mode 100755 vendor/guzzlehttp/guzzle/src/functions.php create mode 100755 vendor/guzzlehttp/guzzle/src/functions_include.php create mode 100755 vendor/guzzlehttp/promises/CHANGELOG.md create mode 100755 vendor/guzzlehttp/promises/LICENSE create mode 100755 vendor/guzzlehttp/promises/Makefile create mode 100755 vendor/guzzlehttp/promises/README.md create mode 100755 vendor/guzzlehttp/promises/composer.json create mode 100755 vendor/guzzlehttp/promises/src/AggregateException.php create mode 100755 vendor/guzzlehttp/promises/src/CancellationException.php create mode 100755 vendor/guzzlehttp/promises/src/Coroutine.php create mode 100755 vendor/guzzlehttp/promises/src/EachPromise.php create mode 100755 vendor/guzzlehttp/promises/src/FulfilledPromise.php create mode 100755 vendor/guzzlehttp/promises/src/Promise.php create mode 100755 vendor/guzzlehttp/promises/src/PromiseInterface.php create mode 100755 vendor/guzzlehttp/promises/src/PromisorInterface.php create mode 100755 vendor/guzzlehttp/promises/src/RejectedPromise.php create mode 100755 vendor/guzzlehttp/promises/src/RejectionException.php create mode 100755 vendor/guzzlehttp/promises/src/TaskQueue.php create mode 100755 vendor/guzzlehttp/promises/src/TaskQueueInterface.php create mode 100755 vendor/guzzlehttp/promises/src/functions.php create mode 100755 vendor/guzzlehttp/promises/src/functions_include.php create mode 100755 vendor/guzzlehttp/psr7/CHANGELOG.md create mode 100755 vendor/guzzlehttp/psr7/LICENSE create mode 100755 vendor/guzzlehttp/psr7/README.md create mode 100755 vendor/guzzlehttp/psr7/composer.json create mode 100755 vendor/guzzlehttp/psr7/src/AppendStream.php create mode 100755 vendor/guzzlehttp/psr7/src/BufferStream.php create mode 100755 vendor/guzzlehttp/psr7/src/CachingStream.php create mode 100755 vendor/guzzlehttp/psr7/src/DroppingStream.php create mode 100755 vendor/guzzlehttp/psr7/src/FnStream.php create mode 100755 vendor/guzzlehttp/psr7/src/InflateStream.php create mode 100755 vendor/guzzlehttp/psr7/src/LazyOpenStream.php create mode 100755 vendor/guzzlehttp/psr7/src/LimitStream.php create mode 100755 vendor/guzzlehttp/psr7/src/MessageTrait.php create mode 100755 vendor/guzzlehttp/psr7/src/MultipartStream.php create mode 100755 vendor/guzzlehttp/psr7/src/NoSeekStream.php create mode 100755 vendor/guzzlehttp/psr7/src/PumpStream.php create mode 100755 vendor/guzzlehttp/psr7/src/Request.php create mode 100755 vendor/guzzlehttp/psr7/src/Response.php create mode 100755 vendor/guzzlehttp/psr7/src/Rfc7230.php create mode 100755 vendor/guzzlehttp/psr7/src/ServerRequest.php create mode 100755 vendor/guzzlehttp/psr7/src/Stream.php create mode 100755 vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php create mode 100755 vendor/guzzlehttp/psr7/src/StreamWrapper.php create mode 100755 vendor/guzzlehttp/psr7/src/UploadedFile.php create mode 100755 vendor/guzzlehttp/psr7/src/Uri.php create mode 100755 vendor/guzzlehttp/psr7/src/UriNormalizer.php create mode 100755 vendor/guzzlehttp/psr7/src/UriResolver.php create mode 100755 vendor/guzzlehttp/psr7/src/functions.php create mode 100755 vendor/guzzlehttp/psr7/src/functions_include.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/.ac-php-conf.json create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/.gitignore create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/.php_cs.dist create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/.pre-commit.hook create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/LICENSE create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/NOTICE create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/README.md create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/bin/lazydoctor create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/composer.json create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/devtools/checkStyle.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/devtools/funcListData.serialized create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testLazyJsonMapper.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testPropertyDefinitionNamespaces.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testUserFeatureToggling.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/devtools/nonRecursiveArrays.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/devtools/prefixSplitAlgorithms.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/examples/basic_example.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/examples/import_example.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/examples/inheritance_example.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/examples/unpredictable_data.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/phpdoc.dist.xml create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/phpunit.xml.dist create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/BadPropertyDefinitionException.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/BadPropertyMapException.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/CircularPropertyMapException.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazyJsonMapperException.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazySerializationException.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazyUserException.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/LazyUserOptionException.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/MagicTranslationException.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Exception/SpanishInquisitionException.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Export/ClassAnalysis.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Export/PropertyDescription.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/LazyJsonMapper.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Magic/FunctionTranslation.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Magic/PropertyTranslation.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Magic/SpecialOperators.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Property/PropertyDefinition.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Property/PropertyMapCache.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Property/PropertyMapCompiler.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Property/UndefinedProperty.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Property/ValueConverter.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/src/Utilities.php create mode 100755 vendor/lazyjsonmapper/lazyjsonmapper/tests/bootstrap.php create mode 100755 vendor/mgp25/instagram-php/.ac-php-conf.json create mode 100755 vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE.md create mode 100755 vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE/bug-report.md create mode 100755 vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE/feature-request.md create mode 100755 vendor/mgp25/instagram-php/.github/ISSUE_TEMPLATE/question.md create mode 100755 vendor/mgp25/instagram-php/.gitignore create mode 100755 vendor/mgp25/instagram-php/.php_cs.dist create mode 100755 vendor/mgp25/instagram-php/.pre-commit.hook create mode 100755 vendor/mgp25/instagram-php/CODE_OF_CONDUCT.md create mode 100755 vendor/mgp25/instagram-php/CONTRIBUTING.md create mode 100755 vendor/mgp25/instagram-php/Dockerfile create mode 100755 vendor/mgp25/instagram-php/LICENSE create mode 100755 vendor/mgp25/instagram-php/LICENSE_PREMIUM create mode 100755 vendor/mgp25/instagram-php/README.md create mode 100755 vendor/mgp25/instagram-php/composer.json create mode 100755 vendor/mgp25/instagram-php/devtools/README.md create mode 100755 vendor/mgp25/instagram-php/devtools/checkDevices.php create mode 100755 vendor/mgp25/instagram-php/devtools/checkExperiments.php create mode 100755 vendor/mgp25/instagram-php/devtools/checkStyle.php create mode 100755 vendor/mgp25/instagram-php/devtools/testInstagramPhoto.php create mode 100755 vendor/mgp25/instagram-php/examples/README.md create mode 100755 vendor/mgp25/instagram-php/examples/accessingValues.php create mode 100755 vendor/mgp25/instagram-php/examples/assets/instagram.png create mode 100755 vendor/mgp25/instagram-php/examples/customSettings.php create mode 100755 vendor/mgp25/instagram-php/examples/exceptionDetailsExample.php create mode 100755 vendor/mgp25/instagram-php/examples/liveBroadcast.php create mode 100755 vendor/mgp25/instagram-php/examples/paginateWithExclusion.php create mode 100755 vendor/mgp25/instagram-php/examples/paginationExample.php create mode 100755 vendor/mgp25/instagram-php/examples/pushReceiver.php create mode 100755 vendor/mgp25/instagram-php/examples/rankTokenUsage.php create mode 100755 vendor/mgp25/instagram-php/examples/realtimeClient.php create mode 100755 vendor/mgp25/instagram-php/examples/realtimeHttp.php create mode 100755 vendor/mgp25/instagram-php/examples/sharePhotoToStoryFeed.php create mode 100755 vendor/mgp25/instagram-php/examples/shortcodeConverter.php create mode 100755 vendor/mgp25/instagram-php/examples/twoFactorLogin.php create mode 100755 vendor/mgp25/instagram-php/examples/uploadAlbum.php create mode 100755 vendor/mgp25/instagram-php/examples/uploadPhoto.php create mode 100755 vendor/mgp25/instagram-php/examples/uploadStory.php create mode 100755 vendor/mgp25/instagram-php/examples/uploadStoryCountdown.php create mode 100755 vendor/mgp25/instagram-php/examples/uploadStoryFundraiser.php create mode 100755 vendor/mgp25/instagram-php/examples/uploadStoryPoll.php create mode 100755 vendor/mgp25/instagram-php/examples/uploadStoryQuestion.php create mode 100755 vendor/mgp25/instagram-php/examples/uploadStorySlider.php create mode 100755 vendor/mgp25/instagram-php/examples/uploadVideo.php create mode 100755 vendor/mgp25/instagram-php/extradocs/Push_setPreferences.txt create mode 100755 vendor/mgp25/instagram-php/src/AutoPropertyMapper.php create mode 100755 vendor/mgp25/instagram-php/src/Client.php create mode 100755 vendor/mgp25/instagram-php/src/Constants.php create mode 100755 vendor/mgp25/instagram-php/src/Debug.php create mode 100755 vendor/mgp25/instagram-php/src/Devices/Device.php create mode 100755 vendor/mgp25/instagram-php/src/Devices/DeviceInterface.php create mode 100755 vendor/mgp25/instagram-php/src/Devices/GoodDevices.php create mode 100755 vendor/mgp25/instagram-php/src/Devices/UserAgent.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/AccountDisabledException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/BadRequestException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/ChallengeRequiredException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/CheckpointRequiredException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/ConsentRequiredException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/EmptyResponseException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/EndpointException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/FeedbackRequiredException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/ForcedPasswordResetException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/IncorrectPasswordException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/InstagramException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/InternalException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/InvalidSmsCodeException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/InvalidUserException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/LoginRequiredException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/NetworkException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/NotFoundException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/RequestException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/RequestHeadersTooLargeException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/SentryBlockException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/ServerMessageThrower.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/SettingsException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/ThrottledException.php create mode 100755 vendor/mgp25/instagram-php/src/Exception/UploadFailedException.php create mode 100755 vendor/mgp25/instagram-php/src/ExperimentsInterface.php create mode 100755 vendor/mgp25/instagram-php/src/Instagram.php create mode 100755 vendor/mgp25/instagram-php/src/InstagramID.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Constraints/AlbumConstraints.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Constraints/ConstraintsFactory.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Constraints/DirectConstraints.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Constraints/DirectStoryConstraints.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Constraints/StoryConstraints.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Constraints/TimelineConstraints.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Constraints/TvConstraints.php create mode 100755 vendor/mgp25/instagram-php/src/Media/ConstraintsInterface.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Geometry/Dimensions.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Geometry/Rectangle.php create mode 100755 vendor/mgp25/instagram-php/src/Media/InstagramMedia.php create mode 100755 vendor/mgp25/instagram-php/src/Media/MediaDetails.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Photo/InstagramPhoto.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Photo/PhotoDetails.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Video/FFmpeg.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Video/InstagramThumbnail.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Video/InstagramVideo.php create mode 100755 vendor/mgp25/instagram-php/src/Media/Video/VideoDetails.php create mode 100755 vendor/mgp25/instagram-php/src/Middleware/FakeCookies.php create mode 100755 vendor/mgp25/instagram-php/src/Middleware/ZeroRating.php create mode 100755 vendor/mgp25/instagram-php/src/Push.php create mode 100755 vendor/mgp25/instagram-php/src/Push/Fbns.php create mode 100755 vendor/mgp25/instagram-php/src/Push/Fbns/Auth.php create mode 100755 vendor/mgp25/instagram-php/src/Push/Notification.php create mode 100755 vendor/mgp25/instagram-php/src/Push/Payload/BadgeCount.php create mode 100755 vendor/mgp25/instagram-php/src/React/Connector.php create mode 100755 vendor/mgp25/instagram-php/src/React/PersistentInterface.php create mode 100755 vendor/mgp25/instagram-php/src/React/PersistentTrait.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/IndicateActivity.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/MarkSeen.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendHashtag.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendItem.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendLike.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendLocation.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendPost.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendProfile.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendReaction.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendStory.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/SendText.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/Direct/ShareItem.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/DirectCommand.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/IrisSubscribe.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Command/UpdateSubscriptions.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/CommandInterface.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Handler/AbstractHandler.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Handler/DirectHandler.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Handler/HandlerException.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Handler/IrisHandler.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Handler/LiveHandler.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Handler/PresenceHandler.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Handler/RegionHintHandler.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Handler/ZeroProvisionHandler.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/HandlerInterface.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Message.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Mqtt.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Mqtt/Auth.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Mqtt/Capabilities.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Mqtt/Config.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Mqtt/PacketFactory.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Mqtt/QosLevel.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Mqtt/StreamParser.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Mqtt/Topics.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Parser/GraphQlParser.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Parser/IrisParser.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Parser/JsonParser.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Parser/RegionHintParser.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Parser/SkywalkerParser.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/ParserInterface.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Payload/Action/AckAction.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Payload/Event/PatchEvent.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Payload/Event/PatchEventOp.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Payload/IrisSubscribeAck.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Payload/LiveBroadcast.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Payload/RealtimeAction.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Payload/RealtimeEvent.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Payload/StoryScreenshot.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Payload/ThreadAction.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Payload/ThreadActivity.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Payload/ZeroProvisionEvent.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQl/AppPresenceSubscription.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQl/DirectTypingSubscription.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQl/ZeroProvisionSubscription.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Subscription/GraphQlSubscription.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Subscription/Skywalker/DirectSubscription.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Subscription/Skywalker/LiveSubscription.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/Subscription/SkywalkerSubscription.php create mode 100755 vendor/mgp25/instagram-php/src/Realtime/SubscriptionInterface.php create mode 100755 vendor/mgp25/instagram-php/src/Request.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Account.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Business.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Collection.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Creative.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Direct.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Discover.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Hashtag.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Highlight.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Internal.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Live.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Location.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Media.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Metadata/Internal.php create mode 100755 vendor/mgp25/instagram-php/src/Request/People.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Push.php create mode 100755 vendor/mgp25/instagram-php/src/Request/RequestCollection.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Shopping.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Story.php create mode 100755 vendor/mgp25/instagram-php/src/Request/TV.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Timeline.php create mode 100755 vendor/mgp25/instagram-php/src/Request/Usertag.php create mode 100755 vendor/mgp25/instagram-php/src/Response.php create mode 100755 vendor/mgp25/instagram-php/src/Response/AccountCreateResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/AccountDetailsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/AccountSecurityInfoResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ActiveFeedAdsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ActiveReelAdsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ActivityNewsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ArchiveMediaResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ArchivedStoriesFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ArlinkDownloadInfoResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BadgeNotificationsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BlockedListResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BlockedMediaResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BlockedReelsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BootstrapUsersResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BroadcastCommentsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BroadcastHeartbeatAndViewerCountResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BroadcastInfoResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BroadcastJoinRequestCountResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BroadcastLikeCountResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BroadcastLikeResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/BroadcastQuestionsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CapabilitiesDecisionsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ChallengeResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ChangePasswordResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CharitiesListResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CheckEmailResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CheckUsernameResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CloseFriendsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CollectionFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CommentBroadcastResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CommentCategoryFilterResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CommentFilterKeywordsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CommentFilterResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CommentFilterSetResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CommentLikeUnlikeResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CommentLikersResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CommentResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ConfigureResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CreateBusinessInfoResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CreateCollectionResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CreateHighlightResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/CreateLiveResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DeleteCollectionResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DeleteCommentResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DirectCreateGroupThreadResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DirectInboxResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DirectPendingInboxResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DirectRankedRecipientsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DirectRecentRecipientsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DirectSeenItemResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DirectSendItemResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DirectSendItemsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DirectShareInboxResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DirectThreadResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DirectVisualThreadResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DisableTwoFactorSMSResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DiscoverChannelsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DiscoverPeopleResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/DiscoverTopLiveResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/EditCollectionResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/EditMediaResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/EnableDisableLiveCommentsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/EnableTwoFactorSMSResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ExploreResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FBLocationResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FBSearchResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FaceEffectsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FaceModelsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FacebookHiddenEntitiesResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FacebookOTAResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FetchQPDataResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FinalViewerListResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FollowerAndFollowingResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FollowingRecentActivityResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FormerUsernamesResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FriendshipResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FriendshipsShowManyResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/FriendshipsShowResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/GenericResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/GetCollectionsListResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/GraphqlResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/HashtagsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/HighlightFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/InsightsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/LauncherSyncResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/LikeFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/LinkAddressBookResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/LinkageStatusResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/LocationFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/LocationResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/LocationStoryResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/LoginResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/LogoutResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/LoomFetchConfigResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/MediaCommentRepliesResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/MediaCommentsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/MediaDeleteResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/MediaInfoResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/MediaInsightsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/MediaLikersResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/MediaSeenResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/MegaphoneLogResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/AccountAccessToolConfig.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/AccountSummaryUnit.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Action.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ActionBadge.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ActionLog.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Ad4ad.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/AdMetadata.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/AdsInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/AndroidLinks.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/AnimatedMedia.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/AnimatedMediaImage.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/AnimatedMediaImageFixedHeigth.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ArchivedStoriesFeedItem.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Args.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/AssetModel.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Attribution.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/AudioContext.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Aymf.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/AymfItem.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Badging.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/BiographyEntities.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/BlockedReels.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Bold.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Broadcast.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/BroadcastQuestion.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/BroadcastStatusItem.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/BusinessEdge.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/BusinessFeed.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/BusinessManager.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/BusinessManagerStatus.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/BusinessNode.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Button.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Caption.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/CarouselMedia.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/CatalogData.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/CatalogEdge.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/CatalogNode.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ChainingInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ChainingSuggestion.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Challenge.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Channel.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/CloseFriends.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Collection.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Comment.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/CommentInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/CommentTranslations.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Composer.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ContextualFilters.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/CountdownSticker.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Counts.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/CoverMedia.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Creative.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DataGraph.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DataPoints.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectCursor.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectExpiringSummary.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectInbox.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectLink.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectMessageMetadata.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectRankedRecipient.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectReaction.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectReactions.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectSeenItemPayload.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectSendItemPayload.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectThread.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectThreadItem.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectThreadItemMedia.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DirectThreadLastSeenAt.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/DismissCard.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Edges.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Effect.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/EligiblePromotions.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/EndOfFeedDemarcator.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Experiment.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Explore.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ExploreItem.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ExploreItemInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/FaceModels.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/FacebookUser.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/FeedAysf.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/FeedItem.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/FelixShare.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/FillItems.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/FollowersUnit.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/FormerUsername.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/FormerUsernameInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/FriendshipStatus.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/FullItem.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Gating.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/GenericMegaphone.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/GraphData.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/GraphNode.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Groups.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Hashtag.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Headline.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/HiddenEntities.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/HideReason.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/IOSLinks.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/IabAutofillOptoutInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Image.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ImageCandidate.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Image_Versions2.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/In.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Injected.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/InlineFollow.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Insights.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Item.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/LayoutContent.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Link.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/LinkContext.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/LiveComment.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/LiveVideoShare.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/LiveViewerInvite.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Location.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/LocationItem.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/MeGraphData.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Media.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/MediaCroppingInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/MediaData.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/MediaInsights.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/MediaShare.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Megaphone.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Nametag.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Owner.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/PageInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Param.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Participants.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/PermanentItem.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/PhoneVerificationSettings.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Placeholder.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/PostLive.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/PostLiveItem.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Prefill.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/PrimaryCountryInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Product.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ProductImage.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ProductShare.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ProductTags.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/PromotionsUnit.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/PushSettings.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/QPData.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/QPExtraInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/QPNode.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/QPSurface.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/QPViewerData.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/QueryResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/QuestionSticker.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/QuizSticker.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Ranking.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Reel.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ReelMention.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ReelShare.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Related.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Responder.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/RewriteRule.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/SavedFeedItem.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Section.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/SectionMedia.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ServerDataInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/ShadowInstagramUser.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/SharePrefillEntities.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/SharedFollower.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/SharedFollowerAccountsInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Slot.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StaticStickers.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StepData.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Stickers.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Stories.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoriesNetego.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Story.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryAppAttribution.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryCountdowns.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryCta.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryHashtag.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryLocation.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryQuestionResponderInfos.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryQuestions.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryQuizParticipantInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryQuizs.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryShare.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryTray.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/StoryTvChannel.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Subscription.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Suggested.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/SuggestedUsers.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Suggestion.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/SuggestionCard.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/SummaryPromotions.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/SupportedCapabilities.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Surface.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/SystemControl.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/TVChannel.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/TVSearchResult.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Tab.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/TabsInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Tag.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Tallies.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Template.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Text.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Thumbnail.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/TimeRange.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Token.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/TopLive.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/TraceControl.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/TraySuggestions.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/TwoFactorInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/CoreUnpredictableContainer.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/DirectThreadLastSeenAtUnpredictableContainer.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/FriendshipStatusUnpredictableContainer.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/MediaUnpredictableContainer.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/PresenceUnpredictableContainer.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/ReelUnpredictableContainer.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/UnpredictableKeys/UserUnpredictableContainer.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/User.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/UserCard.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/UserList.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/UserPresence.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Usertag.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/VideoCallEvent.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/VideoUploadUrl.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/VideoVersions.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Viewer.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/VoiceMedia.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/Voter.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/VoterInfo.php create mode 100755 vendor/mgp25/instagram-php/src/Response/Model/_Message.php create mode 100755 vendor/mgp25/instagram-php/src/Response/MsisdnHeaderResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/MultipleAccountFamilyResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/MutedReelsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/OnBoardCatalogResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/OnTagProductResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PermalinkResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PinCommentBroadcastResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PopularFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PostLiveCommentsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PostLiveLikesResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PostLiveViewerListResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PrefillCandidatesResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PresenceStatusResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PresencesResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ProfileNoticeResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PropertyCollection/Sticker.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PushPreferencesResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/PushRegisterResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/QPCooldownsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/RecentSearchesResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/RecoveryResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ReelMediaViewerResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ReelSettingsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ReelsMediaResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ReelsTrayFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/RelatedLocationResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ReportExploreMediaResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ResumableOffsetResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ResumableUploadResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ReviewPreferenceResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SaveAndUnsaveMedia.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SavedFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SearchTagResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SearchUserResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SegmentedStartResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SendConfirmEmailResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SendSMSCodeResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SendTwoFactorEnableSMSResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SharePrefillResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SharedFollowersResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/StartLiveResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/StickerAssetsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/StoryAnswersResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/StoryCountdownsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/StoryPollVotersResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SuggestedBroadcastsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SuggestedSearchesResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SuggestedUsersBadgeResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SuggestedUsersResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SwitchBusinessProfileResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SwitchPersonalProfileResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/SyncResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TVChannelsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TVGuideResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TVSearchResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TagFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TagInfoResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TagRelatedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TagsStoryResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TimelineFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TokenResultResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TopLiveStatusResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TranslateResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/TwoFactorLoginSMSResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/UnlinkAddressBookResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/UnpinCommentBroadcastResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/UploadJobVideoResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/UploadPhotoResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/UploadVideoResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/UserFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/UserInfoResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/UserReelMediaFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/UserStoryFeedResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/UsersLookupResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/UsertagsResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ValidateURLResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/VerifySMSCodeResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/ViewerListResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Response/WriteSuppotedCapabilitiesResponse.php create mode 100755 vendor/mgp25/instagram-php/src/Settings/Factory.php create mode 100755 vendor/mgp25/instagram-php/src/Settings/Storage/Components/PDOStorage.php create mode 100755 vendor/mgp25/instagram-php/src/Settings/Storage/File.php create mode 100755 vendor/mgp25/instagram-php/src/Settings/Storage/Memcached.php create mode 100755 vendor/mgp25/instagram-php/src/Settings/Storage/MySQL.php create mode 100755 vendor/mgp25/instagram-php/src/Settings/Storage/SQLite.php create mode 100755 vendor/mgp25/instagram-php/src/Settings/StorageHandler.php create mode 100755 vendor/mgp25/instagram-php/src/Settings/StorageInterface.php create mode 100755 vendor/mgp25/instagram-php/src/Signatures.php create mode 100755 vendor/mgp25/instagram-php/src/Utils.php create mode 100755 vendor/mgp25/instagram-php/tests/React/ConnectorTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/IndicateActivityTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/IrisSubscribeTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/MarkSeenTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/SendHashtagTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/SendLikeTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/SendLocationTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/SendPostTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/SendProfileTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/SendReactionTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/SendStoryTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/SendTextTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Command/UpdateSubscriptionsTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Handler/DirectTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Handler/IrisHandlerTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Handler/LiveTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Handler/PresenceTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Handler/RegionHintTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Subscription/AppPresenceTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Realtime/Subscription/ZeroProvisionTest.php create mode 100755 vendor/mgp25/instagram-php/tests/Response/ExceptionsTest.php create mode 100755 vendor/mgp25/instagram-php/webwarning.htm create mode 100755 vendor/psr/http-message/CHANGELOG.md create mode 100755 vendor/psr/http-message/LICENSE create mode 100755 vendor/psr/http-message/README.md create mode 100755 vendor/psr/http-message/composer.json create mode 100755 vendor/psr/http-message/src/MessageInterface.php create mode 100755 vendor/psr/http-message/src/RequestInterface.php create mode 100755 vendor/psr/http-message/src/ResponseInterface.php create mode 100755 vendor/psr/http-message/src/ServerRequestInterface.php create mode 100755 vendor/psr/http-message/src/StreamInterface.php create mode 100755 vendor/psr/http-message/src/UploadedFileInterface.php create mode 100755 vendor/psr/http-message/src/UriInterface.php create mode 100755 vendor/psr/log/.gitignore create mode 100755 vendor/psr/log/LICENSE create mode 100755 vendor/psr/log/Psr/Log/AbstractLogger.php create mode 100755 vendor/psr/log/Psr/Log/InvalidArgumentException.php create mode 100755 vendor/psr/log/Psr/Log/LogLevel.php create mode 100755 vendor/psr/log/Psr/Log/LoggerAwareInterface.php create mode 100755 vendor/psr/log/Psr/Log/LoggerAwareTrait.php create mode 100755 vendor/psr/log/Psr/Log/LoggerInterface.php create mode 100755 vendor/psr/log/Psr/Log/LoggerTrait.php create mode 100755 vendor/psr/log/Psr/Log/NullLogger.php create mode 100755 vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php create mode 100755 vendor/psr/log/Psr/Log/Test/TestLogger.php create mode 100755 vendor/psr/log/README.md create mode 100755 vendor/psr/log/composer.json create mode 100755 vendor/ralouphie/getallheaders/LICENSE create mode 100755 vendor/ralouphie/getallheaders/README.md create mode 100755 vendor/ralouphie/getallheaders/composer.json create mode 100755 vendor/ralouphie/getallheaders/src/getallheaders.php create mode 100755 vendor/react/cache/.gitignore create mode 100755 vendor/react/cache/.travis.yml create mode 100755 vendor/react/cache/CHANGELOG.md create mode 100755 vendor/react/cache/LICENSE create mode 100755 vendor/react/cache/README.md create mode 100755 vendor/react/cache/composer.json create mode 100755 vendor/react/cache/phpunit.xml.dist create mode 100755 vendor/react/cache/src/ArrayCache.php create mode 100755 vendor/react/cache/src/CacheInterface.php create mode 100755 vendor/react/cache/tests/ArrayCacheTest.php create mode 100755 vendor/react/cache/tests/CallableStub.php create mode 100755 vendor/react/cache/tests/TestCase.php create mode 100755 vendor/react/dns/.gitignore create mode 100755 vendor/react/dns/.travis.yml create mode 100755 vendor/react/dns/CHANGELOG.md create mode 100755 vendor/react/dns/LICENSE create mode 100755 vendor/react/dns/README.md create mode 100755 vendor/react/dns/composer.json create mode 100755 vendor/react/dns/examples/01-one.php create mode 100755 vendor/react/dns/examples/02-concurrent.php create mode 100755 vendor/react/dns/examples/03-cached.php create mode 100755 vendor/react/dns/examples/11-all-ips.php create mode 100755 vendor/react/dns/examples/12-all-types.php create mode 100755 vendor/react/dns/examples/13-reverse-dns.php create mode 100755 vendor/react/dns/examples/91-query-a-and-aaaa.php create mode 100755 vendor/react/dns/examples/92-query-any.php create mode 100755 vendor/react/dns/phpunit.xml.dist create mode 100755 vendor/react/dns/src/BadServerException.php create mode 100755 vendor/react/dns/src/Config/Config.php create mode 100755 vendor/react/dns/src/Config/FilesystemFactory.php create mode 100755 vendor/react/dns/src/Config/HostsFile.php create mode 100755 vendor/react/dns/src/Model/HeaderBag.php create mode 100755 vendor/react/dns/src/Model/Message.php create mode 100755 vendor/react/dns/src/Model/Record.php create mode 100755 vendor/react/dns/src/Protocol/BinaryDumper.php create mode 100755 vendor/react/dns/src/Protocol/Parser.php create mode 100755 vendor/react/dns/src/Query/CachedExecutor.php create mode 100755 vendor/react/dns/src/Query/CachingExecutor.php create mode 100755 vendor/react/dns/src/Query/CancellationException.php create mode 100755 vendor/react/dns/src/Query/CoopExecutor.php create mode 100755 vendor/react/dns/src/Query/Executor.php create mode 100755 vendor/react/dns/src/Query/ExecutorInterface.php create mode 100755 vendor/react/dns/src/Query/HostsFileExecutor.php create mode 100755 vendor/react/dns/src/Query/Query.php create mode 100755 vendor/react/dns/src/Query/RecordBag.php create mode 100755 vendor/react/dns/src/Query/RecordCache.php create mode 100755 vendor/react/dns/src/Query/RetryExecutor.php create mode 100755 vendor/react/dns/src/Query/TimeoutException.php create mode 100755 vendor/react/dns/src/Query/TimeoutExecutor.php create mode 100755 vendor/react/dns/src/Query/UdpTransportExecutor.php create mode 100755 vendor/react/dns/src/RecordNotFoundException.php create mode 100755 vendor/react/dns/src/Resolver/Factory.php create mode 100755 vendor/react/dns/src/Resolver/Resolver.php create mode 100755 vendor/react/dns/tests/CallableStub.php create mode 100755 vendor/react/dns/tests/Config/ConfigTest.php create mode 100755 vendor/react/dns/tests/Config/FilesystemFactoryTest.php create mode 100755 vendor/react/dns/tests/Config/HostsFileTest.php create mode 100755 vendor/react/dns/tests/Fixtures/etc/resolv.conf create mode 100755 vendor/react/dns/tests/FunctionalResolverTest.php create mode 100755 vendor/react/dns/tests/Model/MessageTest.php create mode 100755 vendor/react/dns/tests/Protocol/BinaryDumperTest.php create mode 100755 vendor/react/dns/tests/Protocol/ParserTest.php create mode 100755 vendor/react/dns/tests/Query/CachedExecutorTest.php create mode 100755 vendor/react/dns/tests/Query/CachingExecutorTest.php create mode 100755 vendor/react/dns/tests/Query/CoopExecutorTest.php create mode 100755 vendor/react/dns/tests/Query/ExecutorTest.php create mode 100755 vendor/react/dns/tests/Query/HostsFileExecutorTest.php create mode 100755 vendor/react/dns/tests/Query/RecordBagTest.php create mode 100755 vendor/react/dns/tests/Query/RecordCacheTest.php create mode 100755 vendor/react/dns/tests/Query/RetryExecutorTest.php create mode 100755 vendor/react/dns/tests/Query/TimeoutExecutorTest.php create mode 100755 vendor/react/dns/tests/Query/UdpTransportExecutorTest.php create mode 100755 vendor/react/dns/tests/Resolver/FactoryTest.php create mode 100755 vendor/react/dns/tests/Resolver/ResolveAliasesTest.php create mode 100755 vendor/react/dns/tests/Resolver/ResolverTest.php create mode 100755 vendor/react/dns/tests/TestCase.php create mode 100755 vendor/react/event-loop/.gitignore create mode 100755 vendor/react/event-loop/.travis.yml create mode 100755 vendor/react/event-loop/CHANGELOG.md create mode 100755 vendor/react/event-loop/LICENSE create mode 100755 vendor/react/event-loop/README.md create mode 100755 vendor/react/event-loop/composer.json create mode 100755 vendor/react/event-loop/phpunit.xml.dist create mode 100755 vendor/react/event-loop/src/ExtEventLoop.php create mode 100755 vendor/react/event-loop/src/Factory.php create mode 100755 vendor/react/event-loop/src/LibEvLoop.php create mode 100755 vendor/react/event-loop/src/LibEventLoop.php create mode 100755 vendor/react/event-loop/src/LoopInterface.php create mode 100755 vendor/react/event-loop/src/StreamSelectLoop.php create mode 100755 vendor/react/event-loop/src/Tick/FutureTickQueue.php create mode 100755 vendor/react/event-loop/src/Tick/NextTickQueue.php create mode 100755 vendor/react/event-loop/src/Timer/Timer.php create mode 100755 vendor/react/event-loop/src/Timer/TimerInterface.php create mode 100755 vendor/react/event-loop/src/Timer/Timers.php create mode 100755 vendor/react/event-loop/tests/AbstractLoopTest.php create mode 100755 vendor/react/event-loop/tests/CallableStub.php create mode 100755 vendor/react/event-loop/tests/ExtEventLoopTest.php create mode 100755 vendor/react/event-loop/tests/LibEvLoopTest.php create mode 100755 vendor/react/event-loop/tests/LibEventLoopTest.php create mode 100755 vendor/react/event-loop/tests/StreamSelectLoopTest.php create mode 100755 vendor/react/event-loop/tests/TestCase.php create mode 100755 vendor/react/event-loop/tests/Timer/AbstractTimerTest.php create mode 100755 vendor/react/event-loop/tests/Timer/ExtEventTimerTest.php create mode 100755 vendor/react/event-loop/tests/Timer/LibEvTimerTest.php create mode 100755 vendor/react/event-loop/tests/Timer/LibEventTimerTest.php create mode 100755 vendor/react/event-loop/tests/Timer/StreamSelectTimerTest.php create mode 100755 vendor/react/event-loop/tests/Timer/TimersTest.php create mode 100755 vendor/react/event-loop/tests/bootstrap.php create mode 100755 vendor/react/event-loop/travis-init.sh create mode 100755 vendor/react/promise-timer/.gitignore create mode 100755 vendor/react/promise-timer/.travis.yml create mode 100755 vendor/react/promise-timer/CHANGELOG.md create mode 100755 vendor/react/promise-timer/LICENSE create mode 100755 vendor/react/promise-timer/README.md create mode 100755 vendor/react/promise-timer/composer.json create mode 100755 vendor/react/promise-timer/phpunit.xml.dist create mode 100755 vendor/react/promise-timer/src/TimeoutException.php create mode 100755 vendor/react/promise-timer/src/functions.php create mode 100755 vendor/react/promise-timer/src/functions_include.php create mode 100755 vendor/react/promise-timer/tests/CallableStub.php create mode 100755 vendor/react/promise-timer/tests/FunctionRejectTest.php create mode 100755 vendor/react/promise-timer/tests/FunctionResolveTest.php create mode 100755 vendor/react/promise-timer/tests/FunctionTimeoutTest.php create mode 100755 vendor/react/promise-timer/tests/TestCase.php create mode 100755 vendor/react/promise-timer/tests/TimeoutExceptionTest.php create mode 100755 vendor/react/promise/.gitignore create mode 100755 vendor/react/promise/.travis.yml create mode 100755 vendor/react/promise/CHANGELOG.md create mode 100755 vendor/react/promise/LICENSE create mode 100755 vendor/react/promise/README.md create mode 100755 vendor/react/promise/composer.json create mode 100755 vendor/react/promise/phpunit.xml.dist create mode 100755 vendor/react/promise/src/CancellablePromiseInterface.php create mode 100755 vendor/react/promise/src/CancellationQueue.php create mode 100755 vendor/react/promise/src/Deferred.php create mode 100755 vendor/react/promise/src/Exception/LengthException.php create mode 100755 vendor/react/promise/src/ExtendedPromiseInterface.php create mode 100755 vendor/react/promise/src/FulfilledPromise.php create mode 100755 vendor/react/promise/src/LazyPromise.php create mode 100755 vendor/react/promise/src/Promise.php create mode 100755 vendor/react/promise/src/PromiseInterface.php create mode 100755 vendor/react/promise/src/PromisorInterface.php create mode 100755 vendor/react/promise/src/RejectedPromise.php create mode 100755 vendor/react/promise/src/UnhandledRejectionException.php create mode 100755 vendor/react/promise/src/functions.php create mode 100755 vendor/react/promise/src/functions_include.php create mode 100755 vendor/react/promise/tests/CancellationQueueTest.php create mode 100755 vendor/react/promise/tests/DeferredTest.php create mode 100755 vendor/react/promise/tests/FulfilledPromiseTest.php create mode 100755 vendor/react/promise/tests/FunctionAllTest.php create mode 100755 vendor/react/promise/tests/FunctionAnyTest.php create mode 100755 vendor/react/promise/tests/FunctionCheckTypehintTest.php create mode 100755 vendor/react/promise/tests/FunctionMapTest.php create mode 100755 vendor/react/promise/tests/FunctionRaceTest.php create mode 100755 vendor/react/promise/tests/FunctionReduceTest.php create mode 100755 vendor/react/promise/tests/FunctionRejectTest.php create mode 100755 vendor/react/promise/tests/FunctionResolveTest.php create mode 100755 vendor/react/promise/tests/FunctionSomeTest.php create mode 100755 vendor/react/promise/tests/LazyPromiseTest.php create mode 100755 vendor/react/promise/tests/PromiseAdapter/CallbackPromiseAdapter.php create mode 100755 vendor/react/promise/tests/PromiseAdapter/PromiseAdapterInterface.php create mode 100755 vendor/react/promise/tests/PromiseTest.php create mode 100755 vendor/react/promise/tests/PromiseTest/CancelTestTrait.php create mode 100755 vendor/react/promise/tests/PromiseTest/FullTestTrait.php create mode 100755 vendor/react/promise/tests/PromiseTest/NotifyTestTrait.php create mode 100755 vendor/react/promise/tests/PromiseTest/PromiseFulfilledTestTrait.php create mode 100755 vendor/react/promise/tests/PromiseTest/PromisePendingTestTrait.php create mode 100755 vendor/react/promise/tests/PromiseTest/PromiseRejectedTestTrait.php create mode 100755 vendor/react/promise/tests/PromiseTest/PromiseSettledTestTrait.php create mode 100755 vendor/react/promise/tests/PromiseTest/RejectTestTrait.php create mode 100755 vendor/react/promise/tests/PromiseTest/ResolveTestTrait.php create mode 100755 vendor/react/promise/tests/RejectedPromiseTest.php create mode 100755 vendor/react/promise/tests/Stub/CallableStub.php create mode 100755 vendor/react/promise/tests/TestCase.php create mode 100755 vendor/react/promise/tests/bootstrap.php create mode 100755 vendor/react/promise/tests/fixtures/SimpleFulfilledTestPromise.php create mode 100755 vendor/react/promise/tests/fixtures/SimpleFulfilledTestThenable.php create mode 100755 vendor/react/promise/tests/fixtures/SimpleRejectedTestPromise.php create mode 100755 vendor/react/promise/tests/fixtures/SimpleTestCancellable.php create mode 100755 vendor/react/promise/tests/fixtures/SimpleTestCancellableThenable.php create mode 100755 vendor/react/socket/.gitignore create mode 100755 vendor/react/socket/.travis.yml create mode 100755 vendor/react/socket/CHANGELOG.md create mode 100755 vendor/react/socket/LICENSE create mode 100755 vendor/react/socket/README.md create mode 100755 vendor/react/socket/composer.json create mode 100755 vendor/react/socket/examples/01-echo-server.php create mode 100755 vendor/react/socket/examples/02-chat-server.php create mode 100755 vendor/react/socket/examples/03-http-server.php create mode 100755 vendor/react/socket/examples/11-http-client.php create mode 100755 vendor/react/socket/examples/12-https-client.php create mode 100755 vendor/react/socket/examples/21-netcat-client.php create mode 100755 vendor/react/socket/examples/22-http-client.php create mode 100755 vendor/react/socket/examples/91-benchmark-server.php create mode 100755 vendor/react/socket/examples/99-generate-self-signed.php create mode 100755 vendor/react/socket/examples/localhost.pem create mode 100755 vendor/react/socket/examples/localhost_swordfish.pem create mode 100755 vendor/react/socket/phpunit.xml.dist create mode 100755 vendor/react/socket/src/Connection.php create mode 100755 vendor/react/socket/src/ConnectionInterface.php create mode 100755 vendor/react/socket/src/Connector.php create mode 100755 vendor/react/socket/src/ConnectorInterface.php create mode 100755 vendor/react/socket/src/DnsConnector.php create mode 100755 vendor/react/socket/src/FixedUriConnector.php create mode 100755 vendor/react/socket/src/LimitingServer.php create mode 100755 vendor/react/socket/src/SecureConnector.php create mode 100755 vendor/react/socket/src/SecureServer.php create mode 100755 vendor/react/socket/src/Server.php create mode 100755 vendor/react/socket/src/ServerInterface.php create mode 100755 vendor/react/socket/src/StreamEncryption.php create mode 100755 vendor/react/socket/src/TcpConnector.php create mode 100755 vendor/react/socket/src/TcpServer.php create mode 100755 vendor/react/socket/src/TimeoutConnector.php create mode 100755 vendor/react/socket/src/UnixConnector.php create mode 100755 vendor/react/socket/src/UnixServer.php create mode 100755 vendor/react/socket/tests/ConnectionTest.php create mode 100755 vendor/react/socket/tests/ConnectorTest.php create mode 100755 vendor/react/socket/tests/DnsConnectorTest.php create mode 100755 vendor/react/socket/tests/FixedUriConnectorTest.php create mode 100755 vendor/react/socket/tests/FunctionalConnectorTest.php create mode 100755 vendor/react/socket/tests/FunctionalSecureServerTest.php create mode 100755 vendor/react/socket/tests/FunctionalTcpServerTest.php create mode 100755 vendor/react/socket/tests/IntegrationTest.php create mode 100755 vendor/react/socket/tests/LimitingServerTest.php create mode 100755 vendor/react/socket/tests/SecureConnectorTest.php create mode 100755 vendor/react/socket/tests/SecureIntegrationTest.php create mode 100755 vendor/react/socket/tests/SecureServerTest.php create mode 100755 vendor/react/socket/tests/ServerTest.php create mode 100755 vendor/react/socket/tests/Stub/CallableStub.php create mode 100755 vendor/react/socket/tests/Stub/ConnectionStub.php create mode 100755 vendor/react/socket/tests/Stub/ServerStub.php create mode 100755 vendor/react/socket/tests/TcpConnectorTest.php create mode 100755 vendor/react/socket/tests/TcpServerTest.php create mode 100755 vendor/react/socket/tests/TestCase.php create mode 100755 vendor/react/socket/tests/TimeoutConnectorTest.php create mode 100755 vendor/react/socket/tests/UnixConnectorTest.php create mode 100755 vendor/react/socket/tests/UnixServerTest.php create mode 100755 vendor/react/stream/.gitignore create mode 100755 vendor/react/stream/.travis.yml create mode 100755 vendor/react/stream/CHANGELOG.md create mode 100755 vendor/react/stream/LICENSE create mode 100755 vendor/react/stream/README.md create mode 100755 vendor/react/stream/composer.json create mode 100755 vendor/react/stream/examples/01-http.php create mode 100755 vendor/react/stream/examples/02-https.php create mode 100755 vendor/react/stream/examples/11-cat.php create mode 100755 vendor/react/stream/examples/91-benchmark-throughput.php create mode 100755 vendor/react/stream/phpunit.xml.dist create mode 100755 vendor/react/stream/src/CompositeStream.php create mode 100755 vendor/react/stream/src/DuplexResourceStream.php create mode 100755 vendor/react/stream/src/DuplexStreamInterface.php create mode 100755 vendor/react/stream/src/ReadableResourceStream.php create mode 100755 vendor/react/stream/src/ReadableStreamInterface.php create mode 100755 vendor/react/stream/src/ThroughStream.php create mode 100755 vendor/react/stream/src/Util.php create mode 100755 vendor/react/stream/src/WritableResourceStream.php create mode 100755 vendor/react/stream/src/WritableStreamInterface.php create mode 100755 vendor/react/stream/tests/CallableStub.php create mode 100755 vendor/react/stream/tests/CompositeStreamTest.php create mode 100755 vendor/react/stream/tests/DuplexResourceStreamIntegrationTest.php create mode 100755 vendor/react/stream/tests/DuplexResourceStreamTest.php create mode 100755 vendor/react/stream/tests/EnforceBlockingWrapper.php create mode 100755 vendor/react/stream/tests/FunctionalInternetTest.php create mode 100755 vendor/react/stream/tests/ReadableResourceStreamTest.php create mode 100755 vendor/react/stream/tests/Stub/ReadableStreamStub.php create mode 100755 vendor/react/stream/tests/TestCase.php create mode 100755 vendor/react/stream/tests/ThroughStreamTest.php create mode 100755 vendor/react/stream/tests/UtilTest.php create mode 100755 vendor/react/stream/tests/WritableStreamResourceTest.php create mode 100755 vendor/ringcentral/psr7/.gitignore create mode 100755 vendor/ringcentral/psr7/.travis.yml create mode 100755 vendor/ringcentral/psr7/CHANGELOG.md create mode 100755 vendor/ringcentral/psr7/Dockerfile create mode 100755 vendor/ringcentral/psr7/LICENSE create mode 100755 vendor/ringcentral/psr7/Makefile create mode 100755 vendor/ringcentral/psr7/README.md create mode 100755 vendor/ringcentral/psr7/composer.json create mode 100755 vendor/ringcentral/psr7/phpunit.xml.dist create mode 100755 vendor/ringcentral/psr7/src/AppendStream.php create mode 100755 vendor/ringcentral/psr7/src/BufferStream.php create mode 100755 vendor/ringcentral/psr7/src/CachingStream.php create mode 100755 vendor/ringcentral/psr7/src/DroppingStream.php create mode 100755 vendor/ringcentral/psr7/src/FnStream.php create mode 100755 vendor/ringcentral/psr7/src/InflateStream.php create mode 100755 vendor/ringcentral/psr7/src/LazyOpenStream.php create mode 100755 vendor/ringcentral/psr7/src/LimitStream.php create mode 100755 vendor/ringcentral/psr7/src/MessageTrait.php create mode 100755 vendor/ringcentral/psr7/src/MultipartStream.php create mode 100755 vendor/ringcentral/psr7/src/NoSeekStream.php create mode 100755 vendor/ringcentral/psr7/src/PumpStream.php create mode 100755 vendor/ringcentral/psr7/src/Request.php create mode 100755 vendor/ringcentral/psr7/src/Response.php create mode 100755 vendor/ringcentral/psr7/src/ServerRequest.php create mode 100755 vendor/ringcentral/psr7/src/Stream.php create mode 100755 vendor/ringcentral/psr7/src/StreamDecoratorTrait.php create mode 100755 vendor/ringcentral/psr7/src/StreamWrapper.php create mode 100755 vendor/ringcentral/psr7/src/Uri.php create mode 100755 vendor/ringcentral/psr7/src/functions.php create mode 100755 vendor/ringcentral/psr7/src/functions_include.php create mode 100755 vendor/ringcentral/psr7/tests/AppendStreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/BufferStreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/CachingStreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/DroppingStreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/FnStreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/FunctionsTest.php create mode 100755 vendor/ringcentral/psr7/tests/InflateStreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/LazyOpenStreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/LimitStreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/MultipartStreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/NoSeekStreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/PumpStreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/RequestTest.php create mode 100755 vendor/ringcentral/psr7/tests/ResponseTest.php create mode 100755 vendor/ringcentral/psr7/tests/ServerRequestTest.php create mode 100755 vendor/ringcentral/psr7/tests/StreamDecoratorTraitTest.php create mode 100755 vendor/ringcentral/psr7/tests/StreamTest.php create mode 100755 vendor/ringcentral/psr7/tests/StreamWrapperTest.php create mode 100755 vendor/ringcentral/psr7/tests/UriTest.php create mode 100755 vendor/ringcentral/psr7/tests/bootstrap.php create mode 100755 vendor/symfony/process/.gitignore create mode 100755 vendor/symfony/process/CHANGELOG.md create mode 100755 vendor/symfony/process/Exception/ExceptionInterface.php create mode 100755 vendor/symfony/process/Exception/InvalidArgumentException.php create mode 100755 vendor/symfony/process/Exception/LogicException.php create mode 100755 vendor/symfony/process/Exception/ProcessFailedException.php create mode 100755 vendor/symfony/process/Exception/ProcessSignaledException.php create mode 100755 vendor/symfony/process/Exception/ProcessTimedOutException.php create mode 100755 vendor/symfony/process/Exception/RuntimeException.php create mode 100755 vendor/symfony/process/ExecutableFinder.php create mode 100755 vendor/symfony/process/InputStream.php create mode 100755 vendor/symfony/process/LICENSE create mode 100755 vendor/symfony/process/PhpExecutableFinder.php create mode 100755 vendor/symfony/process/PhpProcess.php create mode 100755 vendor/symfony/process/Pipes/AbstractPipes.php create mode 100755 vendor/symfony/process/Pipes/PipesInterface.php create mode 100755 vendor/symfony/process/Pipes/UnixPipes.php create mode 100755 vendor/symfony/process/Pipes/WindowsPipes.php create mode 100755 vendor/symfony/process/Process.php create mode 100755 vendor/symfony/process/ProcessUtils.php create mode 100755 vendor/symfony/process/README.md create mode 100755 vendor/symfony/process/Tests/ErrorProcessInitiator.php create mode 100755 vendor/symfony/process/Tests/ExecutableFinderTest.php create mode 100755 vendor/symfony/process/Tests/KillableProcessWithOutput.php create mode 100755 vendor/symfony/process/Tests/NonStopableProcess.php create mode 100755 vendor/symfony/process/Tests/PhpExecutableFinderTest.php create mode 100755 vendor/symfony/process/Tests/PhpProcessTest.php create mode 100755 vendor/symfony/process/Tests/PipeStdinInStdoutStdErrStreamSelect.php create mode 100755 vendor/symfony/process/Tests/ProcessFailedExceptionTest.php create mode 100755 vendor/symfony/process/Tests/ProcessTest.php create mode 100755 vendor/symfony/process/Tests/SignalListener.php create mode 100755 vendor/symfony/process/composer.json create mode 100755 vendor/symfony/process/phpunit.xml.dist create mode 100755 vendor/valga/fbns-react/.gitignore create mode 100755 vendor/valga/fbns-react/.php_cs create mode 100755 vendor/valga/fbns-react/LICENSE create mode 100755 vendor/valga/fbns-react/README.md create mode 100755 vendor/valga/fbns-react/bin/thrift_debug create mode 100755 vendor/valga/fbns-react/composer.json create mode 100755 vendor/valga/fbns-react/src/Auth/DeviceAuth.php create mode 100755 vendor/valga/fbns-react/src/AuthInterface.php create mode 100755 vendor/valga/fbns-react/src/Common/PublishAckPacket.php create mode 100755 vendor/valga/fbns-react/src/Connection.php create mode 100755 vendor/valga/fbns-react/src/Json.php create mode 100755 vendor/valga/fbns-react/src/Lite.php create mode 100755 vendor/valga/fbns-react/src/Lite/ConnectRequestPacket.php create mode 100755 vendor/valga/fbns-react/src/Lite/ConnectResponsePacket.php create mode 100755 vendor/valga/fbns-react/src/Lite/OutgoingConnectFlow.php create mode 100755 vendor/valga/fbns-react/src/Lite/PacketFactory.php create mode 100755 vendor/valga/fbns-react/src/Lite/ReactFlow.php create mode 100755 vendor/valga/fbns-react/src/Lite/ReactMqttClient.php create mode 100755 vendor/valga/fbns-react/src/Lite/StreamParser.php create mode 100755 vendor/valga/fbns-react/src/Message/Push.php create mode 100755 vendor/valga/fbns-react/src/Message/Register.php create mode 100755 vendor/valga/fbns-react/src/Thrift/Compact.php create mode 100755 vendor/valga/fbns-react/src/Thrift/Debug.php create mode 100755 vendor/valga/fbns-react/src/Thrift/Reader.php create mode 100755 vendor/valga/fbns-react/src/Thrift/Writer.php create mode 100755 vendor/winbox/args/LICENSE create mode 100755 vendor/winbox/args/README.md create mode 100755 vendor/winbox/args/appveyor.yml create mode 100755 vendor/winbox/args/composer.json create mode 100755 vendor/winbox/args/src/Args.php diff --git a/code_depricated/instafeed.1.pl b/code_depricated/instafeed.1.pl new file mode 100755 index 0000000..e92e05b --- /dev/null +++ b/code_depricated/instafeed.1.pl @@ -0,0 +1,170 @@ +#!usr/bin/perl +use strict; +use warnings; +use Data::Dumper; +use JSON::XS qw(encode_json decode_json); +use File::Slurp qw(read_file write_file); +use Getopt::Long qw(GetOptions); + +my %config = ( + 'uploadPHP' => { + 'USERNAME' => 'dreamyourmansion', + 'PASSWORD' => 'H5AZ#dQZ5Ycf', + 'DEBUG' => 1, + 'TRUNCATED_DEBUG' => 1, + 'PROXY_USER' => 'zino%40onlinehome.de', + 'PROXY_PASSWORD' => 'zinomedial33t', + 'PROXY_IP' => 'de435.nordvpn.com', + 'PROXY_PORT' => 80, + }, + 'profile' => undef, + 'imageDir' => './src/images/', + 'SRCRoot' => './src/', + 'DBFilepath' => '/home/pi/instafeed/src/db/db.dat', + 'uploadPHP_CMD' => '/usr/bin/php /home/pi/instafeed/vendor/mgp25/instagram-php/examples/uploadPhoto.php', + 'uploadPHP_DESCRIPTION_ADD' => "The most beautiful real estates in the world!\n\nBenefit from the flourishing housing market in Germany. Contact us now by DM.\n\nVom Mieter zum Eigentümer! Exklusives Portfolio: Kontaktiere uns jetzt per DM.", + 'uploadPHP_TAGS' => '#investment #immobilie #mansionhouse #dream #poolhouse #villa #realestate #loft #awesome #lifestyle #motivation #luxury', +); + +my (%data, %db, %profiles); +my $dbKeysStart = 0; +GetOptions ('profile=s' => \$config{'profile'}) or die "Usage: $0 --profile *name*\n"; +die "Usage: $0 --profile *name*\n" if !$config{'profile'} ; + +# MAIN + +&UndumpFromFile(); +#print Dumper \%db; +&DirectoryListing(); +# print Dumper \%data; +&FindNewDataset(); +&Summary(); + +sub UndumpFromFile { + &Delimiter((caller(0))[3]); + + if (-e $config{'DBFilepath'}) { + my $json = read_file($config{'DBFilepath'}, { binmode => ':raw' }); + if (!$json) { + warn "DB file $config{'DBFilepath'} is empty.\n"; + return; + } + %db = %{ decode_json $json }; + $dbKeysStart = scalar(keys(%db)); + print "INFO: $config{'DBFilepath'} has " . $dbKeysStart . " keys.\n"; + } + elsif (!-e $config{'DBFilepath'}) { + warn "INFO: NO DB file found at $config{'DBFilepath'}\n"; + exit; + } +} + +sub DirectoryListing { + &Delimiter((caller(0))[3]); + + opendir(DIR, $config{'imageDir'}); + my @files = grep(/\.jpg$/,readdir(DIR)); + closedir(DIR); + %data = map { $_ => { 'FILEPATH' => "$config{'imageDir'}$_" } } @files; + # @hash{@keys} = undef; +} + +sub Summary { + &Delimiter((caller(0))[3]); + + print "$config{'DBFilepath'} has " . scalar(keys(%db)) . " keys (before $dbKeysStart).\n"; +} + +sub FindNewDataset { + &Delimiter((caller(0))[3]); + + my $i = 0; + for my $key (keys %data) { + if (exists $db{$key}) { + print "OLD: $key\n"; + } + elsif (!exists $db{$key}) { + print "NEW: $key\n"; + + my $success = &uploadPHP($data{$key}{'FILEPATH'}); + if ($success) { + print "success is $success\n"; + &AddToDB($key); + &WipeData($key); + last; + } + } + $i++; + } + + if ($i == scalar(keys(%data))) { + warn "\nNO NEW FILES AVAILABLE.\n"; + } +} + +sub uploadPHP { + &Delimiter((caller(0))[3]); + my $filepath = shift; + my $success = 1; + my $captionText = "$config{'uploadPHP_DESCRIPTION_ADD'}\n\n$config{'uploadPHP_TAGS'}"; + + open PHPOUT, "$config{'uploadPHP_CMD'} $filepath \'$captionText\' $config{'uploadPHP'}{'USERNAME'} $config{'uploadPHP'}{'PASSWORD'} $config{'uploadPHP'}{'DEBUG'} $config{'uploadPHP'}{'TRUNCATED_DEBUG'} $config{'uploadPHP'}{'PROXY_USER'} $config{'uploadPHP'}{'PROXY_PASSWORD'} $config{'uploadPHP'}{'PROXY_IP'} $config{'uploadPHP'}{'PROXY_PORT'}|"; + while () { + print $_; # PRINT CURRENT PHP OUPUT LINE + if ($_ =~ m/error/) { + $success = 0; + } + } + + return $success; +} + +sub WipeData { + &Delimiter((caller(0))[3]); + my $key = shift; + + print "Deleting $data{$key}{'FILEPATH'}..."; + unlink($data{$key}{'FILEPATH'}) or die "Could not delete $data{$key}{'FILEPATH'}!\n"; + print " Done.\n"; +} + +sub AddToDB { + &Delimiter((caller(0))[3]); + my $key = shift; + + $data{$key}{'TIMESTAMP_UPLOADED'} = &GetTimestamp('YMDHMS'); + $db{$key} = $data{$key}; + my $json = encode_json \%db; + write_file($config{'DBFilepath'}, { binmode => ':raw' }, $json); +} + +sub Delimiter { + my $SubName = shift; + print "\n" . "-" x 80 . "\nSUB " . $SubName . "\n" . '-' x 80 . "\n"; +} + +sub GetTimestamp { + #&Delimiter((caller(0))[3]); + my $switch = shift; + + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); + + my $nice_timestamp; + if ($switch eq 'YMDHMS') { + $nice_timestamp = sprintf ( "%04d%02d%02d_%02d%02d%02d", $year+1900,$mon+1,$mday,$hour,$min,$sec); + } + elsif ($switch eq 'YMD') { + $nice_timestamp = sprintf ( "%04d%02d%02d", $year+1900,$mon+1,$mday); + } + elsif ($switch eq 'year') { + $nice_timestamp = $year+1900; + } + elsif ($switch eq 'month') { + $nice_timestamp = $mon+10; + } + else { + print "Invalid/no switch detected. Use: 'YMDHMS' / 'YMD'\n"; + } + + return $nice_timestamp; +} \ No newline at end of file diff --git a/code_depricated/instafeed.pl b/code_depricated/instafeed.pl new file mode 100755 index 0000000..ffc36f0 --- /dev/null +++ b/code_depricated/instafeed.pl @@ -0,0 +1,253 @@ +#!usr/bin/perl +use strict; +use warnings; +use Data::Dumper; +use JSON::XS qw(encode_json decode_json); +use File::Slurp qw(read_file write_file); +use Getopt::Long qw(GetOptions); +use File::Basename; + +my %config = ( + 'profile' => undef, + 'SRCRoot' => './src/', + 'uploadPHP_CMD' => '/usr/bin/php ./vendor/mgp25/instagram-php/examples/uploadPhoto.php', + 'uploadPHP_debug' => 1, + 'uploadPHP_truncated_debug' => 1, +); + +my %profile = ( + 'dreamyourmansion' => { + 'DBFilepath' => './src/db/db_dreamyourmansion.dat', + 'imageDir' => './src/images/dreamyourmansion', + 'filename_as_title' => 0, + 'uploadPHP' => { + 'username' => 'dreamyourmansion', + 'password' => 'nBLT!4H3aI@c', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#investment #immobilie #mansionhouse #dream #poolhouse #villa #realestate #loft #awesome #lifestyle #motivation #luxury', + 'description_add' => "The most beautiful real estates in the world!\n\nBenefit from the flourishing housing market in Germany. Contact us now by DM.\n\nVom Mieter zum Eigentümer! Exklusives Portfolio: Kontaktiere uns jetzt per DM.", + }, + }, + 'vstbestprices' => { + 'DBFilepath' => './src/db/db_vstbestprices.dat', + 'imageDir' => './src/images/vstbestprices', + 'filename_as_title' => 1, + 'uploadPHP' => { + 'username' => 'vstbestprices', + 'password' => 'Vst#1337vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#Beats #FLStudio20 #Producer #Ableton #Beatmaker #Studio #ProTools #Music #DAW #LogicPro #FruityLoops #VST #VSTplugins #NativeInstruments #MIDI #Drums #AutoTune #Spectrasonics #Omnisphere #AutoTune #Plugins #Keyscape #Trilian #Logic', + 'description_add' => 'INSTALLATION SUPPORT is included in all prices so you can relax and focus on producing!', + }, + }, + 'vstbestprices_testing' => { + 'DBFilepath' => './src/db/db_vstbestprices.dat', + 'imageDir' => './src/images/vstbestprices', + 'filename_as_title' => 1, + 'uploadPHP' => { + 'username' => 'adobebestprices', + 'password' => 'vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#Beats #FLStudio20 #Producer #Ableton #Beatmaker #Studio #ProTools #Music #DAW #LogicPro #FruityLoops #VST #VSTplugins #NativeInstruments #MIDI #Drums #AutoTune #Spectrasonics #Omnisphere #AutoTune #Plugins #Keyscape #Trilian #Logic', + 'description_add' => 'INSTALLATION SUPPORT is included in all prices so you can relax and focus on producing!', + }, + }, + 'adobebestprices' => { + 'DBFilepath' => './src/db/db_adobebestprices.dat', + 'imageDir' => './src/images/adobebestprices/', + 'filename_as_title' => 0, + 'uploadPHP' => { + 'username' => 'adobebestprices', + 'password' => 'vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#adobe #photoshop #adobeillustrator #vector #illustrator #adobephotoshop #vectorart #graphicdesign #aftereffects #logo #cs6 #lightroom #graphic', + 'description_add' => 'Photoshop, Lightroom, Illustrator, Dreamviewer, Premiere for WIN & MAC | Installation support is included in all our prices!', + }, + }, +); + +my (%data, %db); +my $dbKeysStart = 0; +my $profile; + +# MAIN +&CheckParameter(); +&UndumpFromFile(); +#print Dumper \%db; +&DirectoryListing(); +print Dumper \%data; +&FindNewDataset(); +&Summary(); + +sub CheckParameter { + &Delimiter((caller(0))[3]); + + GetOptions ('profile=s' => \$config{'profile'}) or die "Usage: $0 --profile *name*\n"; + die "Usage: $0 --profile *name*\n" if !$config{'profile'} ; + $profile = $config{'profile'}; + if (!exists $profile{$profile}) { + print "Template for profile '$profile' does not exist. Following templates are available:\n"; + print "'$_' " for keys(%profile); + print "\n"; + die; + } +} + +sub UndumpFromFile { + &Delimiter((caller(0))[3]); + + if (-e $profile{$profile}{'DBFilepath'}) { + my $json = read_file($profile{$profile}{'DBFilepath'}, { binmode => ':raw' }); + if (!$json) { + warn "DB file $profile{$profile}{'DBFilepath'} is empty.\n"; + return; + } + %db = %{ decode_json $json }; + $dbKeysStart = scalar(keys(%db)); + print "INFO: $profile{$profile}{'DBFilepath'} has " . $dbKeysStart . " keys.\n"; + } + elsif (!-e $profile{$profile}{'DBFilepath'}) { + print "INFO: NO DB file found at $profile{$profile}{'DBFilepath'}. Creating now... "; + write_file($profile{$profile}{'DBFilepath'}, ''); + print "done.\n"; + die "Please restart."; + # &UndumpFromFile(); + + } +} + +sub DirectoryListing { + &Delimiter((caller(0))[3]); + + # opendir(DIR, $profile{$profile}{'imageDir'}); + # my @files = grep(/\.jpg$|\.png$|\.jpeg$|/,readdir(DIR)); + # closedir(DIR); + my @files = glob ( "$profile{$profile}{'imageDir'}/*" ); + %data = map { $_ => { 'FILEPATH' => "$_" } } @files; +} + +sub Summary { + &Delimiter((caller(0))[3]); + + print "$profile{$profile}{'DBFilepath'} has " . scalar(keys(%db)) . " keys (before $dbKeysStart).\n"; +} + +sub FindNewDataset { + &Delimiter((caller(0))[3]); + + my $i = 0; + for my $key (keys %data) { + if (exists $db{$key}) { + print "OLD: $key\n"; + } + elsif (!exists $db{$key}) { + print "NEW: $key\n"; + + my $success = &uploadPHP($data{$key}{'FILEPATH'}); + &AddToDB($key); + &WipeData($key); + last; + # if ($success) { + # print "success is $success\n"; + # &AddToDB($key); + # &WipeData($key); + # last; + # } + } + $i++; + } + + if ($i == scalar(keys(%data))) { + warn "\nNO NEW FILES AVAILABLE.\n"; + } +} + +sub uploadPHP { + &Delimiter((caller(0))[3]); + my $filepath = shift; + + my $success = 1; + my $captionText = "$profile{$profile}{'uploadPHP'}{'description_add'}\n\n$profile{$profile}{'uploadPHP'}{'tags'}"; + if ($profile{$profile}{'filename_as_title'}) { + my $filename = basename($filepath); + $filename =~ s/(NO INSTALL)|(SymLink Installer)//g; + $filename =~ s/( , )|(\.[^.]+$)//g; + $captionText = "$filename\n\n" . $captionText; + # print Dumper $captionText; + } + open PHPOUT, "$config{'uploadPHP_CMD'} \'$filepath\' \'$captionText\' $profile{$profile}{'uploadPHP'}{'username'} $profile{$profile}{'uploadPHP'}{'password'} $config{'uploadPHP_debug'} $config{'uploadPHP_truncated_debug'} $profile{$profile}{'uploadPHP'}{'proxy_user'} $profile{$profile}{'uploadPHP'}{'proxy_password'} $profile{$profile}{'uploadPHP'}{'proxy_ip'} $profile{$profile}{'uploadPHP'}{'proxy_port'}|"; + while () { + print $_; # PRINT CURRENT PHP OUPUT LINE + if ($_ =~ m/error/) { + $success = 0; + } + } + + return $success; +} + +sub WipeData { + &Delimiter((caller(0))[3]); + my $key = shift; + + print "Deleting $data{$key}{'FILEPATH'}..."; + unlink($data{$key}{'FILEPATH'}) or die "Could not delete $data{$key}{'FILEPATH'}!\n"; + print " Done.\n"; +} + +sub AddToDB { + &Delimiter((caller(0))[3]); + my $key = shift; + + $data{$key}{'TIMESTAMP_UPLOADED'} = &GetTimestamp('YMDHMS'); + $db{$key} = $data{$key}; + my $json = encode_json \%db; + write_file($profile{$profile}{'DBFilepath'}, { binmode => ':raw' }, $json); +} + +sub Delimiter { + my $SubName = shift; + print "\n" . "-" x 80 . "\nSUB " . $SubName . "\n" . '-' x 80 . "\n"; +} + +sub GetTimestamp { + #&Delimiter((caller(0))[3]); + my $switch = shift; + + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); + + my $nice_timestamp; + if ($switch eq 'YMDHMS') { + $nice_timestamp = sprintf ( "%04d%02d%02d_%02d%02d%02d", $year+1900,$mon+1,$mday,$hour,$min,$sec); + } + elsif ($switch eq 'YMD') { + $nice_timestamp = sprintf ( "%04d%02d%02d", $year+1900,$mon+1,$mday); + } + elsif ($switch eq 'year') { + $nice_timestamp = $year+1900; + } + elsif ($switch eq 'month') { + $nice_timestamp = $mon+10; + } + else { + print "Invalid/no switch detected. Use: 'YMDHMS' / 'YMD'\n"; + } + + return $nice_timestamp; +} \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100755 index 0000000..ef0128b --- /dev/null +++ b/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "mgp25/instagram-php": "^7.0" + } +} diff --git a/composer.lock b/composer.lock new file mode 100755 index 0000000..d418520 --- /dev/null +++ b/composer.lock @@ -0,0 +1,1294 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "002cf77f209f09b01600428b67fd422d", + "packages": [ + { + "name": "binsoul/net-mqtt", + "version": "0.2.1", + "source": { + "type": "git", + "url": "https://github.com/binsoul/net-mqtt.git", + "reference": "286b28e6014739b19e0e7ce0cd5871cdd0cef9b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/binsoul/net-mqtt/zipball/286b28e6014739b19e0e7ce0cd5871cdd0cef9b3", + "reference": "286b28e6014739b19e0e7ce0cd5871cdd0cef9b3", + "shasum": "" + }, + "require": { + "php": "~5.6|~7.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.0", + "phpunit/phpunit": "~4.0||~5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "BinSoul\\Net\\Mqtt\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian Mößler", + "email": "code@binsoul.de", + "homepage": "https://github.com/binsoul", + "role": "Developer" + } + ], + "description": "MQTT protocol implementation", + "homepage": "https://github.com/binsoul/net-mqtt", + "keywords": [ + "mqtt", + "net" + ], + "time": "2017-04-03T20:17:02+00:00" + }, + { + "name": "binsoul/net-mqtt-client-react", + "version": "0.3.2", + "source": { + "type": "git", + "url": "https://github.com/binsoul/net-mqtt-client-react.git", + "reference": "6a80fea50e927ebb8bb8a631ea7903c22742ded5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/binsoul/net-mqtt-client-react/zipball/6a80fea50e927ebb8bb8a631ea7903c22742ded5", + "reference": "6a80fea50e927ebb8bb8a631ea7903c22742ded5", + "shasum": "" + }, + "require": { + "binsoul/net-mqtt": "~0.2", + "php": "~5.6|~7.0", + "react/promise": "~2.0", + "react/socket": "~0.8" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.0", + "phpunit/phpunit": "~4.0||~5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "BinSoul\\Net\\Mqtt\\Client\\React\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian Mößler", + "email": "code@binsoul.de", + "homepage": "https://github.com/binsoul", + "role": "Developer" + } + ], + "description": "Asynchronous MQTT client built on React", + "homepage": "https://github.com/binsoul/net-mqtt-client-react", + "keywords": [ + "client", + "mqtt", + "net" + ], + "time": "2017-08-20T08:06:53+00:00" + }, + { + "name": "clue/http-proxy-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/php-http-proxy-react.git", + "reference": "eeff725640ed53386a6adb05ffdbfc2837404fdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/php-http-proxy-react/zipball/eeff725640ed53386a6adb05ffdbfc2837404fdf", + "reference": "eeff725640ed53386a6adb05ffdbfc2837404fdf", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/promise": " ^2.1 || ^1.2.1", + "react/socket": "^1.0 || ^0.8.4", + "ringcentral/psr7": "^1.2" + }, + "require-dev": { + "clue/block-react": "^1.1", + "phpunit/phpunit": "^5.0 || ^4.8", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\HttpProxy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "Async HTTP proxy connector, use any TCP/IP-based protocol through an HTTP CONNECT proxy server, built on top of ReactPHP", + "homepage": "https://github.com/clue/php-http-proxy-react", + "keywords": [ + "async", + "connect", + "http", + "proxy", + "reactphp" + ], + "time": "2018-02-13T16:31:32+00:00" + }, + { + "name": "clue/socks-react", + "version": "v0.8.7", + "source": { + "type": "git", + "url": "https://github.com/clue/php-socks-react.git", + "reference": "0fcd6f2f506918ff003f1b995c6e78443f26e8ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/php-socks-react/zipball/0fcd6f2f506918ff003f1b995c6e78443f26e8ea", + "reference": "0fcd6f2f506918ff003f1b995c6e78443f26e8ea", + "shasum": "" + }, + "require": { + "evenement/evenement": "~3.0|~1.0|~2.0", + "php": ">=5.3", + "react/promise": "^2.1 || ^1.2", + "react/socket": "^1.0 || ^0.8.6" + }, + "require-dev": { + "clue/block-react": "^1.1", + "clue/connection-manager-extra": "^1.0 || ^0.7", + "phpunit/phpunit": "^6.0 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\Socks\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "Async SOCKS4, SOCKS4a and SOCKS5 proxy client and server implementation, built on top of ReactPHP", + "homepage": "https://github.com/clue/php-socks-react", + "keywords": [ + "async", + "proxy", + "reactphp", + "socks client", + "socks protocol", + "socks server", + "tcp tunnel" + ], + "time": "2017-12-17T14:47:58+00:00" + }, + { + "name": "corneltek/getoptionkit", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/c9s/GetOptionKit.git", + "reference": "995607ddf4fc90ebdb4a7d58fe972d581ad8495f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/c9s/GetOptionKit/zipball/995607ddf4fc90ebdb4a7d58fe972d581ad8495f", + "reference": "995607ddf4fc90ebdb4a7d58fe972d581ad8495f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "GetOptionKit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Yo-An Lin", + "email": "yoanlin93@gmail.com" + } + ], + "description": "Powerful command-line option toolkit", + "homepage": "http://github.com/c9s/GetOptionKit", + "time": "2017-06-30T14:54:48+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Evenement": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "time": "2017-07-23T21:35:13+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.4.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "0895c932405407fd3a7368b6910c09a24d26db11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0895c932405407fd3a7368b6910c09a24d26db11", + "reference": "0895c932405407fd3a7368b6910c09a24d26db11", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2019-10-23T15:58:00+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2019-07-01T23:21:34+00:00" + }, + { + "name": "lazyjsonmapper/lazyjsonmapper", + "version": "v1.6.3", + "source": { + "type": "git", + "url": "https://github.com/lazyjsonmapper/lazyjsonmapper.git", + "reference": "51e093b50f4de15d2d64548b3ca743713eed6ee9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lazyjsonmapper/lazyjsonmapper/zipball/51e093b50f4de15d2d64548b3ca743713eed6ee9", + "reference": "51e093b50f4de15d2d64548b3ca743713eed6ee9", + "shasum": "" + }, + "require": { + "corneltek/getoptionkit": "2.*", + "php": ">=5.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.7.1", + "phpunit/phpunit": "6.*" + }, + "bin": [ + "bin/lazydoctor" + ], + "type": "library", + "autoload": { + "psr-4": { + "LazyJsonMapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "SteveJobzniak", + "role": "Developer", + "homepage": "https://github.com/SteveJobzniak" + } + ], + "description": "Advanced, intelligent & automatic object-oriented JSON containers for PHP.", + "homepage": "https://github.com/SteveJobzniak/LazyJsonMapper", + "keywords": [ + "development", + "json" + ], + "time": "2018-05-02T16:57:09+00:00" + }, + { + "name": "mgp25/instagram-php", + "version": "v7.0.1", + "source": { + "type": "git", + "url": "https://github.com/mgp25/Instagram-API.git", + "reference": "53421f90b9ef7743f1c6221c4963f2b9f7a592e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mgp25/Instagram-API/zipball/53421f90b9ef7743f1c6221c4963f2b9f7a592e8", + "reference": "53421f90b9ef7743f1c6221c4963f2b9f7a592e8", + "shasum": "" + }, + "require": { + "binsoul/net-mqtt-client-react": "^0.3.2", + "clue/http-proxy-react": "^1.1.0", + "clue/socks-react": "^0.8.2", + "ext-bcmath": "*", + "ext-curl": "*", + "ext-exif": "*", + "ext-gd": "*", + "ext-mbstring": "*", + "ext-zlib": "*", + "guzzlehttp/guzzle": "^6.2", + "lazyjsonmapper/lazyjsonmapper": "^1.6.1", + "php": ">=5.6", + "psr/log": "^1.0", + "react/event-loop": "^0.4.3", + "react/promise": "^2.5", + "react/socket": "^0.8", + "symfony/process": "^3.4|^4.0", + "valga/fbns-react": "^0.1.8", + "winbox/args": "1.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.11.0", + "monolog/monolog": "^1.23", + "phpunit/phpunit": "^5.7 || ^6.2", + "react/http": "^0.7.2" + }, + "suggest": { + "ext-event": "Installing PHP's native Event extension enables faster Realtime class event handling." + }, + "type": "library", + "autoload": { + "psr-4": { + "InstagramAPI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "RPL-1.5", + "proprietary" + ], + "authors": [ + { + "name": "mgp25", + "email": "me@mgp25.com", + "role": "Founder" + }, + { + "name": "SteveJobzniak", + "homepage": "https://github.com/SteveJobzniak", + "role": "Developer" + } + ], + "description": "Instagram's private API for PHP", + "keywords": [ + "api", + "instagram", + "php", + "private" + ], + "time": "2019-09-17T00:56:42+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "bf73deb2b3b896a9d9c75f3f0d88185d2faa27e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/bf73deb2b3b896a9d9c75f3f0d88185d2faa27e2", + "reference": "bf73deb2b3b896a9d9c75f3f0d88185d2faa27e2", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2019-10-25T08:06:51+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "react/cache", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "aa10d63a1b40a36a486bdf527f28bac607ee6466" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/aa10d63a1b40a36a486bdf527f28bac607ee6466", + "reference": "aa10d63a1b40a36a486bdf527f28bac607ee6466", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "~2.0|~1.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "time": "2019-07-11T13:45:28+00:00" + }, + { + "name": "react/dns", + "version": "v0.4.19", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9", + "reference": "6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", + "react/promise": "^2.1 || ^1.2.1", + "react/promise-timer": "^1.2", + "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.5" + }, + "require-dev": { + "clue/block-react": "^1.2", + "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "time": "2019-07-10T21:00:53+00:00" + }, + { + "name": "react/event-loop", + "version": "v0.4.3", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/8bde03488ee897dc6bb3d91e4e17c353f9c5252f", + "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "suggest": { + "ext-event": "~1.0", + "ext-libev": "*", + "ext-libevent": ">=0.1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Event loop abstraction layer that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "time": "2017-04-27T10:56:23+00:00" + }, + { + "name": "react/promise", + "version": "v2.7.1", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/31ffa96f8d2ed0341a57848cbb84d88b89dd664d", + "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "time": "2019-01-07T21:25:54+00:00" + }, + { + "name": "react/promise-timer", + "version": "v1.5.1", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise-timer.git", + "reference": "35fb910604fd86b00023fc5cda477c8074ad0abc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/35fb910604fd86b00023fc5cda477c8074ad0abc", + "reference": "35fb910604fd86b00023fc5cda477c8074ad0abc", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", + "react/promise": "^2.7.0 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Promise\\Timer\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.", + "homepage": "https://github.com/reactphp/promise-timer", + "keywords": [ + "async", + "event-loop", + "promise", + "reactphp", + "timeout", + "timer" + ], + "time": "2019-03-27T18:10:32+00:00" + }, + { + "name": "react/socket", + "version": "v0.8.12", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "7f7e6c56ccda7418a1a264892a625f38a5bdee0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/7f7e6c56ccda7418a1a264892a625f38a5bdee0c", + "reference": "7f7e6c56ccda7418a1a264892a625f38a5bdee0c", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^0.4.13", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", + "react/promise": "^2.6.0 || ^1.2.1", + "react/promise-timer": "^1.4.0", + "react/stream": "^1.0 || ^0.7.1" + }, + "require-dev": { + "clue/block-react": "^1.2", + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "time": "2018-06-11T14:33:43+00:00" + }, + { + "name": "react/stream", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "50426855f7a77ddf43b9266c22320df5bf6c6ce6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/50426855f7a77ddf43b9266c22320df5bf6c6ce6", + "reference": "50426855f7a77ddf43b9266c22320df5bf6c6ce6", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "time": "2019-01-01T16:15:09+00:00" + }, + { + "name": "ringcentral/psr7", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/ringcentral/psr7.git", + "reference": "dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ringcentral/psr7/zipball/dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c", + "reference": "dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "RingCentral\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "PSR-7 message implementation", + "keywords": [ + "http", + "message", + "stream", + "uri" + ], + "time": "2018-01-15T21:00:49+00:00" + }, + { + "name": "symfony/process", + "version": "v4.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/50556892f3cc47d4200bfd1075314139c4c9ff4b", + "reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2019-09-26T21:17:10+00:00" + }, + { + "name": "valga/fbns-react", + "version": "0.1.8", + "source": { + "type": "git", + "url": "https://github.com/valga/fbns-react.git", + "reference": "4bbf513a8ffed7e0c9ca10776033d34515bb8b37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/valga/fbns-react/zipball/4bbf513a8ffed7e0c9ca10776033d34515bb8b37", + "reference": "4bbf513a8ffed7e0c9ca10776033d34515bb8b37", + "shasum": "" + }, + "require": { + "binsoul/net-mqtt": "~0.2", + "evenement/evenement": "~2.0|~3.0", + "ext-mbstring": "*", + "ext-zlib": "*", + "php": "~5.6|~7.0", + "psr/log": "~1.0", + "react/event-loop": "^0.4.3", + "react/promise": "~2.0", + "react/socket": "~0.8" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.4", + "monolog/monolog": "~1.23" + }, + "suggest": { + "ext-event": "For more efficient event loop implementation.", + "ext-gmp": "To be able to run this code on x86 PHP builds." + }, + "type": "library", + "autoload": { + "psr-4": { + "Fbns\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Abyr Valg", + "email": "valga.github@abyrga.ru" + } + ], + "description": "A PHP client for the FBNS built on top of ReactPHP", + "keywords": [ + "FBNS", + "client", + "php" + ], + "time": "2017-10-09T07:54:13+00:00" + }, + { + "name": "winbox/args", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/johnstevenson/winbox-args.git", + "reference": "389a9ed9410e6f422b1031b3e55a402ace716296" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/johnstevenson/winbox-args/zipball/389a9ed9410e6f422b1031b3e55a402ace716296", + "reference": "389a9ed9410e6f422b1031b3e55a402ace716296", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Winbox\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Windows command-line formatter", + "homepage": "http://github.com/johnstevenson/winbox-args", + "keywords": [ + "Escape", + "command", + "windows" + ], + "time": "2016-08-04T14:30:27+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/foo b/foo new file mode 100755 index 0000000..e69de29 diff --git a/instafeed.pl b/instafeed.pl new file mode 100755 index 0000000..8308497 --- /dev/null +++ b/instafeed.pl @@ -0,0 +1,261 @@ +#!usr/bin/perl +use strict; +use warnings; +use Data::Dumper; +use JSON::XS qw(encode_json decode_json); +use File::Slurp qw(read_file write_file); +use Getopt::Long qw(GetOptions); +use File::Basename; +use HTTP::Cookies; +use Cwd qw(cwd); + +my %config = ( + 'profile' => undef, + 'SRCRoot' => './src/', + 'uploadPHP_CMD' => '/usr/bin/php ./vendor/mgp25/instagram-php/examples/uploadPhoto.php', + 'uploadPHP_debug' => 1, + 'uploadPHP_truncated_debug' => 1, + 'uploadPHP_autoload' => cwd . '/src/mpg25-instagram-api/vendor/autoload.php', +); + +my %profile = ( + 'dreamyourmansion' => { + 'DBFilepath' => './src/db/db_dreamyourmansion.dat', + 'imageDir' => './src/images/dreamyourmansion', + 'filename_as_title' => 0, + 'uploadPHP' => { + 'username' => 'dreamyourmansion', + 'password' => 'nBLT!4H3aI@c', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de786.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#investment #immobilie #mansionhouse #dream #poolhouse #villa #realestate #loft #awesome #lifestyle #motivation #luxury', + 'description_add' => "The most beautiful real estates in the world!", + }, + }, + 'vstbestprices' => { + 'DBFilepath' => './src/db/db_vstbestprices.dat', + 'imageDir' => './src/images/vstbestprices', + 'filename_as_title' => 1, + 'uploadPHP' => { + 'username' => 'vstbestprices', + 'password' => 'Vst#1337vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#Beats #FLStudio20 #Producer #Ableton #Beatmaker #Studio #ProTools #Music #DAW #LogicPro #FruityLoops #VST #VSTplugins #NativeInstruments #MIDI #Drums #AutoTune #Spectrasonics #Omnisphere #AutoTune #Plugins #Keyscape #Trilian #Logic', + 'description_add' => 'INSTALLATION SUPPORT is included in all prices so you can relax and focus on producing!', + }, + }, + 'vstbestprices_testing' => { + 'DBFilepath' => './src/db/db_vstbestprices.dat', + 'imageDir' => './src/images/vstbestprices', + 'filename_as_title' => 1, + 'uploadPHP' => { + 'username' => 'adobebestprices', + 'password' => 'vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#Beats #FLStudio20 #Producer #Ableton #Beatmaker #Studio #ProTools #Music #DAW #LogicPro #FruityLoops #VST #VSTplugins #NativeInstruments #MIDI #Drums #AutoTune #Spectrasonics #Omnisphere #AutoTune #Plugins #Keyscape #Trilian #Logic', + 'description_add' => 'INSTALLATION SUPPORT is included in all prices so you can relax and focus on producing!', + }, + }, + 'adobebestprices' => { + 'DBFilepath' => './src/db/db_adobebestprices.dat', + 'imageDir' => './src/images/adobebestprices/', + 'filename_as_title' => 0, + 'uploadPHP' => { + 'username' => 'adobebestprices', + 'password' => 'vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#adobe #photoshop #adobeillustrator #vector #illustrator #adobephotoshop #vectorart #graphicdesign #aftereffects #logo #cs6 #lightroom #graphic', + 'description_add' => 'Photoshop, Lightroom, Illustrator, Dreamviewer, Premiere for WIN & MAC | Installation support is included in all our prices!', + }, + }, +); + +my (%data, %db); +my $dbKeysStart = 0; +my $profile; + +# MAIN +&CheckParameter(); +&UndumpFromFile(); +#print Dumper \%db; +&DirectoryListing(); +print Dumper \%data; +&FindNewDataset(); +&Summary(); + +sub CheckParameter { + &Delimiter((caller(0))[3]); + + GetOptions ('profile=s' => \$config{'profile'}) or die &PrintUsage(); + die &PrintUsage() if !$config{'profile'}; + $profile = $config{'profile'}; + if (!exists $profile{$profile}) { + print "Profile '$profile' does not exist.\n"; + &PrintUsage(); + die; + } +} + +sub PrintUsage { + print "Usage: $0 --profile *name*\n"; + print "Following profiles are available:\n"; + print "* '$_'\n" for keys(%profile); +} + +sub UndumpFromFile { + &Delimiter((caller(0))[3]); + + if (-e $profile{$profile}{'DBFilepath'}) { + my $json = read_file($profile{$profile}{'DBFilepath'}, { binmode => ':raw' }); + if (!$json) { + warn "DB file $profile{$profile}{'DBFilepath'} is empty.\n"; + return; + } + %db = %{ decode_json $json }; + $dbKeysStart = scalar(keys(%db)); + print "INFO: $profile{$profile}{'DBFilepath'} has " . $dbKeysStart . " keys.\n"; + } + elsif (!-e $profile{$profile}{'DBFilepath'}) { + print "INFO: NO DB file found at $profile{$profile}{'DBFilepath'}. Creating now... "; + write_file($profile{$profile}{'DBFilepath'}, ''); + print "done.\n"; + die "Please restart."; + # &UndumpFromFile(); + + } +} + +sub DirectoryListing { + &Delimiter((caller(0))[3]); + + # opendir(DIR, $profile{$profile}{'imageDir'}); + # my @files = grep(/\.jpg$|\.png$|\.jpeg$|/,readdir(DIR)); + # closedir(DIR); + my @files = glob ( "$profile{$profile}{'imageDir'}/*" ); + %data = map { $_ => { 'FILEPATH' => "$_" } } @files; +} + +sub Summary { + &Delimiter((caller(0))[3]); + + print "$profile{$profile}{'DBFilepath'} has " . scalar(keys(%db)) . " keys (before $dbKeysStart).\n"; +} + +sub FindNewDataset { + &Delimiter((caller(0))[3]); + + my $i = 0; + for my $key (keys %data) { + if (exists $db{$key}) { + print "OLD: $key\n"; + } + elsif (!exists $db{$key}) { + print "NEW: $key\n"; + + my $success = &uploadPHP($data{$key}{'FILEPATH'}); + &AddToDB($key); + &WipeData($key); + last; + # if ($success) { + # print "success is $success\n"; + # &AddToDB($key); + # &WipeData($key); + # last; + # } + } + $i++; + } + + if ($i == scalar(keys(%data))) { + warn "\nNO NEW FILES AVAILABLE.\n"; + } +} + +sub uploadPHP { + &Delimiter((caller(0))[3]); + my $filepath = shift; + + my $success = 1; + my $captionText = "$profile{$profile}{'uploadPHP'}{'description_add'}\n\n$profile{$profile}{'uploadPHP'}{'tags'}"; + if ($profile{$profile}{'filename_as_title'}) { + my $filename = basename($filepath); + $filename =~ s/(NO INSTALL)|(SymLink Installer)//g; + $filename =~ s/( , )|(\.[^.]+$)//g; + $captionText = "$filename\n\n" . $captionText; + # print Dumper $captionText; + } + open PHPOUT, "$config{'uploadPHP_CMD'} \'$filepath\' \'$captionText\' $profile{$profile}{'uploadPHP'}{'username'} $profile{$profile}{'uploadPHP'}{'password'} $config{'uploadPHP_debug'} $config{'uploadPHP_truncated_debug'} $profile{$profile}{'uploadPHP'}{'proxy_user'} $profile{$profile}{'uploadPHP'}{'proxy_password'} $profile{$profile}{'uploadPHP'}{'proxy_ip'} $profile{$profile}{'uploadPHP'}{'proxy_port'} \'$config{'uploadPHP_autoload'}\'|"; + while () { + print $_; # PRINT CURRENT PHP OUPUT LINE + if ($_ =~ m/error/) { + $success = 0; + } + } + + return $success; +} + +sub WipeData { + &Delimiter((caller(0))[3]); + my $key = shift; + + print "Deleting $data{$key}{'FILEPATH'}..."; + unlink($data{$key}{'FILEPATH'}) or die "Could not delete $data{$key}{'FILEPATH'}!\n"; + print " Done.\n"; +} + +sub AddToDB { + &Delimiter((caller(0))[3]); + my $key = shift; + + $data{$key}{'TIMESTAMP_UPLOADED'} = &GetTimestamp('YMDHMS'); + $db{$key} = $data{$key}; + my $json = encode_json \%db; + write_file($profile{$profile}{'DBFilepath'}, { binmode => ':raw' }, $json); +} + +sub Delimiter { + my $SubName = shift; + print "\n" . "-" x 80 . "\nSUB " . $SubName . "\n" . '-' x 80 . "\n"; +} + +sub GetTimestamp { + #&Delimiter((caller(0))[3]); + my $switch = shift; + + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); + + my $nice_timestamp; + if ($switch eq 'YMDHMS') { + $nice_timestamp = sprintf ( "%04d%02d%02d_%02d%02d%02d", $year+1900,$mon+1,$mday,$hour,$min,$sec); + } + elsif ($switch eq 'YMD') { + $nice_timestamp = sprintf ( "%04d%02d%02d", $year+1900,$mon+1,$mday); + } + elsif ($switch eq 'year') { + $nice_timestamp = $year+1900; + } + elsif ($switch eq 'month') { + $nice_timestamp = $mon+10; + } + else { + print "Invalid/no switch detected. Use: 'YMDHMS' / 'YMD'\n"; + } + + return $nice_timestamp; +} \ No newline at end of file diff --git a/instafeed/code_depricated/instafeed.1.pl b/instafeed/code_depricated/instafeed.1.pl new file mode 100755 index 0000000..e92e05b --- /dev/null +++ b/instafeed/code_depricated/instafeed.1.pl @@ -0,0 +1,170 @@ +#!usr/bin/perl +use strict; +use warnings; +use Data::Dumper; +use JSON::XS qw(encode_json decode_json); +use File::Slurp qw(read_file write_file); +use Getopt::Long qw(GetOptions); + +my %config = ( + 'uploadPHP' => { + 'USERNAME' => 'dreamyourmansion', + 'PASSWORD' => 'H5AZ#dQZ5Ycf', + 'DEBUG' => 1, + 'TRUNCATED_DEBUG' => 1, + 'PROXY_USER' => 'zino%40onlinehome.de', + 'PROXY_PASSWORD' => 'zinomedial33t', + 'PROXY_IP' => 'de435.nordvpn.com', + 'PROXY_PORT' => 80, + }, + 'profile' => undef, + 'imageDir' => './src/images/', + 'SRCRoot' => './src/', + 'DBFilepath' => '/home/pi/instafeed/src/db/db.dat', + 'uploadPHP_CMD' => '/usr/bin/php /home/pi/instafeed/vendor/mgp25/instagram-php/examples/uploadPhoto.php', + 'uploadPHP_DESCRIPTION_ADD' => "The most beautiful real estates in the world!\n\nBenefit from the flourishing housing market in Germany. Contact us now by DM.\n\nVom Mieter zum Eigentümer! Exklusives Portfolio: Kontaktiere uns jetzt per DM.", + 'uploadPHP_TAGS' => '#investment #immobilie #mansionhouse #dream #poolhouse #villa #realestate #loft #awesome #lifestyle #motivation #luxury', +); + +my (%data, %db, %profiles); +my $dbKeysStart = 0; +GetOptions ('profile=s' => \$config{'profile'}) or die "Usage: $0 --profile *name*\n"; +die "Usage: $0 --profile *name*\n" if !$config{'profile'} ; + +# MAIN + +&UndumpFromFile(); +#print Dumper \%db; +&DirectoryListing(); +# print Dumper \%data; +&FindNewDataset(); +&Summary(); + +sub UndumpFromFile { + &Delimiter((caller(0))[3]); + + if (-e $config{'DBFilepath'}) { + my $json = read_file($config{'DBFilepath'}, { binmode => ':raw' }); + if (!$json) { + warn "DB file $config{'DBFilepath'} is empty.\n"; + return; + } + %db = %{ decode_json $json }; + $dbKeysStart = scalar(keys(%db)); + print "INFO: $config{'DBFilepath'} has " . $dbKeysStart . " keys.\n"; + } + elsif (!-e $config{'DBFilepath'}) { + warn "INFO: NO DB file found at $config{'DBFilepath'}\n"; + exit; + } +} + +sub DirectoryListing { + &Delimiter((caller(0))[3]); + + opendir(DIR, $config{'imageDir'}); + my @files = grep(/\.jpg$/,readdir(DIR)); + closedir(DIR); + %data = map { $_ => { 'FILEPATH' => "$config{'imageDir'}$_" } } @files; + # @hash{@keys} = undef; +} + +sub Summary { + &Delimiter((caller(0))[3]); + + print "$config{'DBFilepath'} has " . scalar(keys(%db)) . " keys (before $dbKeysStart).\n"; +} + +sub FindNewDataset { + &Delimiter((caller(0))[3]); + + my $i = 0; + for my $key (keys %data) { + if (exists $db{$key}) { + print "OLD: $key\n"; + } + elsif (!exists $db{$key}) { + print "NEW: $key\n"; + + my $success = &uploadPHP($data{$key}{'FILEPATH'}); + if ($success) { + print "success is $success\n"; + &AddToDB($key); + &WipeData($key); + last; + } + } + $i++; + } + + if ($i == scalar(keys(%data))) { + warn "\nNO NEW FILES AVAILABLE.\n"; + } +} + +sub uploadPHP { + &Delimiter((caller(0))[3]); + my $filepath = shift; + my $success = 1; + my $captionText = "$config{'uploadPHP_DESCRIPTION_ADD'}\n\n$config{'uploadPHP_TAGS'}"; + + open PHPOUT, "$config{'uploadPHP_CMD'} $filepath \'$captionText\' $config{'uploadPHP'}{'USERNAME'} $config{'uploadPHP'}{'PASSWORD'} $config{'uploadPHP'}{'DEBUG'} $config{'uploadPHP'}{'TRUNCATED_DEBUG'} $config{'uploadPHP'}{'PROXY_USER'} $config{'uploadPHP'}{'PROXY_PASSWORD'} $config{'uploadPHP'}{'PROXY_IP'} $config{'uploadPHP'}{'PROXY_PORT'}|"; + while () { + print $_; # PRINT CURRENT PHP OUPUT LINE + if ($_ =~ m/error/) { + $success = 0; + } + } + + return $success; +} + +sub WipeData { + &Delimiter((caller(0))[3]); + my $key = shift; + + print "Deleting $data{$key}{'FILEPATH'}..."; + unlink($data{$key}{'FILEPATH'}) or die "Could not delete $data{$key}{'FILEPATH'}!\n"; + print " Done.\n"; +} + +sub AddToDB { + &Delimiter((caller(0))[3]); + my $key = shift; + + $data{$key}{'TIMESTAMP_UPLOADED'} = &GetTimestamp('YMDHMS'); + $db{$key} = $data{$key}; + my $json = encode_json \%db; + write_file($config{'DBFilepath'}, { binmode => ':raw' }, $json); +} + +sub Delimiter { + my $SubName = shift; + print "\n" . "-" x 80 . "\nSUB " . $SubName . "\n" . '-' x 80 . "\n"; +} + +sub GetTimestamp { + #&Delimiter((caller(0))[3]); + my $switch = shift; + + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); + + my $nice_timestamp; + if ($switch eq 'YMDHMS') { + $nice_timestamp = sprintf ( "%04d%02d%02d_%02d%02d%02d", $year+1900,$mon+1,$mday,$hour,$min,$sec); + } + elsif ($switch eq 'YMD') { + $nice_timestamp = sprintf ( "%04d%02d%02d", $year+1900,$mon+1,$mday); + } + elsif ($switch eq 'year') { + $nice_timestamp = $year+1900; + } + elsif ($switch eq 'month') { + $nice_timestamp = $mon+10; + } + else { + print "Invalid/no switch detected. Use: 'YMDHMS' / 'YMD'\n"; + } + + return $nice_timestamp; +} \ No newline at end of file diff --git a/instafeed/code_depricated/instafeed.pl b/instafeed/code_depricated/instafeed.pl new file mode 100755 index 0000000..ffc36f0 --- /dev/null +++ b/instafeed/code_depricated/instafeed.pl @@ -0,0 +1,253 @@ +#!usr/bin/perl +use strict; +use warnings; +use Data::Dumper; +use JSON::XS qw(encode_json decode_json); +use File::Slurp qw(read_file write_file); +use Getopt::Long qw(GetOptions); +use File::Basename; + +my %config = ( + 'profile' => undef, + 'SRCRoot' => './src/', + 'uploadPHP_CMD' => '/usr/bin/php ./vendor/mgp25/instagram-php/examples/uploadPhoto.php', + 'uploadPHP_debug' => 1, + 'uploadPHP_truncated_debug' => 1, +); + +my %profile = ( + 'dreamyourmansion' => { + 'DBFilepath' => './src/db/db_dreamyourmansion.dat', + 'imageDir' => './src/images/dreamyourmansion', + 'filename_as_title' => 0, + 'uploadPHP' => { + 'username' => 'dreamyourmansion', + 'password' => 'nBLT!4H3aI@c', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#investment #immobilie #mansionhouse #dream #poolhouse #villa #realestate #loft #awesome #lifestyle #motivation #luxury', + 'description_add' => "The most beautiful real estates in the world!\n\nBenefit from the flourishing housing market in Germany. Contact us now by DM.\n\nVom Mieter zum Eigentümer! Exklusives Portfolio: Kontaktiere uns jetzt per DM.", + }, + }, + 'vstbestprices' => { + 'DBFilepath' => './src/db/db_vstbestprices.dat', + 'imageDir' => './src/images/vstbestprices', + 'filename_as_title' => 1, + 'uploadPHP' => { + 'username' => 'vstbestprices', + 'password' => 'Vst#1337vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#Beats #FLStudio20 #Producer #Ableton #Beatmaker #Studio #ProTools #Music #DAW #LogicPro #FruityLoops #VST #VSTplugins #NativeInstruments #MIDI #Drums #AutoTune #Spectrasonics #Omnisphere #AutoTune #Plugins #Keyscape #Trilian #Logic', + 'description_add' => 'INSTALLATION SUPPORT is included in all prices so you can relax and focus on producing!', + }, + }, + 'vstbestprices_testing' => { + 'DBFilepath' => './src/db/db_vstbestprices.dat', + 'imageDir' => './src/images/vstbestprices', + 'filename_as_title' => 1, + 'uploadPHP' => { + 'username' => 'adobebestprices', + 'password' => 'vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#Beats #FLStudio20 #Producer #Ableton #Beatmaker #Studio #ProTools #Music #DAW #LogicPro #FruityLoops #VST #VSTplugins #NativeInstruments #MIDI #Drums #AutoTune #Spectrasonics #Omnisphere #AutoTune #Plugins #Keyscape #Trilian #Logic', + 'description_add' => 'INSTALLATION SUPPORT is included in all prices so you can relax and focus on producing!', + }, + }, + 'adobebestprices' => { + 'DBFilepath' => './src/db/db_adobebestprices.dat', + 'imageDir' => './src/images/adobebestprices/', + 'filename_as_title' => 0, + 'uploadPHP' => { + 'username' => 'adobebestprices', + 'password' => 'vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#adobe #photoshop #adobeillustrator #vector #illustrator #adobephotoshop #vectorart #graphicdesign #aftereffects #logo #cs6 #lightroom #graphic', + 'description_add' => 'Photoshop, Lightroom, Illustrator, Dreamviewer, Premiere for WIN & MAC | Installation support is included in all our prices!', + }, + }, +); + +my (%data, %db); +my $dbKeysStart = 0; +my $profile; + +# MAIN +&CheckParameter(); +&UndumpFromFile(); +#print Dumper \%db; +&DirectoryListing(); +print Dumper \%data; +&FindNewDataset(); +&Summary(); + +sub CheckParameter { + &Delimiter((caller(0))[3]); + + GetOptions ('profile=s' => \$config{'profile'}) or die "Usage: $0 --profile *name*\n"; + die "Usage: $0 --profile *name*\n" if !$config{'profile'} ; + $profile = $config{'profile'}; + if (!exists $profile{$profile}) { + print "Template for profile '$profile' does not exist. Following templates are available:\n"; + print "'$_' " for keys(%profile); + print "\n"; + die; + } +} + +sub UndumpFromFile { + &Delimiter((caller(0))[3]); + + if (-e $profile{$profile}{'DBFilepath'}) { + my $json = read_file($profile{$profile}{'DBFilepath'}, { binmode => ':raw' }); + if (!$json) { + warn "DB file $profile{$profile}{'DBFilepath'} is empty.\n"; + return; + } + %db = %{ decode_json $json }; + $dbKeysStart = scalar(keys(%db)); + print "INFO: $profile{$profile}{'DBFilepath'} has " . $dbKeysStart . " keys.\n"; + } + elsif (!-e $profile{$profile}{'DBFilepath'}) { + print "INFO: NO DB file found at $profile{$profile}{'DBFilepath'}. Creating now... "; + write_file($profile{$profile}{'DBFilepath'}, ''); + print "done.\n"; + die "Please restart."; + # &UndumpFromFile(); + + } +} + +sub DirectoryListing { + &Delimiter((caller(0))[3]); + + # opendir(DIR, $profile{$profile}{'imageDir'}); + # my @files = grep(/\.jpg$|\.png$|\.jpeg$|/,readdir(DIR)); + # closedir(DIR); + my @files = glob ( "$profile{$profile}{'imageDir'}/*" ); + %data = map { $_ => { 'FILEPATH' => "$_" } } @files; +} + +sub Summary { + &Delimiter((caller(0))[3]); + + print "$profile{$profile}{'DBFilepath'} has " . scalar(keys(%db)) . " keys (before $dbKeysStart).\n"; +} + +sub FindNewDataset { + &Delimiter((caller(0))[3]); + + my $i = 0; + for my $key (keys %data) { + if (exists $db{$key}) { + print "OLD: $key\n"; + } + elsif (!exists $db{$key}) { + print "NEW: $key\n"; + + my $success = &uploadPHP($data{$key}{'FILEPATH'}); + &AddToDB($key); + &WipeData($key); + last; + # if ($success) { + # print "success is $success\n"; + # &AddToDB($key); + # &WipeData($key); + # last; + # } + } + $i++; + } + + if ($i == scalar(keys(%data))) { + warn "\nNO NEW FILES AVAILABLE.\n"; + } +} + +sub uploadPHP { + &Delimiter((caller(0))[3]); + my $filepath = shift; + + my $success = 1; + my $captionText = "$profile{$profile}{'uploadPHP'}{'description_add'}\n\n$profile{$profile}{'uploadPHP'}{'tags'}"; + if ($profile{$profile}{'filename_as_title'}) { + my $filename = basename($filepath); + $filename =~ s/(NO INSTALL)|(SymLink Installer)//g; + $filename =~ s/( , )|(\.[^.]+$)//g; + $captionText = "$filename\n\n" . $captionText; + # print Dumper $captionText; + } + open PHPOUT, "$config{'uploadPHP_CMD'} \'$filepath\' \'$captionText\' $profile{$profile}{'uploadPHP'}{'username'} $profile{$profile}{'uploadPHP'}{'password'} $config{'uploadPHP_debug'} $config{'uploadPHP_truncated_debug'} $profile{$profile}{'uploadPHP'}{'proxy_user'} $profile{$profile}{'uploadPHP'}{'proxy_password'} $profile{$profile}{'uploadPHP'}{'proxy_ip'} $profile{$profile}{'uploadPHP'}{'proxy_port'}|"; + while () { + print $_; # PRINT CURRENT PHP OUPUT LINE + if ($_ =~ m/error/) { + $success = 0; + } + } + + return $success; +} + +sub WipeData { + &Delimiter((caller(0))[3]); + my $key = shift; + + print "Deleting $data{$key}{'FILEPATH'}..."; + unlink($data{$key}{'FILEPATH'}) or die "Could not delete $data{$key}{'FILEPATH'}!\n"; + print " Done.\n"; +} + +sub AddToDB { + &Delimiter((caller(0))[3]); + my $key = shift; + + $data{$key}{'TIMESTAMP_UPLOADED'} = &GetTimestamp('YMDHMS'); + $db{$key} = $data{$key}; + my $json = encode_json \%db; + write_file($profile{$profile}{'DBFilepath'}, { binmode => ':raw' }, $json); +} + +sub Delimiter { + my $SubName = shift; + print "\n" . "-" x 80 . "\nSUB " . $SubName . "\n" . '-' x 80 . "\n"; +} + +sub GetTimestamp { + #&Delimiter((caller(0))[3]); + my $switch = shift; + + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); + + my $nice_timestamp; + if ($switch eq 'YMDHMS') { + $nice_timestamp = sprintf ( "%04d%02d%02d_%02d%02d%02d", $year+1900,$mon+1,$mday,$hour,$min,$sec); + } + elsif ($switch eq 'YMD') { + $nice_timestamp = sprintf ( "%04d%02d%02d", $year+1900,$mon+1,$mday); + } + elsif ($switch eq 'year') { + $nice_timestamp = $year+1900; + } + elsif ($switch eq 'month') { + $nice_timestamp = $mon+10; + } + else { + print "Invalid/no switch detected. Use: 'YMDHMS' / 'YMD'\n"; + } + + return $nice_timestamp; +} \ No newline at end of file diff --git a/instafeed/composer.json b/instafeed/composer.json new file mode 100755 index 0000000..ef0128b --- /dev/null +++ b/instafeed/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "mgp25/instagram-php": "^7.0" + } +} diff --git a/instafeed/composer.lock b/instafeed/composer.lock new file mode 100755 index 0000000..d418520 --- /dev/null +++ b/instafeed/composer.lock @@ -0,0 +1,1294 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "002cf77f209f09b01600428b67fd422d", + "packages": [ + { + "name": "binsoul/net-mqtt", + "version": "0.2.1", + "source": { + "type": "git", + "url": "https://github.com/binsoul/net-mqtt.git", + "reference": "286b28e6014739b19e0e7ce0cd5871cdd0cef9b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/binsoul/net-mqtt/zipball/286b28e6014739b19e0e7ce0cd5871cdd0cef9b3", + "reference": "286b28e6014739b19e0e7ce0cd5871cdd0cef9b3", + "shasum": "" + }, + "require": { + "php": "~5.6|~7.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.0", + "phpunit/phpunit": "~4.0||~5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "BinSoul\\Net\\Mqtt\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian Mößler", + "email": "code@binsoul.de", + "homepage": "https://github.com/binsoul", + "role": "Developer" + } + ], + "description": "MQTT protocol implementation", + "homepage": "https://github.com/binsoul/net-mqtt", + "keywords": [ + "mqtt", + "net" + ], + "time": "2017-04-03T20:17:02+00:00" + }, + { + "name": "binsoul/net-mqtt-client-react", + "version": "0.3.2", + "source": { + "type": "git", + "url": "https://github.com/binsoul/net-mqtt-client-react.git", + "reference": "6a80fea50e927ebb8bb8a631ea7903c22742ded5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/binsoul/net-mqtt-client-react/zipball/6a80fea50e927ebb8bb8a631ea7903c22742ded5", + "reference": "6a80fea50e927ebb8bb8a631ea7903c22742ded5", + "shasum": "" + }, + "require": { + "binsoul/net-mqtt": "~0.2", + "php": "~5.6|~7.0", + "react/promise": "~2.0", + "react/socket": "~0.8" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.0", + "phpunit/phpunit": "~4.0||~5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "BinSoul\\Net\\Mqtt\\Client\\React\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian Mößler", + "email": "code@binsoul.de", + "homepage": "https://github.com/binsoul", + "role": "Developer" + } + ], + "description": "Asynchronous MQTT client built on React", + "homepage": "https://github.com/binsoul/net-mqtt-client-react", + "keywords": [ + "client", + "mqtt", + "net" + ], + "time": "2017-08-20T08:06:53+00:00" + }, + { + "name": "clue/http-proxy-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/php-http-proxy-react.git", + "reference": "eeff725640ed53386a6adb05ffdbfc2837404fdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/php-http-proxy-react/zipball/eeff725640ed53386a6adb05ffdbfc2837404fdf", + "reference": "eeff725640ed53386a6adb05ffdbfc2837404fdf", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/promise": " ^2.1 || ^1.2.1", + "react/socket": "^1.0 || ^0.8.4", + "ringcentral/psr7": "^1.2" + }, + "require-dev": { + "clue/block-react": "^1.1", + "phpunit/phpunit": "^5.0 || ^4.8", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\HttpProxy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "Async HTTP proxy connector, use any TCP/IP-based protocol through an HTTP CONNECT proxy server, built on top of ReactPHP", + "homepage": "https://github.com/clue/php-http-proxy-react", + "keywords": [ + "async", + "connect", + "http", + "proxy", + "reactphp" + ], + "time": "2018-02-13T16:31:32+00:00" + }, + { + "name": "clue/socks-react", + "version": "v0.8.7", + "source": { + "type": "git", + "url": "https://github.com/clue/php-socks-react.git", + "reference": "0fcd6f2f506918ff003f1b995c6e78443f26e8ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/php-socks-react/zipball/0fcd6f2f506918ff003f1b995c6e78443f26e8ea", + "reference": "0fcd6f2f506918ff003f1b995c6e78443f26e8ea", + "shasum": "" + }, + "require": { + "evenement/evenement": "~3.0|~1.0|~2.0", + "php": ">=5.3", + "react/promise": "^2.1 || ^1.2", + "react/socket": "^1.0 || ^0.8.6" + }, + "require-dev": { + "clue/block-react": "^1.1", + "clue/connection-manager-extra": "^1.0 || ^0.7", + "phpunit/phpunit": "^6.0 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\Socks\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "Async SOCKS4, SOCKS4a and SOCKS5 proxy client and server implementation, built on top of ReactPHP", + "homepage": "https://github.com/clue/php-socks-react", + "keywords": [ + "async", + "proxy", + "reactphp", + "socks client", + "socks protocol", + "socks server", + "tcp tunnel" + ], + "time": "2017-12-17T14:47:58+00:00" + }, + { + "name": "corneltek/getoptionkit", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/c9s/GetOptionKit.git", + "reference": "995607ddf4fc90ebdb4a7d58fe972d581ad8495f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/c9s/GetOptionKit/zipball/995607ddf4fc90ebdb4a7d58fe972d581ad8495f", + "reference": "995607ddf4fc90ebdb4a7d58fe972d581ad8495f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "GetOptionKit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Yo-An Lin", + "email": "yoanlin93@gmail.com" + } + ], + "description": "Powerful command-line option toolkit", + "homepage": "http://github.com/c9s/GetOptionKit", + "time": "2017-06-30T14:54:48+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Evenement": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "time": "2017-07-23T21:35:13+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.4.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "0895c932405407fd3a7368b6910c09a24d26db11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0895c932405407fd3a7368b6910c09a24d26db11", + "reference": "0895c932405407fd3a7368b6910c09a24d26db11", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2019-10-23T15:58:00+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2019-07-01T23:21:34+00:00" + }, + { + "name": "lazyjsonmapper/lazyjsonmapper", + "version": "v1.6.3", + "source": { + "type": "git", + "url": "https://github.com/lazyjsonmapper/lazyjsonmapper.git", + "reference": "51e093b50f4de15d2d64548b3ca743713eed6ee9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lazyjsonmapper/lazyjsonmapper/zipball/51e093b50f4de15d2d64548b3ca743713eed6ee9", + "reference": "51e093b50f4de15d2d64548b3ca743713eed6ee9", + "shasum": "" + }, + "require": { + "corneltek/getoptionkit": "2.*", + "php": ">=5.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.7.1", + "phpunit/phpunit": "6.*" + }, + "bin": [ + "bin/lazydoctor" + ], + "type": "library", + "autoload": { + "psr-4": { + "LazyJsonMapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "SteveJobzniak", + "role": "Developer", + "homepage": "https://github.com/SteveJobzniak" + } + ], + "description": "Advanced, intelligent & automatic object-oriented JSON containers for PHP.", + "homepage": "https://github.com/SteveJobzniak/LazyJsonMapper", + "keywords": [ + "development", + "json" + ], + "time": "2018-05-02T16:57:09+00:00" + }, + { + "name": "mgp25/instagram-php", + "version": "v7.0.1", + "source": { + "type": "git", + "url": "https://github.com/mgp25/Instagram-API.git", + "reference": "53421f90b9ef7743f1c6221c4963f2b9f7a592e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mgp25/Instagram-API/zipball/53421f90b9ef7743f1c6221c4963f2b9f7a592e8", + "reference": "53421f90b9ef7743f1c6221c4963f2b9f7a592e8", + "shasum": "" + }, + "require": { + "binsoul/net-mqtt-client-react": "^0.3.2", + "clue/http-proxy-react": "^1.1.0", + "clue/socks-react": "^0.8.2", + "ext-bcmath": "*", + "ext-curl": "*", + "ext-exif": "*", + "ext-gd": "*", + "ext-mbstring": "*", + "ext-zlib": "*", + "guzzlehttp/guzzle": "^6.2", + "lazyjsonmapper/lazyjsonmapper": "^1.6.1", + "php": ">=5.6", + "psr/log": "^1.0", + "react/event-loop": "^0.4.3", + "react/promise": "^2.5", + "react/socket": "^0.8", + "symfony/process": "^3.4|^4.0", + "valga/fbns-react": "^0.1.8", + "winbox/args": "1.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.11.0", + "monolog/monolog": "^1.23", + "phpunit/phpunit": "^5.7 || ^6.2", + "react/http": "^0.7.2" + }, + "suggest": { + "ext-event": "Installing PHP's native Event extension enables faster Realtime class event handling." + }, + "type": "library", + "autoload": { + "psr-4": { + "InstagramAPI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "RPL-1.5", + "proprietary" + ], + "authors": [ + { + "name": "mgp25", + "email": "me@mgp25.com", + "role": "Founder" + }, + { + "name": "SteveJobzniak", + "homepage": "https://github.com/SteveJobzniak", + "role": "Developer" + } + ], + "description": "Instagram's private API for PHP", + "keywords": [ + "api", + "instagram", + "php", + "private" + ], + "time": "2019-09-17T00:56:42+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "bf73deb2b3b896a9d9c75f3f0d88185d2faa27e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/bf73deb2b3b896a9d9c75f3f0d88185d2faa27e2", + "reference": "bf73deb2b3b896a9d9c75f3f0d88185d2faa27e2", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2019-10-25T08:06:51+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "react/cache", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "aa10d63a1b40a36a486bdf527f28bac607ee6466" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/aa10d63a1b40a36a486bdf527f28bac607ee6466", + "reference": "aa10d63a1b40a36a486bdf527f28bac607ee6466", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "~2.0|~1.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "time": "2019-07-11T13:45:28+00:00" + }, + { + "name": "react/dns", + "version": "v0.4.19", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9", + "reference": "6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", + "react/promise": "^2.1 || ^1.2.1", + "react/promise-timer": "^1.2", + "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.5" + }, + "require-dev": { + "clue/block-react": "^1.2", + "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "time": "2019-07-10T21:00:53+00:00" + }, + { + "name": "react/event-loop", + "version": "v0.4.3", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/8bde03488ee897dc6bb3d91e4e17c353f9c5252f", + "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "suggest": { + "ext-event": "~1.0", + "ext-libev": "*", + "ext-libevent": ">=0.1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Event loop abstraction layer that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "time": "2017-04-27T10:56:23+00:00" + }, + { + "name": "react/promise", + "version": "v2.7.1", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/31ffa96f8d2ed0341a57848cbb84d88b89dd664d", + "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "time": "2019-01-07T21:25:54+00:00" + }, + { + "name": "react/promise-timer", + "version": "v1.5.1", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise-timer.git", + "reference": "35fb910604fd86b00023fc5cda477c8074ad0abc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/35fb910604fd86b00023fc5cda477c8074ad0abc", + "reference": "35fb910604fd86b00023fc5cda477c8074ad0abc", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", + "react/promise": "^2.7.0 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Promise\\Timer\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.", + "homepage": "https://github.com/reactphp/promise-timer", + "keywords": [ + "async", + "event-loop", + "promise", + "reactphp", + "timeout", + "timer" + ], + "time": "2019-03-27T18:10:32+00:00" + }, + { + "name": "react/socket", + "version": "v0.8.12", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "7f7e6c56ccda7418a1a264892a625f38a5bdee0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/7f7e6c56ccda7418a1a264892a625f38a5bdee0c", + "reference": "7f7e6c56ccda7418a1a264892a625f38a5bdee0c", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^0.4.13", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", + "react/promise": "^2.6.0 || ^1.2.1", + "react/promise-timer": "^1.4.0", + "react/stream": "^1.0 || ^0.7.1" + }, + "require-dev": { + "clue/block-react": "^1.2", + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "time": "2018-06-11T14:33:43+00:00" + }, + { + "name": "react/stream", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "50426855f7a77ddf43b9266c22320df5bf6c6ce6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/50426855f7a77ddf43b9266c22320df5bf6c6ce6", + "reference": "50426855f7a77ddf43b9266c22320df5bf6c6ce6", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "time": "2019-01-01T16:15:09+00:00" + }, + { + "name": "ringcentral/psr7", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/ringcentral/psr7.git", + "reference": "dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ringcentral/psr7/zipball/dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c", + "reference": "dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "RingCentral\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "PSR-7 message implementation", + "keywords": [ + "http", + "message", + "stream", + "uri" + ], + "time": "2018-01-15T21:00:49+00:00" + }, + { + "name": "symfony/process", + "version": "v4.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/50556892f3cc47d4200bfd1075314139c4c9ff4b", + "reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2019-09-26T21:17:10+00:00" + }, + { + "name": "valga/fbns-react", + "version": "0.1.8", + "source": { + "type": "git", + "url": "https://github.com/valga/fbns-react.git", + "reference": "4bbf513a8ffed7e0c9ca10776033d34515bb8b37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/valga/fbns-react/zipball/4bbf513a8ffed7e0c9ca10776033d34515bb8b37", + "reference": "4bbf513a8ffed7e0c9ca10776033d34515bb8b37", + "shasum": "" + }, + "require": { + "binsoul/net-mqtt": "~0.2", + "evenement/evenement": "~2.0|~3.0", + "ext-mbstring": "*", + "ext-zlib": "*", + "php": "~5.6|~7.0", + "psr/log": "~1.0", + "react/event-loop": "^0.4.3", + "react/promise": "~2.0", + "react/socket": "~0.8" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.4", + "monolog/monolog": "~1.23" + }, + "suggest": { + "ext-event": "For more efficient event loop implementation.", + "ext-gmp": "To be able to run this code on x86 PHP builds." + }, + "type": "library", + "autoload": { + "psr-4": { + "Fbns\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Abyr Valg", + "email": "valga.github@abyrga.ru" + } + ], + "description": "A PHP client for the FBNS built on top of ReactPHP", + "keywords": [ + "FBNS", + "client", + "php" + ], + "time": "2017-10-09T07:54:13+00:00" + }, + { + "name": "winbox/args", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/johnstevenson/winbox-args.git", + "reference": "389a9ed9410e6f422b1031b3e55a402ace716296" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/johnstevenson/winbox-args/zipball/389a9ed9410e6f422b1031b3e55a402ace716296", + "reference": "389a9ed9410e6f422b1031b3e55a402ace716296", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Winbox\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Windows command-line formatter", + "homepage": "http://github.com/johnstevenson/winbox-args", + "keywords": [ + "Escape", + "command", + "windows" + ], + "time": "2016-08-04T14:30:27+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/instafeed/foo b/instafeed/foo new file mode 100755 index 0000000..e69de29 diff --git a/instafeed/instafeed.pl b/instafeed/instafeed.pl new file mode 100755 index 0000000..8308497 --- /dev/null +++ b/instafeed/instafeed.pl @@ -0,0 +1,261 @@ +#!usr/bin/perl +use strict; +use warnings; +use Data::Dumper; +use JSON::XS qw(encode_json decode_json); +use File::Slurp qw(read_file write_file); +use Getopt::Long qw(GetOptions); +use File::Basename; +use HTTP::Cookies; +use Cwd qw(cwd); + +my %config = ( + 'profile' => undef, + 'SRCRoot' => './src/', + 'uploadPHP_CMD' => '/usr/bin/php ./vendor/mgp25/instagram-php/examples/uploadPhoto.php', + 'uploadPHP_debug' => 1, + 'uploadPHP_truncated_debug' => 1, + 'uploadPHP_autoload' => cwd . '/src/mpg25-instagram-api/vendor/autoload.php', +); + +my %profile = ( + 'dreamyourmansion' => { + 'DBFilepath' => './src/db/db_dreamyourmansion.dat', + 'imageDir' => './src/images/dreamyourmansion', + 'filename_as_title' => 0, + 'uploadPHP' => { + 'username' => 'dreamyourmansion', + 'password' => 'nBLT!4H3aI@c', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de786.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#investment #immobilie #mansionhouse #dream #poolhouse #villa #realestate #loft #awesome #lifestyle #motivation #luxury', + 'description_add' => "The most beautiful real estates in the world!", + }, + }, + 'vstbestprices' => { + 'DBFilepath' => './src/db/db_vstbestprices.dat', + 'imageDir' => './src/images/vstbestprices', + 'filename_as_title' => 1, + 'uploadPHP' => { + 'username' => 'vstbestprices', + 'password' => 'Vst#1337vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#Beats #FLStudio20 #Producer #Ableton #Beatmaker #Studio #ProTools #Music #DAW #LogicPro #FruityLoops #VST #VSTplugins #NativeInstruments #MIDI #Drums #AutoTune #Spectrasonics #Omnisphere #AutoTune #Plugins #Keyscape #Trilian #Logic', + 'description_add' => 'INSTALLATION SUPPORT is included in all prices so you can relax and focus on producing!', + }, + }, + 'vstbestprices_testing' => { + 'DBFilepath' => './src/db/db_vstbestprices.dat', + 'imageDir' => './src/images/vstbestprices', + 'filename_as_title' => 1, + 'uploadPHP' => { + 'username' => 'adobebestprices', + 'password' => 'vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#Beats #FLStudio20 #Producer #Ableton #Beatmaker #Studio #ProTools #Music #DAW #LogicPro #FruityLoops #VST #VSTplugins #NativeInstruments #MIDI #Drums #AutoTune #Spectrasonics #Omnisphere #AutoTune #Plugins #Keyscape #Trilian #Logic', + 'description_add' => 'INSTALLATION SUPPORT is included in all prices so you can relax and focus on producing!', + }, + }, + 'adobebestprices' => { + 'DBFilepath' => './src/db/db_adobebestprices.dat', + 'imageDir' => './src/images/adobebestprices/', + 'filename_as_title' => 0, + 'uploadPHP' => { + 'username' => 'adobebestprices', + 'password' => 'vst#1337', + 'truncated_debug' => 1, + 'proxy_user' => 'zino%40onlinehome.de', + 'proxy_password' => 'zinomedial33t', + 'proxy_ip' => 'de435.nordvpn.com', + 'proxy_port' => 80, + 'tags' => '#adobe #photoshop #adobeillustrator #vector #illustrator #adobephotoshop #vectorart #graphicdesign #aftereffects #logo #cs6 #lightroom #graphic', + 'description_add' => 'Photoshop, Lightroom, Illustrator, Dreamviewer, Premiere for WIN & MAC | Installation support is included in all our prices!', + }, + }, +); + +my (%data, %db); +my $dbKeysStart = 0; +my $profile; + +# MAIN +&CheckParameter(); +&UndumpFromFile(); +#print Dumper \%db; +&DirectoryListing(); +print Dumper \%data; +&FindNewDataset(); +&Summary(); + +sub CheckParameter { + &Delimiter((caller(0))[3]); + + GetOptions ('profile=s' => \$config{'profile'}) or die &PrintUsage(); + die &PrintUsage() if !$config{'profile'}; + $profile = $config{'profile'}; + if (!exists $profile{$profile}) { + print "Profile '$profile' does not exist.\n"; + &PrintUsage(); + die; + } +} + +sub PrintUsage { + print "Usage: $0 --profile *name*\n"; + print "Following profiles are available:\n"; + print "* '$_'\n" for keys(%profile); +} + +sub UndumpFromFile { + &Delimiter((caller(0))[3]); + + if (-e $profile{$profile}{'DBFilepath'}) { + my $json = read_file($profile{$profile}{'DBFilepath'}, { binmode => ':raw' }); + if (!$json) { + warn "DB file $profile{$profile}{'DBFilepath'} is empty.\n"; + return; + } + %db = %{ decode_json $json }; + $dbKeysStart = scalar(keys(%db)); + print "INFO: $profile{$profile}{'DBFilepath'} has " . $dbKeysStart . " keys.\n"; + } + elsif (!-e $profile{$profile}{'DBFilepath'}) { + print "INFO: NO DB file found at $profile{$profile}{'DBFilepath'}. Creating now... "; + write_file($profile{$profile}{'DBFilepath'}, ''); + print "done.\n"; + die "Please restart."; + # &UndumpFromFile(); + + } +} + +sub DirectoryListing { + &Delimiter((caller(0))[3]); + + # opendir(DIR, $profile{$profile}{'imageDir'}); + # my @files = grep(/\.jpg$|\.png$|\.jpeg$|/,readdir(DIR)); + # closedir(DIR); + my @files = glob ( "$profile{$profile}{'imageDir'}/*" ); + %data = map { $_ => { 'FILEPATH' => "$_" } } @files; +} + +sub Summary { + &Delimiter((caller(0))[3]); + + print "$profile{$profile}{'DBFilepath'} has " . scalar(keys(%db)) . " keys (before $dbKeysStart).\n"; +} + +sub FindNewDataset { + &Delimiter((caller(0))[3]); + + my $i = 0; + for my $key (keys %data) { + if (exists $db{$key}) { + print "OLD: $key\n"; + } + elsif (!exists $db{$key}) { + print "NEW: $key\n"; + + my $success = &uploadPHP($data{$key}{'FILEPATH'}); + &AddToDB($key); + &WipeData($key); + last; + # if ($success) { + # print "success is $success\n"; + # &AddToDB($key); + # &WipeData($key); + # last; + # } + } + $i++; + } + + if ($i == scalar(keys(%data))) { + warn "\nNO NEW FILES AVAILABLE.\n"; + } +} + +sub uploadPHP { + &Delimiter((caller(0))[3]); + my $filepath = shift; + + my $success = 1; + my $captionText = "$profile{$profile}{'uploadPHP'}{'description_add'}\n\n$profile{$profile}{'uploadPHP'}{'tags'}"; + if ($profile{$profile}{'filename_as_title'}) { + my $filename = basename($filepath); + $filename =~ s/(NO INSTALL)|(SymLink Installer)//g; + $filename =~ s/( , )|(\.[^.]+$)//g; + $captionText = "$filename\n\n" . $captionText; + # print Dumper $captionText; + } + open PHPOUT, "$config{'uploadPHP_CMD'} \'$filepath\' \'$captionText\' $profile{$profile}{'uploadPHP'}{'username'} $profile{$profile}{'uploadPHP'}{'password'} $config{'uploadPHP_debug'} $config{'uploadPHP_truncated_debug'} $profile{$profile}{'uploadPHP'}{'proxy_user'} $profile{$profile}{'uploadPHP'}{'proxy_password'} $profile{$profile}{'uploadPHP'}{'proxy_ip'} $profile{$profile}{'uploadPHP'}{'proxy_port'} \'$config{'uploadPHP_autoload'}\'|"; + while () { + print $_; # PRINT CURRENT PHP OUPUT LINE + if ($_ =~ m/error/) { + $success = 0; + } + } + + return $success; +} + +sub WipeData { + &Delimiter((caller(0))[3]); + my $key = shift; + + print "Deleting $data{$key}{'FILEPATH'}..."; + unlink($data{$key}{'FILEPATH'}) or die "Could not delete $data{$key}{'FILEPATH'}!\n"; + print " Done.\n"; +} + +sub AddToDB { + &Delimiter((caller(0))[3]); + my $key = shift; + + $data{$key}{'TIMESTAMP_UPLOADED'} = &GetTimestamp('YMDHMS'); + $db{$key} = $data{$key}; + my $json = encode_json \%db; + write_file($profile{$profile}{'DBFilepath'}, { binmode => ':raw' }, $json); +} + +sub Delimiter { + my $SubName = shift; + print "\n" . "-" x 80 . "\nSUB " . $SubName . "\n" . '-' x 80 . "\n"; +} + +sub GetTimestamp { + #&Delimiter((caller(0))[3]); + my $switch = shift; + + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); + + my $nice_timestamp; + if ($switch eq 'YMDHMS') { + $nice_timestamp = sprintf ( "%04d%02d%02d_%02d%02d%02d", $year+1900,$mon+1,$mday,$hour,$min,$sec); + } + elsif ($switch eq 'YMD') { + $nice_timestamp = sprintf ( "%04d%02d%02d", $year+1900,$mon+1,$mday); + } + elsif ($switch eq 'year') { + $nice_timestamp = $year+1900; + } + elsif ($switch eq 'month') { + $nice_timestamp = $mon+10; + } + else { + print "Invalid/no switch detected. Use: 'YMDHMS' / 'YMD'\n"; + } + + return $nice_timestamp; +} \ No newline at end of file diff --git a/instafeed/log/dreamyourmansion.log b/instafeed/log/dreamyourmansion.log new file mode 100755 index 0000000..b9a715c --- /dev/null +++ b/instafeed/log/dreamyourmansion.log @@ -0,0 +1,23 @@ + +-------------------------------------------------------------------------------- +SUB main::CheckParameter +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +SUB main::UndumpFromFile +-------------------------------------------------------------------------------- +INFO: ./src/db/db_dreamyourmansion.dat has 191 keys. + +-------------------------------------------------------------------------------- +SUB main::DirectoryListing +-------------------------------------------------------------------------------- +$VAR1 = {}; + +-------------------------------------------------------------------------------- +SUB main::FindNewDataset +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +SUB main::Summary +-------------------------------------------------------------------------------- +./src/db/db_dreamyourmansion.dat has 191 keys (before 191). diff --git a/instafeed/log/vstbestprices.log b/instafeed/log/vstbestprices.log new file mode 100755 index 0000000..240dee3 --- /dev/null +++ b/instafeed/log/vstbestprices.log @@ -0,0 +1,23 @@ + +-------------------------------------------------------------------------------- +SUB main::CheckParameter +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +SUB main::UndumpFromFile +-------------------------------------------------------------------------------- +INFO: ./src/db/db_vstbestprices.dat has 115 keys. + +-------------------------------------------------------------------------------- +SUB main::DirectoryListing +-------------------------------------------------------------------------------- +$VAR1 = {}; + +-------------------------------------------------------------------------------- +SUB main::FindNewDataset +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +SUB main::Summary +-------------------------------------------------------------------------------- +./src/db/db_vstbestprices.dat has 115 keys (before 115). diff --git a/instafeed/src/db/db_dreamyourmansion.dat b/instafeed/src/db/db_dreamyourmansion.dat new file mode 100755 index 0000000..3b33729 --- /dev/null +++ b/instafeed/src/db/db_dreamyourmansion.dat @@ -0,0 +1 @@ +{"./src/images/dreamyourmansion/beach-clouds-dawn-732199.jpg":{"TIMESTAMP_UPLOADED":"20191117_122322","FILEPATH":"./src/images/dreamyourmansion/beach-clouds-dawn-732199.jpg"},"./src/images/dreamyourmansion/angsana-beach-clouds-2417862.jpg":{"TIMESTAMP_UPLOADED":"20191030_223310","FILEPATH":"./src/images/dreamyourmansion/angsana-beach-clouds-2417862.jpg"},"angsana-beach-clouds-2417862.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/angsana-beach-clouds-2417862.jpg","TIMESTAMP_UPLOADED":"20190918_170406"},"./src/images/dreamyourmansion/coast-coastline-daylight-1449778.jpg":{"FILEPATH":"./src/images/dreamyourmansion/coast-coastline-daylight-1449778.jpg","TIMESTAMP_UPLOADED":"20191121_122318"},"./src/images/dreamyourmansion/apartment-architectural-design-architecture-1115804.jpg":{"FILEPATH":"./src/images/dreamyourmansion/apartment-architectural-design-architecture-1115804.jpg","TIMESTAMP_UPLOADED":"20191126_122316"},"./src/images/dreamyourmansion/abraham-lincoln-architecture-attractions-220820.jpg":{"TIMESTAMP_UPLOADED":"20191105_122319","FILEPATH":"./src/images/dreamyourmansion/abraham-lincoln-architecture-attractions-220820.jpg"},"./src/images/dreamyourmansion/AQl-J19ocWE.jpg":{"TIMESTAMP_UPLOADED":"20201009_130503","FILEPATH":"./src/images/dreamyourmansion/AQl-J19ocWE.jpg"},"./src/images/dreamyourmansion/architectural-design-architecture-blue-sky-462358.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-blue-sky-462358.jpg","TIMESTAMP_UPLOADED":"20191101_122317"},"./src/images/dreamyourmansion/castle-facade-fountain-87378.jpg":{"TIMESTAMP_UPLOADED":"20191027_122325","FILEPATH":"./src/images/dreamyourmansion/castle-facade-fountain-87378.jpg"},"./src/images/dreamyourmansion/architecture-art-chandelier-9298.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-art-chandelier-9298.jpg","TIMESTAMP_UPLOADED":"20191106_002324"},"./src/images/dreamyourmansion/ancient-architecture-attractions-208631.jpg":{"TIMESTAMP_UPLOADED":"20191026_122316","FILEPATH":"./src/images/dreamyourmansion/ancient-architecture-attractions-208631.jpg"},"./src/images/dreamyourmansion/architecture-building-daylight-206172.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-building-daylight-206172.jpg","TIMESTAMP_UPLOADED":"20191117_002319"},"./src/images/dreamyourmansion/architecture-brick-wall-bricks-2263682.jpg":{"TIMESTAMP_UPLOADED":"20191030_222855","FILEPATH":"./src/images/dreamyourmansion/architecture-brick-wall-bricks-2263682.jpg"},"./src/images/dreamyourmansion/blue-exotic-hotel-189296.jpg":{"TIMESTAMP_UPLOADED":"20191027_002324","FILEPATH":"./src/images/dreamyourmansion/blue-exotic-hotel-189296.jpg"},"./src/images/dreamyourmansion/clean-holiday-hotel-221457.jpg":{"FILEPATH":"./src/images/dreamyourmansion/clean-holiday-hotel-221457.jpg","TIMESTAMP_UPLOADED":"20191112_002324"},"architectural-design-architecture-daylight-1706625.jpg":{"TIMESTAMP_UPLOADED":"20190926_062631","FILEPATH":"/home/pi/instafeed/src/images/architectural-design-architecture-daylight-1706625.jpg"},"./src/images/dreamyourmansion/beach-blue-water-chair-264468.jpg":{"FILEPATH":"./src/images/dreamyourmansion/beach-blue-water-chair-264468.jpg","TIMESTAMP_UPLOADED":"20191103_002323"},"./src/images/dreamyourmansion/17th-century-courtyard-duchess-of-lauderdale-36355.jpg":{"TIMESTAMP_UPLOADED":"20191201_122317","FILEPATH":"./src/images/dreamyourmansion/17th-century-courtyard-duchess-of-lauderdale-36355.jpg"},"./src/images/dreamyourmansion/architecture-building-city-210493.jpg":{"TIMESTAMP_UPLOADED":"20191109_122320","FILEPATH":"./src/images/dreamyourmansion/architecture-building-city-210493.jpg"},"./src/images/dreamyourmansion/architecture-attractions-buildings-208608.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-attractions-buildings-208608.jpg","TIMESTAMP_UPLOADED":"20191202_002314"},"architecture-building-buy-259098.jpg":{"TIMESTAMP_UPLOADED":"20190920_112034","FILEPATH":"/home/pi/instafeed/src/images/architecture-building-buy-259098.jpg"},"./src/images/dreamyourmansion/architecture-building-castle-534095.jpg":{"TIMESTAMP_UPLOADED":"20191031_122320","FILEPATH":"./src/images/dreamyourmansion/architecture-building-castle-534095.jpg"},"alcohol-bottles-architecture-coconut-trees-1134178.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/alcohol-bottles-architecture-coconut-trees-1134178.jpg","TIMESTAMP_UPLOADED":"20190929_002636"},"apartment-architectural-design-architecture-323774.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/apartment-architectural-design-architecture-323774.jpg","TIMESTAMP_UPLOADED":"20190921_062635"},"./src/images/dreamyourmansion/aerial-photography-beach-bird-s-eye-view-1198838.jpg":{"FILEPATH":"./src/images/dreamyourmansion/aerial-photography-beach-bird-s-eye-view-1198838.jpg","TIMESTAMP_UPLOADED":"20191129_002321"},"./src/images/dreamyourmansion/design-doors-doorway-1834706.jpg":{"FILEPATH":"./src/images/dreamyourmansion/design-doors-doorway-1834706.jpg","TIMESTAMP_UPLOADED":"20191025_002324"},"./src/images/dreamyourmansion/architecture-construction-daylight-534228.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-construction-daylight-534228.jpg","TIMESTAMP_UPLOADED":"20191118_002323"},"architecture-caribbean-chairs-2565222.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-caribbean-chairs-2565222.jpg","TIMESTAMP_UPLOADED":"20190918_180800"},"./src/images/dreamyourmansion/architecture-building-buses-877994.jpg":{"TIMESTAMP_UPLOADED":"20191111_002328","FILEPATH":"./src/images/dreamyourmansion/architecture-building-buses-877994.jpg"},"./src/images/dreamyourmansion/architecture-buildings-contemporary-1488267.jpg":{"TIMESTAMP_UPLOADED":"20191122_122316","FILEPATH":"./src/images/dreamyourmansion/architecture-buildings-contemporary-1488267.jpg"},"./src/images/dreamyourmansion/architecture-dug-out-pool-hotel-1134175.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-dug-out-pool-hotel-1134175.jpg","TIMESTAMP_UPLOADED":"20191007_002321"},"arched-window-architecture-art-1040893.jpg":{"TIMESTAMP_UPLOADED":"20190927_062636","FILEPATH":"/home/pi/instafeed/src/images/arched-window-architecture-art-1040893.jpg"},"backyard-lights-mansion-32870.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/backyard-lights-mansion-32870.jpg","TIMESTAMP_UPLOADED":"20190927_122634"},"./src/images/dreamyourmansion/arches-architecture-art-316080.jpg":{"FILEPATH":"./src/images/dreamyourmansion/arches-architecture-art-316080.jpg","TIMESTAMP_UPLOADED":"20191014_002328"},"architecture-building-daylight-206172.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-building-daylight-206172.jpg","TIMESTAMP_UPLOADED":"20190918_145241"},"./src/images/dreamyourmansion/beach-chairs-chairs-clouds-2549029.jpg":{"TIMESTAMP_UPLOADED":"20191024_002328","FILEPATH":"./src/images/dreamyourmansion/beach-chairs-chairs-clouds-2549029.jpg"},"beach-building-daylight-1714975.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/beach-building-daylight-1714975.jpg","TIMESTAMP_UPLOADED":"20190927_182632"},"./src/images/dreamyourmansion/architecture-building-daylight-126271.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-building-daylight-126271.jpg","TIMESTAMP_UPLOADED":"20191017_002325"},"architecture-building-daylight-208421.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-building-daylight-208421.jpg","TIMESTAMP_UPLOADED":"20190928_182645"},"./src/images/dreamyourmansion/architectural-design-architecture-building-140963.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-building-140963.jpg","TIMESTAMP_UPLOADED":"20191123_002317"},"beam-cabin-clouds-531450.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/beam-cabin-clouds-531450.jpg","TIMESTAMP_UPLOADED":"20190923_182628"},"aerial-photography-beach-bird-s-eye-view-1198838.jpg":{"TIMESTAMP_UPLOADED":"20190918_151656","FILEPATH":"/home/pi/instafeed/src/images/aerial-photography-beach-bird-s-eye-view-1198838.jpg"},"dug-out-pool-garden-swimming-pool-1746876.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/dug-out-pool-garden-swimming-pool-1746876.jpg","TIMESTAMP_UPLOADED":"20190918_170233"},"./src/images/dreamyourmansion/architecture-building-buy-221540.jpg":{"TIMESTAMP_UPLOADED":"20191006_122317","FILEPATH":"./src/images/dreamyourmansion/architecture-building-buy-221540.jpg"},"./src/images/dreamyourmansion/couple-investment-key-1288482.jpg":{"FILEPATH":"./src/images/dreamyourmansion/couple-investment-key-1288482.jpg","TIMESTAMP_UPLOADED":"20191012_002320"},"architecture-buildings-contemporary-1488267.jpg":{"TIMESTAMP_UPLOADED":"20190918_170318","FILEPATH":"/home/pi/instafeed/src/images/architecture-buildings-contemporary-1488267.jpg"},"architecture-building-castle-1270902.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-building-castle-1270902.jpg","TIMESTAMP_UPLOADED":"20190925_122641"},"architecture-building-daylight-126271.jpg":{"TIMESTAMP_UPLOADED":"20190918_170440","FILEPATH":"/home/pi/instafeed/src/images/architecture-building-daylight-126271.jpg"},"./src/images/dreamyourmansion/KtOid0FLjqU.jpg":{"FILEPATH":"./src/images/dreamyourmansion/KtOid0FLjqU.jpg","TIMESTAMP_UPLOADED":"20201009_131359"},"./src/images/dreamyourmansion/architecture-building-driveway-164522.jpg":{"TIMESTAMP_UPLOADED":"20191004_002333","FILEPATH":"./src/images/dreamyourmansion/architecture-building-driveway-164522.jpg"},"./src/images/dreamyourmansion/dug-out-pool-hotel-poolside-1134176.jpg":{"TIMESTAMP_UPLOADED":"20191129_122319","FILEPATH":"./src/images/dreamyourmansion/dug-out-pool-hotel-poolside-1134176.jpg"},"./src/images/dreamyourmansion/building-exterior-cabin-colors-2343533.jpg":{"FILEPATH":"./src/images/dreamyourmansion/building-exterior-cabin-colors-2343533.jpg","TIMESTAMP_UPLOADED":"20191019_122324"},"beach-boat-bridge-1450350.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/beach-boat-bridge-1450350.jpg","TIMESTAMP_UPLOADED":"20190926_182633"},"./src/images/dreamyourmansion/architecture-chimney-cloudy-skies-1569003.jpg":{"TIMESTAMP_UPLOADED":"20191108_122321","FILEPATH":"./src/images/dreamyourmansion/architecture-chimney-cloudy-skies-1569003.jpg"},"./src/images/dreamyourmansion/architectural-design-architecture-brickwalls-191323.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-brickwalls-191323.jpg","TIMESTAMP_UPLOADED":"20191005_002326"},"./src/images/dreamyourmansion/architecture-building-facade-2710554.jpg":{"TIMESTAMP_UPLOADED":"20191005_122319","FILEPATH":"./src/images/dreamyourmansion/architecture-building-facade-2710554.jpg"},"./src/images/dreamyourmansion/architecture-balcony-blue-sky-343240.jpg":{"TIMESTAMP_UPLOADED":"20191019_002320","FILEPATH":"./src/images/dreamyourmansion/architecture-balcony-blue-sky-343240.jpg"},"architecture-building-daylight-210538.jpg":{"TIMESTAMP_UPLOADED":"20191001_221142","FILEPATH":"./src/images/architecture-building-daylight-210538.jpg"},"ancient-architecture-building-771023.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/ancient-architecture-building-771023.jpg","TIMESTAMP_UPLOADED":"20190921_122639"},"./src/images/dreamyourmansion/architecture-chandelier-clean-210463.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-chandelier-clean-210463.jpg","TIMESTAMP_UPLOADED":"20191021_122321"},"./src/images/dreamyourmansion/architecture-building-buildings-2356336.jpg":{"TIMESTAMP_UPLOADED":"20191114_002323","FILEPATH":"./src/images/dreamyourmansion/architecture-building-buildings-2356336.jpg"},"./src/images/dreamyourmansion/beach-bridge-clouds-1320686.jpg":{"FILEPATH":"./src/images/dreamyourmansion/beach-bridge-clouds-1320686.jpg","TIMESTAMP_UPLOADED":"20191104_002332"},"ceiling-chairs-clean-2343465.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/ceiling-chairs-clean-2343465.jpg","TIMESTAMP_UPLOADED":"20190920_122621"},"./src/images/dreamyourmansion/clouds-coconut-trees-daylight-434657.jpg":{"TIMESTAMP_UPLOADED":"20191012_122322","FILEPATH":"./src/images/dreamyourmansion/clouds-coconut-trees-daylight-434657.jpg"},"architecture-backyard-chairs-2775312.jpg":{"TIMESTAMP_UPLOADED":"20190928_062639","FILEPATH":"/home/pi/instafeed/src/images/architecture-backyard-chairs-2775312.jpg"},"architecture-dug-out-pool-hotel-1134175.jpg":{"TIMESTAMP_UPLOADED":"20190813_191818","FILEPATH":"/home/pi/instafeed/src/images/architecture-dug-out-pool-hotel-1134175.jpg"},"./src/images/dreamyourmansion/so3wgJLwDxo.jpg":{"TIMESTAMP_UPLOADED":"20201009_130725","FILEPATH":"./src/images/dreamyourmansion/so3wgJLwDxo.jpg"},"./src/images/dreamyourmansion/broker-buy-customers-1368687.jpg":{"TIMESTAMP_UPLOADED":"20191030_222938","FILEPATH":"./src/images/dreamyourmansion/broker-buy-customers-1368687.jpg"},"./src/images/dreamyourmansion/ceiling-chairs-contemporary-1884261.jpg":{"TIMESTAMP_UPLOADED":"20191008_122323","FILEPATH":"./src/images/dreamyourmansion/ceiling-chairs-contemporary-1884261.jpg"},"animal-architecture-beautiful-162107.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/animal-architecture-beautiful-162107.jpg","TIMESTAMP_UPLOADED":"20190928_122631"},"architecture-building-daylight-804044.jpg":{"TIMESTAMP_UPLOADED":"20190918_170215","FILEPATH":"/home/pi/instafeed/src/images/architecture-building-daylight-804044.jpg"},"./src/images/dreamyourmansion/daylight-door-entrance-242264.jpg":{"FILEPATH":"./src/images/dreamyourmansion/daylight-door-entrance-242264.jpg","TIMESTAMP_UPLOADED":"20191112_122323"},"./src/images/dreamyourmansion/architecture-design-family-929961.jpg":{"TIMESTAMP_UPLOADED":"20191119_122317","FILEPATH":"./src/images/dreamyourmansion/architecture-design-family-929961.jpg"},"architecture-ceiling-chair-1065883.jpg":{"TIMESTAMP_UPLOADED":"20190923_122630","FILEPATH":"/home/pi/instafeed/src/images/architecture-ceiling-chair-1065883.jpg"},"./src/images/dreamyourmansion/architecture-bed-bedroom-1103808.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-bed-bedroom-1103808.jpg","TIMESTAMP_UPLOADED":"20191016_002302"},"calm-clouds-exotic-297984.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/calm-clouds-exotic-297984.jpg","TIMESTAMP_UPLOADED":"20190925_182639"},"./src/images/dreamyourmansion/architecture-beach-building-258154.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-beach-building-258154.jpg","TIMESTAMP_UPLOADED":"20191021_002322"},"architectural-design-architecture-building-exterior-2212875.jpg":{"TIMESTAMP_UPLOADED":"20190813_192233","FILEPATH":"/home/pi/instafeed/src/images/architectural-design-architecture-building-exterior-2212875.jpg"},"./src/images/dreamyourmansion/architecture-atrium-building-220768.jpg":{"TIMESTAMP_UPLOADED":"20191020_122317","FILEPATH":"./src/images/dreamyourmansion/architecture-atrium-building-220768.jpg"},"architecture-building-daylight-208747.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-building-daylight-208747.jpg","TIMESTAMP_UPLOADED":"20190922_182631"},"./src/images/dreamyourmansion/architecture-beautiful-exterior-106399.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-beautiful-exterior-106399.jpg","TIMESTAMP_UPLOADED":"20191107_122322"},"./src/images/dreamyourmansion/background-beach-beautiful-2606523.jpg":{"FILEPATH":"./src/images/dreamyourmansion/background-beach-beautiful-2606523.jpg","TIMESTAMP_UPLOADED":"20191102_122326"},"architecture-building-industry-209274.jpg":{"TIMESTAMP_UPLOADED":"20191001_221941","FILEPATH":"./src/images/dreamyourmansion/architecture-building-industry-209274.jpg"},"architecture-art-chandelier-9298.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-art-chandelier-9298.jpg","TIMESTAMP_UPLOADED":"20190918_170304"},"./src/images/dreamyourmansion/architectural-design-architecture-cabin-1795507.jpg":{"TIMESTAMP_UPLOADED":"20191127_002320","FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-cabin-1795507.jpg"},"./src/images/dreamyourmansion/architecture-beautiful-home-building-280229.jpg":{"TIMESTAMP_UPLOADED":"20191113_122321","FILEPATH":"./src/images/dreamyourmansion/architecture-beautiful-home-building-280229.jpg"},"broker-buy-customers-1368687.jpg":{"TIMESTAMP_UPLOADED":"20190918_180708","FILEPATH":"/home/pi/instafeed/src/images/broker-buy-customers-1368687.jpg"},"./src/images/dreamyourmansion/aerial-photography-architecture-bali-2480608.jpg":{"TIMESTAMP_UPLOADED":"20191130_122319","FILEPATH":"./src/images/dreamyourmansion/aerial-photography-architecture-bali-2480608.jpg"},"./src/images/dreamyourmansion/architectural-design-architecture-daylight-2083459.jpg":{"TIMESTAMP_UPLOADED":"20191127_122320","FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-daylight-2083459.jpg"},"./src/images/dreamyourmansion/building-downtown-real-estate-36362.jpg":{"FILEPATH":"./src/images/dreamyourmansion/building-downtown-real-estate-36362.jpg","TIMESTAMP_UPLOADED":"20191009_122317"},"beach-blue-coast-1724420.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/beach-blue-coast-1724420.jpg","TIMESTAMP_UPLOADED":"20190918_170543"},"./src/images/dreamyourmansion/architecture-building-dry-leaves-1757516.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-building-dry-leaves-1757516.jpg","TIMESTAMP_UPLOADED":"20191106_122322"},"./src/images/dreamyourmansion/beach-daylight-exotic-2631613.jpg":{"TIMESTAMP_UPLOADED":"20191011_122735","FILEPATH":"./src/images/dreamyourmansion/beach-daylight-exotic-2631613.jpg"},"./src/images/dreamyourmansion/architectural-design-architecture-building-exterior-2212875.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-building-exterior-2212875.jpg","TIMESTAMP_UPLOADED":"20191016_122323"},"./src/images/dreamyourmansion/architecture-chair-color-1080696.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-chair-color-1080696.jpg","TIMESTAMP_UPLOADED":"20191102_002323"},"./src/images/dreamyourmansion/architecture-building-daylight-173229.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-building-daylight-173229.jpg","TIMESTAMP_UPLOADED":"20191201_002317"},"./src/images/dreamyourmansion/architecture-buy-construction-461024.jpg":{"TIMESTAMP_UPLOADED":"20191017_122332","FILEPATH":"./src/images/dreamyourmansion/architecture-buy-construction-461024.jpg"},"architecture-autumn-building-exterior-2179603.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-autumn-building-exterior-2179603.jpg","TIMESTAMP_UPLOADED":"20190924_182640"},"chairs-contemporary-daylight-1439711.jpg":{"TIMESTAMP_UPLOADED":"20190918_150225","FILEPATH":"/home/pi/instafeed/src/images/chairs-contemporary-daylight-1439711.jpg"},"./src/images/dreamyourmansion/ancient-architecture-building-140019.jpg":{"TIMESTAMP_UPLOADED":"20191011_002336","FILEPATH":"./src/images/dreamyourmansion/ancient-architecture-building-140019.jpg"},"architecture-building-city-221106.jpg":{"TIMESTAMP_UPLOADED":"20190926_122633","FILEPATH":"/home/pi/instafeed/src/images/architecture-building-city-221106.jpg"},"./src/images/dreamyourmansion/adventure-aerial-shot-beach-1456293.jpg":{"FILEPATH":"./src/images/dreamyourmansion/adventure-aerial-shot-beach-1456293.jpg","TIMESTAMP_UPLOADED":"20191030_230729"},"./src/images/dreamyourmansion/ancient-arched-window-architecture-532902.jpg":{"TIMESTAMP_UPLOADED":"20191119_002316","FILEPATH":"./src/images/dreamyourmansion/ancient-arched-window-architecture-532902.jpg"},"./src/images/dreamyourmansion/2d4lAQAlbDA.jpg":{"FILEPATH":"./src/images/dreamyourmansion/2d4lAQAlbDA.jpg","TIMESTAMP_UPLOADED":"20201009_130139"},"./src/images/dreamyourmansion/architecture-building-entrance-187815.jpg":{"TIMESTAMP_UPLOADED":"20191025_122321","FILEPATH":"./src/images/dreamyourmansion/architecture-building-entrance-187815.jpg"},"./src/images/dreamyourmansion/clouds-evening-evening-sky-1724422.jpg":{"FILEPATH":"./src/images/dreamyourmansion/clouds-evening-evening-sky-1724422.jpg","TIMESTAMP_UPLOADED":"20191018_122323"},"./src/images/dreamyourmansion/architecture-building-daylight-158148.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-building-daylight-158148.jpg","TIMESTAMP_UPLOADED":"20191030_223154"},"./src/images/dreamyourmansion/arched-window-architecture-blue-sky-259602.jpg":{"TIMESTAMP_UPLOADED":"20191110_122321","FILEPATH":"./src/images/dreamyourmansion/arched-window-architecture-blue-sky-259602.jpg"},"./src/images/dreamyourmansion/chairs-contemporary-daylight-1439711.jpg":{"TIMESTAMP_UPLOADED":"20191115_002322","FILEPATH":"./src/images/dreamyourmansion/chairs-contemporary-daylight-1439711.jpg"},"architecture-building-daylight-1710484.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-building-daylight-1710484.jpg","TIMESTAMP_UPLOADED":"20190925_002632"},"./src/images/dreamyourmansion/afternoon-architecture-backyard-271815.jpg":{"FILEPATH":"./src/images/dreamyourmansion/afternoon-architecture-backyard-271815.jpg","TIMESTAMP_UPLOADED":"20191108_002318"},"./src/images/dreamyourmansion/beach-chairs-blue-chairs-2549018.jpg":{"FILEPATH":"./src/images/dreamyourmansion/beach-chairs-blue-chairs-2549018.jpg","TIMESTAMP_UPLOADED":"20191128_002323"},"./src/images/dreamyourmansion/architecture-brick-building-209315.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-brick-building-209315.jpg","TIMESTAMP_UPLOADED":"20191128_122314"},"./src/images/dreamyourmansion/architecture-daylight-driveway-277667.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-daylight-driveway-277667.jpg","TIMESTAMP_UPLOADED":"20191004_122339"},"architecture-bridge-chairs-261410.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-bridge-chairs-261410.jpg","TIMESTAMP_UPLOADED":"20190921_182646"},"architecture-building-lawn-164539.jpg":{"TIMESTAMP_UPLOADED":"20190919_120616","FILEPATH":"/home/pi/instafeed/src/images/architecture-building-lawn-164539.jpg"},"./src/images/dreamyourmansion/appliances-architecture-ceiling-534151.jpg":{"TIMESTAMP_UPLOADED":"20191008_002318","FILEPATH":"./src/images/dreamyourmansion/appliances-architecture-ceiling-534151.jpg"},"contemporary-counter-door-1380019.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/contemporary-counter-door-1380019.jpg","TIMESTAMP_UPLOADED":"20190924_122603"},"./src/images/dreamyourmansion/2-storey-house-architecture-building-1694360.jpg":{"FILEPATH":"./src/images/dreamyourmansion/2-storey-house-architecture-building-1694360.jpg","TIMESTAMP_UPLOADED":"20191121_002321"},"./src/images/dreamyourmansion/alcohol-bottles-architecture-daytime-1134177.jpg":{"TIMESTAMP_UPLOADED":"20191014_122321","FILEPATH":"./src/images/dreamyourmansion/alcohol-bottles-architecture-daytime-1134177.jpg"},"./src/images/dreamyourmansion/architecture-balcony-building-1658083.jpg":{"TIMESTAMP_UPLOADED":"20191126_002321","FILEPATH":"./src/images/dreamyourmansion/architecture-balcony-building-1658083.jpg"},"./src/images/dreamyourmansion/chairs-columns-decor-1327389.jpg":{"TIMESTAMP_UPLOADED":"20191022_002324","FILEPATH":"./src/images/dreamyourmansion/chairs-columns-decor-1327389.jpg"},"./src/images/dreamyourmansion/architecture-daylight-design-534157.jpg":{"TIMESTAMP_UPLOADED":"20191111_122319","FILEPATH":"./src/images/dreamyourmansion/architecture-daylight-design-534157.jpg"},"abinger-common-ancient-architecture-161791.jpg":{"TIMESTAMP_UPLOADED":"20190921_002637","FILEPATH":"/home/pi/instafeed/src/images/abinger-common-ancient-architecture-161791.jpg"},"./src/images/dreamyourmansion/beach-bungalows-clouds-1449746.jpg":{"TIMESTAMP_UPLOADED":"20191028_002323","FILEPATH":"./src/images/dreamyourmansion/beach-bungalows-clouds-1449746.jpg"},"./src/images/dreamyourmansion/beach-blue-coast-1724420.jpg":{"TIMESTAMP_UPLOADED":"20191006_002323","FILEPATH":"./src/images/dreamyourmansion/beach-blue-coast-1724420.jpg"},"./src/images/dreamyourmansion/architecture-black-and-white-facade-259820.jpg":{"TIMESTAMP_UPLOADED":"20191030_221509","FILEPATH":"./src/images/dreamyourmansion/architecture-black-and-white-facade-259820.jpg"},"contemporary-counter-daylight-1504025.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/contemporary-counter-daylight-1504025.jpg","TIMESTAMP_UPLOADED":"20190928_002636"},"building-exterior-cabin-colors-2343533.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/building-exterior-cabin-colors-2343533.jpg","TIMESTAMP_UPLOADED":"20190916_213744"},"./src/images/dreamyourmansion/dug-out-pool-garden-swimming-pool-1746876.jpg":{"TIMESTAMP_UPLOADED":"20191029_002326","FILEPATH":"./src/images/dreamyourmansion/dug-out-pool-garden-swimming-pool-1746876.jpg"},"architecture-building-garden-1358837.jpg":{"TIMESTAMP_UPLOADED":"20190922_122636","FILEPATH":"/home/pi/instafeed/src/images/architecture-building-garden-1358837.jpg"},"ceiling-chairs-contemporary-1864888.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/ceiling-chairs-contemporary-1864888.jpg","TIMESTAMP_UPLOADED":"20190924_002633"},"./src/images/dreamyourmansion/architecture-building-driveway-284991.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-building-driveway-284991.jpg","TIMESTAMP_UPLOADED":"20191103_122320"},"./src/images/dreamyourmansion/apartment-architecture-artistic-1608165.jpg":{"TIMESTAMP_UPLOADED":"20191023_122324","FILEPATH":"./src/images/dreamyourmansion/apartment-architecture-artistic-1608165.jpg"},"./src/images/dreamyourmansion/architectural-design-architecture-building-1212053.jpg":{"TIMESTAMP_UPLOADED":"20191101_002319","FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-building-1212053.jpg"},"architecture-attraction-building-210474.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-attraction-building-210474.jpg","TIMESTAMP_UPLOADED":"20190923_062641"},"aqua-boardwalk-clouds-2525899.jpg":{"TIMESTAMP_UPLOADED":"20190929_062638","FILEPATH":"/home/pi/instafeed/src/images/aqua-boardwalk-clouds-2525899.jpg"},"./src/images/dreamyourmansion/apartment-architecture-balcony-347141.jpg":{"TIMESTAMP_UPLOADED":"20191004_163559","FILEPATH":"./src/images/dreamyourmansion/apartment-architecture-balcony-347141.jpg"},"./src/images/dreamyourmansion/architecture-backyard-clouds-2513972.jpg":{"TIMESTAMP_UPLOADED":"20191030_122320","FILEPATH":"./src/images/dreamyourmansion/architecture-backyard-clouds-2513972.jpg"},"./src/images/dreamyourmansion/architecture-art-chair-1365225.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-art-chair-1365225.jpg","TIMESTAMP_UPLOADED":"20191031_002321"},"./src/images/dreamyourmansion/architecture-attractive-balcony-210496.jpg":{"TIMESTAMP_UPLOADED":"20191026_002317","FILEPATH":"./src/images/dreamyourmansion/architecture-attractive-balcony-210496.jpg"},"./src/images/dreamyourmansion/architecture-building-campus-207684.jpg":{"TIMESTAMP_UPLOADED":"20191123_122315","FILEPATH":"./src/images/dreamyourmansion/architecture-building-campus-207684.jpg"},"high-angle-shot-hotel-palm-1488291.jpg":{"TIMESTAMP_UPLOADED":"20190919_122613","FILEPATH":"/home/pi/instafeed/src/images/high-angle-shot-hotel-palm-1488291.jpg"},"./src/images/dreamyourmansion/architecture-balcony-daylight-1060950.jpg":{"TIMESTAMP_UPLOADED":"20191007_122322","FILEPATH":"./src/images/dreamyourmansion/architecture-balcony-daylight-1060950.jpg"},"./src/images/dreamyourmansion/architectural-design-architecture-country-home-2287310.jpg":{"TIMESTAMP_UPLOADED":"20191109_002323","FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-country-home-2287310.jpg"},"./src/images/dreamyourmansion/architecture-dug-out-pool-family-1488327.jpg":{"TIMESTAMP_UPLOADED":"20191013_122318","FILEPATH":"./src/images/dreamyourmansion/architecture-dug-out-pool-family-1488327.jpg"},"architectural-design-architecture-balcony-2307277.jpg":{"TIMESTAMP_UPLOADED":"20190927_002638","FILEPATH":"/home/pi/instafeed/src/images/architectural-design-architecture-balcony-2307277.jpg"},"./src/images/dreamyourmansion/PyFzygP2eNg.jpg":{"TIMESTAMP_UPLOADED":"20201009_125756","FILEPATH":"./src/images/dreamyourmansion/PyFzygP2eNg.jpg"},"./src/images/dreamyourmansion/arched-window-architectural-design-architecture-1598546.jpg":{"TIMESTAMP_UPLOADED":"20191113_002323","FILEPATH":"./src/images/dreamyourmansion/arched-window-architectural-design-architecture-1598546.jpg"},"architecture-baroque-building-326784.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-baroque-building-326784.jpg","TIMESTAMP_UPLOADED":"20190930_002330"},"./src/images/dreamyourmansion/architectural-design-architecture-daylight-112283.jpg":{"TIMESTAMP_UPLOADED":"20191125_122316","FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-daylight-112283.jpg"},"architecture-building-grass-275516.jpg":{"TIMESTAMP_UPLOADED":"20190925_062633","FILEPATH":"/home/pi/instafeed/src/images/architecture-building-grass-275516.jpg"},"architecture-daylight-exterior-1327445.jpg":{"TIMESTAMP_UPLOADED":"20190926_002634","FILEPATH":"/home/pi/instafeed/src/images/architecture-daylight-exterior-1327445.jpg"},"banking-buy-construction-210617.jpg":{"TIMESTAMP_UPLOADED":"20190916_213409","FILEPATH":"/home/pi/instafeed/src/images/banking-buy-construction-210617.jpg"},"./src/images/dreamyourmansion/beach-beautiful-blue-279574.jpg":{"FILEPATH":"./src/images/dreamyourmansion/beach-beautiful-blue-279574.jpg","TIMESTAMP_UPLOADED":"20191107_002318"},"./src/images/dreamyourmansion/architectural-design-architecture-body-of-water-1438834.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-body-of-water-1438834.jpg","TIMESTAMP_UPLOADED":"20191028_122323"},"architecture-daylight-exterior-112291.jpg":{"TIMESTAMP_UPLOADED":"20190920_182632","FILEPATH":"/home/pi/instafeed/src/images/architecture-daylight-exterior-112291.jpg"},"./src/images/dreamyourmansion/accommodation-beach-bed-1531672.jpg":{"TIMESTAMP_UPLOADED":"20191022_122325","FILEPATH":"./src/images/dreamyourmansion/accommodation-beach-bed-1531672.jpg"},"architecture-asheville-biltmore-estate-259823.jpg":{"TIMESTAMP_UPLOADED":"20190922_062630","FILEPATH":"/home/pi/instafeed/src/images/architecture-asheville-biltmore-estate-259823.jpg"},"./src/images/dreamyourmansion/administration-architecture-building-460716.jpg":{"FILEPATH":"./src/images/dreamyourmansion/administration-architecture-building-460716.jpg","TIMESTAMP_UPLOADED":"20191115_122318"},"./src/images/dreamyourmansion/architectural-design-architecture-construction-1800387.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-construction-1800387.jpg","TIMESTAMP_UPLOADED":"20191015_122302"},"./src/images/dreamyourmansion/architecture-beach-blue-261101.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-beach-blue-261101.jpg","TIMESTAMP_UPLOADED":"20191114_122327"},"./src/images/dreamyourmansion/architectural-design-architecture-building-2280844.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-building-2280844.jpg","TIMESTAMP_UPLOADED":"20191104_122324"},"./src/images/dreamyourmansion/architecture-daylight-driveway-6343.jpg":{"TIMESTAMP_UPLOADED":"20191110_002323","FILEPATH":"./src/images/dreamyourmansion/architecture-daylight-driveway-6343.jpg"},"./src/images/dreamyourmansion/architecture-building-facade-164558.jpg":{"TIMESTAMP_UPLOADED":"20191120_122314","FILEPATH":"./src/images/dreamyourmansion/architecture-building-facade-164558.jpg"},"./src/images/dreamyourmansion/architecture-bricks-buildings-242246.jpg":{"TIMESTAMP_UPLOADED":"20191010_002328","FILEPATH":"./src/images/dreamyourmansion/architecture-bricks-buildings-242246.jpg"},"./src/images/dreamyourmansion/_hw4aUQ81ic.jpg":{"TIMESTAMP_UPLOADED":"20201009_130847","FILEPATH":"./src/images/dreamyourmansion/_hw4aUQ81ic.jpg"},"./src/images/dreamyourmansion/architecture-balcony-building-534182.jpg":{"TIMESTAMP_UPLOADED":"20191029_122320","FILEPATH":"./src/images/dreamyourmansion/architecture-balcony-building-534182.jpg"},"./src/images/dreamyourmansion/architectural-design-architecture-clouds-1732414.jpg":{"TIMESTAMP_UPLOADED":"20191125_002320","FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-clouds-1732414.jpg"},"./src/images/dreamyourmansion/architectural-architecture-building-816198.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architectural-architecture-building-816198.jpg","TIMESTAMP_UPLOADED":"20191120_002322"},"./src/images/dreamyourmansion/vbSRUrNm3Ik.jpg":{"TIMESTAMP_UPLOADED":"20201009_131152","FILEPATH":"./src/images/dreamyourmansion/vbSRUrNm3Ik.jpg"},"dark-huts-lights-128303.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/dark-huts-lights-128303.jpg","TIMESTAMP_UPLOADED":"20190924_062603"},"./src/images/dreamyourmansion/architecture-building-daylight-804044.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-building-daylight-804044.jpg","TIMESTAMP_UPLOADED":"20191124_002319"},"architecture-building-condo-280492.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/architecture-building-condo-280492.jpg","TIMESTAMP_UPLOADED":"20190918_195459"},"./src/images/dreamyourmansion/administration-architecture-building-962989.jpg":{"FILEPATH":"./src/images/dreamyourmansion/administration-architecture-building-962989.jpg","TIMESTAMP_UPLOADED":"20191105_002321"},"./src/images/dreamyourmansion/blue-daylight-nature-2549021.jpg":{"TIMESTAMP_UPLOADED":"20191002_155557","FILEPATH":"./src/images/dreamyourmansion/blue-daylight-nature-2549021.jpg"},"./src/images/dreamyourmansion/architectural-design-architecture-building-exterior-616155.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-building-exterior-616155.jpg","TIMESTAMP_UPLOADED":"20191020_002317"},"./src/images/dreamyourmansion/apartment-architecture-balcony-276539.jpg":{"TIMESTAMP_UPLOADED":"20191030_002316","FILEPATH":"./src/images/dreamyourmansion/apartment-architecture-balcony-276539.jpg"},"./src/images/dreamyourmansion/architecture-backyard-brickwalls-221024.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-backyard-brickwalls-221024.jpg","TIMESTAMP_UPLOADED":"20191024_122320"},"./src/images/dreamyourmansion/architecture-backlit-building-2440984.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-backlit-building-2440984.jpg","TIMESTAMP_UPLOADED":"20191118_122321"},"./src/images/dreamyourmansion/architecture-building-cabin-279857.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-building-cabin-279857.jpg","TIMESTAMP_UPLOADED":"20191018_002320"},"./src/images/dreamyourmansion/architecture-daylight-door-1661566.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architecture-daylight-door-1661566.jpg","TIMESTAMP_UPLOADED":"20191010_122332"},"./src/images/dreamyourmansion/architectural-design-architecture-blue-sky-2664118.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-blue-sky-2664118.jpg","TIMESTAMP_UPLOADED":"20191124_122319"},"./src/images/dreamyourmansion/architecture-calm-dug-out-pool-2677398.jpg":{"TIMESTAMP_UPLOADED":"20191002_161141","FILEPATH":"./src/images/dreamyourmansion/architecture-calm-dug-out-pool-2677398.jpg"},"./src/images/dreamyourmansion/chairs-contemporary-counter-1790224.jpg":{"TIMESTAMP_UPLOADED":"20191030_222530","FILEPATH":"./src/images/dreamyourmansion/chairs-contemporary-counter-1790224.jpg"},"./src/images/dreamyourmansion/banking-buy-construction-210617.jpg":{"TIMESTAMP_UPLOADED":"20191130_002317","FILEPATH":"./src/images/dreamyourmansion/banking-buy-construction-210617.jpg"},"./src/images/dreamyourmansion/architectural-design-architecture-bridge-283657.jpg":{"FILEPATH":"./src/images/dreamyourmansion/architectural-design-architecture-bridge-283657.jpg","TIMESTAMP_UPLOADED":"20191023_002324"},"architecture-building-columns-208732.jpg":{"TIMESTAMP_UPLOADED":"20190930_122302","FILEPATH":"/home/pi/instafeed/src/images/architecture-building-columns-208732.jpg"},"./src/images/dreamyourmansion/beach-beautiful-blue-374549.jpg":{"FILEPATH":"./src/images/dreamyourmansion/beach-beautiful-blue-374549.jpg","TIMESTAMP_UPLOADED":"20191122_002321"},"./src/images/dreamyourmansion/ceiling-chairs-contemporary-1864898.jpg":{"FILEPATH":"./src/images/dreamyourmansion/ceiling-chairs-contemporary-1864898.jpg","TIMESTAMP_UPLOADED":"20191015_002302"},"architecture-balcony-blue-sky-343240.jpg":{"TIMESTAMP_UPLOADED":"20190918_145805","FILEPATH":"/home/pi/instafeed/src/images/architecture-balcony-blue-sky-343240.jpg"},"architecture-building-construction-53610.jpg":{"TIMESTAMP_UPLOADED":"20190922_002638","FILEPATH":"/home/pi/instafeed/src/images/architecture-building-construction-53610.jpg"},"beach-chairs-clouds-hotel-338504.jpg":{"FILEPATH":"/home/pi/instafeed/src/images/beach-chairs-clouds-hotel-338504.jpg","TIMESTAMP_UPLOADED":"20190923_002632"},"architecture-grass-landscape-221522.jpg":{"TIMESTAMP_UPLOADED":"20190929_122330","FILEPATH":"/home/pi/instafeed/src/images/architecture-grass-landscape-221522.jpg"},"./src/images/dreamyourmansion/beach-clouds-couple-1287454.jpg":{"FILEPATH":"./src/images/dreamyourmansion/beach-clouds-couple-1287454.jpg","TIMESTAMP_UPLOADED":"20191116_122320"},"./src/images/dreamyourmansion/abandoned-architecture-barn-2360673.jpg":{"TIMESTAMP_UPLOADED":"20191013_002324","FILEPATH":"./src/images/dreamyourmansion/abandoned-architecture-barn-2360673.jpg"},"./src/images/dreamyourmansion/architecture-art-building-1381729.jpg":{"TIMESTAMP_UPLOADED":"20191116_002326","FILEPATH":"./src/images/dreamyourmansion/architecture-art-building-1381729.jpg"},"./src/images/dreamyourmansion/architecture-bushes-chimneys-208736.jpg":{"TIMESTAMP_UPLOADED":"20191009_002321","FILEPATH":"./src/images/dreamyourmansion/architecture-bushes-chimneys-208736.jpg"}} \ No newline at end of file diff --git a/instafeed/src/db/db_vstbestprices.dat b/instafeed/src/db/db_vstbestprices.dat new file mode 100755 index 0000000..5d21f1e --- /dev/null +++ b/instafeed/src/db/db_vstbestprices.dat @@ -0,0 +1 @@ +{"./src/images/vstbestprices//Klevgrand – Modley v1.0.1 – R2R (VST, VST3, AAX, AU) [WiN.OSX x64].png":{"FILEPATH":"./src/images/vstbestprices//Klevgrand – Modley v1.0.1 – R2R (VST, VST3, AAX, AU) [WiN.OSX x64].png","TIMESTAMP_UPLOADED":"20191023_163320"},"./src/images/vstbestprices//Tracktion Software Waveform v9.3.6 [OSX x64].png":{"FILEPATH":"./src/images/vstbestprices//Tracktion Software Waveform v9.3.6 [OSX x64].png","TIMESTAMP_UPLOADED":"20191007_163326"},"./src/images/vstbestprices//Waves Casual – Nylon v1.0.1 (VSTi, VST3) [WiN x64].png":{"FILEPATH":"./src/images/vstbestprices//Waves Casual – Nylon v1.0.1 (VSTi, VST3) [WiN x64].png","TIMESTAMP_UPLOADED":"20191014_083316"},"./src/images/vstbestprices/Positive Grid – BIAS Pedal Pro 2.3.3.5467 (STANDALONE, VST, RTAS, AAX) [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191116_163317","FILEPATH":"./src/images/vstbestprices/Positive Grid – BIAS Pedal Pro 2.3.3.5467 (STANDALONE, VST, RTAS, AAX) [WiN x64].jpeg"},"./src/images/vstbestprices//PG Music – Band-in-a-Box 2019 + RealBand 2019 PlusPAK Build 628 + RealTracks Sets 301-328 + RealTracks Update 2019 (STANDALONE, VST, VST3, AAX) [WiN x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//PG Music – Band-in-a-Box 2019 + RealBand 2019 PlusPAK Build 628 + RealTracks Sets 301-328 + RealTracks Update 2019 (STANDALONE, VST, VST3, AAX) [WiN x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191020_003317"},"./src/images/vstbestprices//Serato – Studio 1.0.0 [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191023_083317","FILEPATH":"./src/images/vstbestprices//Serato – Studio 1.0.0 [WiN x64].jpeg"},"./src/images/vstbestprices//kiloHearts – Toolbox Ultimate v1.7.3 – Rev2 (VSTi, VST, AAX) [WiN x64].png":{"FILEPATH":"./src/images/vstbestprices//kiloHearts – Toolbox Ultimate v1.7.3 – Rev2 (VSTi, VST, AAX) [WiN x64].png","TIMESTAMP_UPLOADED":"20191020_163322"},"./src/images/vstbestprices//W.A.Production – Screamo 1.0.1 (VST, VST3, AAX, AU) [WIN.OSX x64 x86].jpeg":{"FILEPATH":"./src/images/vstbestprices//W.A.Production – Screamo 1.0.1 (VST, VST3, AAX, AU) [WIN.OSX x64 x86].jpeg","TIMESTAMP_UPLOADED":"20191028_083317"},"./src/images/vstbestprices//United Plugins – Soundevice Digital Royal Compressor 1.0 (VST, VST3, AAX) [WiN x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//United Plugins – Soundevice Digital Royal Compressor 1.0 (VST, VST3, AAX) [WiN x64].jpeg","TIMESTAMP_UPLOADED":"20191016_083302"},"./src/images/vstbestprices//Raising Jake Studios – SideMinder ME v1.1.0 (VST, VST3, AAX, AU) [WiN.OSX x64].png":{"TIMESTAMP_UPLOADED":"20191005_003318","FILEPATH":"./src/images/vstbestprices//Raising Jake Studios – SideMinder ME v1.1.0 (VST, VST3, AAX, AU) [WiN.OSX x64].png"},"./src/images/vstbestprices//NoiseAsh – Rule Tec All Collection v1.1.0 (VST, AU, AAX) [WiN.OSX x86 x64].png":{"TIMESTAMP_UPLOADED":"20191025_083318","FILEPATH":"./src/images/vstbestprices//NoiseAsh – Rule Tec All Collection v1.1.0 (VST, AU, AAX) [WiN.OSX x86 x64].png"},"./src/images/vstbestprices/W.A.Production – Imprint v1.0.1 (VST, VST3, AAX, AU) [WiN.OSX x64 x86].jpeg":{"FILEPATH":"./src/images/vstbestprices/W.A.Production – Imprint v1.0.1 (VST, VST3, AAX, AU) [WiN.OSX x64 x86].jpeg","TIMESTAMP_UPLOADED":"20191119_003318"},"./src/images/vstbestprices/Venn Audio – V-Clip v1.0.02 – FiX (VST, VST3, AAX) [WiN x64].jpeg":{"FILEPATH":"./src/images/vstbestprices/Venn Audio – V-Clip v1.0.02 – FiX (VST, VST3, AAX) [WiN x64].jpeg","TIMESTAMP_UPLOADED":"20191114_003308"},"./src/images/vstbestprices//Waves – 10 Complete 10.7.2019 (STANDALONE, VST, VST3, RTAS, AAX, AU) [WIN.OSX x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//Waves – 10 Complete 10.7.2019 (STANDALONE, VST, VST3, RTAS, AAX, AU) [WIN.OSX x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191018_083316"},"./src/images/vstbestprices//u-he – Hive v2.0.0.8791 (VSTi, VST3, AAX) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191024_083316","FILEPATH":"./src/images/vstbestprices//u-he – Hive v2.0.0.8791 (VSTi, VST3, AAX) [WiN x86 x64].jpeg"},"./src/images/vstbestprices//Tracktion MOK Waverazor v.2.0.2 (AU, VSTi, VSTi3) [OSX].png":{"TIMESTAMP_UPLOADED":"20191008_003316","FILEPATH":"./src/images/vstbestprices//Tracktion MOK Waverazor v.2.0.2 (AU, VSTi, VSTi3) [OSX].png"},"./src/images/vstbestprices/Analog Obsession – Full Bundle 04.2019 (VST, AU) [WIN.OSX x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191116_003316","FILEPATH":"./src/images/vstbestprices/Analog Obsession – Full Bundle 04.2019 (VST, AU) [WIN.OSX x86 x64].jpeg"},"./src/images/vstbestprices//SoundSpot – Mercury Bundle 2019.6 (VST, VST3, AAX) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191015_163302","FILEPATH":"./src/images/vstbestprices//SoundSpot – Mercury Bundle 2019.6 (VST, VST3, AAX) [WiN x86 x64].jpeg"},"./src/images/vstbestprices//Venn Audio – V-Clip – NO INSTALL, SymLink Installer (VST, VST3, AAX) [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191010_163523","FILEPATH":"./src/images/vstbestprices//Venn Audio – V-Clip – NO INSTALL, SymLink Installer (VST, VST3, AAX) [WiN x64].jpeg"},"./src/images/vstbestprices//DDMF – MagicDeathEye v1.0.1 – R2R (VST, VST3, AAX) [WiN x86 x64].png":{"FILEPATH":"./src/images/vstbestprices//DDMF – MagicDeathEye v1.0.1 – R2R (VST, VST3, AAX) [WiN x86 x64].png","TIMESTAMP_UPLOADED":"20191027_083317"},"./src/images/vstbestprices//W.A Production – Ascension 1.0.1 (STANDALONE, VSTi, VSTi3) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191029_003317","FILEPATH":"./src/images/vstbestprices//W.A Production – Ascension 1.0.1 (STANDALONE, VSTi, VSTi3) [WiN x86 x64].jpeg"},"./src/images/vstbestprices//MAGIX – Vandal v1.112 (VST) [WiN x86 x64].png":{"FILEPATH":"./src/images/vstbestprices//MAGIX – Vandal v1.112 (VST) [WiN x86 x64].png","TIMESTAMP_UPLOADED":"20191026_163320"},"./src/images/vstbestprices//HoRNet – SW34EQ MK2 2.1.2 (VST, VST3, AU) [WIN.OSX x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191026_003316","FILEPATH":"./src/images/vstbestprices//HoRNet – SW34EQ MK2 2.1.2 (VST, VST3, AU) [WIN.OSX x86 x64].jpeg"},"./src/images/vstbestprices/Positive Grid – BIAS FX 2 Elite Complete + DeskTop v2.1.1.4655 (STANDALONE, VST, AAX) [WiN x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices/Positive Grid – BIAS FX 2 Elite Complete + DeskTop v2.1.1.4655 (STANDALONE, VST, AAX) [WiN x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191115_163324"},"./src/images/vstbestprices//Kuassa – Efektor Distortion Bundle 1.0.6 (VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//Kuassa – Efektor Distortion Bundle 1.0.6 (VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191014_163320"},"./src/images/vstbestprices/Kuassa – Amplifikation Matchlock 1.0.0 (STANDALONE, VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices/Kuassa – Amplifikation Matchlock 1.0.0 (STANDALONE, VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191120_083312"},"./src/images/vstbestprices//uJAM – Virtual Drummer HEAVY 2.0.0.192 (VSTi, AAX) [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191017_083318","FILEPATH":"./src/images/vstbestprices//uJAM – Virtual Drummer HEAVY 2.0.0.192 (VSTi, AAX) [WiN x64].jpeg"},"./src/images/vstbestprices//LUXONIX – ravity Bundle v1.4.3 (STANDALONE, VSTi) [WiN x86].jpeg":{"TIMESTAMP_UPLOADED":"20191007_083320","FILEPATH":"./src/images/vstbestprices//LUXONIX – ravity Bundle v1.4.3 (STANDALONE, VSTi) [WiN x86].jpeg"},"./src/images/vstbestprices//kiloHearts – Toolbox Ultimate 1.7.1 (VST, VSTi, AAX) [WiN x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//kiloHearts – Toolbox Ultimate 1.7.1 (VST, VSTi, AAX) [WiN x64].jpeg","TIMESTAMP_UPLOADED":"20191022_083318"},"./src/images/vstbestprices//Kuassa – Bundle – NO INSTALL, SymLink Installer (VST, VST3, AAX, STANDALONE) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191012_003316","FILEPATH":"./src/images/vstbestprices//Kuassa – Bundle – NO INSTALL, SymLink Installer (VST, VST3, AAX, STANDALONE) [WiN x86 x64].jpeg"},"./src/images/vstbestprices//NUGEN – Audio Stereoplacer 3.2.0.1 (VST, VST3, RTAS, AAX, AU) [WIN.OSX x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191025_003317","FILEPATH":"./src/images/vstbestprices//NUGEN – Audio Stereoplacer 3.2.0.1 (VST, VST3, RTAS, AAX, AU) [WIN.OSX x86 x64].jpeg"},"./src/images/vstbestprices/ISM – DuckDelay v1.0.0 – R2R (VST, VST3, AAX, AU) [WiN.OSX x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191119_083313","FILEPATH":"./src/images/vstbestprices/ISM – DuckDelay v1.0.0 – R2R (VST, VST3, AAX, AU) [WiN.OSX x86 x64].jpeg"},"./src/images/vstbestprices//Serato – DJ Pro Suite v2.1.2 [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191022_003318","FILEPATH":"./src/images/vstbestprices//Serato – DJ Pro Suite v2.1.2 [WiN x64].jpeg"},"./src/images/vstbestprices//Stillwell Audio – All Plugins Bundle v3.0.3 (RTAS, VST, VST3) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191013_163318","FILEPATH":"./src/images/vstbestprices//Stillwell Audio – All Plugins Bundle v3.0.3 (RTAS, VST, VST3) [WiN x86 x64].jpeg"},"./src/images/vstbestprices//Tracktion Software DAW Essentials Collection v1.0.25 (AU, VST) [OSX x64].png":{"FILEPATH":"./src/images/vstbestprices//Tracktion Software DAW Essentials Collection v1.0.25 (AU, VST) [OSX x64].png","TIMESTAMP_UPLOADED":"20191006_163320"},"./src/images/vstbestprices/Klevgrand – FX Bundle 6.2019 (VST, AAX) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191118_163318","FILEPATH":"./src/images/vstbestprices/Klevgrand – FX Bundle 6.2019 (VST, AAX) [WiN x86 x64].jpeg"},"./src/images/vstbestprices//FeelyoursoundHQ – ChordPotion v1.1.0 (VST) [WiN x64].png":{"TIMESTAMP_UPLOADED":"20191025_163320","FILEPATH":"./src/images/vstbestprices//FeelyoursoundHQ – ChordPotion v1.1.0 (VST) [WiN x64].png"},"./src/images/vstbestprices/Gramotech – Babylon v19.2.4 (VST3) [WiN x64].png":{"TIMESTAMP_UPLOADED":"20191030_221328","FILEPATH":"./src/images/vstbestprices/Gramotech – Babylon v19.2.4 (VST3) [WiN x64].png"},"./src/images/vstbestprices//AIR Music Tech – Hybrid 3.0.7 – REPACK (VSTi) [WiN x86 x64].png":{"TIMESTAMP_UPLOADED":"20191006_003318","FILEPATH":"./src/images/vstbestprices//AIR Music Tech – Hybrid 3.0.7 – REPACK (VSTi) [WiN x86 x64].png"},"./src/images/vstbestprices//HoRNet – DeeLay Plus 1.2.3 (VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//HoRNet – DeeLay Plus 1.2.3 (VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191024_163319"},"./src/images/vstbestprices//NUGEN – Audio Stereoizer 3.4.0.1 (VST, VST3, RTAS, AAX, AU) [WIN.OSX x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191019_163319","FILEPATH":"./src/images/vstbestprices//NUGEN – Audio Stereoizer 3.4.0.1 (VST, VST3, RTAS, AAX, AU) [WIN.OSX x86 x64].jpeg"},"./src/images/vstbestprices/29Palms – Mastering The Mix Collection 2019.6 – FIXED (STANDALONE, VST, VST3, AAX) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191030_221110","FILEPATH":"./src/images/vstbestprices/29Palms – Mastering The Mix Collection 2019.6 – FIXED (STANDALONE, VST, VST3, AAX) [WiN x86 x64].jpeg"},"./src/images/vstbestprices//Acon Digital – Verberate Immersive 2 v2.0.2 – R2R (AU, VST, VST3, AAX) [WiN.OSX x86 x64].png":{"FILEPATH":"./src/images/vstbestprices//Acon Digital – Verberate Immersive 2 v2.0.2 – R2R (AU, VST, VST3, AAX) [WiN.OSX x86 x64].png","TIMESTAMP_UPLOADED":"20191021_163322"},"./src/images/vstbestprices/Producers Vault – METALES 1.1 (VSTi) [WiN x86 x64].png":{"TIMESTAMP_UPLOADED":"20191002_160508","FILEPATH":"./src/images/vstbestprices/Producers Vault – METALES 1.1 (VSTi) [WiN x86 x64].png"},"./src/images/vstbestprices//FeelYourSound – XotoPad 2.8.0 [WiN x86].jpeg":{"FILEPATH":"./src/images/vstbestprices//FeelYourSound – XotoPad 2.8.0 [WiN x86].jpeg","TIMESTAMP_UPLOADED":"20191028_163320"},"./src/images/vstbestprices//Tracktion Software BioTek 2 v2.1.2 (AU, VSTi) [OSX x64].png":{"TIMESTAMP_UPLOADED":"20191009_083317","FILEPATH":"./src/images/vstbestprices//Tracktion Software BioTek 2 v2.1.2 (AU, VSTi) [OSX x64].png"},"./src/images/vstbestprices//Ample Sound – Ample Bass Upright III v3.00 (VSTi, VSTi3, AAX, AUi) [OSX x64].png":{"FILEPATH":"./src/images/vstbestprices//Ample Sound – Ample Bass Upright III v3.00 (VSTi, VSTi3, AAX, AUi) [OSX x64].png","TIMESTAMP_UPLOADED":"20191018_003323"},"./src/images/vstbestprices//Native Instruments Massive v1.5.5 (STANDALONE, AU, VST) [OSX].png":{"TIMESTAMP_UPLOADED":"20191005_083321","FILEPATH":"./src/images/vstbestprices//Native Instruments Massive v1.5.5 (STANDALONE, AU, VST) [OSX].png"},"./src/images/vstbestprices//Kuassa – Efektor CP3603 1.0.1 (VST, VST3, AAX) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191021_003316","FILEPATH":"./src/images/vstbestprices//Kuassa – Efektor CP3603 1.0.1 (VST, VST3, AAX) [WiN x86 x64].jpeg"},"./src/images/vstbestprices//29Palms – Mastering The Mix Collection v18.6.2019 (EXE, VST, VST3, AAX) [WiN x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//29Palms – Mastering The Mix Collection v18.6.2019 (EXE, VST, VST3, AAX) [WiN x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191013_083316"},"./src/images/vstbestprices/Hexachord – Orb Composer Pro v1.2.1 (VSTi) [WiN x64].png":{"TIMESTAMP_UPLOADED":"20191002_160929","FILEPATH":"./src/images/vstbestprices/Hexachord – Orb Composer Pro v1.2.1 (VSTi) [WiN x64].png"},"./src/images/vstbestprices//Zplane – Bundle – NO INSTALL, SymLink Installer (VST, VST3, AAX, STANDALONE) [WiN x86 x64].png":{"FILEPATH":"./src/images/vstbestprices//Zplane – Bundle – NO INSTALL, SymLink Installer (VST, VST3, AAX, STANDALONE) [WiN x86 x64].png","TIMESTAMP_UPLOADED":"20191005_163319"},"./src/images/vstbestprices//Initial Audio – Master Suite v1.0.0 – R2R (VST, VST3, AU) [WIN.OSX x86 x64].png":{"FILEPATH":"./src/images/vstbestprices//Initial Audio – Master Suite v1.0.0 – R2R (VST, VST3, AU) [WIN.OSX x86 x64].png","TIMESTAMP_UPLOADED":"20191030_083314"},"./src/images/vstbestprices//Output – Bundle – NO INSTALL, SymLink Installer (VST, VST3, AAX) [WiN x86 x64].png":{"FILEPATH":"./src/images/vstbestprices//Output – Bundle – NO INSTALL, SymLink Installer (VST, VST3, AAX) [WiN x86 x64].png","TIMESTAMP_UPLOADED":"20191004_163325"},"./src/images/vstbestprices//uJAM – Virtual Drummer PHAT 2.0.0.258 (VSTi, AAX) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191015_003302","FILEPATH":"./src/images/vstbestprices//uJAM – Virtual Drummer PHAT 2.0.0.258 (VSTi, AAX) [WiN x86 x64].jpeg"},"./src/images/vstbestprices/Unfiltered Audio – Plugins Bundle 2019.6 rev.2 (VST, VST3, AAX) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191115_003315","FILEPATH":"./src/images/vstbestprices/Unfiltered Audio – Plugins Bundle 2019.6 rev.2 (VST, VST3, AAX) [WiN x86 x64].jpeg"},"./src/images/vstbestprices/Hexachords – Orb Composer S Pro v1.4.4 (VSTi) [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191116_083317","FILEPATH":"./src/images/vstbestprices/Hexachords – Orb Composer S Pro v1.4.4 (VSTi) [WiN x64].jpeg"},"./src/images/vstbestprices//United Plugins – JMG Sound Hyperspace 1.0 (VST, VST3, AAX) [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191030_003314","FILEPATH":"./src/images/vstbestprices//United Plugins – JMG Sound Hyperspace 1.0 (VST, VST3, AAX) [WiN x64].jpeg"},"./src/images/vstbestprices//Audiority – Pedalboard Distortions 1.0.1 (VST, AAX, AU) [WIN.OSX x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191017_003316","FILEPATH":"./src/images/vstbestprices//Audiority – Pedalboard Distortions 1.0.1 (VST, AAX, AU) [WIN.OSX x86 x64].jpeg"},"./src/images/vstbestprices//Apple – Logic Pro X 10.4.6 [OSX].png":{"FILEPATH":"./src/images/vstbestprices//Apple – Logic Pro X 10.4.6 [OSX].png","TIMESTAMP_UPLOADED":"20191019_003317"},"./src/images/vstbestprices//NoiseAsh – Bundle – NO INSTALL, SymLink Installer (VST, AAX) [WiN x86 x64].png":{"FILEPATH":"./src/images/vstbestprices//NoiseAsh – Bundle – NO INSTALL, SymLink Installer (VST, AAX) [WiN x86 x64].png","TIMESTAMP_UPLOADED":"20191012_163319"},"./src/images/vstbestprices//IK Multimedia – T-RackS 5 Complete 5.2.1 (STANDALONE, AU, VST2, VST3, AAX) [OSX x64].png":{"FILEPATH":"./src/images/vstbestprices//IK Multimedia – T-RackS 5 Complete 5.2.1 (STANDALONE, AU, VST2, VST3, AAX) [OSX x64].png","TIMESTAMP_UPLOADED":"20191016_003302"},"./src/images/vstbestprices//Audio Damage – AD043 Filterstation2 v2.0.5 (VST, VST3, AAX, AU) [WiN.OSX x86 x64].png":{"TIMESTAMP_UPLOADED":"20191008_163319","FILEPATH":"./src/images/vstbestprices//Audio Damage – AD043 Filterstation2 v2.0.5 (VST, VST3, AAX, AU) [WiN.OSX x86 x64].png"},"./src/images/vstbestprices//Native Instruments – Massive X v1.0.0 (VSTi, AAX) [WiN x64].png":{"FILEPATH":"./src/images/vstbestprices//Native Instruments – Massive X v1.0.0 (VSTi, AAX) [WiN x64].png","TIMESTAMP_UPLOADED":"20191002_154808"},"./src/images/vstbestprices//Xfer Records – Serum v1.23b7 (VSTi, AAX) [WiN x64 x86].png":{"FILEPATH":"./src/images/vstbestprices//Xfer Records – Serum v1.23b7 (VSTi, AAX) [WiN x64 x86].png","TIMESTAMP_UPLOADED":"20191030_220658"},"./src/images/vstbestprices/Steinberg – SpectraLayers Pro v6.0.10 (VST3, AAX, SAL) [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191002_160626","FILEPATH":"./src/images/vstbestprices/Steinberg – SpectraLayers Pro v6.0.10 (VST3, AAX, SAL) [WiN x64].jpeg"},"./src/images/vstbestprices//Soundspot – Mercury Bundle 2019.05.30 (VST, VST3, AU) [OSX].png":{"TIMESTAMP_UPLOADED":"20191026_083317","FILEPATH":"./src/images/vstbestprices//Soundspot – Mercury Bundle 2019.05.30 (VST, VST3, AU) [OSX].png"},"./src/images/vstbestprices/Ample Sound – Ample Bass P III v3.00 (VSTi, VSTi3, AAX) [WiN x64].jpeg":{"FILEPATH":"./src/images/vstbestprices/Ample Sound – Ample Bass P III v3.00 (VSTi, VSTi3, AAX) [WiN x64].jpeg","TIMESTAMP_UPLOADED":"20191118_083317"},"./src/images/vstbestprices//iZotope – Neutron Advanced 3.00 – NO INSTALL, SymLink Installer (VST, VST3, AAX) [WiN x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//iZotope – Neutron Advanced 3.00 – NO INSTALL, SymLink Installer (VST, VST3, AAX) [WiN x64].jpeg","TIMESTAMP_UPLOADED":"20191003_163329"},"./src/images/vstbestprices//Wavesfactory – Mercury FX 1.0.0 (VST, AU) [WIN.OSX x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191020_083315","FILEPATH":"./src/images/vstbestprices//Wavesfactory – Mercury FX 1.0.0 (VST, AU) [WIN.OSX x86 x64].jpeg"},"./src/images/vstbestprices/Voxengo – Powershaper 1.1 (VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191117_083316","FILEPATH":"./src/images/vstbestprices/Voxengo – Powershaper 1.1 (VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg"},"./src/images/vstbestprices/AIR Music Tech – Grand 1.2.7 – REPACK (VSTi) [WiN x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices/AIR Music Tech – Grand 1.2.7 – REPACK (VSTi) [WiN x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191002_160000"},"./src/images/vstbestprices/ToneBoosters – All Plugin Bundle 1.3.0 (VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191120_163316","FILEPATH":"./src/images/vstbestprices/ToneBoosters – All Plugin Bundle 1.3.0 (VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg"},"./src/images/vstbestprices//Inertia Sound Systems – Instinct – NO INSTALL, SymLink Installer (VST) [WiN x64].png":{"TIMESTAMP_UPLOADED":"20191008_083319","FILEPATH":"./src/images/vstbestprices//Inertia Sound Systems – Instinct – NO INSTALL, SymLink Installer (VST) [WiN x64].png"},"./src/images/vstbestprices//MeldaProduction – MAudioPlugins 13.03 (VST, VST3, AAX) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191019_083316","FILEPATH":"./src/images/vstbestprices//MeldaProduction – MAudioPlugins 13.03 (VST, VST3, AAX) [WiN x86 x64].jpeg"},"./src/images/vstbestprices//Output – Portal v1.0.1 (VST, VST3, AU) [WiN x86 x64].png":{"FILEPATH":"./src/images/vstbestprices//Output – Portal v1.0.1 (VST, VST3, AU) [WiN x86 x64].png","TIMESTAMP_UPLOADED":"20191014_003318"},"./src/images/vstbestprices//NoiseAsh – Need 31102 Console EQ v1.0 – R2R (VST, AAX, AU) [WiN.OSX x86 x64].png":{"FILEPATH":"./src/images/vstbestprices//NoiseAsh – Need 31102 Console EQ v1.0 – R2R (VST, AAX, AU) [WiN.OSX x86 x64].png","TIMESTAMP_UPLOADED":"20191022_163326"},"./src/images/vstbestprices//Ample Sound – Ample Guitar M III 3.01 (VSTi, VSTi3, AAX, AUi) [OSX x64].png":{"FILEPATH":"./src/images/vstbestprices//Ample Sound – Ample Guitar M III 3.01 (VSTi, VSTi3, AAX, AUi) [OSX x64].png","TIMESTAMP_UPLOADED":"20191027_003318"},"./src/images/vstbestprices//AIR Music Tech – Velvet 2.0.7 – REPACK (VSTi) [WiN x86 x64].png":{"TIMESTAMP_UPLOADED":"20191009_003317","FILEPATH":"./src/images/vstbestprices//AIR Music Tech – Velvet 2.0.7 – REPACK (VSTi) [WiN x86 x64].png"},"./src/images/vstbestprices//Propellerhead – Reason Limited v1.5.3 [OSX x64].png":{"TIMESTAMP_UPLOADED":"20191009_163319","FILEPATH":"./src/images/vstbestprices//Propellerhead – Reason Limited v1.5.3 [OSX x64].png"},"./src/images/vstbestprices/Cockos – REAPER v5.979 + Rus + Portable + Plugins [Win x86 x64].png":{"FILEPATH":"./src/images/vstbestprices/Cockos – REAPER v5.979 + Rus + Portable + Plugins [Win x86 x64].png","TIMESTAMP_UPLOADED":"20191117_163320"},"./src/images/vstbestprices/Guda Audio – EnvelopR 1.4 (VST, AU) [WIN.OSX x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices/Guda Audio – EnvelopR 1.4 (VST, AU) [WIN.OSX x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191118_003316"},"./src/images/vstbestprices//Steinberg – Groove Agent 5.0.10.99 (STANDALONE, VSTi3, AAX) [WiN x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//Steinberg – Groove Agent 5.0.10.99 (STANDALONE, VSTi3, AAX) [WiN x64].jpeg","TIMESTAMP_UPLOADED":"20191004_083329"},"./src/images/vstbestprices/Voxengo – bundle 6.2019 rev – 2 (VST, VST3, AAX) [WiN x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices/Voxengo – bundle 6.2019 rev – 2 (VST, VST3, AAX) [WiN x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191120_003313"},"./src/images/vstbestprices/Positive Grid – BIAS AMP 2 Elite Complete 2.2.8.1409 (STANDALONE, VST, RTAS, AAX) [WiN x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices/Positive Grid – BIAS AMP 2 Elite Complete 2.2.8.1409 (STANDALONE, VST, RTAS, AAX) [WiN x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191030_221015"},"./src/images/vstbestprices//u-he – Diva v1.4.3.8791 (VSTi, VST3, AAX) [WiN x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//u-he – Diva v1.4.3.8791 (VSTi, VST3, AAX) [WiN x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191007_003319"},"./src/images/vstbestprices//Sonible – smartComp v1.0.0 (VST, VST3, AAX) [WiN x86 x64].png":{"TIMESTAMP_UPLOADED":"20191030_163327","FILEPATH":"./src/images/vstbestprices//Sonible – smartComp v1.0.0 (VST, VST3, AAX) [WiN x86 x64].png"},"./src/images/vstbestprices//Ableton – Live Suite v10.1 – R2R [WiN.OSX x64].png":{"FILEPATH":"./src/images/vstbestprices//Ableton – Live Suite v10.1 – R2R [WiN.OSX x64].png","TIMESTAMP_UPLOADED":"20191018_163321"},"./src/images/vstbestprices//UJAM – Drums 2 Bundle – NO INSTALL, SymLink Installer (VSTi, AAX) [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191004_003325","FILEPATH":"./src/images/vstbestprices//UJAM – Drums 2 Bundle – NO INSTALL, SymLink Installer (VSTi, AAX) [WiN x64].jpeg"},"./src/images/vstbestprices//PreSonus – Studio One 4 Professional 4.5.1 -R2R [WIN.OSX x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//PreSonus – Studio One 4 Professional 4.5.1 -R2R [WIN.OSX x64].jpeg","TIMESTAMP_UPLOADED":"20191023_003317"},"./src/images/vstbestprices//Vengeance Producer Suite – Avenger v1.4.10 + Factory content (VSTi, VSTi3, AAX) [WiN x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//Vengeance Producer Suite – Avenger v1.4.10 + Factory content (VSTi, VSTi3, AAX) [WiN x64].jpeg","TIMESTAMP_UPLOADED":"20191012_083317"},"./src/images/vstbestprices//zplane – Elastique & PPM Bundle 6.2019 (SAL, RTAS, VST, VST3, AAX) [WiN x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191024_003317","FILEPATH":"./src/images/vstbestprices//zplane – Elastique & PPM Bundle 6.2019 (SAL, RTAS, VST, VST3, AAX) [WiN x86 x64].jpeg"},"./src/images/vstbestprices//VAST Dynamics – Vaporizer2 v2.4.1 – NO INSTALL, SymLink Installer (VSTi, VSTi3, STANDALONE) [WiN x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//VAST Dynamics – Vaporizer2 v2.4.1 – NO INSTALL, SymLink Installer (VSTi, VSTi3, STANDALONE) [WiN x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191006_083317"},"./src/images/vstbestprices//Ample Sound – Ample Ethno Ukulele III v3.00 (VSTi, VSTi3, AAX) [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191016_163323","FILEPATH":"./src/images/vstbestprices//Ample Sound – Ample Ethno Ukulele III v3.00 (VSTi, VSTi3, AAX) [WiN x64].jpeg"},"./src/images/vstbestprices//Tracktion Software Collective v1.2.1 (AU, VST) [OSX x64].png":{"TIMESTAMP_UPLOADED":"20191013_003317","FILEPATH":"./src/images/vstbestprices//Tracktion Software Collective v1.2.1 (AU, VST) [OSX x64].png"},"./src/images/vstbestprices//AIR Music Tech – Xpand 2.2.7 – REPACK (VSTi) [WiN x86 x64].png":{"FILEPATH":"./src/images/vstbestprices//AIR Music Tech – Xpand 2.2.7 – REPACK (VSTi) [WiN x86 x64].png","TIMESTAMP_UPLOADED":"20191010_083329"},"./src/images/vstbestprices//Kuassa – Amplification Bundle 2019.7 (STANDALONE, VST, VST3, AAX) [WiN x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//Kuassa – Amplification Bundle 2019.7 (STANDALONE, VST, VST3, AAX) [WiN x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191029_163324"},"./src/images/vstbestprices/Image-Line – FL Studio Producer Edition + Signature Bundle v20.5.0.1142 [WiN x86 x64].png":{"FILEPATH":"./src/images/vstbestprices/Image-Line – FL Studio Producer Edition + Signature Bundle v20.5.0.1142 [WiN x86 x64].png","TIMESTAMP_UPLOADED":"20191119_163319"},"./src/images/vstbestprices//iZotope – Neutron 3 Advanced v3.00 PROPER – R2R (VST, VST3, AAX) [WiN х86 x64].png":{"TIMESTAMP_UPLOADED":"20191027_163320","FILEPATH":"./src/images/vstbestprices//iZotope – Neutron 3 Advanced v3.00 PROPER – R2R (VST, VST3, AAX) [WiN х86 x64].png"},"./src/images/vstbestprices//SonicLAB – Cosmos Saturn7 (STANDALONE, VSTi3) [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191002_210735","FILEPATH":"./src/images/vstbestprices//SonicLAB – Cosmos Saturn7 (STANDALONE, VSTi3) [WiN x64].jpeg"},"./src/images/vstbestprices/Overloud – Gem OTD-2 1.0.0 (STANDALONE, VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices/Overloud – Gem OTD-2 1.0.0 (STANDALONE, VST, VST3, AAX, AU) [WIN.OSX x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191115_083308"},"./src/images/vstbestprices//Gramotech – Pompeii v19.5.0 (VST3) [WiN x64].png":{"TIMESTAMP_UPLOADED":"20191015_083302","FILEPATH":"./src/images/vstbestprices//Gramotech – Pompeii v19.5.0 (VST3) [WiN x64].png"},"./src/images/vstbestprices//Tracktion Software Master Mix 1.2.0 (AU, VST, VST3) [OSX x64].png":{"FILEPATH":"./src/images/vstbestprices//Tracktion Software Master Mix 1.2.0 (AU, VST, VST3) [OSX x64].png","TIMESTAMP_UPLOADED":"20191011_083358"},"./src/images/vstbestprices//Sonic Academy – KICK 2 v1.1.1 -R2R (VSTi, AAX, AU) [WiN x86 x64].png":{"TIMESTAMP_UPLOADED":"20191017_163320","FILEPATH":"./src/images/vstbestprices//Sonic Academy – KICK 2 v1.1.1 -R2R (VSTi, AAX, AU) [WiN x86 x64].png"},"./src/images/vstbestprices//uJAM – Virtual Drummer SOLID 2.0.0.2504 (VSTi, AAX) [WiN x64].jpeg":{"TIMESTAMP_UPLOADED":"20191029_083314","FILEPATH":"./src/images/vstbestprices//uJAM – Virtual Drummer SOLID 2.0.0.2504 (VSTi, AAX) [WiN x64].jpeg"},"./src/images/vstbestprices/Inertia Sound Systems – Instinct v1.0.0 (VST) [WiN x64].png":{"FILEPATH":"./src/images/vstbestprices/Inertia Sound Systems – Instinct v1.0.0 (VST) [WiN x64].png","TIMESTAMP_UPLOADED":"20191121_003313"},"./src/images/vstbestprices//Overloud – TH-U Complete v1.0.13 – R2R (EXE, VST, VST3, AU, AAX) [WIN.OSX x86 x64].jpeg":{"TIMESTAMP_UPLOADED":"20191028_003319","FILEPATH":"./src/images/vstbestprices//Overloud – TH-U Complete v1.0.13 – R2R (EXE, VST, VST3, AU, AAX) [WIN.OSX x86 x64].jpeg"},"./src/images/vstbestprices/AIR Music Tech – DB-33 1.2.7 – REPACK (VSTi) [WiN x86 x64].png":{"TIMESTAMP_UPLOADED":"20191002_155730","FILEPATH":"./src/images/vstbestprices/AIR Music Tech – DB-33 1.2.7 – REPACK (VSTi) [WiN x86 x64].png"},"./src/images/vstbestprices//Z3 Audiolabs – Repeat X 1.1 – NO INSTALL, SymLink Installer (VST) [WiN x86].png":{"FILEPATH":"./src/images/vstbestprices//Z3 Audiolabs – Repeat X 1.1 – NO INSTALL, SymLink Installer (VST) [WiN x86].png","TIMESTAMP_UPLOADED":"20191010_003317"},"./src/images/vstbestprices/Tritik – Echorus 1.0.4 (VST, AAX, AU) [WIN.OSX x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices/Tritik – Echorus 1.0.4 (VST, AAX, AU) [WIN.OSX x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191117_003317"},"./src/images/vstbestprices/Tracktion Software Waveform v9.3.4 [OSX x64].png":{"FILEPATH":"./src/images/vstbestprices/Tracktion Software Waveform v9.3.4 [OSX x64].png","TIMESTAMP_UPLOADED":"20191002_160823"},"./src/images/vstbestprices//Tracktion Software Waveform 10.2.1 [OSX x64].png":{"TIMESTAMP_UPLOADED":"20191011_003436","FILEPATH":"./src/images/vstbestprices//Tracktion Software Waveform 10.2.1 [OSX x64].png"},"./src/images/vstbestprices/Native Instruments – Reaktor 6.3.1 (STANDALONE, VSTi, AU) [OSX x64].png":{"FILEPATH":"./src/images/vstbestprices/Native Instruments – Reaktor 6.3.1 (STANDALONE, VSTi, AU) [OSX x64].png","TIMESTAMP_UPLOADED":"20191114_123330"},"./src/images/vstbestprices//VAST Dynamics – Vaporizer2 v2.4.1 (VSTi, VSTi3, AUi) [WIN.OSX x86 x64].jpeg":{"FILEPATH":"./src/images/vstbestprices//VAST Dynamics – Vaporizer2 v2.4.1 (VSTi, VSTi3, AUi) [WIN.OSX x86 x64].jpeg","TIMESTAMP_UPLOADED":"20191021_083318"},"./src/images/vstbestprices//United Plugins – Bundle – NO INSTALL, SymLink Installer (VST, VST3, AAX) [WiN x64].png":{"TIMESTAMP_UPLOADED":"20191011_163320","FILEPATH":"./src/images/vstbestprices//United Plugins – Bundle – NO INSTALL, SymLink Installer (VST, VST3, AAX) [WiN x64].png"}} \ No newline at end of file diff --git a/instafeed/src/images/dreamyourmansion/7VPFyhB_j8Y.jpg b/instafeed/src/images/dreamyourmansion/7VPFyhB_j8Y.jpg new file mode 100755 index 0000000000000000000000000000000000000000..0bc8a7734688f72e3449330db87f564ac3e55001 GIT binary patch literal 271284 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�-Ia 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

ETbX)X(0iV*c}|2h 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 RLJs!#_bG|+W~0El|Jf(&fp!1@ literal 0 HcmV?d00001 diff --git a/instafeed/src/images/dreamyourmansion/RKdLlTyjm5g.jpg b/instafeed/src/images/dreamyourmansion/RKdLlTyjm5g.jpg new file mode 100755 index 0000000000000000000000000000000000000000..9c2832d1abf76a501784731fc240259d02d744c8 GIT binary patch literal 142895 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 literal 0 HcmV?d00001 diff --git a/instafeed/src/images/dreamyourmansion/UV81E0oXXWQ.jpg b/instafeed/src/images/dreamyourmansion/UV81E0oXXWQ.jpg new file mode 100755 index 0000000000000000000000000000000000000000..446e0a0dc073ddc3c5897406b6acebd9a876314e GIT binary patch literal 267946 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

yKP@*!Bsn-ymk|PleEOT zzfHhaCbzckbdlm?wLdILbR<5%)1H2E9M@jIB#qN+^rgBoMlH!>Ih$OMosb&`W8V5# z&F2zZ18{3^Tz8i_%lXAw(*A^c#s``rkkjtms&issLL`DsSw%A098}w>w7*GEw>sRf z!myPZy%w!guzG37{JYh)`G-8Nd)0csR;V&U5R*1J%7)giQ$0EE>qfReP|T&SbrfSd zR%|W%vIz>^ty7eAX7|)Q*+u3(cXRZIaM+yLwk=`Qi+6FF^N=hx7+q_k^_}x$PEfaH z%iAvzeeG+S7s;BAqw8OC0P_V+g!{GBFoB9f6*N$4%T)AF80EJ`XeAo_@*`N{7TVrlV7_%p=H7kv=YwRu4fJEq zuSo%}vGb2n^N(KpQ-_pIlJf4BSmzum3Q{7IcGdlz#(QqnL5R>BTeNvog<>o9YHd=Z zPuh<8SABK-u9Vevdg0&g?S-#h%yh?|``<|GPg9lV4zu5V5v!s@cUqd%HC=V77*V3O z8%}K1P2JhHX3>*IA5-}a0p9(!ce+8kO+^vr9VH{dU8%L@4MEa6cXL28+CIo_W0k!} zg)~1GZm*!Cu{TuX}%B>XU19)CP z;J#?ve?x?f*V{tFF6mPoR0N7rku=ju1`fF|YMGsy-&Ee*p~A2=s?|cbNV#`Zcb{Dq zwD$L&Jg@GZ6Q5(O6wPn4c@uWh_Bk7B5_DnDQkXN|(7h z6c{AV8V2CyZwn}tzNA@i+7p9DBfoCgPHE% zM>w^h>$ybPh0zeF~rug%_c>UWNo^b4o8KAPuEMb%!1$d?*YHIzGaU|iV_#fv5|we54N zHIydX?x-iOS9Z@y^K|zeb4s3%?F|>kDH_eWYZUi>q56WbCexmL(9~MX>0Wi!)D=*3 z1aLr!CQ=jK`if)f4H6?r+#b34{Pg2#H8g zO)?=J!;&2+<;&ffW#pa>qQO^bI>xPg^=gO18gttj-x4dGxwZB>j5JpWY%L$Il-e^r zZM1>J-ND@zWuHmdyLMb~LcOhFHPPMEG~TY)-CesVG1{|W>=|e`58OMh^UjyI&G{(| zzoweQkqDKWyt!H!magCR$zV;MgYz$&o8r4avAp@pS`*t-c{!&2ozq<9p!BTGn!d#_vj zgW8JXO>`#_@GqpEp#!~vh?qok1QRM`B59;Tr;JfDs=9r6<=$Mf*q*ZIzI?g&6c--z zf2c7YU1%-Wv9}MNPcPS*i$2P<%kjTf5Ylq9;q9Bbg`fZp8po__6ZWSvk-9sV zZXFKtfNIjufqLgLQtWW1^CAd$6)1(icQhuLuTZ!D0MHB7fQ+iB87Ial)XZgUQ27RrEWt}vUIoRhoD$nf`KF7{4F zZfvQ7&h5RSGgdYbH7_jnrp%2hs5c5HFH-k;pv#giBQ?h;-P_ireA=(Mu;JMDEy_nl z-ZYoHy*PCMj5(jj-CymuW|_{y%p3xgr2r}}H&hPqoJ zB}+Rhc&_%ca^|{`xE6WhoKf26eD-$2R(YMC0%&g=w9sX{3B$zLN39{EMSo0pe-@_I_cW003tJczVv#z!NljTg?ru%?GS?NMn;)$pu! zR=(@rh*B$+8`hthv#4Hhpj`GBHTm@Gc4_wKI-c0G4TgzZ0$Gg zqmWTufJ91B49vneA|wn%sir|xposy$i`@I~+KI-tZC&!)nLQh~*DBDYZjxw5$F4#y z$*Jb0l-M1nMH)63Bv$J=;x^zewUtJnt)UZdM$sJ|)mloCReC{LmaFF*4&~R{7f5J_ z7CQQd?O#Y9I9X3GH_x#EMl`|s^n26WtJGzZI=5n?VLlXq1VuE61x+#$GPp>If^9r= z<)5I3E}2H6%f~M{ed+3gCFVCsuV1XhPz0jT8#inz62I4dngwKrMUPp}6}J;nJB2Ei zy@Eg*!E=7fzmf%b*KccltpRPN>)9>E%bd_mJcqY;Cke#rA2R#f*fS#;s7>?zJ<awwh;(=w9R1eBVMJTH0_&T zJ=*(%;Sb@XVz1dAk)EBSwVrX0YKw|5n=q*)MAJ;fO*8=&QBx8pf?7-H=~pfqMzQiI%wKpq z&ORQx7l+xW>jBZJa)kc?j!<5gdW3V8QFucb zPlr&2#PK2!2!d%5HH4=sDEU3XA4sa0=tZ;gJIzmXI`n|hrU)MzIK$jtngcm*nl03j zZLR!$-Ny7QY?K)$9T~8Z;_fKCdO)sBpA<#crCHd{Iud&EJ;lh0m2L9`M( zUXx*%+ub*I^K;g}N{)uQ<#-+drTQD`!lnf=;zq$S0Ll>Qff6D`K{U<_EI}y}^TU%n z-*)VgJYx?geBbuBu^Xt72qoqJ00q8-?Uz<-v|SWgJ$0(QBi#GAeILINtq9wqc1wFK~FK^ZFFA|bImM3As>TI0!fsl!GOVBGnBscd`H+`sCtr(%UWgs6Oh ztUZ12HAfGN0kCj^h7kfc1cf4#0L~O9Vkr5w=7+P~U9x&#en_$MYt7$idp)~k5<7); zM}eNuU$$#ZC}EhfajX0^p>{Re!RXDnphm1ZD`#qL**pd*0R8VZ1`lG{b zb0gVvS6@S{qaF#R(ba!E>s!Cjb-B8c5dzr8k)iS3-(&TBM!3(Gxgt6NvliBu66D#dc8>icWTym}!S6R&hFmP)Iv zFa2+-IX9HiSuaz3%cwc@Z+2`GXdXAF>LX9%~<`*=nS-bbGSzvHbv}xIH*Ta`Pd}%WRFGk_Q1S+`|31})n2ps4NqUy zE%8{<{I5e-WP8QAf-jr78%Al4#3ci70{L&6xS4aHqj9FH>3Oqqq+2NvTI&DE3-Au@b~8A z5j?@k+k!Q8GACS<0ss6u@R&1h9#;Xp3cXRf0(QhvYxhOxe;{3+FG6Ud;MB z(uu=da@KElbKZjbAMqE~*=^Yu5Q}uvM?-jlQqNR9Dpls8^F5bUc0(nZu13Wn3i3}| zYu;vkW%Tg0Nf!0*1n7u2=}wjD{{R+gj(t1c96!p;r=fa}->K3?bEgk-RDWgr44_~M znVDB^ls*(hQEVWJKtN=QQH9B(qTi8xL;66ool_q?;_>I$Z%I;SjW31xX};2|dI_Q1 z_g2w&TXi1M2AV6wiop7%=^UxIe-in&->|xk2V_B%b5vGdMUNKOCU;)M>C0UipPPPY zB*I(hS48OVG%GH>WV(44*%tl(0B`m+P>bhpIC;7M0Ht1!C;@_Wow`uP!vF$!L`s`< zPmPgp6oRVApx>E%&As~1Zz+LqIQ)h6pVC7pn^^sI!@N5W(p%S?{Y0DDa0)SG)gFKF z&ICPG^j^xfuWNaC#prg%@_Zjp;#(p>9cvh)v6bMjp=vUMNNHEbjO5cR;^)#1e@ ze{1+}l~6v>^?QlEv9=N;nmoqQT|w>>lVAak`9Uz@1Qf!82%ws203zKexb&8>BG;Te z6!l8S*c(8G4>bIv^XtZ*=X!0dA3zp+6sOHC5Z;`5(~Gh6JGS}1 z)x{Hrow)eIw9Jz-x1CiFXfHB3i%94m<3*{twHGO|jX%SnepC&XX#j@1IHe06SnpS>#1Rxw6-JAt!a|O|7&gF`Xu-9nF3@krqC^ z_j`Adwa)@5l2A@2H>a=;>bzC$0`2KOW9lzb`UXtc1BX1hfS_1uasZ=Su{Jn7{?SuZJ8A6Dci;luv<#MChUjBmxNoZGEdXKCW^#>aO6| zeVu=%U2V00A-U5{deiD#$Za#Hv#M@hChPv^;6GC|pPWATP&Xx4%C1JM?S5>nIq#jn zMWM$+Ui({g^?ZjX`Ej~Bv#zfRp&ZGxSu|=897*Kz1!LBrq_0=_Oyf9Lqc+fmxs=@+A0vSYwhl&-<#Qn ztK09yNQ*X1+PetKH_!IIDL2ozb=p@+S&vTh-^&JtmG=JtX=#dvx#NGK38-!l zv18$L4KEzCgW{M#CKEBXHA11PHG=}VD>&0~dltpFJn3#r^#@`!V?Ds0K-$UZhgPCx zX+6qjyi@0<^x8gj?4Hl=8BTWQGifh6;Dd8@tcr>#;x~M6&Xu;~)eVWH*}DdDvgGqG z%4H3n)by$vPNUWqoqgaXKdTlK$0Ic1&mu-uTf|CshdXy(`9?-ZgM2jT^qzDVd`YdYI#+)+=Fc>_ccP&A zi`AZy+;xvV+321RN)qMOyKZ7Zlb4F`UD?p2mr+1T6jN-%4zT0rHnx204`uL>oS7-t zd=chyDNg+X?KtLgG>$R!@hv&$9cR^j#HMCp9?Y_S&kPtOF;sxndWMchc-9{z9ZO0* zN;94L<+H~f4A*}0Pj>XYmjHNc+`Xmd{#<<+*qXy+bdI9s-gM(`u%7e#)h)%?i11F3 z*8CpTXIn$2cLV1v-m!1d{Ry+zc&H+RV2fx9f0dqni?{yn?o1Nb`A!4P+U_Ii7o^L( zRlA-t^d$~s^YX#$1i|w&2r5|`fRMqN7q2x<0fcE9GL9Cr@)Am>HV6FM%I@-Ug?}ciJF=dAl)O8I4*tgCM+Izx35u2n2aj^PxDeJ-M#OgJEA;CjQtgi;r>kBex#_N zUf>3_8R zo3H%((@;HU*q1=9a*mhN+W`8H)Q*eZmA^1`FAqdy^u7A?(esXJ8fLkA@BPcVWFLce zdtT2j`qEdgCTW{nd$AjzAg4LwQ5|!=Dz`B z%Pr`Stx}QE3|qJH&q6helJ>KsB^We8M%+{BZld$DiRrgQ9B>B;Hi-JBvZl3V3kOz= zK@<^MSrrS86xYkk8*vP0C=A z7q$!K$%e3hz#2OnI+5(=JZmE_>F-3S)V@x0p84U+zVO_<-LZI+Yg;&r+H03s#rc=z zz8`&UxUO8cxtxhrT-+U5v21&~!#LI<6g(Q!j2`T7eBH%Br+u2^j~!_VX%1HC z{sf@+=TeDCTq&PiG&CNxuC`4KK$ObM%RH5#XN;H?L(ko=Z7WP3xqRWzA@b~__R&dZ zdNIe=FIZ7Y&Uls4y-8j2>r8G5Dy$95OxArz+`IeFUm*c*=U-IDX?qm3#o5gIjJm^O z$nE(Haupv0=?FO7KI6=z4`JJmJkIhNl#<@Tbje$!g*QVw=-q+lmu2zdKBMhC0uun% zeCOh7)Ecl>7PSL0H(`3^yEGadORdUYvl9;?F74u$D_=PB7R2YMSmh;R>(1zVx+x3`+Bp6pI`KHX;2FTE!E(R-ei^Eb|% zBkx%H=1yy6%dn&T-q6b{*?yG;pioVR)vGskg!py9(G3oyBPS%~P@xO7ZWc@DmV9_omi8;Hw=s}vhNt<-t4zD}1K3wl zTy;Hba&oh-=x;vyo4+o?vLQqg2zp^y42ncDir=L3IY<&(##a}5)jxZh25hQzV(=8W~u$K*Lz^nPNz z=S zPNQv=<^(tM{!g@h7jA_Li*z&(&&(SOC!`*(61u>UoU?G)P6$-IxY`oFsM`RD;frOm z=%@%Pf=7#qfks+xz|s+hFmD{yfNAkah5vWi4LFpVWOdXRj zhUJS+$Z$SvTY9&+fD=pxO7X9Ct4%~^@^9V7!o;MpqGH~Zp6Z{RiH1{s!_6FIYY)0LDk8ODCa%yL zw(BbeQN)`z2G=i4eJxnaNhu%TS2;IVX?wLf5=plxCW~lZShDQ*K5f}O5$JF#WDvN? z>1Zh3OK6#I6$M^yvs_8Fio+%`Q78hLi%LGSSfyURGz1LGwV!93+`tJkY)Q`fb;X?x z-TqI(dWF!(P2!~Svx=W;tNqiJ+TVS;){R)#s5%wi-i75Iu~n+ZAle>FvbzIDcGpj! z#LIE7k5LFsdWGMJwOBNsJWI88y@avyN^=BY;kE9Na#mN!z- zU+bARv?n{`Y;=yxcVN_YFG%dMzIAzwf_Gn2dkuz6tTF8cHvruzPH5ooKs);gM9fRO zol#qY)o?8Z-Eqy)yCb3PvJ+hqCavR? z@7?!Z@E)2;jr;AhW-g|qPzv*xrZ_fA7so$TI@}W>K}~@frBJHtq|g|P9O{n-9R{o; zTb!h_ZDLp49!`M{m5J!8?q(VAyht_Al|<-`H&!~h%t009L70RaF200000000000ssL61O)~M2>;pu2mt~R0002DZBbyY z88S$n*pWI(JCYVgD9O?xQ$&UI^AbrDDWxJ#Z3K0-v%)Zftf@P(q)8HVktD)L6ojOV zj8xD%ZCtiuNet5wIXks`7ieJULeWr}IXgSMq-i@kc0novG-8ZZm=ivpVif2moyifp zXl-ZCq$7X?ujIl2_uoo7%2hl)g;=PjGY9tyOB8)1a`XqQ=L)(=T4my zr($&J$tOu9#*K^=vAwE^+fy-_#%W32$bqZ?Sn2u9+_}VP8@hKSi94rGot@J;BMAjb z8n;m;tCW)+f<)x-gw|ne8#FVqq!FTS>CvR_NjtJ+Y)p-aObS@lx`{1Jv_mb{-gwo@X*Ql{oamj*YYm2)#d&0!I*{d<)@OHg zPU#UOl1bCLHgPah!dGb|w6h+|yP|5ZI%%v{oZ-1jJY?|2B2JwVByN&PJETM;CJMw4 zdXqBJ&a{)73bPe^YH47&thFY<2WrOdi6lggI!PyYbV5TUYRz)HOj)%myQD!{#8?;h zhI#AgM}6^a(Z(04D<^kJ8>3Fi)1oGJA(Ay}v0b8t_GqM(QO`%4q1S7x62Yxgr(A}P z9zm*eGDPVoG?Tg{of8rvk~MC#UZ9n`^ioiS*i~a4&2?m<+@;VLJ#UrFnX5?2$t220 zO2`6qoPg0Z(5qEd`VDdJQ%P2zno{QAce@8|;M&aSGH%1qVA&eeGDMP0WQx)z2$>TQ z$}>W(Raa)LZ$YUnTJ^;Ge&Bnp!xM3bSB)YByC)ly>#MtbVy zLAnwyQ)^ZZcgbXWYS2hCXRQKI~Cg13wNu(p2OU2HDwv` zI6bb0nG@e}joQAnFU$m0Y0PpFyOK#eoQ6?Gg0;CNip6%Fj@?z^_O`pNRKYJJTe6(N z?$~&A8!Ep1b#ZD$GzrLvoSiy!JDQ5j*F=R61o*yZ7b1K*ku*Ecvf;NOO{4X zo!!wQ7G#{9nqZo)lq%&$$k$0aG@%=ZR4fx{=+~{RBOSUFX2hpHSsSNG-O?gSGqXrC z#%F%J*{>g;_r{6RN;?omJfIWkX;-PN5slik!yc6RL~flTPLgtTkt2#qno?MSS*eHQ z-AAO%l1V`wiDA!I?q1ZZQ(_p##flhk(wii#%@_hEB%IQ8&Zdr9+G={?1%Djl`hQjG zQzA*&Am&G)*&DjmYHPv)YVKYPbfw2TcT+TA0x3vo*jY{!Rn=+pvhQ=gUCs4=i`%4` z29-={uuH1D1>I_uHYV98gGeFBp-u75<;0Rvq)^6gk_VnERW+KfcwMu_SckPVDIwFX%5P?e zPyu6Nr9HZgHkBobSaHtP*G|cRinuen1ok7hPgttv^SWIVfyhk4lWJDTzXsL7$)9GW zO{!^4LY=JYp^A1byQg&;D1}*?D8MI<%}s}?o9E~0vILSOm=kK(&D66rb)lDPok0y~ zJ~PH^dncgBDZ3=X+OTJDRWvb{%`E#CF4lM+ z=RFJPr5;sUVuC8%YND#T&ib}fiW%3?ZAE|mM5xPl}Xti^K2bSTd0S==nPtWw2d3@$G z9g7wxnrW94*htDksT7i3j(WP;Jg-YaPK4`7?vsjXp@gTfM5x~$)NS*PR`EC8Ra4=BuXfw=%`vM`&>^=fK+fF zH=|CHO~-mB9eAS^8NAs&4qpENh4S8!>hj+JbnKE&MJT0 zsLRXu`RyT-LgzGBJj%^zyUXQl0WuRKa!zQ8m|1{2Jp7FdkPcBzB1t9%6nz#~IjXPLkk30EOFf~?gG-g^qutDNbc9s?E5dyr zzgAFxHl^rWCgPK#PLU!JNCG~GHxeCNs=TF33}n4{GPAXCIz^+H#W~Fk5pv!S%>4)I z&sn7}D&sv{wvbsSBT*Y17Eq3$f|tu*j>}P2)Pe&#?5Y z6{kA92bTI@r`?4+B1k+A3I1h%b5lNM#2$n4mQ z&3D77dOxMg!0DaSu!y=c+zlQ=?XkUJSV5VX5@g0s=|xTj#&vh)%HB*s~SuQGkE|j9?K(6Er%SXAXS|nOw&?*=Xv)cxAVjr8rUJynlDo zyJV7cK;%T9K<#4<$ZuPYIO72TiWuUGB$chBubZ71=416*7bxvkg8p2SR>_wi#5Fsg zN}VMm3L+<3DN+lNUbz?qQM7Tz3?K|ICXL3=%&Lcz;O4ixe{9wm>@ZJrQ#Zo{t@TYO zPU4f17MPt1+BL6T0FE#aj3SI!oaB}3QlkWC8DZdc+IQg7(;~-{MDp|M_}@LzdXG$r z+0#3%i0#m!p<3a39;yX)UFBL z*=z;=W?R)S=m3B-0Ei1SCI*hRNFxf`Re26Jc_-{T%se-kHzLp6y?A&pF4ydRCeS2_ z)~jFVqtL5=L_`=^7)CJ`hdVa3yHY`yQoi*`$4zs9)zI)u(#=F$6J0B%VG4vmD<&=9{AR+PyCa<+ptW^cqeluHGv-dXENuYPT@S z?cdGvn^(K;mC{9|pB^oWGiSi&$twpSdB1qnJnNedi_|mwUL%O-do4bJs`-}JN2Sh3 z(Q|Ywne}7O*t37AsphObe`aoQ%BPw0QFXmg_B{UpFxY(# zwyiEdk2}=vT=XtRYdSg`)b=b{%dS3a%5HQW#rKlqJQZx#mXv8Em5Lcxxc>B^@{V#Y z@29)b^SlVw>H9ix?8oMOKU2`?bTRcZ2p$xZRgyLi2aKNPuExiA5l4ro1&TnDNn3*q zuyrZ+UO|NqZ|LD2J~x`!>iYgl;Z3K*bXqf6qiWV}RSfI0@$z5R*SC$A%jR0Q?vuq^ zHptHe1PLX2C}?1Ei`9Ii5&KV1qzu`--L9jbD`xhZ_HS;(t4>?qZE?enzT@pqB>w4Z1eSgP0v4Z-AmQuXJyorxXY8t`zM>rvaIIU zEuT!s(a_r1p9)*19AA&yvA@uD`ZelBB$@?Sph*#!Q|CP|mAB*gW7_&QFQ?(*<7MdU zbveAK$GM@#`GpRzcY9EJ2XU#Jn`?p&S_@V??vSs9Akyi}RaZ&gNOJlvBhhf*$FSFB z>&?>hbnEdF--os2I-YJTn>d+UHf_yFAm{RN#Jf`RYF4aueO|oU6^1D6=owb5k)wQx zxqj+uzCDEfkELzh&zF|V#Gh+>%53yR=b1}R-zx?WNzm}L;bOJfc`eDWdUZawzLZc5 zbLh@=;btUn1`dCJRxcjGm#p;L9lms2oh!V~mu=#hH@it7^X#~51wubpi;-cnT)q0Q9tUT$uy z)Z*%VmX!DJ>fY7jgShG``8?Z?=bl|X&dYCd>gYT#fVV$O-E)~+z2&<16IZFKWfL-V zMrX%#P)p=|-JX}xsQOMOC{WP1m(t|o`qA6sI7zoH;c}fe zT`IQ(BcZK224-?b^KxC}S-vmM&D8o%e^Gy#&!--oeJ3|txYWRdo2+|U9PW;Q(B-jw z(5;ts((d?|rtI<_kqw{$&)1y@q>&SrF6@;2Z=C469*(xV*bPw9nZ!~~X*wsy^BkQCXPR5s`8~#w9@iw=lU9C* zBO!TzIRLh{d{?axqR`ars?Eg9=?q9St=g3eNf9K;E_=y3h+?TmON~AkuU-q>(z_*f zxuM0zy!(g|87){{FKf%}b__OmDi}0)yEDp?PR{8FvTR7R@v}m-V{z)UQj=FZH@5Bd zwD39GJud;{iaQg}Z@tX)3|+Z06EpQCF{%QVNNUs_-@2 z**!a3Gm)F8v&{H*HiXjk`W3rt4bb#e@v909yl%2W5_FxNAYf%go;a;V86J1dp5d!d zDB^kOhr0TWeimKr1MviWziu=tKJ3+Nv};3BiP&-iVNHv0beWNOe+4>6PKu2pk%4n~R75jsgS0gdXFWC@1X zocTA>?9!Jx#Bzdu?a*?12jf*N+28BEB9?7)9$!OOBd$uGZnH?xyCjH-GH9ZOinGa4 zjSU~0eb1+PCBMb-yvVO^g4Z9!Shshs^g5jGriDp-&9wVH;B1nzax^HJNa#hGqmBlV zicHBQxnDoQwY_Z}-8x)kEc2YGHnL0u- z!Vd8`3a@gdtH2!p0GxS$(GotM%r&`QGajUONc45L_zpss(!Cd+ zJIL)KWQH&ZqBRJ-BMkK5Ev||WKl#7dy2Y)zR&C!VW)zw*GdEJx7M%(bLt~p2uBh z#=S>N!Fay&*(hvqoQJ=`ozHbql#@DP297X>5wl+o=Ofiz#vKCJJ5$xUegn1Y^-Il1Tw8R^#SCZgg`awt}#olAeAT=oY!Yu~A^Q>fzg_us|5$JhJ*$2X4`z3iJ#iRI@xdmD|+_@}aK zc%BW3{))onJ8>71Lu$D>bgNgRT8#|b9n|pRbJ2R=nfgYhE`4)LC2D zp@0-7`VX$o@yni#<2q9IH+h=c9rdTL!1={ppL9Q-YkH5MO#J-~9hiVB;qn#5R$;6) zslXJf#v$l;^-TF4PAW+Hy1vQPaU9Qa;^bPsfmVjT#4vfEDpcGe%c+m5`dr1w z?#~o!7n{X`AZoF}SZmd-4Orb--t=dFTcYy~tfp^C?>cUBU!HI6+U{kyW?OvUiy3qt z=H3HNgcdzh(Prj%!Bn;wUw`c7@g;|g5&F^(kMLOiSe@NKC<+=`wA}tQaUoY)??n}wU>{FulL;u788vy_T z1pxs70000000000000930RjXC1_%Gz00;pC5C8xG(5E1jmMlR#GbI$6l1!PDo#80~ z#Wo35TS+XPWSNqA0;@%u3T4>E+oa_+(InAKlSMS5l4R;pX~Gf=*alSYGFe)w)Ll-! zSSY50lBTu24CqX{B8xLJWfbhmCP_I1H5ehy1j>!aX3EufWTXnQi!>8Fs@2`t9b!*N zDWZ_lOp=SG6z?IFO$0I^9Z|fQWa}i&G1VJIqZU(*T>hI}xul+$RAQ4dib*ndXLS`Y zxMm_M_7xk+K2EAh$5sk4j9y`wftA*38ic2z257QLK{81sl1ZFO6A4o@nMIOL z?8zo*JPH#kmYRjVmqRA$TWRtQ=E-A#d%Bosf z`V8wcN~1-ZFK|I1AQ77^@*c9(G-Yf_GK(aXS(21eN(v+yYn`cEY8nYXRhY$-O4W6v zQj`G$W7}$bHYxOpUJ6Xi$t2NbB+QbGp)nG@hNW##zMb%|Gr<(~Y~HtnRsex;v@+}U zFD{S@=u%}Al1eU}qRA-A6A^2kG_EQa)Tw7*ibjz1ty3;Y1z8gVM07expKNlt6!A=w zNt3}O&dM@`#9Edboy9`@=rtR$Pblsxr?rJt6QJqp^IG`CS;TYW-g$~l%1m} zOjE3NPU4}bKw8wQ$x17su=lUx^ zxLVrE44}!~JEWQ{nV{k&V}$~>sn)WrbQvL_&t7&3L9R}=MPggRnRIJtY*w;b+YyUJ zl1eO|PbX%I9IKYSoXM(|r>C0fCW2G3R2EBAa?7Yoc!WK=yH@Y5C zdKMoJB$81rfmbf2&U(IPdG2AJ(}r3-1vA#yh(bwC)3ZsU%e zCf`9zTCQe!sO8zcfo$^5w`+WIZFp49QfWK8#=+VwrsyTFYbA+fKz`#k?u62dJqJ*;a-|#ndhlWGibt2>Yb5Z#)Xcf(+9!vl8hPDoz_uxxyvJIni$#|fTU2h zsY6&(+l_h&Go>Dz4d%@mN!qc2a~aF&9i0wq&Zfg>N=~wfao3FP+Z|RrFS_eN%uk-`CVr(mPNlwWO zS?5usgk||d8##T|xai+nQ`4&5&aXV2i?Z)O$hCmik8ZpTzP+B5? zrTT%_+=z8fPExq{8dcTc=amL?cS<*z=Sd}>8(OX`O(~-f4j(I%jz+8T3ddhf0)2TUe-Ih+3U^- z#ob6w2of_&9#?aDZ1R!k09Vw>v>{c|p;fy@m{Rb#M+w1ZTf71DGAbq7AykyeXw)gP zD0aG>HIs%WKDn3NB*~a7xRtFu64)d;uKMh*js`+WI!SWNrzN(WHgG}}QSNg$&S<<& zq3|0UUm`PF`bV%;`EPptNse}Q^$$HC{B&&d^ONk=Y+-&zd3-v&v51W699m)Z@*pv1 zDuYw<@~_ImEpleH8y%jNn3D1Fs^6C7O&|bEYLnR9CN76D{v8Cd;!P9GG~uWFYeDxTYOkG%Jvv6>$y{PZethi5~lUHBzvB3xDLq zT;@q0_TeVq(O$b*>=F8*bmsHI`y&d|5nJX#E#CQJ}#^l%?6hu6O9t*H^T$ z#?dz8({8s~q~Ss4*s(aH1i=5Z`Ixv2Zk&Ih|3rxdCOKtL;#0D(;ZdIROKi?&+B3CA zBxy*Ah4EDNm)(QLdrJZ_Owmd|`X>7FBt9l*ZJMNc20Y&er|y%GxA4_d7Lo@F zY+DigDj4x?RgL5vyG&&8jmH`&Q!f4Jo zPaV$Np>WC`vO)xc=VELJ1Tq7%C$Z!KZ81IXqktKtNz%}xofamkO%Um2*oNeu;H;?=>QVNfrU2ev|Q2k=Jq(&(zJNPJdu&5x_SYWd1 zajs?yzeXi60Xs?wp_>{UGh>PnE;gZoXpF+;*VyxByah1FBnxn#rQ8TcQwuP;g-8(Z zP~cFs)Zr6vZy64eCa5dxk0MTs=ES00C$$G^&)*g8NOLb^aU76ekDB5;OSc2&q)&K! zUk{>pN`_7!kr5q@j1mb4sKa89HkwxIx{yKk!=s-a*}QX}P|I&;anBt{s(jm8j+>nc zzWV4j9T?}dI_cEL|61~*c_z)Pd~#ACm?96;wN@JYJZ6@M&z_-hI2$}WRW$Z1Q7+HB zZoT>Hz$>UKbwSH`yuco{i}V!wb!UX!@l25=NiDb&EZN-LOz-s)j{|cssIsPVGtjwi zEv(9jd0$1`zPGq5>hStlM(MU>wy)AtaIIcPc=mjK*tCc=rln>$?CNZzTn{hpRk zw2ww({khmdfPJ1DihWBW<%9|a6%fMu*!w((T6{CU`*m+c6c5-h%m$^I$ic9eaXgPlI*Jsk*$UOPWro?jI~+AMkn z-?)`q3kRMB^f}W7W+W#(S&DFY*|p{MO?f8TV}q1N3#}|LQ#Ztq%%B0v-l{xT^O?o5aVtqsI zHOCzpQWM)}AAaJi!KkMXeZcpe_R~PwGrJZ&WGs>NsE0#l%Ogz>s1Vc&E=iiVd$vWI z2Y><4`B0mF9Jh3d%9I@8kEtygzO8KEPh;EXwJaqqKKg@_u3U+Alhff=4BfWNi|-(0 zV!dS~bx9#YPXj@6S^PTNVVDbEH?5UG*g-;W{PBt6Z@n{IeFg3*@>F;o<~DqaJjQ=r z1JOpj{8Ii|$mtQyXMWDoUeclYV@VO2hxv~rwi1Uwc|Nd7nQjvBYXx@@$C5&a$gtLgzM2oijM;J-GN66}z>?^<)k_)03hnYP5a9|P6d zxj;f-ol5_vH@ErF%c?V|Kla2lIQ!#Z;<@Y8qPXUtcR|^vjOg5D-ZZHjQXSq6^C(djRNbKN z-1$TpV4e*QFUdAAJWuscd<{8+wi{&|^E&T&x(_1Zz&qsaopMq32_t(jBthTqM*h6sgf+Qs{h+d! z?Gw+FTcc-I!iAnDvpa+QEXOg7VcJ~ffe|{Co5%FmqR`c^quY%VPGz&gHA?q{giR)L z9Hnz!mE2QwI^4ThxIOFYGmlJ<{U!VHzu&FSR>Rb|da zc1JDynwu$$!6p;6-(3$|hj;GXBwc)vqk@zU7Ib z%?(9Yw&Wx)0hR~xV*&A_<(nIGdw92z-!#y>q3$w9f#06~9@+A^yw1$|9Y^7~+GM4A zEOyE-P)T0E*T!VdDV-IDAYn>5wSSHD!i1E(WU!lhd@O-?PftFJW4R^7C0vtUe9@s& z;hW``=4k5^oSrh>Id*(Mlq-&NK%bM?h&ns#x;hoHyFKi=MSL!#-hddIt!wW8aaMu- z<<(GcquguR*Q%Xz6rCpHFRQO#(vEIZGIrxsvt`8utGDP6?yd~lO>V1&e6Zfbv1k75 zBXl!AecK6dSiK008H)kGlY(nLZ&NOjp8{dHad+7s#Bzu0rL603WA~Sgi6`+Ne*KZU zljErP<1_;n5EVA>r25BA`bHAtv;$9uGI<+LaZ|;t>*BtP8o0DrLqCHT<{M*4d-AV7qwv56+Z9Df{k+;Y#_!b#k z*c-LY;hyma->@@CSreN5=715%;0OH0F)A=;Sq#(6%|O1u>1FAsrjgnD(S>*kC4j=# z&`Vq8Pp#VhCLW(1XCitzgVf7Hv{lZheR=IeDheVK6TW-Y%@1_{=Z%54HBjYKco|(8U!?z;7#KE## zTSsi{bn>KHP$M~IsprcVaxSXo#$f5C0>Qa*^ve47^qGV%1qpG(2Qn)ihg)dEJ<|vt z|0Ny<^4r8Z-a$rD*7_;M>iWr219}YPiexZT+RS4zOZI2_=PmRjV!CNQ3f{0Vv13d1 znvJQLMnQ+TBKM$be4KV?mz=t*>A?&&AQ!1y?*KY4tXo$<6fJMkDCnhL+~IHv97y`EiAg=GyEUO+K<$7?VBg#41Th*SIH z>#(qo$oW%XdfuY2+3-R9@b}9;;n0PAA(%~+mg3jiMmYh*;Y`%$1Xm_EOf~Au#8RJb z(EN4#cp&rjnZ^R^*@McHTchmLF%xpe?H*@xfQ&x0o(`Ta8fO*qy{NuL!bCNMzdHc8 zj_dH$@3M4kDZDB2Dt(=<0OsjySRM)&P`yR(!mXk;I(vlIDm-fe1wxlkhcjbJ<=VyW z$%K{%-#<}5T|K3kEmK zNf!&m6L}XH-`yImV{a6TfU*1R=!T{7R3=iv`(DpE4P4jPYAFJRw<$U4-$k8QHmPEt znQas1TU9?Qg?$NJJ5$9y4|bRwSpe;}G&p3nHSK{nY?&Lcqb4J^KO2M%w<7=OgfrWH zS`Wu$6?bha7F8YH-4%b^xD%gYe4x@HYbBbcwCfE!1vPZ;S%?+1mJOYXqyP64mH+(- zoac2c$W+AdoDkQDJw57bfEq9(IzKOu+9ShScnG}SQ`&CajS_wej$6`juYH1Qd$F2_ zXnX{Z-KxJ`-;*Fl&sd@#w5YJ}hTF8&u6vpohqA_orCQ;$Z2zkcu_-_u2JIff67c_% zm>9Uy^Xk26!OP+T}?rYZa6 z@d)Zh@-!i^R6OPYaAX zJ>exzBm4u@<@=N0MKzWy-0CF%Bph!Rd!w7?v1)9lE(PKD#OlN{h_CblLfZ252a=QK zuN}TbE-a^MwMzall5ma0Wg9~)$~)n>V*t;k|I`9Ee1DC-Ce>;_BHyZ#0#Flf6(JFt>@0}fh2Dq*daYtt@<(K|{rv4Jl_i7ib zRqw9>R+x86F(GGer3@d9*!x}$+tePdb57oPa=Hw&zCY`Vzul>krUbMHCfelY-{x$Z z)vc(5siDL!efM4b*uAoLNd=LqxgRZ*n0f}(rMtbfgyW)t29(=1;}XTA$%RpcL z5?I2<3_IOGPdYFC2Tz8;I7%EFt~M}a3D(pR`w*ZHhC0fDHMco#mAxBu3dW&2!T2vYM!b0WH4R?gyE!i(vGizJ0!zq{JiSQ4DjoTFt_|4^B z!bfBF6suwDcwZM`S7fz$Rx<_=cv~G2J4?z0(*Ws!woOGhFkXhM2hXI7q*{<2fR_@> z4tOkBq|7TYx!ILlcv7eKwpwz$Ou^954y*_x)NjvtB>bB5JPPp^CO>u6~Oy(_xC z(~il!ZfdV8gU!i`v<~&U6*{5*qXFwvLa)=F6CPNsoawWmbHTt0V~1J!8xmfh;?bF> zo5=3bP&K1Pg6Bxa0jpwlflJOb-cHUG$7FXO{z)ogWs}{WLl>`RFP^a3&$Z5P1Z-}A zakdbI9f>f5)KhOOy%J1u*vYx+pi^(g1xo#_XQndHt4)Vf~0d{1nrNf`8bM1eo_H_VsEY;1S% z?Eq^0-!X>EU`w(h?Nj2p_5UFT?ea&ZQmT6q+s63EavsFZmk58&=gRaWR4M`&;Y>h` zE6%ckTqHk;XQG*HXPH&UKFh$zmeZYtDI>%PfxuJh;IFpKQZDdzxLo<#bo%kb593<3 z$^s^2yPpR2fZb2hwrmai%9W+q{gu?e1Q>tNxMM3<$21Vm0V%AR{gX#hIUo;JKpupS zGVXXfxdN;6`{nTFRQ0F50Q)Nr%2;lu-VKHh0;6%A|Dk znRL#o)m8!q^AYt38?x}q{}JT1fyEtXqWmO|fU*y+e$wcSzm z^&-nGLZGtow`C>g@aZvp#ari~3J*Ewvd$MW4}y*H^84x26k~NbU<-g3ap%*}ajD3x zt>G7dwVL*H*7R5`f2sMM^Hp)aJ;t6>PE>kkSJ7MrnLM*6aVY^7>15SmTirh@z1{}% zvpy;(%`aiBs(7Wz^K!N#Xy%WR5?N#&v_?V=y!~R-HpKtjw4*b(q>{L6WW)CLGc_y0 zLiQcxGD}$pFfOv{lFO8(i+(#l*;Yq}x|k-fZC@ATPo z=DpT(F8l6~cyFhmr=RY3=6TTtwhZz2{l}7@v2BS)e+d=_h@u004b`5U+1N+5x+c&# zB?`GS_T#JSDzB(w7?)ExbbjaVJh{8w4;EyLj%6Oca-c_0PO-+VR?C%s^>a1Dq z8n0ST8^WQCA-KHVgn9ldP?7V57G}P+*;IsHgD1~z^|e0UQBHL^EXJCy?zRf|!AsHw z=<JeZtLrP90@YHFsgI!3v5Pw8kZ)X-Y{wPneoHFlh2A(feP%$4(phi zkwL<`&yjYz*PAW5d#X6TE1pF+2L+48b5TYK^K}uz6x&Ye@kBK2FF}e_JAYKeQQ5>w zwCwBtbe3Ks&FI%rziWgIZl{Tz>3T5sxAGif3k_f&^EAJuR_E^|bA@`2SWMc@6>^&; zl08+dvxml+aE}QciEzN15KR(7qKDbTSw3w3%q>TW_ZU8P>DoULJ=Erjc|@gP1(At- z%A2UlIxayK8La+vBW8LF)RdVTcWWb<-Z-}9JnOmQQLe9C&`$MizjPDk zdp?rSo+N!BGAjtB$=rkxj)S&M(z!gemh1&*1S(TmG zle$zexc-=@fe=K^3HO89#A9DCv+=uWKGZEwq02BG$qZ|tO^x7X@CCigcr?wzirD(N zSC`IQvZ11trM>C`-*?&5=+Sa%aKP@)rS9%Zzq?C3+HKvIIx7e{GonLQpUmSZb(Met z*w{#Y+#(%z7$I%lDI64V85I74Z@EPMEUy>U(f2j9tLD+bhk@`H0J`LpBS{YgND`<>a91q-}H2tpjQ2Sne*Tw&|cpezC7 z-X3M*r_^mPD)}TYQ>ZanQIl+*9&A%nW$HzsOc4Ku>>oOz4nMjrXIu`9&(0Vf&7DYR zcg<{GvH7P-i*t**2s+|*L(S1FjCNDXZOEg;(C}L2I+U6XYNywAoA_&;B-|wbT!`&N zocLnCPRn({KJG7pa{9hP96UIle;-ggA)t0#0nQ6hI*oogm}n3kU-{;SZTI%z#@!U& z2Kulsg|jT_AJ;8(YNPv+0Xf&561!QMj*xH-+YFBlEz=f1*#CG{ zdVBE8!&ff}c&Ge0T@9lYZtIZje+d3U_SUvY>XGQ?Sji5068aM=1kCUeXz+8E(< zT4)_{QopSqI^R!i5g#eFC79!TpNq!}l!2)~ePVb@AfGaMYe=n|>-C5uYEt}4PK5WoBb8E$W{?YbbUm$rk4EQ%TV;R$JASMf_zY2X8) z5ZwQfRHwaRM@fe<`y|UG?EE+v zZgy@2E8vi+?3O-QtSwXtd<~2^L1a{_3(;VH_bT7#uKTuCbMN8YO`(lVn0;B-@Imd` zrd^)T>s6xVOmYq5xr2pUbLdNew}uSe2B|ok(9drsp&!_N#G`DPs);I}9{jejNqU>x4}YhSS}N*q-Ko@%KB&0kNjh~?7<*Sr zvER(!qCKp8AldsO4xWOptY8g^`0@t#B-L<7yCf6KdXILGJqBO9Bye+{q~xo zyAl1VU&CmGNO}E`Du9{r2a5TvcWPQeWOQu&w2d8RVZ**gbsm$jKAt+zLC650S3mds z0?PoVQhoyVl;kg;kRWBNhH!L&7PE-ORqOfE#-ZMXe>VTcCMw9n2*(1fVwhX{e5SsO za!y_+7HHMYGFO?fd&;M{EWGI!|7bSrbCPW2jB4%)g9R@3^VzQ{Yx`dfArp;;paDkieA zwbc}FB9bse>0~>YitpV?GN-PlwJYv#EThQ3^5OpomRvSdUf%ach@C2CmbYGix$6B| z0P4(7-w%m{m)l1Lsmh-yjQ%C450=Mf{@7it=HGbI;Cm5$_o|$1um5^j37mWk{WZ-9 zt(`usQ9??_;$w-d>`z)+Pif_`wu8pEJ}L7oS@(Atlm^v z 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⪻Jo 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 A5&!@I literal 0 HcmV?d00001 diff --git a/instafeed/vendor/autoload.php b/instafeed/vendor/autoload.php new file mode 100755 index 0000000..f626d9e --- /dev/null +++ b/instafeed/vendor/autoload.php @@ -0,0 +1,7 @@ +/dev/null" to send STDOUT to the void... + * That way you'll ONLY see critical status messages during the processing. + */ + +set_time_limit(0); +date_default_timezone_set('UTC'); + +// Verify minimum PHP version. +if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50600) { + fwrite(STDERR, 'LazyDoctor requires PHP 5.6 or higher.'.PHP_EOL); + exit(1); +} + +// Register a simple GetOptionKit autoloader. This is fine because +// GetOptionKit has no 3rd party library dependencies. +spl_autoload_register(function ($class) { + // Check if this is a "GetOptionKit" load-request. + static $prefix = 'GetOptionKit\\'; + static $len = 13; // strlen($prefix) + if (strncmp($prefix, $class, $len) !== 0) { + return; + } + + // Find the "GetOptionKit" source folder. + static $dirs = [ + __DIR__.'/../../../corneltek/getoptionkit/src', + __DIR__.'/../vendor/corneltek/getoptionkit/src', + ]; + $baseDir = null; + foreach ($dirs as $dir) { + if (is_dir($dir) && ($dir = realpath($dir)) !== false) { + $baseDir = $dir; + break; + } + } + if ($baseDir === null) { + return; + } + + // Get the relative class name. + $relativeClass = substr($class, $len); + + // Generate PSR-4 file path to the class. + $file = sprintf('%s/%s.php', $baseDir, str_replace('\\', '/', $relativeClass)); + if (is_file($file)) { + require $file; + } +}); + +// Parse command line options... +use GetOptionKit\OptionCollection; +use GetOptionKit\OptionParser; +use GetOptionKit\OptionPrinter\ConsoleOptionPrinter; + +$specs = new OptionCollection(); +$specs->add('c|composer:=file', 'Path to your project\'s composer.json file.'); +$specs->add('p|properties?=boolean', 'Document virtual properties (if enabled for the classes).'); +$specs->add('f|functions?=boolean', 'Document virtual functions (if enabled for the classes).'); +$specs->add('o|document-overridden?=boolean', 'Always document virtual functions/properties even when they have been manually overridden by the class (or its parents).'); +$specs->add('w|windows?=boolean', 'Generate Windows-style ("\r\n") documentation line endings instead of the default Unix-style ("\n").'); +$specs->add('validate-only?=boolean', 'Validate current docs for all classes but don\'t write anything to disk.'); +$specs->add('h|help?=boolean', 'Show all available options.'); + +try { + $parser = new OptionParser($specs); + $result = $parser->parse($argv); + $options = [ + 'composer' => isset($result->keys['composer']) ? $result->keys['composer']->value : null, + 'properties' => isset($result->keys['properties']) && $result->keys['properties']->value !== false, + 'functions' => isset($result->keys['functions']) && $result->keys['functions']->value !== false, + 'document-overridden' => isset($result->keys['document-overridden']) && $result->keys['document-overridden']->value !== false, + 'windows' => isset($result->keys['windows']) && $result->keys['windows']->value !== false, + 'validate-only' => isset($result->keys['validate-only']) && $result->keys['validate-only']->value !== false, + 'help' => isset($result->keys['help']) && $result->keys['help']->value !== false, + ]; +} catch (Exception $e) { + // Warns in case of invalid option values. + fwrite(STDERR, $e->getMessage().PHP_EOL); + exit(1); +} + +// Verify options... +echo '[ LazyDoctor ]'.PHP_EOL.PHP_EOL; +if ($options['composer'] === null || $options['help']) { + if ($options['composer'] === null) { + fwrite(STDERR, 'You must provide the --composer option.'.PHP_EOL.PHP_EOL); + } + $printer = new ConsoleOptionPrinter(); + echo 'Available options:'.PHP_EOL.PHP_EOL; + echo $printer->render($specs); + exit($options['composer'] === null && !$options['help'] ? 1 : 0); +} + +if ($options['composer']->getBasename() !== 'composer.json') { + fwrite(STDERR, 'You must point to your project\'s composer.json file.'.PHP_EOL.'You used: "'.$options['composer']->getRealPath().'".'.PHP_EOL); + exit(1); +} + +// Decode the composer.json file... +$json = @json_decode(file_get_contents($options['composer']->getRealPath()), true); +if ($json === null) { + fwrite(STDERR, 'Unable to decode composer.json.'.PHP_EOL); + exit(1); +} + +// Determine the project folder's real root path... +$projectRoot = $options['composer']->getPathInfo()->getRealPath(); + +// Determine their namespace PSR-4 paths via their project's composer.json... +$namespaces = []; +foreach (['autoload', 'autoload-dev'] as $type) { + if (!isset($json[$type]['psr-4']) || !is_array($json[$type]['psr-4'])) { + continue; + } + + foreach ($json[$type]['psr-4'] as $namespace => $dir) { + // We don't support composer's empty "fallback" namespaces. + if ($namespace === '') { + fwrite(STDERR, 'Encountered illegal unnamed PSR-4 autoload namespace in composer.json.'.PHP_EOL); + exit(1); + } + + // Ensure that the namespace ends in backslash. + if (substr_compare($namespace, '\\', strlen($namespace) - 1, 1) !== 0) { + fwrite(STDERR, 'Encountered illegal namespace "'.$namespace.'" (does not end in backslash) in composer.json.'.PHP_EOL); + exit(1); + } + + // Ensure that the value is a string. + // NOTE: We allow empty strings, which corresponds to root folder. + if (!is_string($dir)) { + fwrite(STDERR, 'Encountered illegal non-string value for namespace "'.$namespace.'".'.PHP_EOL); + exit(1); + } + + // Now resolve the path name... + $path = sprintf('%s/%s', $projectRoot, $dir); + $realpath = realpath($path); + if ($realpath === false) { + fwrite(STDERR, 'Unable to resolve real path for "'.$path.'".'.PHP_EOL); + exit(1); + } + + // We don't allow the same directory to be defined multiple times. + if (isset($namespaces[$realpath])) { + fwrite(STDERR, 'Encountered duplicate namespace directory "'.$realpath.'" in composer.json.'.PHP_EOL); + exit(1); + } + + // And we're done! The namespace and its path have been resolved. + $namespaces[$realpath] = $namespace; + } +} + +// Verify that we found some namespaces... +if (empty($namespaces)) { + fwrite(STDERR, 'There are no PSR-4 autoload namespaces in your composer.json.'.PHP_EOL); + exit(1); +} + +// Now load the project's autoload.php file. +// NOTE: This is necessary so that we can autoload their classes... +$autoload = sprintf('%s/vendor/autoload.php', $projectRoot); +$realautoload = realpath($autoload); +if ($realautoload === false) { + fwrite(STDERR, 'Unable to find the project\'s Composer autoloader ("'.$autoload.'").'.PHP_EOL); + exit(1); +} +require $realautoload; + +// Verify that their project's autoloader contains LazyJsonMapper... +if (!class_exists('\LazyJsonMapper\LazyJsonMapper', true)) { // TRUE = Autoload. + fwrite(STDERR, 'Target project doesn\'t contain the LazyJsonMapper library.'.PHP_EOL); + exit(1); +} + +// Alright, display the current options... +echo 'Project: "'.$projectRoot.'".'.PHP_EOL + .'- Documentation Line Endings: '.($options['windows'] ? 'Windows ("\r\n")' : 'Unix ("\n")').'.'.PHP_EOL + .'- ['.($options['properties'] ? 'X' : ' ').'] Document Virtual Properties ("@property").'.PHP_EOL + .'- ['.($options['functions'] ? 'X' : ' ').'] Document Virtual Functions ("@method").'.PHP_EOL + .'- ['.($options['document-overridden'] ? 'X' : ' ').'] Document Overridden Properties/Functions.'.PHP_EOL; +if ($options['validate-only']) { + echo '- This is a validation run. Nothing will be written to disk.'.PHP_EOL; +} + +// We can now use our custom classes, since the autoloader has been imported... +use LazyJsonMapper\Exception\LazyJsonMapperException; +use LazyJsonMapper\Export\PropertyDescription; +use LazyJsonMapper\Property\PropertyMapCache; +use LazyJsonMapper\Property\PropertyMapCompiler; +use LazyJsonMapper\Utilities; + +/** + * Automatic LazyJsonMapper-class documentation generator. + * + * @copyright 2017 The LazyJsonMapper Project + * @license http://www.apache.org/licenses/LICENSE-2.0 + * @author SteveJobzniak (https://github.com/SteveJobzniak) + */ +class LazyClassDocumentor +{ + /** @var PropertyMapCache */ + private static $_propertyMapCache; + + /** @var array */ + private $_compiledPropertyMapLink; + + /** @var ReflectionClass */ + private $_reflector; + + /** @var array */ + private $_options; + + /** @var string Newline sequence. */ + private $_nl; + + /** + * Constructor. + * + * @param string $class + * @param array $options + * + * @throws ReflectionException + */ + public function __construct( + $class, + array $options) + { + if (self::$_propertyMapCache === null) { + self::$_propertyMapCache = new PropertyMapCache(); + } + $this->_reflector = new ReflectionClass($class); + $this->_options = $options; + $this->_nl = $options['windows'] ? "\r\n" : "\n"; + } + + /** + * Process the current class. + * + * @throws ReflectionException + * @throws LazyJsonMapperException + * + * @return bool `TRUE` if on-disk file has correct docs, otherwise `FALSE`. + */ + public function process() + { + // Only process user-defined classes (never any built-in PHP classes). + if (!$this->_reflector->isUserDefined()) { + return true; + } + + // There's nothing to do if this isn't a LazyJsonMapper subclass. + // NOTE: This properly skips "\LazyJsonMapper\LazyJsonMapper" itself. + if (!$this->_reflector->isSubclassOf('\LazyJsonMapper\LazyJsonMapper')) { + return true; + } + + // Compile this class property map if not yet built and cached. + $thisClassName = $this->_reflector->getName(); + if (!isset(self::$_propertyMapCache->classMaps[$thisClassName])) { + try { + PropertyMapCompiler::compileClassPropertyMap( // Throws. + self::$_propertyMapCache, + $thisClassName + ); + } catch (Exception $e) { + fwrite(STDERR, '> Unable to compile the class property map for "'.$thisClassName.'". Reason: '.$e->getMessage().PHP_EOL); + + return false; + } + } + + // Now link to the property map cache for our current class. + $this->_compiledPropertyMapLink = &self::$_propertyMapCache->classMaps[$thisClassName]; + + // Get the current class comment (string if ok, FALSE if none exists). + $currentDocComment = $this->_reflector->getDocComment(); + if (is_string($currentDocComment)) { + $currentDocComment = trim($currentDocComment); + } + + // Extract all relevant lines from the current comment. + $finalDocLines = $this->_extractRelevantLines($currentDocComment); + + // Generate the automatic summary line (classname followed by period). + $autoSummaryLine = $this->_reflector->getShortName().'.'; + + // If the 1st line is a classname followed by a period, update the name. + // NOTE: This ensures that we update all outdated auto-added classnames, + // and the risk of false positives is very low since we only document + // `LazyJsonMapper`-based classes with a `OneWord.`-style summary line. + // NOTE: Regex is from http://php.net/manual/en/language.oop5.basic.php, + // and yes we must run it in NON-UNICODE MODE, so that it parses on a + // byte by byte basis exactly like the real PHP classname interpreter. + if ( + isset($finalDocLines[0]) // The 1st line MUST exist to proceed. + && preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\.$/', $finalDocLines[0]) + ) { + $finalDocLines[0] = $autoSummaryLine; + } + + // Generate the magic documentation lines for the current class. + $magicDocLines = $this->_generateMagicDocs(); + if (!empty($magicDocLines)) { + // If there are no lines already... add the automatic summary line. + if (empty($finalDocLines)) { + $finalDocLines[] = $autoSummaryLine; + } + + // Check the 1st char of the 1st line. If it's an @tag of any kind, + // insert automatic summary line at top and empty line after that. + elseif ($finalDocLines[0][0] === '@') { + array_unshift( + $finalDocLines, + $autoSummaryLine, + '' + ); + } + + $finalDocLines[] = ''; // Add empty line before our magic docs. + $finalDocLines = array_merge($finalDocLines, array_values($magicDocLines)); + } + unset($magicDocLines); + + // Generate the final doc-comment that this class is supposed to have. + if (!empty($finalDocLines)) { + // This will generate even if the class only contained an existing + // summary/tags and nothing was added by our magic handler. + foreach ($finalDocLines as &$line) { + $line = ($line === '' ? ' *' : " * {$line}"); + } + unset($line); + $finalDocComment = sprintf( + '/**%s%s%s */', + $this->_nl, + implode($this->_nl, $finalDocLines), + $this->_nl + ); + } else { + // The FALSE signifies that we want no class doc-block at all... + $finalDocComment = false; + } + unset($finalDocLines); + + // There's nothing to do if the doc-comment is already correct. + // NOTE: Both values are FALSE if no doc-comment exists and none wanted. + if ($currentDocComment === $finalDocComment) { + return true; + } + + // The docs mismatch. If this is a validate-run, just return false now. + if ($this->_options['validate-only']) { + fwrite(STDERR, '> Outdated class docs encountered in "'.$thisClassName.'". Aborting scan...'.PHP_EOL); + + return false; + } + + // Load the contents of the file... + $classFileName = $this->_reflector->getFileName(); + $fileLines = @file($classFileName); + if ($fileLines === false) { + fwrite(STDERR, '> Unable to read class file from disk: "'.$classFileName.'".'.PHP_EOL); + + return false; + } + + // Split the file into lines BEFORE the class and lines AFTER the class. + $classLine = $this->_reflector->getStartLine(); + $startLines = array_slice($fileLines, 0, $classLine - 1); + $endLines = array_slice($fileLines, $classLine - 1); + unset($fileLines); + + // Insert the new class documentation using a very careful algorithm. + if ($currentDocComment !== false) { + // Since the class already had PHPdoc, remove it and insert new doc. + // NOTE: A valid PHPdoc (getDocComment()) always starts with + // "/**[whitespace]". If it's just a "/*" or something like + // "/**Foo", then it's not detected by getDocComment(). However, the + // comment may be several lines above the class. So we'll have to do + // an intelligent search to find the old class-comment. As for the + // ending tag "*/", PHP doesn't care about whitespace around that. + // And it also doesn't let the user escape the "*/", which means + // that if we see that sequence we KNOW it's the end of a comment! + // NOTE: We'll search for the latest "/**[whitespace]" block and + // remove all lines from that until its closest "*/". + $deleteFrom = null; + $deleteTo = null; + for ($i = count($startLines) - 1; $i >= 0; --$i) { + if (strpos($startLines[$i], '*/') !== false) { + $deleteTo = $i; + } + if (preg_match('/^\s*\/\*\*\s/u', $startLines[$i])) { + $deleteFrom = $i; + break; + } + } + + // Ensure that we have found valid comment-offsets. + if ($deleteFrom === null || $deleteTo === null || $deleteTo < $deleteFrom) { + fwrite(STDERR, '> Unable to parse current class comment on disk: "'.$classFileName.'".'.PHP_EOL); + + return false; + } + + // Now update the startLines array to replace the doc-comment... + foreach ($startLines as $k => $v) { + if ($k === $deleteFrom && $finalDocComment !== false) { + // We've found the first line of the old comment, and we + // have a new comment. So replace that array entry. + $startLines[$k] = $finalDocComment.$this->_nl; + } elseif ($k >= $deleteFrom && $k <= $deleteTo) { + // Delete all other comment lines, including the first line + // if we had no new doc-comment. + unset($startLines[$k]); + } + + // Break if we've reached the final line to delete. + if ($k >= $deleteTo) { + break; + } + } + } elseif ($finalDocComment !== false) { + // There's no existing doc-comment. Just add ours above the class. + // NOTE: This only does something if we had a new comment to insert, + // which we SHOULD have since we came this far in this scenario... + $startLines[] = $finalDocComment.$this->_nl; + } + + // Generate the new file contents. + $newFileContent = implode($startLines).implode($endLines); + unset($startLines); + unset($endLines); + + // Perform an atomic file-write to disk, which ensures that we will + // never be able to corrupt the class-files on disk via partial writes. + $written = Utilities::atomicWrite($classFileName, $newFileContent); + if ($written !== false) { + echo '> Wrote updated class documentation to disk: "'.$classFileName.'".'.PHP_EOL; + + return true; + } else { + fwrite(STDERR, '> Unable to write new class documentation to disk: "'.$classFileName.'".'.PHP_EOL); + + return false; + } + } + + /** + * Extracts all relevant lines from a doc-comment. + * + * @param string $currentDocComment + * + * @return array + */ + private function _extractRelevantLines( + $currentDocComment) + { + if (!is_string($currentDocComment)) { + return []; + } + + // Remove the leading and trailing doc-comment tags (/** and */). + $currentDocComment = preg_replace('/(^\s*\/\*\*\s*|\s*\*\/$)/u', '', $currentDocComment); + + // Process all lines. Skip all @method and @property lines. + $relevantLines = []; + $lines = preg_split('/\r?\n|\r/u', $currentDocComment); + foreach ($lines as $line) { + // Remove leading and trailing whitespace, and leading asterisks. + $line = trim(preg_replace('/^\s*\*+/u', '', $line)); + + // Skip this line if it's a @method or @property line. + // NOTE: Removing them is totally safe, because the LazyJsonMapper + // class has marked all of its magic property/function handlers as + // final, which means that people's subclasses CANNOT override them + // to add their own magic methods/properties. So therefore we KNOW + // that ALL existing @method/@property class doc lines belong to us! + if (preg_match('/^@(?:method|property)/u', $line)) { + continue; + } + + $relevantLines[] = $line; + } + + // Remove trailing empty lines from the relevant lines. + for ($i = count($relevantLines) - 1; $i >= 0; --$i) { + if ($relevantLines[$i] === '') { + unset($relevantLines[$i]); + } else { + break; + } + } + + // Remove leading empty lines from the relevant lines. + foreach ($relevantLines as $k => $v) { + if ($v !== '') { + break; + } + + unset($relevantLines[$k]); + } + + // Return a re-indexed (properly 0-indexed) array. + return array_values($relevantLines); + } + + /** + * Generate PHPdoc lines for all magic properties and functions. + * + * @throws ReflectionException + * @throws LazyJsonMapperException + * + * @return array + */ + private function _generateMagicDocs() + { + // Check whether we should (and can) document properties and functions. + $documentProperties = $this->_options['properties'] && $this->_reflector->getConstant('ALLOW_VIRTUAL_PROPERTIES'); + $documentFunctions = $this->_options['functions'] && $this->_reflector->getConstant('ALLOW_VIRTUAL_FUNCTIONS'); + if (!$documentProperties && !$documentFunctions) { + return []; + } + + // Export all JSON properties, with RELATIVE class-paths when possible. + // NOTE: We will document ALL properties. Even ones inherited from + // parents/imported maps. This ensures that users who are manually + // reading the source code can see EVERYTHING without needing an IDE. + $properties = []; + $ownerClassName = $this->_reflector->getName(); + foreach ($this->_compiledPropertyMapLink as $propName => $propDef) { + $properties[$propName] = new PropertyDescription( // Throws. + $ownerClassName, + $propName, + $propDef, + true // Use relative class-paths when possible. + ); + } + + // Build the magic documentation... + $magicDocLines = []; + foreach (['functions', 'properties'] as $docType) { + if (($docType === 'functions' && !$documentFunctions) + || ($docType === 'properties' && !$documentProperties)) { + continue; + } + + // Generate all lines for the current magic tag type... + $lineStorage = []; + foreach ($properties as $property) { + if ($docType === 'functions') { + // We will only document useful functions (not the "has", + // since those are useless for properties that are fully + // defined in the class map). + foreach (['get', 'set', 'is', 'unset'] as $funcType) { + // Generate the function name, ie "getSomething", and + // skip this function if it's already defined as a REAL + // (overridden) function in this class or its parents. + $functionName = $funcType.$property->func_case; + if (!$this->_options['document-overridden'] && $this->_reflector->hasMethod($functionName)) { + continue; + } + + // Alright, the function doesn't exist as a real class + // function, or the user wants to document it anyway... + // Document it via its calculated signature. + // NOTE: Classtypes use paths relative to current class! + $functionSignature = $property->{'function_'.$funcType}; + $lineStorage[$functionName] = sprintf('@method %s', $functionSignature); + } + } elseif ($docType === 'properties') { + // Skip this property if it's already defined as a REAL + // (overridden) property in this class or its parents. + if (!$this->_options['document-overridden'] && $this->_reflector->hasProperty($property->name)) { + continue; + } + + // Alright, the property doesn't exist as a real class + // property, or the user wants to document it anyway... + // Document it via its calculated signature. + // NOTE: Classtypes use paths relative to current class! + $lineStorage[$property->name] = sprintf( + '@property %s $%s', + $property->type, + $property->name + ); + } + } + + // Skip this tag type if there was nothing to document... + if (empty($lineStorage)) { + continue; + } + + // Insert empty line separators between different magic tag types. + if (!empty($magicDocLines)) { + $magicDocLines[] = ''; + } + + // Reorder lines by name and add them to the magic doc lines. + // NOTE: We use case sensitivity so that "getComments" and + // "getCommentThreads" etc aren't placed next to each other. + ksort($lineStorage, SORT_NATURAL); // Case-sensitive natural order. + $magicDocLines = array_merge($magicDocLines, array_values($lineStorage)); + } + + return $magicDocLines; + } +} + +// Now process all PHP files under all of the project's namespace folders. +foreach ($namespaces as $realpath => $namespace) { + echo PHP_EOL.'Processing namespace "'.$namespace.'".'.PHP_EOL.'- Path: "'.$realpath.'".'.PHP_EOL; + $realpathlen = strlen($realpath); + + $iterator = new RegexIterator( + new RecursiveIteratorIterator(new RecursiveDirectoryIterator($realpath)), + '/\.php$/i', RecursiveRegexIterator::GET_MATCH + ); + foreach ($iterator as $file => $ext) { + // Determine the real path to the file (compatible with $realpath). + $realfile = realpath($file); + if ($realfile === false) { + fwrite(STDERR, 'Unable to determine real path to file "'.$file.'".'.PHP_EOL); + exit(1); + } + + // Now ensure that the file starts with the expected path... + if (strncmp($realpath, $realfile, $realpathlen) !== 0) { + fwrite(STDERR, 'Unexpected path to file "'.$realfile.'". Does not match project path.'.PHP_EOL); + exit(1); + } + $class = substr($realfile, $realpathlen); + + // Remove the leading slash for the folder... + if ($class[0] !== '/' && $class[0] !== '\\') { + fwrite(STDERR, 'Unexpected path to file "'.$realfile.'". Does not match project path.'.PHP_EOL); + exit(1); + } + $class = substr($class, 1); + + // And now just generate the final class name... + $class = sprintf( + '%s%s', + $namespace, + str_replace('/', '\\', preg_replace('/\.php$/ui', '', $class)) + ); + + // Some files may not contain classes. For example, some people have + // functions.php files with functions, etc. So before we proceed, just + // ensure that the generated class name actually exists. + // NOTE: class_exists() ignores interfaces. Only finds classes. Good. + if (!class_exists($class, true)) { // TRUE = Autoload. + continue; + } + + // Now process the current class. + $documentor = new LazyClassDocumentor($class, $options); + $result = $documentor->process(); + if (!$result) { + if ($options['validate-only']) { + fwrite(STDERR, '> One or more files need updated class documentation or contain other errors.'.PHP_EOL); + } else { + fwrite(STDERR, '> Error while processing class "'.$class.'". Aborting...'.PHP_EOL); + } + exit(1); + } + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt-client-react/LICENSE.md b/instafeed/vendor/binsoul/net-mqtt-client-react/LICENSE.md new file mode 100755 index 0000000..6d19c5c --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt-client-react/LICENSE.md @@ -0,0 +1,21 @@ +# The MIT License (MIT) + +Copyright (c) 2015 Sebastian Mößler + +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. diff --git a/instafeed/vendor/binsoul/net-mqtt-client-react/README.md b/instafeed/vendor/binsoul/net-mqtt-client-react/README.md new file mode 100755 index 0000000..ca3099d --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt-client-react/README.md @@ -0,0 +1,145 @@ +# net-mqtt-client-react + +[![Latest Version on Packagist][ico-version]][link-packagist] +[![Software License][ico-license]](LICENSE.md) +[![Total Downloads][ico-downloads]][link-downloads] + +This package provides an asynchronous MQTT client built on the [React socket](https://github.com/reactphp/socket) library. All client methods return a promise which is fulfilled if the operation succeeded or rejected if the operation failed. Incoming messages of subscribed topics are delivered via the "message" event. + +## Install + +Via composer: + +``` bash +$ composer require binsoul/net-mqtt-client-react +``` + +## Example + +Connect to a public broker and run forever. + +``` php +createCached('8.8.8.8', $loop)); +$client = new ReactMqttClient($connector, $loop); + +// Bind to events +$client->on('open', function () use ($client) { + // Network connection established + echo sprintf("Open: %s:%s\n", $client->getHost(), $client->getPort()); +}); + +$client->on('close', function () use ($client, $loop) { + // Network connection closed + echo sprintf("Close: %s:%s\n", $client->getHost(), $client->getPort()); + + $loop->stop(); +}); + +$client->on('connect', function (Connection $connection) { + // Broker connected + echo sprintf("Connect: client=%s\n", $connection->getClientID()); +}); + +$client->on('disconnect', function (Connection $connection) { + // Broker disconnected + echo sprintf("Disconnect: client=%s\n", $connection->getClientID()); +}); + +$client->on('message', function (Message $message) { + // Incoming message + echo 'Message'; + + if ($message->isDuplicate()) { + echo ' (duplicate)'; + } + + if ($message->isRetained()) { + echo ' (retained)'; + } + + echo ': '.$message->getTopic().' => '.mb_strimwidth($message->getPayload(), 0, 50, '...'); + echo "\n"; +}); + +$client->on('warning', function (\Exception $e) { + echo sprintf("Warning: %s\n", $e->getMessage()); +}); + +$client->on('error', function (\Exception $e) use ($loop) { + echo sprintf("Error: %s\n", $e->getMessage()); + + $loop->stop(); +}); + +// Connect to broker +$client->connect('test.mosquitto.org')->then( + function () use ($client) { + // Subscribe to all topics + $client->subscribe(new DefaultSubscription('#')) + ->then(function (Subscription $subscription) { + echo sprintf("Subscribe: %s\n", $subscription->getFilter()); + }) + ->otherwise(function (\Exception $e) { + echo sprintf("Error: %s\n", $e->getMessage()); + }); + + // Publish humidity once + $client->publish(new DefaultMessage('sensors/humidity', '55%')) + ->then(function (Message $message) { + echo sprintf("Publish: %s => %s\n", $message->getTopic(), $message->getPayload()); + }) + ->otherwise(function (\Exception $e) { + echo sprintf("Error: %s\n", $e->getMessage()); + }); + + // Publish a random temperature every 10 seconds + $generator = function () { + return mt_rand(-20, 30); + }; + + $client->publishPeriodically(10, new DefaultMessage('sensors/temperature'), $generator) + ->progress(function (Message $message) { + echo sprintf("Publish: %s => %s\n", $message->getTopic(), $message->getPayload()); + }) + ->otherwise(function (\Exception $e) { + echo sprintf("Error: %s\n", $e->getMessage()); + }); + } +); + +$loop->run(); +``` + +## Testing + +``` bash +$ composer test +``` + +## License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. + +[ico-version]: https://img.shields.io/packagist/v/binsoul/net-mqtt-client-react.svg?style=flat-square +[ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square +[ico-downloads]: https://img.shields.io/packagist/dt/binsoul/net-mqtt-client-react.svg?style=flat-square + +[link-packagist]: https://packagist.org/packages/binsoul/net-mqtt-client-react +[link-downloads]: https://packagist.org/packages/binsoul/net-mqtt-client-react +[link-author]: https://github.com/binsoul diff --git a/instafeed/vendor/binsoul/net-mqtt-client-react/composer.json b/instafeed/vendor/binsoul/net-mqtt-client-react/composer.json new file mode 100755 index 0000000..e9dcc25 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt-client-react/composer.json @@ -0,0 +1,51 @@ +{ + "name": "binsoul/net-mqtt-client-react", + "description": "Asynchronous MQTT client built on React", + "keywords": [ + "net", + "mqtt", + "client" + ], + "homepage": "https://github.com/binsoul/net-mqtt-client-react", + "license": "MIT", + "authors": [ + { + "name": "Sebastian Mößler", + "email": "code@binsoul.de", + "homepage": "https://github.com/binsoul", + "role": "Developer" + } + ], + "require": { + "php": "~5.6|~7.0", + "binsoul/net-mqtt": "~0.2", + "react/promise": "~2.0", + "react/socket": "~0.8" + }, + "require-dev": { + "phpunit/phpunit": "~4.0||~5.0", + "friendsofphp/php-cs-fixer": "~1.0" + }, + "autoload": { + "psr-4": { + "BinSoul\\Net\\Mqtt\\Client\\React\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "BinSoul\\Test\\Net\\Mqtt\\Client\\React\\": "tests" + } + }, + "scripts": { + "test": "phpunit", + "fix-style": [ + "php-cs-fixer fix src", + "php-cs-fixer fix tests" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt-client-react/src/ReactFlow.php b/instafeed/vendor/binsoul/net-mqtt-client-react/src/ReactFlow.php new file mode 100755 index 0000000..d404145 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt-client-react/src/ReactFlow.php @@ -0,0 +1,112 @@ +decorated = $decorated; + $this->deferred = $deferred; + $this->packet = $packet; + $this->isSilent = $isSilent; + } + + public function getCode() + { + return $this->decorated->getCode(); + } + + public function start() + { + $this->packet = $this->decorated->start(); + + return $this->packet; + } + + public function accept(Packet $packet) + { + return $this->decorated->accept($packet); + } + + public function next(Packet $packet) + { + $this->packet = $this->decorated->next($packet); + + return $this->packet; + } + + public function isFinished() + { + return $this->decorated->isFinished(); + } + + public function isSuccess() + { + return $this->decorated->isSuccess(); + } + + public function getResult() + { + return $this->decorated->getResult(); + } + + public function getErrorMessage() + { + return $this->decorated->getErrorMessage(); + } + + /** + * Returns the associated deferred. + * + * @return Deferred + */ + public function getDeferred() + { + return $this->deferred; + } + + /** + * Returns the current packet. + * + * @return Packet + */ + public function getPacket() + { + return $this->packet; + } + + /** + * Indicates if the flow should emit events. + * + * @return bool + */ + public function isSilent() + { + return $this->isSilent; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt-client-react/src/ReactMqttClient.php b/instafeed/vendor/binsoul/net-mqtt-client-react/src/ReactMqttClient.php new file mode 100755 index 0000000..f56b191 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt-client-react/src/ReactMqttClient.php @@ -0,0 +1,701 @@ +connector = $connector; + $this->loop = $loop; + + $this->parser = $parser; + if ($this->parser === null) { + $this->parser = new StreamParser(); + } + + $this->parser->onError(function (\Exception $e) { + $this->emitWarning($e); + }); + + $this->identifierGenerator = $identifierGenerator; + if ($this->identifierGenerator === null) { + $this->identifierGenerator = new DefaultIdentifierGenerator(); + } + } + + /** + * Return the host. + * + * @return string + */ + public function getHost() + { + return $this->host; + } + + /** + * Return the port. + * + * @return string + */ + public function getPort() + { + return $this->port; + } + + /** + * Indicates if the client is connected. + * + * @return bool + */ + public function isConnected() + { + return $this->isConnected; + } + + /** + * Returns the underlying stream or null if the client is not connected. + * + * @return DuplexStreamInterface|null + */ + public function getStream() + { + return $this->stream; + } + + /** + * Connects to a broker. + * + * @param string $host + * @param int $port + * @param Connection $connection + * @param int $timeout + * + * @return ExtendedPromiseInterface + */ + public function connect($host, $port = 1883, Connection $connection = null, $timeout = 5) + { + if ($this->isConnected || $this->isConnecting) { + return new RejectedPromise(new \LogicException('The client is already connected.')); + } + + $this->isConnecting = true; + $this->isConnected = false; + + $this->host = $host; + $this->port = $port; + + if ($connection === null) { + $connection = new DefaultConnection(); + } + + if ($connection->isCleanSession()) { + $this->cleanPreviousSession(); + } + + if ($connection->getClientID() === '') { + $connection = $connection->withClientID($this->identifierGenerator->generateClientID()); + } + + $deferred = new Deferred(); + + $this->establishConnection($this->host, $this->port, $timeout) + ->then(function (DuplexStreamInterface $stream) use ($connection, $deferred, $timeout) { + $this->stream = $stream; + + $this->emit('open', [$connection, $this]); + + $this->registerClient($connection, $timeout) + ->then(function (Connection $connection) use ($deferred) { + $this->isConnecting = false; + $this->isConnected = true; + $this->connection = $connection; + + $this->emit('connect', [$connection, $this]); + $deferred->resolve($this->connection); + }) + ->otherwise(function (\Exception $e) use ($deferred, $connection) { + $this->isConnecting = false; + + $this->emitError($e); + $deferred->reject($e); + + if ($this->stream !== null) { + $this->stream->close(); + } + + $this->emit('close', [$connection, $this]); + }); + }) + ->otherwise(function (\Exception $e) use ($deferred) { + $this->isConnecting = false; + + $this->emitError($e); + $deferred->reject($e); + }); + + return $deferred->promise(); + } + + /** + * Disconnects from a broker. + * + * @return ExtendedPromiseInterface + */ + public function disconnect() + { + if (!$this->isConnected || $this->isDisconnecting) { + return new RejectedPromise(new \LogicException('The client is not connected.')); + } + + $this->isDisconnecting = true; + + $deferred = new Deferred(); + + $this->startFlow(new OutgoingDisconnectFlow($this->connection), true) + ->then(function (Connection $connection) use ($deferred) { + $this->isDisconnecting = false; + $this->isConnected = false; + + $this->emit('disconnect', [$connection, $this]); + $deferred->resolve($connection); + + if ($this->stream !== null) { + $this->stream->close(); + } + }) + ->otherwise(function () use ($deferred) { + $this->isDisconnecting = false; + $deferred->reject($this->connection); + }); + + return $deferred->promise(); + } + + /** + * Subscribes to a topic filter. + * + * @param Subscription $subscription + * + * @return ExtendedPromiseInterface + */ + public function subscribe(Subscription $subscription) + { + if (!$this->isConnected) { + return new RejectedPromise(new \LogicException('The client is not connected.')); + } + + return $this->startFlow(new OutgoingSubscribeFlow([$subscription], $this->identifierGenerator)); + } + + /** + * Unsubscribes from a topic filter. + * + * @param Subscription $subscription + * + * @return ExtendedPromiseInterface + */ + public function unsubscribe(Subscription $subscription) + { + if (!$this->isConnected) { + return new RejectedPromise(new \LogicException('The client is not connected.')); + } + + return $this->startFlow(new OutgoingUnsubscribeFlow([$subscription], $this->identifierGenerator)); + } + + /** + * Publishes a message. + * + * @param Message $message + * + * @return ExtendedPromiseInterface + */ + public function publish(Message $message) + { + if (!$this->isConnected) { + return new RejectedPromise(new \LogicException('The client is not connected.')); + } + + return $this->startFlow(new OutgoingPublishFlow($message, $this->identifierGenerator)); + } + + /** + * Calls the given generator periodically and publishes the return value. + * + * @param int $interval + * @param Message $message + * @param callable $generator + * + * @return ExtendedPromiseInterface + */ + public function publishPeriodically($interval, Message $message, callable $generator) + { + if (!$this->isConnected) { + return new RejectedPromise(new \LogicException('The client is not connected.')); + } + + $deferred = new Deferred(); + + $this->timer[] = $this->loop->addPeriodicTimer( + $interval, + function () use ($message, $generator, $deferred) { + $this->publish($message->withPayload($generator($message->getTopic())))->then( + function ($value) use ($deferred) { + $deferred->notify($value); + }, + function (\Exception $e) use ($deferred) { + $deferred->reject($e); + } + ); + } + ); + + return $deferred->promise(); + } + + /** + * Emits warnings. + * + * @param \Exception $e + */ + private function emitWarning(\Exception $e) + { + $this->emit('warning', [$e, $this]); + } + + /** + * Emits errors. + * + * @param \Exception $e + */ + private function emitError(\Exception $e) + { + $this->emit('error', [$e, $this]); + } + + /** + * Establishes a network connection to a server. + * + * @param string $host + * @param int $port + * @param int $timeout + * + * @return ExtendedPromiseInterface + */ + private function establishConnection($host, $port, $timeout) + { + $deferred = new Deferred(); + + $timer = $this->loop->addTimer( + $timeout, + function () use ($deferred, $timeout) { + $exception = new \RuntimeException(sprintf('Connection timed out after %d seconds.', $timeout)); + $deferred->reject($exception); + } + ); + + $this->connector->connect($host.':'.$port) + ->always(function () use ($timer) { + $this->loop->cancelTimer($timer); + }) + ->then(function (DuplexStreamInterface $stream) use ($deferred) { + $stream->on('data', function ($data) { + $this->handleReceive($data); + }); + + $stream->on('close', function () { + $this->handleClose(); + }); + + $stream->on('error', function (\Exception $e) { + $this->handleError($e); + }); + + $deferred->resolve($stream); + }) + ->otherwise(function (\Exception $e) use ($deferred) { + $deferred->reject($e); + }); + + return $deferred->promise(); + } + + /** + * Registers a new client with the broker. + * + * @param Connection $connection + * @param int $timeout + * + * @return ExtendedPromiseInterface + */ + private function registerClient(Connection $connection, $timeout) + { + $deferred = new Deferred(); + + $responseTimer = $this->loop->addTimer( + $timeout, + function () use ($deferred, $timeout) { + $exception = new \RuntimeException(sprintf('No response after %d seconds.', $timeout)); + $deferred->reject($exception); + } + ); + + $this->startFlow(new OutgoingConnectFlow($connection, $this->identifierGenerator), true) + ->always(function () use ($responseTimer) { + $this->loop->cancelTimer($responseTimer); + })->then(function (Connection $connection) use ($deferred) { + $this->timer[] = $this->loop->addPeriodicTimer( + floor($connection->getKeepAlive() * 0.75), + function () { + $this->startFlow(new OutgoingPingFlow()); + } + ); + + $deferred->resolve($connection); + })->otherwise(function (\Exception $e) use ($deferred) { + $deferred->reject($e); + }); + + return $deferred->promise(); + } + + /** + * Handles incoming data. + * + * @param string $data + */ + private function handleReceive($data) + { + if (!$this->isConnected && !$this->isConnecting) { + return; + } + + $flowCount = count($this->receivingFlows); + + $packets = $this->parser->push($data); + foreach ($packets as $packet) { + $this->handlePacket($packet); + } + + if ($flowCount > count($this->receivingFlows)) { + $this->receivingFlows = array_values($this->receivingFlows); + } + + $this->handleSend(); + } + + /** + * Handles an incoming packet. + * + * @param Packet $packet + */ + private function handlePacket(Packet $packet) + { + switch ($packet->getPacketType()) { + case Packet::TYPE_PUBLISH: + /* @var PublishRequestPacket $packet */ + $message = new DefaultMessage( + $packet->getTopic(), + $packet->getPayload(), + $packet->getQosLevel(), + $packet->isRetained(), + $packet->isDuplicate() + ); + + $this->startFlow(new IncomingPublishFlow($message, $packet->getIdentifier())); + break; + case Packet::TYPE_CONNACK: + case Packet::TYPE_PINGRESP: + case Packet::TYPE_SUBACK: + case Packet::TYPE_UNSUBACK: + case Packet::TYPE_PUBREL: + case Packet::TYPE_PUBACK: + case Packet::TYPE_PUBREC: + case Packet::TYPE_PUBCOMP: + $flowFound = false; + foreach ($this->receivingFlows as $index => $flow) { + if ($flow->accept($packet)) { + $flowFound = true; + + unset($this->receivingFlows[$index]); + $this->continueFlow($flow, $packet); + + break; + } + } + + if (!$flowFound) { + $this->emitWarning( + new \LogicException(sprintf('Received unexpected packet of type %d.', $packet->getPacketType())) + ); + } + break; + default: + $this->emitWarning( + new \LogicException(sprintf('Cannot handle packet of type %d.', $packet->getPacketType())) + ); + } + } + + /** + * Handles outgoing packets. + */ + private function handleSend() + { + $flow = null; + if ($this->writtenFlow !== null) { + $flow = $this->writtenFlow; + $this->writtenFlow = null; + } + + if (count($this->sendingFlows) > 0) { + $this->writtenFlow = array_shift($this->sendingFlows); + $this->stream->write($this->writtenFlow->getPacket()); + } + + if ($flow !== null) { + if ($flow->isFinished()) { + $this->loop->nextTick(function () use ($flow) { + $this->finishFlow($flow); + }); + } else { + $this->receivingFlows[] = $flow; + } + } + } + + /** + * Handles closing of the stream. + */ + private function handleClose() + { + foreach ($this->timer as $timer) { + $this->loop->cancelTimer($timer); + } + + $this->timer = []; + + $connection = $this->connection; + + $this->isConnecting = false; + $this->isDisconnecting = false; + $this->isConnected = false; + $this->connection = null; + $this->stream = null; + + if ($connection !== null) { + $this->emit('close', [$connection, $this]); + } + } + + /** + * Handles errors of the stream. + * + * @param \Exception $e + */ + private function handleError(\Exception $e) + { + $this->emitError($e); + } + + /** + * Starts the given flow. + * + * @param Flow $flow + * @param bool $isSilent + * + * @return ExtendedPromiseInterface + */ + private function startFlow(Flow $flow, $isSilent = false) + { + try { + $packet = $flow->start(); + } catch (\Exception $e) { + $this->emitError($e); + + return new RejectedPromise($e); + } + + $deferred = new Deferred(); + $internalFlow = new ReactFlow($flow, $deferred, $packet, $isSilent); + + if ($packet !== null) { + if ($this->writtenFlow !== null) { + $this->sendingFlows[] = $internalFlow; + } else { + $this->stream->write($packet); + $this->writtenFlow = $internalFlow; + $this->handleSend(); + } + } else { + $this->loop->nextTick(function () use ($internalFlow) { + $this->finishFlow($internalFlow); + }); + } + + return $deferred->promise(); + } + + /** + * Continues the given flow. + * + * @param ReactFlow $flow + * @param Packet $packet + */ + private function continueFlow(ReactFlow $flow, Packet $packet) + { + try { + $response = $flow->next($packet); + } catch (\Exception $e) { + $this->emitError($e); + + return; + } + + if ($response !== null) { + if ($this->writtenFlow !== null) { + $this->sendingFlows[] = $flow; + } else { + $this->stream->write($response); + $this->writtenFlow = $flow; + $this->handleSend(); + } + } elseif ($flow->isFinished()) { + $this->loop->nextTick(function () use ($flow) { + $this->finishFlow($flow); + }); + } + } + + /** + * Finishes the given flow. + * + * @param ReactFlow $flow + */ + private function finishFlow(ReactFlow $flow) + { + if ($flow->isSuccess()) { + if (!$flow->isSilent()) { + $this->emit($flow->getCode(), [$flow->getResult(), $this]); + } + + $flow->getDeferred()->resolve($flow->getResult()); + } else { + $result = new \RuntimeException($flow->getErrorMessage()); + $this->emitWarning($result); + + $flow->getDeferred()->reject($result); + } + } + + /** + * Cleans previous session by rejecting all pending flows. + */ + private function cleanPreviousSession() + { + $error = new \RuntimeException('Connection has been closed.'); + + foreach ($this->receivingFlows as $receivingFlow) { + $receivingFlow->getDeferred()->reject($error); + } + + foreach ($this->sendingFlows as $sendingFlow) { + $sendingFlow->getDeferred()->reject($error); + } + + $this->receivingFlows = []; + $this->sendingFlows = []; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/LICENSE.md b/instafeed/vendor/binsoul/net-mqtt/LICENSE.md new file mode 100755 index 0000000..6d19c5c --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/LICENSE.md @@ -0,0 +1,21 @@ +# The MIT License (MIT) + +Copyright (c) 2015 Sebastian Mößler + +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. diff --git a/instafeed/vendor/binsoul/net-mqtt/README.md b/instafeed/vendor/binsoul/net-mqtt/README.md new file mode 100755 index 0000000..9f341da --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/README.md @@ -0,0 +1,36 @@ +# net-mqtt + +[![Latest Version on Packagist][ico-version]][link-packagist] +[![Software License][ico-license]](LICENSE.md) +[![Total Downloads][ico-downloads]][link-downloads] + +MQTT is a machine-to-machine (M2M) / Internet of Things (IoT) connectivity protocol. It provides a lightweight method of carrying out messaging using a publish/subscribe model. + +This package implements the MQTT protocol versions 3.1 and 3.1.1. + + +## Install + +Via composer: + +``` bash +$ composer require binsoul/net-mqtt +``` + +## Testing + +``` bash +$ composer test +``` + +## License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. + +[ico-version]: https://img.shields.io/packagist/v/binsoul/net-mqtt.svg?style=flat-square +[ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square +[ico-downloads]: https://img.shields.io/packagist/dt/binsoul/net-mqtt.svg?style=flat-square + +[link-packagist]: https://packagist.org/packages/binsoul/net-mqtt +[link-downloads]: https://packagist.org/packages/binsoul/net-mqtt +[link-author]: https://github.com/binsoul diff --git a/instafeed/vendor/binsoul/net-mqtt/composer.json b/instafeed/vendor/binsoul/net-mqtt/composer.json new file mode 100755 index 0000000..035ad9f --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/composer.json @@ -0,0 +1,47 @@ +{ + "name": "binsoul/net-mqtt", + "description": "MQTT protocol implementation", + "keywords": [ + "net", + "mqtt" + ], + "homepage": "https://github.com/binsoul/net-mqtt", + "license": "MIT", + "authors": [ + { + "name": "Sebastian Mößler", + "email": "code@binsoul.de", + "homepage": "https://github.com/binsoul", + "role": "Developer" + } + ], + "require": { + "php": "~5.6|~7.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0||~5.0", + "friendsofphp/php-cs-fixer": "~1.0" + }, + "autoload": { + "psr-4": { + "BinSoul\\Net\\Mqtt\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "BinSoul\\Test\\Net\\Mqtt\\": "tests" + } + }, + "scripts": { + "test": "phpunit", + "fix-style": [ + "php-cs-fixer fix src", + "php-cs-fixer fix tests" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Connection.php b/instafeed/vendor/binsoul/net-mqtt/src/Connection.php new file mode 100755 index 0000000..5297b74 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Connection.php @@ -0,0 +1,90 @@ +username = $username; + $this->password = $password; + $this->will = $will; + $this->clientID = $clientID; + $this->keepAlive = $keepAlive; + $this->protocol = $protocol; + $this->clean = $clean; + } + + public function getProtocol() + { + return $this->protocol; + } + + public function getClientID() + { + return $this->clientID; + } + + public function isCleanSession() + { + return $this->clean; + } + + public function getUsername() + { + return $this->username; + } + + public function getPassword() + { + return $this->password; + } + + public function getWill() + { + return $this->will; + } + + public function getKeepAlive() + { + return $this->keepAlive; + } + + public function withProtocol($protocol) + { + $result = clone $this; + $result->protocol = $protocol; + + return $result; + } + + public function withClientID($clientID) + { + $result = clone $this; + $result->clientID = $clientID; + + return $result; + } + + public function withCredentials($username, $password) + { + $result = clone $this; + $result->username = $username; + $result->password = $password; + + return $result; + } + + public function withWill(Message $will = null) + { + $result = clone $this; + $result->will = $will; + + return $result; + } + + public function withKeepAlive($timeout) + { + $result = clone $this; + $result->keepAlive = $timeout; + + return $result; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/DefaultIdentifierGenerator.php b/instafeed/vendor/binsoul/net-mqtt/src/DefaultIdentifierGenerator.php new file mode 100755 index 0000000..4c21211 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/DefaultIdentifierGenerator.php @@ -0,0 +1,38 @@ +currentIdentifier; + if ($this->currentIdentifier > 0xFFFF) { + $this->currentIdentifier = 1; + } + + return $this->currentIdentifier; + } + + public function generateClientID() + { + if (function_exists('random_bytes')) { + $data = random_bytes(9); + } elseif (function_exists('openssl_random_pseudo_bytes')) { + $data = openssl_random_pseudo_bytes(9); + } else { + $data = ''; + for ($i = 1; $i <= 8; ++$i) { + $data = chr(mt_rand(0, 255)).$data; + } + } + + return 'BNMCR'.bin2hex($data); + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/DefaultMessage.php b/instafeed/vendor/binsoul/net-mqtt/src/DefaultMessage.php new file mode 100755 index 0000000..bc659e9 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/DefaultMessage.php @@ -0,0 +1,119 @@ +topic = $topic; + $this->payload = $payload; + $this->isRetained = $retain; + $this->qosLevel = $qosLevel; + $this->isDuplicate = $isDuplicate; + } + + public function getTopic() + { + return $this->topic; + } + + public function getPayload() + { + return $this->payload; + } + + public function getQosLevel() + { + return $this->qosLevel; + } + + public function isDuplicate() + { + return $this->isDuplicate; + } + + public function isRetained() + { + return $this->isRetained; + } + + public function withTopic($topic) + { + $result = clone $this; + $result->topic = $topic; + + return $result; + } + + public function withPayload($payload) + { + $result = clone $this; + $result->payload = $payload; + + return $result; + } + + public function withQosLevel($level) + { + $result = clone $this; + $result->qosLevel = $level; + + return $result; + } + + public function retain() + { + $result = clone $this; + $result->isRetained = true; + + return $result; + } + + public function release() + { + $result = clone $this; + $result->isRetained = false; + + return $result; + } + + public function duplicate() + { + $result = clone $this; + $result->isDuplicate = true; + + return $result; + } + + public function original() + { + $result = clone $this; + $result->isDuplicate = false; + + return $result; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/DefaultSubscription.php b/instafeed/vendor/binsoul/net-mqtt/src/DefaultSubscription.php new file mode 100755 index 0000000..2fa71ab --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/DefaultSubscription.php @@ -0,0 +1,52 @@ +filter = $filter; + $this->qosLevel = $qosLevel; + } + + public function getFilter() + { + return $this->filter; + } + + public function getQosLevel() + { + return $this->qosLevel; + } + + public function withFilter($filter) + { + $result = clone $this; + $result->filter = $filter; + + return $result; + } + + public function withQosLevel($level) + { + $result = clone $this; + $result->qosLevel = $level; + + return $result; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Exception/EndOfStreamException.php b/instafeed/vendor/binsoul/net-mqtt/src/Exception/EndOfStreamException.php new file mode 100755 index 0000000..3ffc71c --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Exception/EndOfStreamException.php @@ -0,0 +1,10 @@ +isFinished; + } + + public function isSuccess() + { + return $this->isFinished && $this->isSuccess; + } + + public function getResult() + { + return $this->result; + } + + public function getErrorMessage() + { + return $this->error; + } + + /** + * Marks the flow as successful and sets the result. + * + * @param mixed|null $result + */ + protected function succeed($result = null) + { + $this->isFinished = true; + $this->isSuccess = true; + $this->result = $result; + } + + /** + * Marks the flow as failed and sets the error message. + * + * @param string $error + */ + protected function fail($error = '') + { + $this->isFinished = true; + $this->isSuccess = false; + $this->error = $error; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Flow/IncomingPingFlow.php b/instafeed/vendor/binsoul/net-mqtt/src/Flow/IncomingPingFlow.php new file mode 100755 index 0000000..a19a1b0 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Flow/IncomingPingFlow.php @@ -0,0 +1,23 @@ +succeed(); + + return new PingResponsePacket(); + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Flow/IncomingPublishFlow.php b/instafeed/vendor/binsoul/net-mqtt/src/Flow/IncomingPublishFlow.php new file mode 100755 index 0000000..b992c38 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Flow/IncomingPublishFlow.php @@ -0,0 +1,80 @@ +message = $message; + $this->identifier = $identifier; + } + + public function getCode() + { + return 'message'; + } + + public function start() + { + $packet = null; + $emit = true; + if ($this->message->getQosLevel() === 1) { + $packet = new PublishAckPacket(); + } elseif ($this->message->getQosLevel() === 2) { + $packet = new PublishReceivedPacket(); + $emit = false; + } + + if ($packet !== null) { + $packet->setIdentifier($this->identifier); + } + + if ($emit) { + $this->succeed($this->message); + } + + return $packet; + } + + public function accept(Packet $packet) + { + if ($this->message->getQosLevel() !== 2 || $packet->getPacketType() !== Packet::TYPE_PUBREL) { + return false; + } + + /* @var PublishReleasePacket $packet */ + return $packet->getIdentifier() === $this->identifier; + } + + public function next(Packet $packet) + { + $this->succeed($this->message); + + $response = new PublishCompletePacket(); + $response->setIdentifier($this->identifier); + + return $response; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingConnectFlow.php b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingConnectFlow.php new file mode 100755 index 0000000..f439e79 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingConnectFlow.php @@ -0,0 +1,70 @@ +connection = $connection; + + if ($this->connection->getClientID() === '') { + $this->connection = $this->connection->withClientID($generator->generateClientID()); + } + } + + public function getCode() + { + return 'connect'; + } + + public function start() + { + $packet = new ConnectRequestPacket(); + $packet->setProtocolLevel($this->connection->getProtocol()); + $packet->setKeepAlive($this->connection->getKeepAlive()); + $packet->setClientID($this->connection->getClientID()); + $packet->setCleanSession($this->connection->isCleanSession()); + $packet->setUsername($this->connection->getUsername()); + $packet->setPassword($this->connection->getPassword()); + $will = $this->connection->getWill(); + if ($will !== null && $will->getTopic() !== '' && $will->getPayload() !== '') { + $packet->setWill($will->getTopic(), $will->getPayload(), $will->getQosLevel(), $will->isRetained()); + } + + return $packet; + } + + public function accept(Packet $packet) + { + return $packet->getPacketType() === Packet::TYPE_CONNACK; + } + + public function next(Packet $packet) + { + /** @var ConnectResponsePacket $packet */ + if ($packet->isSuccess()) { + $this->succeed($this->connection); + } else { + $this->fail($packet->getErrorName()); + } + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingDisconnectFlow.php b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingDisconnectFlow.php new file mode 100755 index 0000000..fe04c33 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingDisconnectFlow.php @@ -0,0 +1,37 @@ +connection = $connection; + } + + public function getCode() + { + return 'disconnect'; + } + + public function start() + { + $this->succeed($this->connection); + + return new DisconnectRequestPacket(); + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingPingFlow.php b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingPingFlow.php new file mode 100755 index 0000000..8cf79ab --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingPingFlow.php @@ -0,0 +1,32 @@ +getPacketType() === Packet::TYPE_PINGRESP; + } + + public function next(Packet $packet) + { + $this->succeed(); + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingPublishFlow.php b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingPublishFlow.php new file mode 100755 index 0000000..63fe264 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingPublishFlow.php @@ -0,0 +1,102 @@ +message = $message; + if ($this->message->getQosLevel() > 0) { + $this->identifier = $generator->generatePacketID(); + } + } + + public function getCode() + { + return 'publish'; + } + + public function start() + { + $packet = new PublishRequestPacket(); + $packet->setTopic($this->message->getTopic()); + $packet->setPayload($this->message->getPayload()); + $packet->setRetained($this->message->isRetained()); + $packet->setDuplicate($this->message->isDuplicate()); + $packet->setQosLevel($this->message->getQosLevel()); + + if ($this->message->getQosLevel() === 0) { + $this->succeed($this->message); + } else { + $packet->setIdentifier($this->identifier); + } + + return $packet; + } + + public function accept(Packet $packet) + { + if ($this->message->getQosLevel() === 0) { + return false; + } + + $packetType = $packet->getPacketType(); + + if ($packetType === Packet::TYPE_PUBACK && $this->message->getQosLevel() === 1) { + /* @var PublishAckPacket $packet */ + return $packet->getIdentifier() === $this->identifier; + } elseif ($this->message->getQosLevel() === 2) { + if ($packetType === Packet::TYPE_PUBREC) { + /* @var PublishReceivedPacket $packet */ + return $packet->getIdentifier() === $this->identifier; + } elseif ($this->receivedPubRec && $packetType === Packet::TYPE_PUBCOMP) { + /* @var PublishCompletePacket $packet */ + return $packet->getIdentifier() === $this->identifier; + } + } + + return false; + } + + public function next(Packet $packet) + { + $packetType = $packet->getPacketType(); + + if ($packetType === Packet::TYPE_PUBACK || $packetType === Packet::TYPE_PUBCOMP) { + $this->succeed($this->message); + } elseif ($packetType === Packet::TYPE_PUBREC) { + $this->receivedPubRec = true; + + $response = new PublishReleasePacket(); + $response->setIdentifier($this->identifier); + + return $response; + } + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingSubscribeFlow.php b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingSubscribeFlow.php new file mode 100755 index 0000000..4a25517 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingSubscribeFlow.php @@ -0,0 +1,82 @@ +subscriptions = array_values($subscriptions); + $this->identifier = $generator->generatePacketID(); + } + + public function getCode() + { + return 'subscribe'; + } + + public function start() + { + $packet = new SubscribeRequestPacket(); + $packet->setTopic($this->subscriptions[0]->getFilter()); + $packet->setQosLevel($this->subscriptions[0]->getQosLevel()); + $packet->setIdentifier($this->identifier); + + return $packet; + } + + public function accept(Packet $packet) + { + if ($packet->getPacketType() !== Packet::TYPE_SUBACK) { + return false; + } + + /* @var SubscribeResponsePacket $packet */ + return $packet->getIdentifier() === $this->identifier; + } + + public function next(Packet $packet) + { + /* @var SubscribeResponsePacket $packet */ + $returnCodes = $packet->getReturnCodes(); + if (count($returnCodes) !== count($this->subscriptions)) { + throw new \LogicException( + sprintf( + 'SUBACK: Expected %d return codes but got %d.', + count($this->subscriptions), + count($returnCodes) + ) + ); + } + + foreach ($returnCodes as $index => $code) { + if ($packet->isError($code)) { + $this->fail(sprintf('Failed to subscribe to "%s".', $this->subscriptions[$index]->getFilter())); + + return; + } + } + + $this->succeed($this->subscriptions[0]); + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingUnsubscribeFlow.php b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingUnsubscribeFlow.php new file mode 100755 index 0000000..4949ff3 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Flow/OutgoingUnsubscribeFlow.php @@ -0,0 +1,61 @@ +subscriptions = array_values($subscriptions); + $this->identifier = $generator->generatePacketID(); + } + + public function getCode() + { + return 'unsubscribe'; + } + + public function start() + { + $packet = new UnsubscribeRequestPacket(); + $packet->setTopic($this->subscriptions[0]->getFilter()); + $packet->setIdentifier($this->identifier); + + return $packet; + } + + public function accept(Packet $packet) + { + if ($packet->getPacketType() !== Packet::TYPE_UNSUBACK) { + return false; + } + + /* @var UnsubscribeResponsePacket $packet */ + return $packet->getIdentifier() === $this->identifier; + } + + public function next(Packet $packet) + { + $this->succeed($this->subscriptions[0]); + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/IdentifierGenerator.php b/instafeed/vendor/binsoul/net-mqtt/src/IdentifierGenerator.php new file mode 100755 index 0000000..94c7c78 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/IdentifierGenerator.php @@ -0,0 +1,23 @@ +write($output); + + return $output->getData(); + } + + public function read(PacketStream $stream) + { + $byte = $stream->readByte(); + + if ($byte >> 4 !== static::$packetType) { + throw new MalformedPacketException( + sprintf( + 'Expected packet type %02x but got %02x.', + $byte >> 4, + static::$packetType + ) + ); + } + + $this->packetFlags = $byte & 0x0F; + $this->readRemainingLength($stream); + } + + public function write(PacketStream $stream) + { + $stream->writeByte(((static::$packetType & 0x0F) << 4) + ($this->packetFlags & 0x0F)); + $this->writeRemainingLength($stream); + } + + /** + * Reads the remaining length from the given stream. + * + * @param PacketStream $stream + * + * @throws MalformedPacketException + */ + private function readRemainingLength(PacketStream $stream) + { + $this->remainingPacketLength = 0; + $multiplier = 1; + + do { + $encodedByte = $stream->readByte(); + + $this->remainingPacketLength += ($encodedByte & 127) * $multiplier; + $multiplier *= 128; + + if ($multiplier > 128 * 128 * 128 * 128) { + throw new MalformedPacketException('Malformed remaining length.'); + } + } while (($encodedByte & 128) !== 0); + } + + /** + * Writes the remaining length to the given stream. + * + * @param PacketStream $stream + */ + private function writeRemainingLength(PacketStream $stream) + { + $x = $this->remainingPacketLength; + do { + $encodedByte = $x % 128; + $x = (int) ($x / 128); + if ($x > 0) { + $encodedByte |= 128; + } + + $stream->writeByte($encodedByte); + } while ($x > 0); + } + + public function getPacketType() + { + return static::$packetType; + } + + /** + * Returns the packet flags. + * + * @return int + */ + public function getPacketFlags() + { + return $this->packetFlags; + } + + /** + * Returns the remaining length. + * + * @return int + */ + public function getRemainingPacketLength() + { + return $this->remainingPacketLength; + } + + /** + * Asserts that the packet flags have a specific value. + * + * @param int $value + * @param bool $fromPacket + * + * @throws MalformedPacketException + * @throws \InvalidArgumentException + */ + protected function assertPacketFlags($value, $fromPacket = true) + { + if ($this->packetFlags !== $value) { + $this->throwException( + sprintf( + 'Expected flags %02x but got %02x.', + $value, + $this->packetFlags + ), + $fromPacket + ); + } + } + + /** + * Asserts that the remaining length is greater than zero and has a specific value. + * + * @param int|null $value value to test or null if any value greater than zero is valid + * @param bool $fromPacket + * + * @throws MalformedPacketException + * @throws \InvalidArgumentException + */ + protected function assertRemainingPacketLength($value = null, $fromPacket = true) + { + if ($value === null && $this->remainingPacketLength === 0) { + $this->throwException('Expected payload but remaining packet length is zero.', $fromPacket); + } + + if ($value !== null && $this->remainingPacketLength !== $value) { + $this->throwException( + sprintf( + 'Expected remaining packet length of %d bytes but got %d.', + $value, + $this->remainingPacketLength + ), + $fromPacket + ); + } + } + + /** + * Asserts that the given string is a well-formed MQTT string. + * + * @param string $value + * @param bool $fromPacket + * + * @throws MalformedPacketException + * @throws \InvalidArgumentException + */ + protected function assertValidStringLength($value, $fromPacket = true) + { + if (strlen($value) > 0xFFFF) { + $this->throwException( + sprintf( + 'The string "%s" is longer than 65535 byte.', + substr($value, 0, 50) + ), + $fromPacket + ); + } + } + + /** + * Asserts that the given string is a well-formed MQTT string. + * + * @param string $value + * @param bool $fromPacket + * + * @throws MalformedPacketException + * @throws \InvalidArgumentException + */ + protected function assertValidString($value, $fromPacket = true) + { + $this->assertValidStringLength($value, $fromPacket); + + if (!mb_check_encoding($value, 'UTF-8')) { + $this->throwException( + sprintf( + 'The string "%s" is not well-formed UTF-8.', + substr($value, 0, 50) + ), + $fromPacket + ); + } + + if (preg_match('/[\xD8-\xDF][\x00-\xFF]|\x00\x00/x', $value)) { + $this->throwException( + sprintf( + 'The string "%s" contains invalid characters.', + substr($value, 0, 50) + ), + $fromPacket + ); + } + } + + /** + * Asserts that the given quality of service level is valid. + * + * @param int $level + * @param bool $fromPacket + * + * @throws MalformedPacketException + * @throws \InvalidArgumentException + */ + protected function assertValidQosLevel($level, $fromPacket = true) + { + if ($level < 0 || $level > 2) { + $this->throwException( + sprintf( + 'Expected a quality of service level between 0 and 2 but got %d.', + $level + ), + $fromPacket + ); + } + } + + /** + * Throws a MalformedPacketException for packet validation and an InvalidArgumentException otherwise. + * + * @param string $message + * @param bool $fromPacket + * + * @throws MalformedPacketException + * @throws \InvalidArgumentException + */ + protected function throwException($message, $fromPacket) + { + if ($fromPacket) { + throw new MalformedPacketException($message); + } + + throw new \InvalidArgumentException($message); + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/ConnectRequestPacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/ConnectRequestPacket.php new file mode 100755 index 0000000..7abce1f --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/ConnectRequestPacket.php @@ -0,0 +1,405 @@ +assertPacketFlags(0); + $this->assertRemainingPacketLength(); + + $this->protocolName = $stream->readString(); + $this->protocolLevel = $stream->readByte(); + $this->flags = $stream->readByte(); + $this->keepAlive = $stream->readWord(); + $this->clientID = $stream->readString(); + + if ($this->hasWill()) { + $this->willTopic = $stream->readString(); + $this->willMessage = $stream->readString(); + } + + if ($this->hasUsername()) { + $this->username = $stream->readString(); + } + + if ($this->hasPassword()) { + $this->password = $stream->readString(); + } + + $this->assertValidWill(); + $this->assertValidString($this->clientID); + $this->assertValidString($this->willTopic); + $this->assertValidString($this->username); + } + + public function write(PacketStream $stream) + { + if ($this->clientID === '') { + $this->clientID = 'BinSoul'.mt_rand(100000, 999999); + } + + $data = new PacketStream(); + + $data->writeString($this->protocolName); + $data->writeByte($this->protocolLevel); + $data->writeByte($this->flags); + $data->writeWord($this->keepAlive); + $data->writeString($this->clientID); + + if ($this->hasWill()) { + $data->writeString($this->willTopic); + $data->writeString($this->willMessage); + } + + if ($this->hasUsername()) { + $data->writeString($this->username); + } + + if ($this->hasPassword()) { + $data->writeString($this->password); + } + + $this->remainingPacketLength = $data->length(); + + parent::write($stream); + $stream->write($data->getData()); + } + + /** + * Returns the protocol level. + * + * @return int + */ + public function getProtocolLevel() + { + return $this->protocolLevel; + } + + /** + * Sets the protocol level. + * + * @param int $value + * + * @throws \InvalidArgumentException + */ + public function setProtocolLevel($value) + { + if ($value < 3 || $value > 4) { + throw new \InvalidArgumentException(sprintf('Unknown protocol level %d.', $value)); + } + + $this->protocolLevel = $value; + if ($this->protocolLevel === 3) { + $this->protocolName = 'MQIsdp'; + } elseif ($this->protocolLevel === 4) { + $this->protocolName = 'MQTT'; + } + } + + /** + * Returns the client id. + * + * @return string + */ + public function getClientID() + { + return $this->clientID; + } + + /** + * Sets the client id. + * + * @param string $value + */ + public function setClientID($value) + { + $this->clientID = $value; + } + + /** + * Returns the keep alive time in seconds. + * + * @return int + */ + public function getKeepAlive() + { + return $this->keepAlive; + } + + /** + * Sets the keep alive time in seconds. + * + * @param int $value + * + * @throws \InvalidArgumentException + */ + public function setKeepAlive($value) + { + if ($value > 65535) { + throw new \InvalidArgumentException( + sprintf( + 'Expected a keep alive time lower than 65535 but got %d.', + $value + ) + ); + } + + $this->keepAlive = $value; + } + + /** + * Indicates if the clean session flag is set. + * + * @return bool + */ + public function isCleanSession() + { + return ($this->flags & 2) === 2; + } + + /** + * Changes the clean session flag. + * + * @param bool $value + */ + public function setCleanSession($value) + { + if ($value) { + $this->flags |= 2; + } else { + $this->flags &= ~2; + } + } + + /** + * Indicates if a will is set. + * + * @return bool + */ + public function hasWill() + { + return ($this->flags & 4) === 4; + } + + /** + * Returns the desired quality of service level of the will. + * + * @return int + */ + public function getWillQosLevel() + { + return ($this->flags & 24) >> 3; + } + + /** + * Indicates if the will should be retained. + * + * @return bool + */ + public function isWillRetained() + { + return ($this->flags & 32) === 32; + } + + /** + * Returns the will topic. + * + * @return string + */ + public function getWillTopic() + { + return $this->willTopic; + } + + /** + * Returns the will message. + * + * @return string + */ + public function getWillMessage() + { + return $this->willMessage; + } + + /** + * Sets the will. + * + * @param string $topic + * @param string $message + * @param int $qosLevel + * @param bool $isRetained + * + * @throws \InvalidArgumentException + */ + public function setWill($topic, $message, $qosLevel = 0, $isRetained = false) + { + $this->assertValidString($topic, false); + if ($topic === '') { + throw new \InvalidArgumentException('The topic must not be empty.'); + } + + $this->assertValidStringLength($message, false); + if ($message === '') { + throw new \InvalidArgumentException('The message must not be empty.'); + } + + $this->assertValidQosLevel($qosLevel, false); + + $this->willTopic = $topic; + $this->willMessage = $message; + + $this->flags |= 4; + $this->flags |= ($qosLevel << 3); + + if ($isRetained) { + $this->flags |= 32; + } else { + $this->flags &= ~32; + } + } + + /** + * Removes the will. + */ + public function removeWill() + { + $this->flags &= ~60; + $this->willTopic = ''; + $this->willMessage = ''; + } + + /** + * Indicates if a username is set. + * + * @return bool + */ + public function hasUsername() + { + return $this->flags & 64; + } + + /** + * Returns the username. + * + * @return string + */ + public function getUsername() + { + return $this->username; + } + + /** + * Sets the username. + * + * @param string $value + * + * @throws \InvalidArgumentException + */ + public function setUsername($value) + { + $this->assertValidString($value, false); + + $this->username = $value; + if ($this->username !== '') { + $this->flags |= 64; + } else { + $this->flags &= ~64; + } + } + + /** + * Indicates if a password is set. + * + * @return bool + */ + public function hasPassword() + { + return $this->flags & 128; + } + + /** + * Returns the password. + * + * @return string + */ + public function getPassword() + { + return $this->password; + } + + /** + * Sets the password. + * + * @param string $value + * + * @throws \InvalidArgumentException + */ + public function setPassword($value) + { + $this->assertValidStringLength($value, false); + + $this->password = $value; + if ($this->password !== '') { + $this->flags |= 128; + } else { + $this->flags &= ~128; + } + } + + /** + * Asserts that all will flags and quality of service are correct. + * + * @throws MalformedPacketException + */ + private function assertValidWill() + { + if ($this->hasWill()) { + $this->assertValidQosLevel($this->getWillQosLevel(), true); + } else { + if ($this->getWillQosLevel() > 0) { + $this->throwException( + sprintf( + 'Expected a will quality of service level of zero but got %d.', + $this->getWillQosLevel() + ), + true + ); + } + + if ($this->isWillRetained()) { + $this->throwException('There is not will but the will retain flag is set.', true); + } + } + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/ConnectResponsePacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/ConnectResponsePacket.php new file mode 100755 index 0000000..f896d22 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/ConnectResponsePacket.php @@ -0,0 +1,111 @@ + [ + 'Connection accepted', + '', + ], + 1 => [ + 'Unacceptable protocol version', + 'The Server does not support the level of the MQTT protocol requested by the client.', + ], + 2 => [ + 'Identifier rejected', + 'The client identifier is correct UTF-8 but not allowed by the server.', + ], + 3 => [ + 'Server unavailable', + 'The network connection has been made but the MQTT service is unavailable', + ], + 4 => [ + 'Bad user name or password', + 'The data in the user name or password is malformed.', + ], + 5 => [ + 'Not authorized', + 'The client is not authorized to connect.', + ], + ]; + + /** @var int */ + private $flags = 0; + /** @var int */ + private $returnCode; + + protected static $packetType = Packet::TYPE_CONNACK; + protected $remainingPacketLength = 2; + + public function read(PacketStream $stream) + { + parent::read($stream); + $this->assertPacketFlags(0); + $this->assertRemainingPacketLength(2); + + $this->flags = $stream->readByte(); + $this->returnCode = $stream->readByte(); + } + + public function write(PacketStream $stream) + { + $this->remainingPacketLength = 2; + parent::write($stream); + + $stream->writeByte($this->flags); + $stream->writeByte($this->returnCode); + } + + /** + * Returns the return code. + * + * @return int + */ + public function getReturnCode() + { + return $this->returnCode; + } + + /** + * Indicates if the connection was successful. + * + * @return bool + */ + public function isSuccess() + { + return $this->returnCode === 0; + } + + /** + * Indicates if the connection failed. + * + * @return bool + */ + public function isError() + { + return $this->returnCode > 0; + } + + /** + * Returns a string representation of the returned error code. + * + * @return int + */ + public function getErrorName() + { + if (isset(self::$returnCodes[$this->returnCode])) { + return self::$returnCodes[$this->returnCode][0]; + } + + return 'Error '.$this->returnCode; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/DisconnectRequestPacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/DisconnectRequestPacket.php new file mode 100755 index 0000000..0cda785 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/DisconnectRequestPacket.php @@ -0,0 +1,22 @@ +assertPacketFlags(0); + $this->assertRemainingPacketLength(0); + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/IdentifiablePacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/IdentifiablePacket.php new file mode 100755 index 0000000..a44ae1c --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/IdentifiablePacket.php @@ -0,0 +1,62 @@ +identifier === null) { + ++self::$nextIdentifier; + self::$nextIdentifier &= 0xFFFF; + + $this->identifier = self::$nextIdentifier; + } + + return $this->identifier; + } + + /** + * Returns the identifier. + * + * @return int|null + */ + public function getIdentifier() + { + return $this->identifier; + } + + /** + * Sets the identifier. + * + * @param int|null $value + * + * @throws \InvalidArgumentException + */ + public function setIdentifier($value) + { + if ($value !== null && ($value < 0 || $value > 0xFFFF)) { + throw new \InvalidArgumentException( + sprintf( + 'Expected an identifier between 0x0000 and 0xFFFF but got %x', + $value + ) + ); + } + + $this->identifier = $value; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/IdentifierOnlyPacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/IdentifierOnlyPacket.php new file mode 100755 index 0000000..01dffa5 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/IdentifierOnlyPacket.php @@ -0,0 +1,42 @@ +assertPacketFlags($this->getExpectedPacketFlags()); + $this->assertRemainingPacketLength(2); + + $this->identifier = $stream->readWord(); + } + + public function write(PacketStream $stream) + { + $this->remainingPacketLength = 2; + parent::write($stream); + + $stream->writeWord($this->generateIdentifier()); + } + + /** + * Returns the expected packet flags. + * + * @return int + */ + protected function getExpectedPacketFlags() + { + return 0; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/PingRequestPacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/PingRequestPacket.php new file mode 100755 index 0000000..cb0fc58 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/PingRequestPacket.php @@ -0,0 +1,22 @@ +assertPacketFlags(0); + $this->assertRemainingPacketLength(0); + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/PingResponsePacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/PingResponsePacket.php new file mode 100755 index 0000000..79eaeb3 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/PingResponsePacket.php @@ -0,0 +1,22 @@ +assertPacketFlags(0); + $this->assertRemainingPacketLength(0); + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/PublishAckPacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/PublishAckPacket.php new file mode 100755 index 0000000..fc4937e --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/PublishAckPacket.php @@ -0,0 +1,13 @@ +assertRemainingPacketLength(); + + $originalPosition = $stream->getPosition(); + $this->topic = $stream->readString(); + $this->identifier = null; + if ($this->getQosLevel() > 0) { + $this->identifier = $stream->readWord(); + } + + $payloadLength = $this->remainingPacketLength - ($stream->getPosition() - $originalPosition); + $this->payload = $stream->read($payloadLength); + + $this->assertValidQosLevel($this->getQosLevel()); + $this->assertValidString($this->topic); + } + + public function write(PacketStream $stream) + { + $data = new PacketStream(); + + $data->writeString($this->topic); + if ($this->getQosLevel() > 0) { + $data->writeWord($this->generateIdentifier()); + } + + $data->write($this->payload); + + $this->remainingPacketLength = $data->length(); + + parent::write($stream); + $stream->write($data->getData()); + } + + /** + * Returns the topic. + * + * @return string + */ + public function getTopic() + { + return $this->topic; + } + + /** + * Sets the topic. + * + * @param string $value + * + * @throws \InvalidArgumentException + */ + public function setTopic($value) + { + $this->assertValidString($value, false); + if ($value === '') { + throw new \InvalidArgumentException('The topic must not be empty.'); + } + + $this->topic = $value; + } + + /** + * Returns the payload. + * + * @return string + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Sets the payload. + * + * @param string $value + */ + public function setPayload($value) + { + $this->payload = $value; + } + + /** + * Indicates if the packet is a duplicate. + * + * @return bool + */ + public function isDuplicate() + { + return ($this->packetFlags & 8) === 8; + } + + /** + * Marks the packet as duplicate. + * + * @param bool $value + */ + public function setDuplicate($value) + { + if ($value) { + $this->packetFlags |= 8; + } else { + $this->packetFlags &= ~8; + } + } + + /** + * Indicates if the packet is retained. + * + * @return bool + */ + public function isRetained() + { + return ($this->packetFlags & 1) === 1; + } + + /** + * Marks the packet as retained. + * + * @param bool $value + */ + public function setRetained($value) + { + if ($value) { + $this->packetFlags |= 1; + } else { + $this->packetFlags &= ~1; + } + } + + /** + * Returns the quality of service level. + * + * @return int + */ + public function getQosLevel() + { + return ($this->packetFlags & 6) >> 1; + } + + /** + * Sets the quality of service level. + * + * @param int $value + * + * @throws \InvalidArgumentException + */ + public function setQosLevel($value) + { + $this->assertValidQosLevel($value, false); + + $this->packetFlags |= ($value & 3) << 1; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/StrictConnectRequestPacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/StrictConnectRequestPacket.php new file mode 100755 index 0000000..71e8c78 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/StrictConnectRequestPacket.php @@ -0,0 +1,66 @@ +assertValidClientID($this->clientID, true); + } + + /** + * Sets the client id. + * + * @param string $value + * + * @throws \InvalidArgumentException + */ + public function setClientID($value) + { + $this->assertValidClientID($value, false); + + $this->clientID = $value; + } + + /** + * Asserts that a client id is shorter than 24 bytes and only contains characters 0-9, a-z or A-Z. + * + * @param string $value + * @param bool $fromPacket + * + * @throws MalformedPacketException + * @throws \InvalidArgumentException + */ + private function assertValidClientID($value, $fromPacket) + { + + if (strlen($value) > 23) { + $this->throwException( + sprintf( + 'Expected client id shorter than 24 bytes but got "%s".', + $value + ), + $fromPacket + ); + } + + if ($value !== '' && !ctype_alnum($value)) { + $this->throwException( + sprintf( + 'Expected a client id containing characters 0-9, a-z or A-Z but got "%s".', + $value + ), + $fromPacket + ); + } + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/SubscribeRequestPacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/SubscribeRequestPacket.php new file mode 100755 index 0000000..55aa831 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/SubscribeRequestPacket.php @@ -0,0 +1,101 @@ +assertPacketFlags(2); + $this->assertRemainingPacketLength(); + + $this->identifier = $stream->readWord(); + $this->topic = $stream->readString(); + $this->qosLevel = $stream->readByte(); + + $this->assertValidQosLevel($this->qosLevel); + $this->assertValidString($this->topic); + } + + public function write(PacketStream $stream) + { + $data = new PacketStream(); + + $data->writeWord($this->generateIdentifier()); + $data->writeString($this->topic); + $data->writeByte($this->qosLevel); + + $this->remainingPacketLength = $data->length(); + + parent::write($stream); + $stream->write($data->getData()); + } + + /** + * Returns the topic. + * + * @return string + */ + public function getTopic() + { + return $this->topic; + } + + /** + * Sets the topic. + * + * @param string $value + * + * @throws \InvalidArgumentException + */ + public function setTopic($value) + { + $this->assertValidString($value, false); + if ($value === '') { + throw new \InvalidArgumentException('The topic must not be empty.'); + } + + $this->topic = $value; + } + + /** + * Returns the quality of service level. + * + * @return int + */ + public function getQosLevel() + { + return $this->qosLevel; + } + + /** + * Sets the quality of service level. + * + * @param int $value + * + * @throws \InvalidArgumentException + */ + public function setQosLevel($value) + { + $this->assertValidQosLevel($value, false); + + $this->qosLevel = $value; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/SubscribeResponsePacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/SubscribeResponsePacket.php new file mode 100755 index 0000000..35c78e4 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/SubscribeResponsePacket.php @@ -0,0 +1,132 @@ + ['Maximum QoS 0'], + 1 => ['Maximum QoS 1'], + 2 => ['Maximum QoS 2'], + 128 => ['Failure'], + ]; + + /** @var int[] */ + private $returnCodes; + + protected static $packetType = Packet::TYPE_SUBACK; + + public function read(PacketStream $stream) + { + parent::read($stream); + $this->assertPacketFlags(0); + $this->assertRemainingPacketLength(); + + $this->identifier = $stream->readWord(); + + $returnCodeLength = $this->remainingPacketLength - 2; + for ($n = 0; $n < $returnCodeLength; ++$n) { + $returnCode = $stream->readByte(); + $this->assertValidReturnCode($returnCode); + + $this->returnCodes[] = $returnCode; + } + } + + public function write(PacketStream $stream) + { + $data = new PacketStream(); + + $data->writeWord($this->generateIdentifier()); + foreach ($this->returnCodes as $returnCode) { + $data->writeByte($returnCode); + } + + $this->remainingPacketLength = $data->length(); + + parent::write($stream); + $stream->write($data->getData()); + } + + /** + * Indicates if the given return code is an error. + * + * @param int $returnCode + * + * @return bool + */ + public function isError($returnCode) + { + return $returnCode === 128; + } + + /** + * Indicates if the given return code is an error. + * + * @param int $returnCode + * + * @return bool + */ + public function getReturnCodeName($returnCode) + { + if (isset(self::$qosLevels[$returnCode])) { + return self::$qosLevels[$returnCode][0]; + } + + return 'Unknown '.$returnCode; + } + + /** + * Returns the return codes. + * + * @return int[] + */ + public function getReturnCodes() + { + return $this->returnCodes; + } + + /** + * Sets the return codes. + * + * @param int[] $value + * + * @throws \InvalidArgumentException + */ + public function setReturnCodes(array $value) + { + foreach ($value as $returnCode) { + $this->assertValidReturnCode($returnCode, false); + } + + $this->returnCodes = $value; + } + + /** + * Asserts that a return code is valid. + * + * @param int $returnCode + * @param bool $fromPacket + * + * @throws MalformedPacketException + * @throws \InvalidArgumentException + */ + private function assertValidReturnCode($returnCode, $fromPacket = true) + { + if (!in_array($returnCode, [0, 1, 2, 128])) { + $this->throwException( + sprintf('Malformed return code %02x.', $returnCode), + $fromPacket + ); + } + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/UnsubscribeRequestPacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/UnsubscribeRequestPacket.php new file mode 100755 index 0000000..4bce38c --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/UnsubscribeRequestPacket.php @@ -0,0 +1,68 @@ +assertPacketFlags(2); + $this->assertRemainingPacketLength(); + + $originalPosition = $stream->getPosition(); + + do { + $this->identifier = $stream->readWord(); + $this->topic = $stream->readString(); + } while (($stream->getPosition() - $originalPosition) <= $this->remainingPacketLength); + } + + public function write(PacketStream $stream) + { + $data = new PacketStream(); + + $data->writeWord($this->generateIdentifier()); + $data->writeString($this->topic); + + $this->remainingPacketLength = $data->length(); + + parent::write($stream); + $stream->write($data->getData()); + } + + /** + * Returns the topic. + * + * @return string + */ + public function getTopic() + { + return $this->topic; + } + + /** + * Sets the topic. + * + * @param string $value + */ + public function setTopic($value) + { + $this->topic = $value; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Packet/UnsubscribeResponsePacket.php b/instafeed/vendor/binsoul/net-mqtt/src/Packet/UnsubscribeResponsePacket.php new file mode 100755 index 0000000..385b91d --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Packet/UnsubscribeResponsePacket.php @@ -0,0 +1,13 @@ + ConnectRequestPacket::class, + Packet::TYPE_CONNACK => ConnectResponsePacket::class, + Packet::TYPE_PUBLISH => PublishRequestPacket::class, + Packet::TYPE_PUBACK => PublishAckPacket::class, + Packet::TYPE_PUBREC => PublishReceivedPacket::class, + Packet::TYPE_PUBREL => PublishReleasePacket::class, + Packet::TYPE_PUBCOMP => PublishCompletePacket::class, + Packet::TYPE_SUBSCRIBE => SubscribeRequestPacket::class, + Packet::TYPE_SUBACK => SubscribeResponsePacket::class, + Packet::TYPE_UNSUBSCRIBE => UnsubscribeRequestPacket::class, + Packet::TYPE_UNSUBACK => UnsubscribeResponsePacket::class, + Packet::TYPE_PINGREQ => PingRequestPacket::class, + Packet::TYPE_PINGRESP => PingResponsePacket::class, + Packet::TYPE_DISCONNECT => DisconnectRequestPacket::class, + ]; + + /** + * Builds a packet object for the given type. + * + * @param int $type + * + * @throws UnknownPacketTypeException + * + * @return Packet + */ + public function build($type) + { + if (!isset(self::$mapping[$type])) { + throw new UnknownPacketTypeException(sprintf('Unknown packet type %d.', $type)); + } + + $class = self::$mapping[$type]; + + return new $class(); + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/PacketStream.php b/instafeed/vendor/binsoul/net-mqtt/src/PacketStream.php new file mode 100755 index 0000000..eb241d6 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/PacketStream.php @@ -0,0 +1,216 @@ +data = $data; + $this->position = 0; + } + + /** + * @return string + */ + public function __toString() + { + return $this->data; + } + + /** + * Returns the desired number of bytes. + * + * @param int $count + * + * @throws EndOfStreamException + * + * @return string + */ + public function read($count) + { + $contentLength = strlen($this->data); + if ($this->position > $contentLength || $count > $contentLength - $this->position) { + throw new EndOfStreamException( + sprintf( + 'End of stream reached when trying to read %d bytes. content length=%d, position=%d', + $count, + $contentLength, + $this->position + ) + ); + } + + $chunk = substr($this->data, $this->position, $count); + if ($chunk === false) { + $chunk = ''; + } + + $readBytes = strlen($chunk); + $this->position += $readBytes; + + return $chunk; + } + + /** + * Returns a single byte. + * + * @return int + */ + public function readByte() + { + return ord($this->read(1)); + } + + /** + * Returns a single word. + * + * @return int + */ + public function readWord() + { + return ($this->readByte() << 8) + $this->readByte(); + } + + /** + * Returns a length prefixed string. + * + * @return string + */ + public function readString() + { + $length = $this->readWord(); + + return $this->read($length); + } + + /** + * Appends the given value. + * + * @param string $value + */ + public function write($value) + { + $this->data .= $value; + } + + /** + * Appends a single byte. + * + * @param int $value + */ + public function writeByte($value) + { + $this->write(chr($value)); + } + + /** + * Appends a single word. + * + * @param int $value + */ + public function writeWord($value) + { + $this->write(chr(($value & 0xFFFF) >> 8)); + $this->write(chr($value & 0xFF)); + } + + /** + * Appends a length prefixed string. + * + * @param string $string + */ + public function writeString($string) + { + $this->writeWord(strlen($string)); + $this->write($string); + } + + /** + * Returns the length of the stream. + * + * @return int + */ + public function length() + { + return strlen($this->data); + } + + /** + * Returns the number of bytes until the end of the stream. + * + * @return int + */ + public function getRemainingBytes() + { + return $this->length() - $this->position; + } + + /** + * Returns the whole content of the stream. + * + * @return string + */ + public function getData() + { + return $this->data; + } + + /** + * Changes the internal position of the stream relative to the current position. + * + * @param int $offset + */ + public function seek($offset) + { + $this->position += $offset; + } + + /** + * Returns the internal position of the stream. + * + * @return int + */ + public function getPosition() + { + return $this->position; + } + + /** + * Sets the internal position of the stream. + * + * @param int $value + */ + public function setPosition($value) + { + $this->position = $value; + } + + /** + * Removes all bytes from the beginning to the current position. + */ + public function cut() + { + $this->data = substr($this->data, $this->position); + if ($this->data === false) { + $this->data = ''; + } + + $this->position = 0; + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/StreamParser.php b/instafeed/vendor/binsoul/net-mqtt/src/StreamParser.php new file mode 100755 index 0000000..398f3e6 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/StreamParser.php @@ -0,0 +1,90 @@ +buffer = new PacketStream(); + $this->factory = new PacketFactory(); + } + + /** + * Registers an error callback. + * + * @param callable $callback + */ + public function onError($callback) + { + $this->errorCallback = $callback; + } + + /** + * Appends the given data to the internal buffer and parses it. + * + * @param string $data + * + * @return Packet[] + */ + public function push($data) + { + $this->buffer->write($data); + + $result = []; + while ($this->buffer->getRemainingBytes() > 0) { + $type = $this->buffer->readByte() >> 4; + try { + $packet = $this->factory->build($type); + } catch (UnknownPacketTypeException $e) { + $this->handleError($e); + continue; + } + + $this->buffer->seek(-1); + $position = $this->buffer->getPosition(); + try { + $packet->read($this->buffer); + $result[] = $packet; + $this->buffer->cut(); + } catch (EndOfStreamException $e) { + $this->buffer->setPosition($position); + break; + } catch (MalformedPacketException $e) { + $this->handleError($e); + } + } + + return $result; + } + + /** + * Executes the registered error callback. + * + * @param \Throwable $exception + */ + private function handleError($exception) + { + if ($this->errorCallback !== null) { + $callback = $this->errorCallback; + $callback($exception); + } + } +} diff --git a/instafeed/vendor/binsoul/net-mqtt/src/Subscription.php b/instafeed/vendor/binsoul/net-mqtt/src/Subscription.php new file mode 100755 index 0000000..b870533 --- /dev/null +++ b/instafeed/vendor/binsoul/net-mqtt/src/Subscription.php @@ -0,0 +1,41 @@ + + */ +class TopicMatcher +{ + /** + * Check if the given topic matches the filter. + * + * @param string $filter e.g. A/B/+, A/B/# + * @param string $topic e.g. A/B/C, A/B/foo/bar/baz + * + * @return bool true if topic matches the pattern + */ + public function matches($filter, $topic) + { + // Created by Steffen (https://github.com/kernelguy) + $tokens = explode('/', $filter); + $parts = []; + for ($i = 0, $count = count($tokens); $i < $count; ++$i) { + $token = $tokens[$i]; + switch ($token) { + case '+': + $parts[] = '[^/#\+]*'; + + break; + case '#': + if ($i === 0) { + $parts[] = '[^\+\$]*'; + } else { + $parts[] = '[^\+]*'; + } + + break; + default: + $parts[] = str_replace('+', '\+', $token); + + break; + } + } + + $regex = implode('/', $parts); + $regex = str_replace('$', '\$', $regex); + $regex = ';^'.$regex.'$;'; + + return preg_match($regex, $topic) === 1; + } +} diff --git a/instafeed/vendor/clue/http-proxy-react/.gitignore b/instafeed/vendor/clue/http-proxy-react/.gitignore new file mode 100755 index 0000000..4fbb073 --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/.gitignore @@ -0,0 +1,2 @@ +/vendor/ +/composer.lock diff --git a/instafeed/vendor/clue/http-proxy-react/.travis.yml b/instafeed/vendor/clue/http-proxy-react/.travis.yml new file mode 100755 index 0000000..04f51ad --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/.travis.yml @@ -0,0 +1,27 @@ +language: php + +php: +# - 5.3 # requires old distro, see below + - 5.4 + - 5.5 + - 5.6 + - 7 + - hhvm # ignore errors, see below + +# lock distro so new future defaults will not break the build +dist: trusty + +matrix: + include: + - php: 5.3 + dist: precise + allow_failures: + - php: hhvm + +sudo: false + +install: + - composer install --no-interaction + +script: + - vendor/bin/phpunit --coverage-text diff --git a/instafeed/vendor/clue/http-proxy-react/CHANGELOG.md b/instafeed/vendor/clue/http-proxy-react/CHANGELOG.md new file mode 100755 index 0000000..3d25812 --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/CHANGELOG.md @@ -0,0 +1,103 @@ +# Changelog + +## 1.3.0 (2018-02-13) + +* Feature: Support communication over Unix domain sockets (UDS) + (#20 by @clue) + + ```php + // new: now supports communication over Unix domain sockets (UDS) + $proxy = new ProxyConnector('http+unix:///tmp/proxy.sock', $connector); + ``` + +* Reduce memory consumption by avoiding circular reference from stream reader + (#18 by @valga) + +* Improve documentation + (#19 by @clue) + +## 1.2.0 (2017-08-30) + +* Feature: Use socket error codes for connection rejections + (#17 by @clue) + + ```php + $promise = $proxy->connect('imap.example.com:143'); + $promise->then(null, function (Exeption $e) { + if ($e->getCode() === SOCKET_EACCES) { + echo 'Failed to authenticate with proxy!'; + } + throw $e; + }); + ``` + +* Improve test suite by locking Travis distro so new defaults will not break the build and + optionally exclude tests that rely on working internet connection + (#15 and #16 by @clue) + +## 1.1.0 (2017-06-11) + +* Feature: Support proxy authentication if proxy URL contains username/password + (#14 by @clue) + + ```php + // new: username/password will now be passed to HTTP proxy server + $proxy = new ProxyConnector('user:pass@127.0.0.1:8080', $connector); + ``` + +## 1.0.0 (2017-06-10) + +* First stable release, now following SemVer + +> Contains no other changes, so it's actually fully compatible with the v0.3.2 release. + +## 0.3.2 (2017-06-10) + +* Fix: Fix rejecting invalid URIs and unexpected URI schemes + (#13 by @clue) + +* Fix HHVM build for now again and ignore future HHVM build errors + (#12 by @clue) + +* Documentation for Connector concepts (TCP/TLS, timeouts, DNS resolution) + (#11 by @clue) + +## 0.3.1 (2017-05-10) + +* Feature: Forward compatibility with upcoming Socket v1.0 and v0.8 + (#10 by @clue) + +## 0.3.0 (2017-04-10) + +* Feature / BC break: Replace deprecated SocketClient with new Socket component + (#9 by @clue) + + This implies that the `ProxyConnector` from this package now implements the + `React\Socket\ConnectorInterface` instead of the legacy + `React\SocketClient\ConnectorInterface`. + +## 0.2.0 (2017-04-10) + +* Feature / BC break: Update SocketClient to v0.7 or v0.6 and + use `connect($uri)` instead of `create($host, $port)` + (#8 by @clue) + + ```php + // old + $connector->create($host, $port)->then(function (Stream $conn) { + $conn->write("…"); + }); + + // new + $connector->connect($uri)->then(function (ConnectionInterface $conn) { + $conn->write("…"); + }); + ``` + +* Improve test suite by adding PHPUnit to require-dev + (#7 by @clue) + + +## 0.1.0 (2016-11-01) + +* First tagged release diff --git a/instafeed/vendor/clue/http-proxy-react/LICENSE b/instafeed/vendor/clue/http-proxy-react/LICENSE new file mode 100755 index 0000000..7baae8e --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Christian Lück + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/instafeed/vendor/clue/http-proxy-react/README.md b/instafeed/vendor/clue/http-proxy-react/README.md new file mode 100755 index 0000000..442b7f9 --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/README.md @@ -0,0 +1,422 @@ +# clue/http-proxy-react [![Build Status](https://travis-ci.org/clue/php-http-proxy-react.svg?branch=master)](https://travis-ci.org/clue/php-http-proxy-react) + +Async HTTP proxy connector, use any TCP/IP-based protocol through an HTTP +CONNECT proxy server, built on top of [ReactPHP](https://reactphp.org). + +HTTP CONNECT proxy servers (also commonly known as "HTTPS proxy" or "SSL proxy") +are commonly used to tunnel HTTPS traffic through an intermediary ("proxy"), to +conceal the origin address (anonymity) or to circumvent address blocking +(geoblocking). While many (public) HTTP CONNECT proxy servers often limit this +to HTTPS port `443` only, this can technically be used to tunnel any +TCP/IP-based protocol (HTTP, SMTP, IMAP etc.). +This library provides a simple API to create these tunneled connection for you. +Because it implements ReactPHP's standard +[`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface), +it can simply be used in place of a normal connector. +This makes it fairly simple to add HTTP CONNECT proxy support to pretty much any +existing higher-level protocol implementation. + +* **Async execution of connections** - + Send any number of HTTP CONNECT requests in parallel and process their + responses as soon as results come in. + The Promise-based design provides a *sane* interface to working with out of + bound responses and possible connection errors. +* **Standard interfaces** - + Allows easy integration with existing higher-level components by implementing + ReactPHP's standard + [`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface). +* **Lightweight, SOLID design** - + Provides a thin abstraction that is [*just good enough*](http://en.wikipedia.org/wiki/Principle_of_good_enough) + and does not get in your way. + Builds on top of well-tested components and well-established concepts instead of reinventing the wheel. +* **Good test coverage** - + Comes with an automated tests suite and is regularly tested against actual proxy servers in the wild + +**Table of contents** + +* [Quickstart example](#quickstart-example) +* [Usage](#usage) + * [ProxyConnector](#proxyconnector) + * [Plain TCP connections](#plain-tcp-connections) + * [Secure TLS connections](#secure-tls-connections) + * [Connection timeout](#connection-timeout) + * [DNS resolution](#dns-resolution) + * [Authentication](#authentication) + * [Advanced secure proxy connections](#advanced-secure-proxy-connections) + * [Advanced Unix domain sockets](#advanced-unix-domain-sockets) +* [Install](#install) +* [Tests](#tests) +* [License](#license) +* [More](#more) + +### Quickstart example + +The following example code demonstrates how this library can be used to send a +secure HTTPS request to google.com through a local HTTP proxy server: + +```php +$loop = React\EventLoop\Factory::create(); + +$proxy = new ProxyConnector('127.0.0.1:8080', new Connector($loop)); +$connector = new Connector($loop, array( + 'tcp' => $proxy, + 'timeout' => 3.0, + 'dns' => false +)); + +$connector->connect('tls://google.com:443')->then(function (ConnectionInterface $stream) { + $stream->write("GET / HTTP/1.1\r\nHost: google.com\r\nConnection: close\r\n\r\n"); + $stream->on('data', function ($chunk) { + echo $chunk; + }); +}, 'printf'); + +$loop->run(); +``` + +See also the [examples](examples). + +## Usage + +### ProxyConnector + +The `ProxyConnector` is responsible for creating plain TCP/IP connections to +any destination by using an intermediary HTTP CONNECT proxy. + +``` +[you] -> [proxy] -> [destination] +``` + +Its constructor simply accepts an HTTP proxy URL and a connector used to connect +to the proxy server address: + +```php +$connector = new Connector($loop); +$proxy = new ProxyConnector('http://127.0.0.1:8080', $connector); +``` + +The proxy URL may or may not contain a scheme and port definition. The default +port will be `80` for HTTP (or `443` for HTTPS), but many common HTTP proxy +servers use custom ports (often the alternative HTTP port `8080`). +In its most simple form, the given connector will be a +[`\React\Socket\Connector`](https://github.com/reactphp/socket#connector) if you +want to connect to a given IP address as above. + +This is the main class in this package. +Because it implements ReactPHP's standard +[`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface), +it can simply be used in place of a normal connector. +Accordingly, it provides only a single public method, the +[`connect()`](https://github.com/reactphp/socket#connect) method. +The `connect(string $uri): PromiseInterface` +method can be used to establish a streaming connection. +It returns a [Promise](https://github.com/reactphp/promise) which either +fulfills with a [ConnectionInterface](https://github.com/reactphp/socket#connectioninterface) +on success or rejects with an `Exception` on error. + +This makes it fairly simple to add HTTP CONNECT proxy support to pretty much any +higher-level component: + +```diff +- $client = new SomeClient($connector); ++ $proxy = new ProxyConnector('http://127.0.0.1:8080', $connector); ++ $client = new SomeClient($proxy); +``` + +#### Plain TCP connections + +HTTP CONNECT proxies are most frequently used to issue HTTPS requests to your destination. +However, this is actually performed on a higher protocol layer and this +connector is actually inherently a general-purpose plain TCP/IP connector. +As documented above, you can simply invoke its `connect()` method to establish +a streaming plain TCP/IP connection and use any higher level protocol like so: + +```php +$proxy = new ProxyConnector('http://127.0.0.1:8080', $connector); + +$proxy->connect('tcp://smtp.googlemail.com:587')->then(function (ConnectionInterface $stream) { + $stream->write("EHLO local\r\n"); + $stream->on('data', function ($chunk) use ($stream) { + echo $chunk; + }); +}); +``` + +You can either use the `ProxyConnector` directly or you may want to wrap this connector +in ReactPHP's [`Connector`](https://github.com/reactphp/socket#connector): + +```php +$connector = new Connector($loop, array( + 'tcp' => $proxy, + 'dns' => false +)); + +$connector->connect('tcp://smtp.googlemail.com:587')->then(function (ConnectionInterface $stream) { + $stream->write("EHLO local\r\n"); + $stream->on('data', function ($chunk) use ($stream) { + echo $chunk; + }); +}); +``` + +Note that HTTP CONNECT proxies often restrict which ports one may connect to. +Many (public) proxy servers do in fact limit this to HTTPS (443) only. + +#### Secure TLS connections + +This class can also be used if you want to establish a secure TLS connection +(formerly known as SSL) between you and your destination, such as when using +secure HTTPS to your destination site. You can simply wrap this connector in +ReactPHP's [`Connector`](https://github.com/reactphp/socket#connector) or the +low-level [`SecureConnector`](https://github.com/reactphp/socket#secureconnector): + +```php +$proxy = new ProxyConnector('http://127.0.0.1:8080', $connector); +$connector = new Connector($loop, array( + 'tcp' => $proxy, + 'dns' => false +)); + +$connector->connect('tls://smtp.googlemail.com:465')->then(function (ConnectionInterface $stream) { + $stream->write("EHLO local\r\n"); + $stream->on('data', function ($chunk) use ($stream) { + echo $chunk; + }); +}); +``` + +> Note how secure TLS connections are in fact entirely handled outside of + this HTTP CONNECT client implementation. + +#### Connection timeout + +By default, the `ProxyConnector` does not implement any timeouts for establishing remote +connections. +Your underlying operating system may impose limits on pending and/or idle TCP/IP +connections, anywhere in a range of a few minutes to several hours. + +Many use cases require more control over the timeout and likely values much +smaller, usually in the range of a few seconds only. + +You can use ReactPHP's [`Connector`](https://github.com/reactphp/socket#connector) +or the low-level +[`TimeoutConnector`](https://github.com/reactphp/socket#timeoutconnector) +to decorate any given `ConnectorInterface` instance. +It provides the same `connect()` method, but will automatically reject the +underlying connection attempt if it takes too long: + +```php +$connector = new Connector($loop, array( + 'tcp' => $proxy, + 'dns' => false, + 'timeout' => 3.0 +)); + +$connector->connect('tcp://google.com:80')->then(function ($stream) { + // connection succeeded within 3.0 seconds +}); +``` + +See also any of the [examples](examples). + +> Note how connection timeout is in fact entirely handled outside of this + HTTP CONNECT client implementation. + +#### DNS resolution + +By default, the `ProxyConnector` does not perform any DNS resolution at all and simply +forwards any hostname you're trying to connect to the remote proxy server. +The remote proxy server is thus responsible for looking up any hostnames via DNS +(this default mode is thus called *remote DNS resolution*). + +As an alternative, you can also send the destination IP to the remote proxy +server. +In this mode you either have to stick to using IPs only (which is ofen unfeasable) +or perform any DNS lookups locally and only transmit the resolved destination IPs +(this mode is thus called *local DNS resolution*). + +The default *remote DNS resolution* is useful if your local `ProxyConnector` either can +not resolve target hostnames because it has no direct access to the internet or +if it should not resolve target hostnames because its outgoing DNS traffic might +be intercepted. + +As noted above, the `ProxyConnector` defaults to using remote DNS resolution. +However, wrapping the `ProxyConnector` in ReactPHP's +[`Connector`](https://github.com/reactphp/socket#connector) actually +performs local DNS resolution unless explicitly defined otherwise. +Given that remote DNS resolution is assumed to be the preferred mode, all +other examples explicitly disable DNS resoltion like this: + +```php +$connector = new Connector($loop, array( + 'tcp' => $proxy, + 'dns' => false +)); +``` + +If you want to explicitly use *local DNS resolution*, you can use the following code: + +```php +// set up Connector which uses Google's public DNS (8.8.8.8) +$connector = Connector($loop, array( + 'tcp' => $proxy, + 'dns' => '8.8.8.8' +)); +``` + +> Note how local DNS resolution is in fact entirely handled outside of this + HTTP CONNECT client implementation. + +#### Authentication + +If your HTTP proxy server requires authentication, you may pass the username and +password as part of the HTTP proxy URL like this: + +```php +$proxy = new ProxyConnector('http://user:pass@127.0.0.1:8080', $connector); +``` + +Note that both the username and password must be percent-encoded if they contain +special characters: + +```php +$user = 'he:llo'; +$pass = 'p@ss'; + +$proxy = new ProxyConnector( + rawurlencode($user) . ':' . rawurlencode($pass) . '@127.0.0.1:8080', + $connector +); +``` + +> The authentication details will be used for basic authentication and will be + transferred in the `Proxy-Authorization` HTTP request header for each + connection attempt. + If the authentication details are missing or not accepted by the remote HTTP + proxy server, it is expected to reject each connection attempt with a + `407` (Proxy Authentication Required) response status code and an exception + error code of `SOCKET_EACCES` (13). + +#### Advanced secure proxy connections + +Note that communication between the client and the proxy is usually via an +unencrypted, plain TCP/IP HTTP connection. Note that this is the most common +setup, because you can still establish a TLS connection between you and the +destination host as above. + +If you want to connect to a (rather rare) HTTPS proxy, you may want use the +`https://` scheme (HTTPS default port 443) and use ReactPHP's +[`Connector`](https://github.com/reactphp/socket#connector) or the low-level +[`SecureConnector`](https://github.com/reactphp/socket#secureconnector) +instance to create a secure connection to the proxy: + +```php +$connector = new Connector($loop); +$proxy = new ProxyConnector('https://127.0.0.1:443', $connector); + +$proxy->connect('tcp://smtp.googlemail.com:587'); +``` + +#### Advanced Unix domain sockets + +HTTP CONNECT proxy servers support forwarding TCP/IP based connections and +higher level protocols. +In some advanced cases, it may be useful to let your HTTP CONNECT proxy server +listen on a Unix domain socket (UDS) path instead of a IP:port combination. +For example, this allows you to rely on file system permissions instead of +having to rely on explicit [authentication](#authentication). + +You can simply use the `http+unix://` URI scheme like this: + +```php +$proxy = new ProxyConnector('http+unix:///tmp/proxy.sock', $connector); + +$proxy->connect('tcp://google.com:80')->then(function (ConnectionInterface $stream) { + // connected… +}); +``` + +Similarly, you can also combine this with [authentication](#authentication) +like this: + +```php +$proxy = new ProxyConnector('http+unix://user:pass@/tmp/proxy.sock', $connector); +``` + +> Note that Unix domain sockets (UDS) are considered advanced usage and PHP only + has limited support for this. + In particular, enabling [secure TLS](#secure-tls-connections) may not be + supported. + +> Note that the HTTP CONNECT protocol does not support the notion of UDS paths. + The above works reasonably well because UDS is only used for the connection between + client and proxy server and the path will not actually passed over the protocol. + This implies that this does not support connecting to UDS destination paths. + +## Install + +The recommended way to install this library is [through Composer](https://getcomposer.org). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) + +This project follows [SemVer](http://semver.org/). +This will install the latest supported version: + +```bash +$ composer require clue/http-proxy-react:^1.3 +``` + +See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. + +This project aims to run on any platform and thus does not require any PHP +extensions and supports running on legacy PHP 5.3 through current PHP 7+ and +HHVM. +It's *highly recommended to use PHP 7+* for this project. + +## Tests + +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org): + +```bash +$ composer install +``` + +To run the test suite, go to the project root and run: + +```bash +$ php vendor/bin/phpunit +``` + +The test suite contains tests that rely on a working internet connection, +alternatively you can also run it like this: + +```bash +$ php vendor/bin/phpunit --exclude-group internet +``` + +## License + +MIT + +## More + +* If you want to learn more about how the + [`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface) + and its usual implementations look like, refer to the documentation of the underlying + [react/socket](https://github.com/reactphp/socket) component. +* If you want to learn more about processing streams of data, refer to the + documentation of the underlying + [react/stream](https://github.com/reactphp/stream) component. +* As an alternative to an HTTP CONNECT proxy, you may also want to look into + using a SOCKS (SOCKS4/SOCKS5) proxy instead. + You may want to use [clue/socks-react](https://github.com/clue/php-socks-react) + which also provides an implementation of the same + [`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface) + so that supporting either proxy protocol should be fairly trivial. +* If you're dealing with public proxies, you'll likely have to work with mixed + quality and unreliable proxies. You may want to look into using + [clue/connection-manager-extra](https://github.com/clue/php-connection-manager-extra) + which allows retrying unreliable ones, implying connection timeouts, + concurrently working with multiple connectors and more. +* If you're looking for an end-user HTTP CONNECT proxy server daemon, you may + want to use [LeProxy](https://leproxy.org/). diff --git a/instafeed/vendor/clue/http-proxy-react/composer.json b/instafeed/vendor/clue/http-proxy-react/composer.json new file mode 100755 index 0000000..23801c9 --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/composer.json @@ -0,0 +1,30 @@ +{ + "name": "clue/http-proxy-react", + "description": "Async HTTP proxy connector, use any TCP/IP-based protocol through an HTTP CONNECT proxy server, built on top of ReactPHP", + "keywords": ["HTTP", "CONNECT", "proxy", "ReactPHP", "async"], + "homepage": "https://github.com/clue/php-http-proxy-react", + "license": "MIT", + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "autoload": { + "psr-4": { "Clue\\React\\HttpProxy\\": "src/" } + }, + "autoload-dev": { + "psr-4": { "Tests\\Clue\\React\\HttpProxy\\": "tests/" } + }, + "require": { + "php": ">=5.3", + "react/promise": " ^2.1 || ^1.2.1", + "react/socket": "^1.0 || ^0.8.4", + "ringcentral/psr7": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^5.0 || ^4.8", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3", + "clue/block-react": "^1.1" + } +} diff --git a/instafeed/vendor/clue/http-proxy-react/examples/01-proxy-https.php b/instafeed/vendor/clue/http-proxy-react/examples/01-proxy-https.php new file mode 100755 index 0000000..c07ea0d --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/examples/01-proxy-https.php @@ -0,0 +1,30 @@ + $proxy, + 'timeout' => 3.0, + 'dns' => false +)); + +$connector->connect('tls://google.com:443')->then(function (ConnectionInterface $stream) { + $stream->write("GET / HTTP/1.1\r\nHost: google.com\r\nConnection: close\r\n\r\n"); + $stream->on('data', function ($chunk) { + echo $chunk; + }); +}, 'printf'); + +$loop->run(); diff --git a/instafeed/vendor/clue/http-proxy-react/examples/02-optional-proxy-https.php b/instafeed/vendor/clue/http-proxy-react/examples/02-optional-proxy-https.php new file mode 100755 index 0000000..c65e69a --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/examples/02-optional-proxy-https.php @@ -0,0 +1,37 @@ + $proxy, + 'timeout' => 3.0, + 'dns' => false + )); +} + +$connector->connect('tls://google.com:443')->then(function (ConnectionInterface $stream) { + $stream->write("GET / HTTP/1.1\r\nHost: google.com\r\nConnection: close\r\n\r\n"); + $stream->on('data', function ($chunk) { + echo $chunk; + }); +}, 'printf'); + +$loop->run(); diff --git a/instafeed/vendor/clue/http-proxy-react/examples/11-proxy-smtp.php b/instafeed/vendor/clue/http-proxy-react/examples/11-proxy-smtp.php new file mode 100755 index 0000000..3225491 --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/examples/11-proxy-smtp.php @@ -0,0 +1,32 @@ + $proxy, + 'timeout' => 3.0, + 'dns' => false +)); + +$connector->connect('tcp://smtp.googlemail.com:587')->then(function (ConnectionInterface $stream) { + $stream->write("EHLO local\r\n"); + $stream->on('data', function ($chunk) use ($stream) { + echo $chunk; + $stream->write("QUIT\r\n"); + }); +}, 'printf'); + +$loop->run(); diff --git a/instafeed/vendor/clue/http-proxy-react/examples/12-proxy-smtps.php b/instafeed/vendor/clue/http-proxy-react/examples/12-proxy-smtps.php new file mode 100755 index 0000000..462dba3 --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/examples/12-proxy-smtps.php @@ -0,0 +1,35 @@ + $proxy, + 'timeout' => 3.0, + 'dns' => false +)); + +$connector->connect('tls://smtp.googlemail.com:465')->then(function (ConnectionInterface $stream) { + $stream->write("EHLO local\r\n"); + $stream->on('data', function ($chunk) use ($stream) { + echo $chunk; + $stream->write("QUIT\r\n"); + }); +}, 'printf'); + +$loop->run(); diff --git a/instafeed/vendor/clue/http-proxy-react/phpunit.xml.dist b/instafeed/vendor/clue/http-proxy-react/phpunit.xml.dist new file mode 100755 index 0000000..a6e2430 --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/phpunit.xml.dist @@ -0,0 +1,14 @@ + + + + + + ./tests/ + + + + + ./src/ + + + diff --git a/instafeed/vendor/clue/http-proxy-react/src/ProxyConnector.php b/instafeed/vendor/clue/http-proxy-react/src/ProxyConnector.php new file mode 100755 index 0000000..69eb5ee --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/src/ProxyConnector.php @@ -0,0 +1,213 @@ + [proxy] -> [destination] + * + * This is most frequently used to issue HTTPS requests to your destination. + * However, this is actually performed on a higher protocol layer and this + * connector is actually inherently a general-purpose plain TCP/IP connector. + * + * Note that HTTP CONNECT proxies often restrict which ports one may connect to. + * Many (public) proxy servers do in fact limit this to HTTPS (443) only. + * + * If you want to establish a TLS connection (such as HTTPS) between you and + * your destination, you may want to wrap this connector in a SecureConnector + * instance. + * + * Note that communication between the client and the proxy is usually via an + * unencrypted, plain TCP/IP HTTP connection. Note that this is the most common + * setup, because you can still establish a TLS connection between you and the + * destination host as above. + * + * If you want to connect to a (rather rare) HTTPS proxy, you may want use its + * HTTPS port (443) and use a SecureConnector instance to create a secure + * connection to the proxy. + * + * @link https://tools.ietf.org/html/rfc7231#section-4.3.6 + */ +class ProxyConnector implements ConnectorInterface +{ + private $connector; + private $proxyUri; + private $proxyAuth = ''; + + /** + * Instantiate a new ProxyConnector which uses the given $proxyUrl + * + * @param string $proxyUrl The proxy URL may or may not contain a scheme and + * port definition. The default port will be `80` for HTTP (or `443` for + * HTTPS), but many common HTTP proxy servers use custom ports. + * @param ConnectorInterface $connector In its most simple form, the given + * connector will be a \React\Socket\Connector if you want to connect to + * a given IP address. + * @throws InvalidArgumentException if the proxy URL is invalid + */ + public function __construct($proxyUrl, ConnectorInterface $connector) + { + // support `http+unix://` scheme for Unix domain socket (UDS) paths + if (preg_match('/^http\+unix:\/\/(.*?@)?(.+?)$/', $proxyUrl, $match)) { + // rewrite URI to parse authentication from dummy host + $proxyUrl = 'http://' . $match[1] . 'localhost'; + + // connector uses Unix transport scheme and explicit path given + $connector = new FixedUriConnector( + 'unix://' . $match[2], + $connector + ); + } + + if (strpos($proxyUrl, '://') === false) { + $proxyUrl = 'http://' . $proxyUrl; + } + + $parts = parse_url($proxyUrl); + if (!$parts || !isset($parts['scheme'], $parts['host']) || ($parts['scheme'] !== 'http' && $parts['scheme'] !== 'https')) { + throw new InvalidArgumentException('Invalid proxy URL "' . $proxyUrl . '"'); + } + + // apply default port and TCP/TLS transport for given scheme + if (!isset($parts['port'])) { + $parts['port'] = $parts['scheme'] === 'https' ? 443 : 80; + } + $parts['scheme'] = $parts['scheme'] === 'https' ? 'tls' : 'tcp'; + + $this->connector = $connector; + $this->proxyUri = $parts['scheme'] . '://' . $parts['host'] . ':' . $parts['port']; + + // prepare Proxy-Authorization header if URI contains username/password + if (isset($parts['user']) || isset($parts['pass'])) { + $this->proxyAuth = 'Proxy-Authorization: Basic ' . base64_encode( + rawurldecode($parts['user'] . ':' . (isset($parts['pass']) ? $parts['pass'] : '')) + ) . "\r\n"; + } + } + + public function connect($uri) + { + if (strpos($uri, '://') === false) { + $uri = 'tcp://' . $uri; + } + + $parts = parse_url($uri); + if (!$parts || !isset($parts['scheme'], $parts['host'], $parts['port']) || $parts['scheme'] !== 'tcp') { + return Promise\reject(new InvalidArgumentException('Invalid target URI specified')); + } + + $host = trim($parts['host'], '[]'); + $port = $parts['port']; + + // construct URI to HTTP CONNECT proxy server to connect to + $proxyUri = $this->proxyUri; + + // append path from URI if given + if (isset($parts['path'])) { + $proxyUri .= $parts['path']; + } + + // parse query args + $args = array(); + if (isset($parts['query'])) { + parse_str($parts['query'], $args); + } + + // append hostname from URI to query string unless explicitly given + if (!isset($args['hostname'])) { + $args['hostname'] = $parts['host']; + } + + // append query string + $proxyUri .= '?' . http_build_query($args, '', '&');; + + // append fragment from URI if given + if (isset($parts['fragment'])) { + $proxyUri .= '#' . $parts['fragment']; + } + + $auth = $this->proxyAuth; + + return $this->connector->connect($proxyUri)->then(function (ConnectionInterface $stream) use ($host, $port, $auth) { + $deferred = new Deferred(function ($_, $reject) use ($stream) { + $reject(new RuntimeException('Connection canceled while waiting for response from proxy (ECONNABORTED)', defined('SOCKET_ECONNABORTED') ? SOCKET_ECONNABORTED : 103)); + $stream->close(); + }); + + // keep buffering data until headers are complete + $buffer = ''; + $fn = function ($chunk) use (&$buffer, $deferred, $stream) { + $buffer .= $chunk; + + $pos = strpos($buffer, "\r\n\r\n"); + if ($pos !== false) { + // try to parse headers as response message + try { + $response = Psr7\parse_response(substr($buffer, 0, $pos)); + } catch (Exception $e) { + $deferred->reject(new RuntimeException('Invalid response received from proxy (EBADMSG)', defined('SOCKET_EBADMSG') ? SOCKET_EBADMSG: 71, $e)); + $stream->close(); + return; + } + + if ($response->getStatusCode() === 407) { + // map status code 407 (Proxy Authentication Required) to EACCES + $deferred->reject(new RuntimeException('Proxy denied connection due to invalid authentication ' . $response->getStatusCode() . ' (' . $response->getReasonPhrase() . ') (EACCES)', defined('SOCKET_EACCES') ? SOCKET_EACCES : 13)); + return $stream->close(); + } elseif ($response->getStatusCode() < 200 || $response->getStatusCode() >= 300) { + // map non-2xx status code to ECONNREFUSED + $deferred->reject(new RuntimeException('Proxy refused connection with HTTP error code ' . $response->getStatusCode() . ' (' . $response->getReasonPhrase() . ') (ECONNREFUSED)', defined('SOCKET_ECONNREFUSED') ? SOCKET_ECONNREFUSED : 111)); + return $stream->close(); + } + + // all okay, resolve with stream instance + $deferred->resolve($stream); + + // emit remaining incoming as data event + $buffer = (string)substr($buffer, $pos + 4); + if ($buffer !== '') { + $stream->emit('data', array($buffer)); + $buffer = ''; + } + return; + } + + // stop buffering when 8 KiB have been read + if (isset($buffer[8192])) { + $deferred->reject(new RuntimeException('Proxy must not send more than 8 KiB of headers (EMSGSIZE)', defined('SOCKET_EMSGSIZE') ? SOCKET_EMSGSIZE : 90)); + $stream->close(); + } + }; + $stream->on('data', $fn); + + $stream->on('error', function (Exception $e) use ($deferred) { + $deferred->reject(new RuntimeException('Stream error while waiting for response from proxy (EIO)', defined('SOCKET_EIO') ? SOCKET_EIO : 5, $e)); + }); + + $stream->on('close', function () use ($deferred) { + $deferred->reject(new RuntimeException('Connection to proxy lost while waiting for response (ECONNRESET)', defined('SOCKET_ECONNRESET') ? SOCKET_ECONNRESET : 104)); + }); + + $stream->write("CONNECT " . $host . ":" . $port . " HTTP/1.1\r\nHost: " . $host . ":" . $port . "\r\n" . $auth . "\r\n"); + + return $deferred->promise()->then(function (ConnectionInterface $stream) use ($fn) { + // Stop buffering when connection has been established. + $stream->removeListener('data', $fn); + return new Promise\FulfilledPromise($stream); + }); + }, function (Exception $e) use ($proxyUri) { + throw new RuntimeException('Unable to connect to proxy (ECONNREFUSED)', defined('SOCKET_ECONNREFUSED') ? SOCKET_ECONNREFUSED : 111, $e); + }); + } +} diff --git a/instafeed/vendor/clue/http-proxy-react/tests/AbstractTestCase.php b/instafeed/vendor/clue/http-proxy-react/tests/AbstractTestCase.php new file mode 100755 index 0000000..632b314 --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/tests/AbstractTestCase.php @@ -0,0 +1,80 @@ +createCallableMock(); + $mock + ->expects($this->never()) + ->method('__invoke'); + + return $mock; + } + + protected function expectCallableOnce() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke'); + + return $mock; + } + + protected function expectCallableOnceWith($value) + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->equalTo($value)); + + return $mock; + } + + protected function expectCallableOnceWithExceptionCode($code) + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->callback(function ($e) use ($code) { + return $e->getCode() === $code; + })); + + return $mock; + } + + + protected function expectCallableOnceParameter($type) + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->isInstanceOf($type)); + + return $mock; + } + + /** + * @link https://github.com/reactphp/react/blob/master/tests/React/Tests/Socket/TestCase.php (taken from reactphp/react) + */ + protected function createCallableMock() + { + return $this->getMockBuilder('Tests\\Clue\\React\\HttpProxy\\CallableStub')->getMock(); + } +} + +class CallableStub +{ + public function __invoke() + { + } +} + diff --git a/instafeed/vendor/clue/http-proxy-react/tests/FunctionalTest.php b/instafeed/vendor/clue/http-proxy-react/tests/FunctionalTest.php new file mode 100755 index 0000000..23273cf --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/tests/FunctionalTest.php @@ -0,0 +1,75 @@ +loop = Factory::create(); + + $this->tcpConnector = new TcpConnector($this->loop); + + $f = new \React\Dns\Resolver\Factory(); + $resolver = $f->create('8.8.8.8', $this->loop); + + $this->dnsConnector = new DnsConnector($this->tcpConnector, $resolver); + } + + public function testNonListeningSocketRejectsConnection() + { + $proxy = new ProxyConnector('127.0.0.1:9999', $this->dnsConnector); + + $promise = $proxy->connect('google.com:80'); + + $this->setExpectedException('RuntimeException', 'Unable to connect to proxy', SOCKET_ECONNREFUSED); + Block\await($promise, $this->loop, 3.0); + } + + public function testPlainGoogleDoesNotAcceptConnectMethod() + { + $proxy = new ProxyConnector('google.com', $this->dnsConnector); + + $promise = $proxy->connect('google.com:80'); + + $this->setExpectedException('RuntimeException', '405 (Method Not Allowed)', SOCKET_ECONNREFUSED); + Block\await($promise, $this->loop, 3.0); + } + + public function testSecureGoogleDoesNotAcceptConnectMethod() + { + if (!function_exists('stream_socket_enable_crypto')) { + $this->markTestSkipped('TLS not supported on really old platforms (HHVM < 3.8)'); + } + + $secure = new SecureConnector($this->dnsConnector, $this->loop); + $proxy = new ProxyConnector('https://google.com:443', $secure); + + $promise = $proxy->connect('google.com:80'); + + $this->setExpectedException('RuntimeException', '405 (Method Not Allowed)', SOCKET_ECONNREFUSED); + Block\await($promise, $this->loop, 3.0); + } + + public function testSecureGoogleDoesNotAcceptPlainStream() + { + $proxy = new ProxyConnector('google.com:443', $this->dnsConnector); + + $promise = $proxy->connect('google.com:80'); + + $this->setExpectedException('RuntimeException', 'Connection to proxy lost', SOCKET_ECONNRESET); + Block\await($promise, $this->loop, 3.0); + } +} diff --git a/instafeed/vendor/clue/http-proxy-react/tests/ProxyConnectorTest.php b/instafeed/vendor/clue/http-proxy-react/tests/ProxyConnectorTest.php new file mode 100755 index 0000000..13d6e42 --- /dev/null +++ b/instafeed/vendor/clue/http-proxy-react/tests/ProxyConnectorTest.php @@ -0,0 +1,333 @@ +connector = $this->getMockBuilder('React\Socket\ConnectorInterface')->getMock(); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testInvalidProxy() + { + new ProxyConnector('///', $this->connector); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testInvalidProxyScheme() + { + new ProxyConnector('ftp://example.com', $this->connector); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testInvalidHttpsUnixScheme() + { + new ProxyConnector('https+unix:///tmp/proxy.sock', $this->connector); + } + + public function testCreatesConnectionToHttpPort() + { + $promise = new Promise(function () { }); + $this->connector->expects($this->once())->method('connect')->with('tcp://proxy.example.com:80?hostname=google.com')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $proxy->connect('google.com:80'); + } + + public function testCreatesConnectionToHttpPortAndPassesThroughUriComponents() + { + $promise = new Promise(function () { }); + $this->connector->expects($this->once())->method('connect')->with('tcp://proxy.example.com:80/path?foo=bar&hostname=google.com#segment')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $proxy->connect('google.com:80/path?foo=bar#segment'); + } + + public function testCreatesConnectionToHttpPortAndObeysExplicitHostname() + { + $promise = new Promise(function () { }); + $this->connector->expects($this->once())->method('connect')->with('tcp://proxy.example.com:80?hostname=www.google.com')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $proxy->connect('google.com:80?hostname=www.google.com'); + } + + public function testCreatesConnectionToHttpsPort() + { + $promise = new Promise(function () { }); + $this->connector->expects($this->once())->method('connect')->with('tls://proxy.example.com:443?hostname=google.com')->willReturn($promise); + + $proxy = new ProxyConnector('https://proxy.example.com', $this->connector); + + $proxy->connect('google.com:80'); + } + + public function testCreatesConnectionToUnixPath() + { + $promise = new Promise(function () { }); + $this->connector->expects($this->once())->method('connect')->with('unix:///tmp/proxy.sock')->willReturn($promise); + + $proxy = new ProxyConnector('http+unix:///tmp/proxy.sock', $this->connector); + + $proxy->connect('google.com:80'); + } + + public function testCancelPromiseWillCancelPendingConnection() + { + $promise = new Promise(function () { }, $this->expectCallableOnce()); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $promise = $proxy->connect('google.com:80'); + + $this->assertInstanceOf('React\Promise\CancellablePromiseInterface', $promise); + + $promise->cancel(); + } + + public function testWillWriteToOpenConnection() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + $stream->expects($this->once())->method('write')->with("CONNECT google.com:80 HTTP/1.1\r\nHost: google.com:80\r\n\r\n"); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $proxy->connect('google.com:80'); + } + + public function testWillProxyAuthorizationHeaderIfProxyUriContainsAuthentication() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + $stream->expects($this->once())->method('write')->with("CONNECT google.com:80 HTTP/1.1\r\nHost: google.com:80\r\nProxy-Authorization: Basic dXNlcjpwYXNz\r\n\r\n"); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('user:pass@proxy.example.com', $this->connector); + + $proxy->connect('google.com:80'); + } + + public function testWillProxyAuthorizationHeaderIfProxyUriContainsOnlyUsernameWithoutPassword() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + $stream->expects($this->once())->method('write')->with("CONNECT google.com:80 HTTP/1.1\r\nHost: google.com:80\r\nProxy-Authorization: Basic dXNlcjo=\r\n\r\n"); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('user@proxy.example.com', $this->connector); + + $proxy->connect('google.com:80'); + } + + public function testWillProxyAuthorizationHeaderIfProxyUriContainsAuthenticationWithPercentEncoding() + { + $user = 'h@llÖ'; + $pass = '%secret?'; + + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + $stream->expects($this->once())->method('write')->with("CONNECT google.com:80 HTTP/1.1\r\nHost: google.com:80\r\nProxy-Authorization: Basic " . base64_encode($user . ':' . $pass) . "\r\n\r\n"); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector(rawurlencode($user) . ':' . rawurlencode($pass) . '@proxy.example.com', $this->connector); + + $proxy->connect('google.com:80'); + } + + public function testWillProxyAuthorizationHeaderIfUnixProxyUriContainsAuthentication() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + $stream->expects($this->once())->method('write')->with("CONNECT google.com:80 HTTP/1.1\r\nHost: google.com:80\r\nProxy-Authorization: Basic dXNlcjpwYXNz\r\n\r\n"); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->with('unix:///tmp/proxy.sock')->willReturn($promise); + + $proxy = new ProxyConnector('http+unix://user:pass@/tmp/proxy.sock', $this->connector); + + $proxy->connect('google.com:80'); + } + + public function testRejectsInvalidUri() + { + $this->connector->expects($this->never())->method('connect'); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $promise = $proxy->connect('///'); + + $promise->then(null, $this->expectCallableOnce()); + } + + public function testRejectsUriWithNonTcpScheme() + { + $this->connector->expects($this->never())->method('connect'); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $promise = $proxy->connect('tls://google.com:80'); + + $promise->then(null, $this->expectCallableOnce()); + } + + public function testRejectsIfConnectorRejects() + { + $promise = \React\Promise\reject(new \RuntimeException()); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $promise = $proxy->connect('google.com:80'); + + $promise->then(null, $this->expectCallableOnce()); + } + + public function testRejectsAndClosesIfStreamWritesNonHttp() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $promise = $proxy->connect('google.com:80'); + + $stream->expects($this->once())->method('close'); + $stream->emit('data', array("invalid\r\n\r\n")); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_EBADMSG)); + } + + public function testRejectsAndClosesIfStreamWritesTooMuchData() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $promise = $proxy->connect('google.com:80'); + + $stream->expects($this->once())->method('close'); + $stream->emit('data', array(str_repeat('*', 100000))); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_EMSGSIZE)); + } + + public function testRejectsAndClosesIfStreamReturnsProyAuthenticationRequired() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $promise = $proxy->connect('google.com:80'); + + $stream->expects($this->once())->method('close'); + $stream->emit('data', array("HTTP/1.1 407 Proxy Authentication Required\r\n\r\n")); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_EACCES)); + } + + public function testRejectsAndClosesIfStreamReturnsNonSuccess() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $promise = $proxy->connect('google.com:80'); + + $stream->expects($this->once())->method('close'); + $stream->emit('data', array("HTTP/1.1 403 Not allowed\r\n\r\n")); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_ECONNREFUSED)); + } + + public function testResolvesIfStreamReturnsSuccess() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $promise = $proxy->connect('google.com:80'); + + $promise->then($this->expectCallableOnce('React\Stream\Stream')); + $never = $this->expectCallableNever(); + $promise->then(function (ConnectionInterface $stream) use ($never) { + $stream->on('data', $never); + }); + + $stream->emit('data', array("HTTP/1.1 200 OK\r\n\r\n")); + } + + public function testResolvesIfStreamReturnsSuccessAndEmitsExcessiveData() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $promise = $proxy->connect('google.com:80'); + + $once = $this->expectCallableOnceWith('hello!'); + $promise->then(function (ConnectionInterface $stream) use ($once) { + $stream->on('data', $once); + }); + + $stream->emit('data', array("HTTP/1.1 200 OK\r\n\r\nhello!")); + } + + public function testCancelPromiseWillCloseOpenConnectionAndReject() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close', 'write'))->getMock(); + $stream->expects($this->once())->method('close'); + + $promise = \React\Promise\resolve($stream); + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $proxy = new ProxyConnector('proxy.example.com', $this->connector); + + $promise = $proxy->connect('google.com:80'); + + $this->assertInstanceOf('React\Promise\CancellablePromiseInterface', $promise); + + $promise->cancel(); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_ECONNABORTED)); + } +} diff --git a/instafeed/vendor/clue/socks-react/.gitignore b/instafeed/vendor/clue/socks-react/.gitignore new file mode 100755 index 0000000..de4a392 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/.gitignore @@ -0,0 +1,2 @@ +/vendor +/composer.lock diff --git a/instafeed/vendor/clue/socks-react/.travis.yml b/instafeed/vendor/clue/socks-react/.travis.yml new file mode 100755 index 0000000..04f51ad --- /dev/null +++ b/instafeed/vendor/clue/socks-react/.travis.yml @@ -0,0 +1,27 @@ +language: php + +php: +# - 5.3 # requires old distro, see below + - 5.4 + - 5.5 + - 5.6 + - 7 + - hhvm # ignore errors, see below + +# lock distro so new future defaults will not break the build +dist: trusty + +matrix: + include: + - php: 5.3 + dist: precise + allow_failures: + - php: hhvm + +sudo: false + +install: + - composer install --no-interaction + +script: + - vendor/bin/phpunit --coverage-text diff --git a/instafeed/vendor/clue/socks-react/CHANGELOG.md b/instafeed/vendor/clue/socks-react/CHANGELOG.md new file mode 100755 index 0000000..c1eddb3 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/CHANGELOG.md @@ -0,0 +1,338 @@ +# Changelog + +## 0.8.7 (2017-12-17) + +* Feature: Support SOCKS over TLS (`sockss://` URI scheme) + (#70 and #71 by @clue) + + ```php + // new: now supports SOCKS over TLS + $client = new Client('socks5s://localhost', $connector); + ``` + +* Feature: Support communication over Unix domain sockets (UDS) + (#69 by @clue) + + ```php + // new: now supports SOCKS over Unix domain sockets (UDS) + $client = new Client('socks5+unix:///tmp/proxy.sock', $connector); + ``` + +* Improve test suite by adding forward compatibility with PHPUnit 6 + (#68 by @clue) + +## 0.8.6 (2017-09-17) + +* Feature: Forward compatibility with Evenement v3.0 + (#67 by @WyriHaximus) + +## 0.8.5 (2017-09-01) + +* Feature: Use socket error codes for connection rejections + (#63 by @clue) + + ```php + $promise = $proxy->connect('imap.example.com:143'); + $promise->then(null, function (Exeption $e) { + if ($e->getCode() === SOCKET_EACCES) { + echo 'Failed to authenticate with proxy!'; + } + throw $e; + }); + ``` + +* Feature: Report matching SOCKS5 error codes for server side connection errors + (#62 by @clue) + +* Fix: Fix SOCKS5 client receiving destination hostnames and + fix IPv6 addresses as hostnames for TLS certificates + (#64 and #65 by @clue) + +* Improve test suite by locking Travis distro so new defaults will not break the build and + optionally exclude tests that rely on working internet connection + (#61 and #66 by @clue) + +## 0.8.4 (2017-07-27) + +* Feature: Server now passes client source address to Connector + (#60 by @clue) + +## 0.8.3 (2017-07-18) + +* Feature: Pass full remote URI as parameter to authentication callback + (#58 by @clue) + + ```php + // new third parameter passed to authentication callback + $server->setAuth(function ($user, $pass, $remote) { + $ip = parse_url($remote, PHP_URL_HOST); + + return ($ip === '127.0.0.1'); + }); + ``` + +* Fix: Fix connecting to IPv6 address via SOCKS5 server and validate target + URI so hostname can not contain excessive URI components + (#59 by @clue) + +* Improve test suite by fixing HHVM build for now again and ignore future HHVM build errors + (#57 by @clue) + +## 0.8.2 (2017-05-09) + +* Feature: Forward compatibility with upcoming Socket v1.0 and v0.8 + (#56 by @clue) + +## 0.8.1 (2017-04-21) + +* Update examples to use URIs with default port 1080 and accept proxy URI arguments + (#54 by @clue) + +* Remove now unneeded dependency on `react/stream` + (#55 by @clue) + +## 0.8.0 (2017-04-18) + +* Feature: Merge `Server` class from clue/socks-server + (#52 by @clue) + + ```php + $socket = new React\Socket\Server(1080, $loop); + $server = new Clue\React\Socks\Server($loop, $socket); + ``` + + > Upgrading from [clue/socks-server](https://github.com/clue/php-socks-server)? + The classes have been moved as-is, so you can simply start using the new + class name `Clue\React\Socks\Server` with no other changes required. + +## 0.7.0 (2017-04-14) + +* Feature / BC break: Replace depreacted SocketClient with Socket v0.7 and + use `connect($uri)` instead of `create($host, $port)` + (#51 by @clue) + + ```php + // old + $connector = new React\SocketClient\TcpConnector($loop); + $client = new Client(1080, $connector); + $client->create('google.com', 80)->then(function (Stream $conn) { + $conn->write("…"); + }); + + // new + $connector = new React\Socket\TcpConnector($loop); + $client = new Client(1080, $connector); + $client->connect('google.com:80')->then(function (ConnectionInterface $conn) { + $conn->write("…"); + }); + ``` + +* Improve test suite by adding PHPUnit to require-dev + (#50 by @clue) + +## 0.6.0 (2016-11-29) + +* Feature / BC break: Pass connector into `Client` instead of loop, remove unneeded deps + (#49 by @clue) + + ```php + // old (connector is create implicitly) + $client = new Client('127.0.0.1', $loop); + + // old (connector can optionally be passed) + $client = new Client('127.0.0.1', $loop, $connector); + + // new (connector is now mandatory) + $connector = new React\SocketClient\TcpConnector($loop); + $client = new Client('127.0.0.1', $connector); + ``` + +* Feature / BC break: `Client` now implements `ConnectorInterface`, remove `Connector` adapter + (#47 by @clue) + + ```php + // old (explicit connector functions as an adapter) + $connector = $client->createConnector(); + $promise = $connector->create('google.com', 80); + + // new (client can be used as connector right away) + $promise = $client->create('google.com', 80); + ``` + +* Feature / BC break: Remove `createSecureConnector()`, use `SecureConnector` instead + (#47 by @clue) + + ```php + // old (tight coupling and hidden dependency) + $tls = $client->createSecureConnector(); + $promise = $tls->create('google.com', 443); + + // new (more explicit, loose coupling) + $tls = new React\SocketClient\SecureConnector($client, $loop); + $promise = $tls->create('google.com', 443); + ``` + +* Feature / BC break: Remove `setResolveLocal()` and local DNS resolution and default to remote DNS resolution, use `DnsConnector` instead + (#44 by @clue) + + ```php + // old (implicitly defaults to true, can be disabled) + $client->setResolveLocal(false); + $tcp = $client->createConnector(); + $promise = $tcp->create('google.com', 80); + + // new (always disabled, can be re-enabled like this) + $factory = new React\Dns\Resolver\Factory(); + $resolver = $factory->createCached('8.8.8.8', $loop); + $tcp = new React\SocketClient\DnsConnector($client, $resolver); + $promise = $tcp->create('google.com', 80); + ``` + +* Feature / BC break: Remove `setTimeout()`, use `TimeoutConnector` instead + (#45 by @clue) + + ```php + // old (timeout only applies to TCP/IP connection) + $client = new Client('127.0.0.1', …); + $client->setTimeout(3.0); + $tcp = $client->createConnector(); + $promise = $tcp->create('google.com', 80); + + // new (timeout can be added to any layer) + $client = new Client('127.0.0.1', …); + $tcp = new React\SocketClient\TimeoutConnector($client, 3.0, $loop); + $promise = $tcp->create('google.com', 80); + ``` + +* Feature / BC break: Remove `setProtocolVersion()` and `setAuth()` mutators, only support SOCKS URI for protocol version and authentication (immutable API) + (#46 by @clue) + + ```php + // old (state can be mutated after instantiation) + $client = new Client('127.0.0.1', …); + $client->setProtocolVersion('5'); + $client->setAuth('user', 'pass'); + + // new (immutable after construction, already supported as of v0.5.2 - now mandatory) + $client = new Client('socks5://user:pass@127.0.0.1', …); + ``` + +## 0.5.2 (2016-11-25) + +* Feature: Apply protocol version and username/password auth from SOCKS URI + (#43 by @clue) + + ```php + // explicitly use SOCKS5 + $client = new Client('socks5://127.0.0.1', $loop); + + // use authentication (automatically SOCKS5) + $client = new Client('user:pass@127.0.0.1', $loop); + ``` + +* More explicit client examples, including proxy chaining + (#42 by @clue) + +## 0.5.1 (2016-11-21) + +* Feature: Support Promise cancellation + (#39 by @clue) + + ```php + $promise = $connector->create($host, $port); + + $promise->cancel(); + ``` + +* Feature: Timeout now cancels pending connection attempt + (#39, #22 by @clue) + +## 0.5.0 (2016-11-07) + +* Remove / BC break: Split off Server to clue/socks-server + (#35 by @clue) + + > Upgrading? Check [clue/socks-server](https://github.com/clue/php-socks-server) for details. + +* Improve documentation and project structure + +## 0.4.0 (2016-03-19) + +* Feature: Support proper SSL/TLS connections with additional SSL context options + (#31, #33 by @clue) + +* Documentation for advanced Connector setups (bindto, multihop) + (#32 by @clue) + +## 0.3.0 (2015-06-20) + +* BC break / Feature: Client ctor now accepts a SOCKS server URI + ([#24](https://github.com/clue/php-socks-react/pull/24)) + + ```php +// old +$client = new Client($loop, 'localhost', 9050); + +// new +$client = new Client('localhost:9050', $loop); +``` + +* Feature: Automatically assume default SOCKS port (1080) if not given explicitly + ([#26](https://github.com/clue/php-socks-react/pull/26)) + +* Improve documentation and test suite + +## 0.2.1 (2014-11-13) + +* Support React PHP v0.4 (while preserving BC with React PHP v0.3) + ([#16](https://github.com/clue/php-socks-react/pull/16)) + +* Improve examples and add first class support for HHVM + ([#15](https://github.com/clue/php-socks-react/pull/15) and [#17](https://github.com/clue/php-socks-react/pull/17)) + +## 0.2.0 (2014-09-27) + +* BC break / Feature: Simplify constructors by making parameters optional. + ([#10](https://github.com/clue/php-socks-react/pull/10)) + + The `Factory` has been removed, you can now create instances of the `Client` + and `Server` yourself: + + ```php + // old + $factory = new Factory($loop, $dns); + $client = $factory->createClient('localhost', 9050); + $server = $factory->createSever($socket); + + // new + $client = new Client($loop, 'localhost', 9050); + $server = new Server($loop, $socket); + ``` + +* BC break: Remove HTTP support and link to [clue/buzz-react](https://github.com/clue/php-buzz-react) instead. + ([#9](https://github.com/clue/php-socks-react/pull/9)) + + HTTP operates on a different layer than this low-level SOCKS library. + Removing this reduces the footprint of this library. + + > Upgrading? Check the [README](https://github.com/clue/php-socks-react#http-requests) for details. + +* Fix: Refactored to support other, faster loops (libev/libevent) + ([#12](https://github.com/clue/php-socks-react/pull/12)) + +* Explicitly list dependencies, clean up examples and extend test suite significantly + +## 0.1.0 (2014-05-19) + +* First stable release +* Async SOCKS `Client` and `Server` implementation +* Project was originally part of [clue/socks](https://github.com/clue/php-socks) + and was split off from its latest releave v0.4.0 + ([#1](https://github.com/clue/reactphp-socks/issues/1)) + +> Upgrading from clue/socks v0.4.0? Use namespace `Clue\React\Socks` instead of `Socks` and you're ready to go! + +## 0.0.0 (2011-04-26) + +* Initial concept, originally tracked as part of + [clue/socks](https://github.com/clue/php-socks) diff --git a/instafeed/vendor/clue/socks-react/LICENSE b/instafeed/vendor/clue/socks-react/LICENSE new file mode 100755 index 0000000..8efa9aa --- /dev/null +++ b/instafeed/vendor/clue/socks-react/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2011 Christian Lück + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/instafeed/vendor/clue/socks-react/README.md b/instafeed/vendor/clue/socks-react/README.md new file mode 100755 index 0000000..a18d797 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/README.md @@ -0,0 +1,1017 @@ +# clue/socks-react [![Build Status](https://travis-ci.org/clue/php-socks-react.svg?branch=master)](https://travis-ci.org/clue/php-socks-react) + +Async SOCKS4, SOCKS4a and SOCKS5 proxy client and server implementation, built on top of [ReactPHP](http://reactphp.org). + +The SOCKS protocol family can be used to easily tunnel TCP connections independent +of the actual application level protocol, such as HTTP, SMTP, IMAP, Telnet etc. + +**Table of contents** + +* [Quickstart example](#quickstart-example) +* [Usage](#usage) + * [ConnectorInterface](#connectorinterface) + * [connect()](#connect) + * [Client](#client) + * [Plain TCP connections](#plain-tcp-connections) + * [Secure TLS connections](#secure-tls-connections) + * [HTTP requests](#http-requests) + * [Protocol version](#protocol-version) + * [DNS resolution](#dns-resolution) + * [Authentication](#authentication) + * [Proxy chaining](#proxy-chaining) + * [Connection timeout](#connection-timeout) + * [SOCKS over TLS](#socks-over-tls) + * [Unix domain sockets](#unix-domain-sockets) + * [Server](#server) + * [Server connector](#server-connector) + * [Protocol version](#server-protocol-version) + * [Authentication](#server-authentication) + * [Proxy chaining](#server-proxy-chaining) + * [SOCKS over TLS](#server-socks-over-tls) + * [Unix domain sockets](#server-unix-domain-sockets) +* [Servers](#servers) + * [Using a PHP SOCKS server](#using-a-php-socks-server) + * [Using SSH as a SOCKS server](#using-ssh-as-a-socks-server) + * [Using the Tor (anonymity network) to tunnel SOCKS connections](#using-the-tor-anonymity-network-to-tunnel-socks-connections) +* [Install](#install) +* [Tests](#tests) +* [License](#license) +* [More](#more) + +## Quickstart example + +Once [installed](#install), you can use the following code to create a connection +to google.com via a local SOCKS proxy server: + +```php +$loop = React\EventLoop\Factory::create(); +$client = new Client('127.0.0.1:1080', new Connector($loop)); + +$client->connect('tcp://www.google.com:80')->then(function (ConnectionInterface $stream) { + $stream->write("GET / HTTP/1.0\r\n\r\n"); +}); + +$loop->run(); +``` + +If you're not already running any other [SOCKS proxy server](#servers), +you can use the following code to create a SOCKS +proxy server listening for connections on `localhost:1080`: + +```php +$loop = React\EventLoop\Factory::create(); + +// listen on localhost:1080 +$socket = new Socket('127.0.0.1:1080', $loop); + +// start a new server listening for incoming connection on the given socket +$server = new Server($loop, $socket); + +$loop->run(); +``` + +See also the [examples](examples). + +## Usage + +### ConnectorInterface + +The `ConnectorInterface` is responsible for providing an interface for +establishing streaming connections, such as a normal TCP/IP connection. + +In order to use this library, you should understand how this integrates with its +ecosystem. +This base interface is actually defined in React's +[Socket component](https://github.com/reactphp/socket) and used +throughout React's ecosystem. + +Most higher-level components (such as HTTP, database or other networking +service clients) accept an instance implementing this interface to create their +TCP/IP connection to the underlying networking service. +This is usually done via dependency injection, so it's fairly simple to actually +swap this implementation against this library in order to connect through a +SOCKS proxy server. + +The interface only offers a single method: + +#### connect() + +The `connect(string $uri): PromiseInterface` method +can be used to establish a streaming connection. +It returns a [Promise](https://github.com/reactphp/promise) which either +fulfills with a [ConnectionInterface](https://github.com/reactphp/socket#connectioninterface) or +rejects with an `Exception`: + +```php +$connector->connect('tcp://google.com:80')->then( + function (ConnectionInterface $stream) { + // connection successfully established + }, + function (Exception $error) { + // failed to connect due to $error + } +); +``` + +### Client + +The `Client` is responsible for communication with your SOCKS server instance. +Its constructor simply accepts an SOCKS proxy URI and a connector used to +connect to the SOCKS proxy server address. + +In its most simple form, you can simply pass React's +[`Connector`](https://github.com/reactphp/socket#connector) +like this: + +```php +$connector = new React\Socket\Connector($loop); +$client = new Client('127.0.0.1:1080', $connector); +``` + +You can omit the port if you're using the default SOCKS port 1080: + +```php +$client = new Client('127.0.0.1', $connector); +``` + +If you need custom connector settings (DNS resolution, timeouts etc.), you can explicitly pass a +custom instance of the [`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface): + +```php +// use local DNS server +$dnsResolverFactory = new DnsFactory(); +$resolver = $dnsResolverFactory->createCached('127.0.0.1', $loop); + +// outgoing connections to SOCKS server via interface 192.168.10.1 +// this is not to be confused with local DNS resolution (see further below) +$connector = new DnsConnector( + new TcpConnector($loop, array('bindto' => '192.168.10.1:0')), + $resolver +); + +$client = new Client('my-socks-server.local:1080', $connector); +``` + +This is the main class in this package. +Because it implements the the [`ConnectorInterface`](#connectorinterface), it +can simply be used in place of a normal connector. +This makes it fairly simple to add SOCKS proxy support to pretty much any +higher-level component: + +```diff +- $client = new SomeClient($connector); ++ $proxy = new Client('127.0.0.1:1080', $connector); ++ $client = new SomeClient($proxy); +``` + +#### Plain TCP connections + +The `Client` implements the [`ConnectorInterface`](#connectorinterface) and +hence provides a single public method, the [`connect()`](#connect) method. +Let's open up a streaming TCP/IP connection and write some data: + +```php +$client->connect('tcp://www.google.com:80')->then(function (ConnectonInterface $stream) { + echo 'connected to www.google.com:80'; + $stream->write("GET / HTTP/1.0\r\n\r\n"); + // ... +}); +``` + +You can either use the `Client` directly or you may want to wrap this connector +in React's [`Connector`](https://github.com/reactphp/socket#connector): + +```php +$connector = new React\Socket\Connector($loop, array( + 'tcp' => $client, + 'dns' => false +)); + +$connector->connect('tcp://www.google.com:80')->then(function (ConnectonInterface $stream) { + echo 'connected to www.google.com:80'; + $stream->write("GET / HTTP/1.0\r\n\r\n"); + // ... +}); + +``` + +See also the [first example](examples). + +The `tcp://` scheme can also be omitted. +Passing any other scheme will reject the promise. + +Pending connection attempts can be canceled by canceling its pending promise like so: + +```php +$promise = $connector->connect($uri); + +$promise->cancel(); +``` + +Calling `cancel()` on a pending promise will cancel the underlying TCP/IP +connection to the SOCKS server and/or the SOCKS protocol negotiation and reject +the resulting promise. + +#### Secure TLS connections + +If you want to establish a secure TLS connection (such as HTTPS) between you and +your destination, you may want to wrap this connector in React's +[`Connector`](https://github.com/reactphp/socket#connector) or the low-level +[`SecureConnector`](https://github.com/reactphp/socket#secureconnector): + +```php +$connector = new React\Socket\Connector($loop, array( + 'tcp' => $client, + 'dns' => false +)); + +// now create an SSL encrypted connection (notice the $ssl instead of $tcp) +$connector->connect('tls://www.google.com:443')->then(function (ConnectionInterface $stream) { + // proceed with just the plain text data + // everything is encrypted/decrypted automatically + echo 'connected to SSL encrypted www.google.com'; + $stream->write("GET / HTTP/1.0\r\n\r\n"); + // ... +}); +``` + +See also the [second example](examples). + +If you use the low-level `SecureConnector`, then the `tls://` scheme can also +be omitted. +Passing any other scheme will reject the promise. + +Pending connection attempts can be canceled by canceling its pending promise +as usual. + +> Also note how secure TLS connections are in fact entirely handled outside of + this SOCKS client implementation. + +You can optionally pass additional +[SSL context options](http://php.net/manual/en/context.ssl.php) +to the constructor like this: + +```php +$connector = new React\Socket\Connector($loop, array( + 'tcp' => $client, + 'tls' => array( + 'verify_peer' => false, + 'verify_peer_name' => false + ), + 'dns' => false +)); +``` + +#### HTTP requests + +HTTP operates on a higher layer than this low-level SOCKS implementation. +If you want to issue HTTP requests, you can add a dependency for +[clue/buzz-react](https://github.com/clue/php-buzz-react). +It can interact with this library by issuing all +[http requests through a SOCKS server](https://github.com/clue/php-buzz-react#socks-proxy). +This works for both plain HTTP and SSL encrypted HTTPS requests. + +#### Protocol version + +This library supports the SOCKS4, SOCKS4a and SOCKS5 protocol versions. + +While SOCKS4 already had (a somewhat limited) support for `SOCKS BIND` requests +and SOCKS5 added generic UDP support (`SOCKS UDPASSOCIATE`), this library +focuses on the most commonly used core feature of `SOCKS CONNECT`. +In this mode, a SOCKS server acts as a generic proxy allowing higher level +application protocols to work through it. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SOCKS4SOCKS4aSOCKS5
Protocol specificationSOCKS4.protocolSOCKS4A.protocolRFC 1928
Tunnel outgoing TCP connections
Remote DNS resolving
IPv6 addresses
Username/Password authentication✓ (as per RFC 1929)
Handshake # roundtrips112 (3 with authentication)
Handshake traffic
+ remote DNS
17 bytes
17 bytes
+ hostname + 1
variable (+ auth + IPv6)
+ hostname - 3
+ +Note, this is __not__ a full SOCKS5 implementation due to missing GSSAPI +authentication (but it's unlikely you're going to miss it anyway). + +By default, the `Client` communicates via SOCKS4a with the SOCKS server +– unless you enable [authentication](#authentication), in which case it will +default to SOCKS5. +This is done because SOCKS4a incurs less overhead than SOCKS5 (see above) and +is equivalent with SOCKS4 if you use [local DNS resolution](#dns-resolution). + +If want to explicitly set the protocol version, use the supported values URI +schemes `socks4`, `socks4a` or `socks5` as part of the SOCKS URI: + +```php +$client = new Client('socks5://127.0.0.1', $connector); +``` + +As seen above, both SOCKS5 and SOCKS4a support remote and local DNS resolution. +If you've explicitly set this to SOCKS4, then you may want to check the following +chapter about local DNS resolution or you may only connect to IPv4 addresses. + +#### DNS resolution + +By default, the `Client` does not perform any DNS resolution at all and simply +forwards any hostname you're trying to connect to to the SOCKS server. +The remote SOCKS server is thus responsible for looking up any hostnames via DNS +(this default mode is thus called *remote DNS resolution*). +As seen above, this mode is supported by the SOCKS5 and SOCKS4a protocols, but +not the SOCKS4 protocol, as the protocol lacks a way to communicate hostnames. + +On the other hand, all SOCKS protocol versions support sending destination IP +addresses to the SOCKS server. +In this mode you either have to stick to using IPs only (which is ofen unfeasable) +or perform any DNS lookups locally and only transmit the resolved destination IPs +(this mode is thus called *local DNS resolution*). + +The default *remote DNS resolution* is useful if your local `Client` either can +not resolve target hostnames because it has no direct access to the internet or +if it should not resolve target hostnames because its outgoing DNS traffic might +be intercepted (in particular when using the +[Tor network](#using-the-tor-anonymity-network-to-tunnel-socks-connections)). + +As noted above, the `Client` defaults to using remote DNS resolution. +However, wrapping the `Client` in React's +[`Connector`](https://github.com/reactphp/socket#connector) actually +performs local DNS resolution unless explicitly defined otherwise. +Given that remote DNS resolution is assumed to be the preferred mode, all +other examples explicitly disable DNS resoltion like this: + +```php +$connector = new React\Socket\Connector($loop, array( + 'tcp' => $client, + 'dns' => false +)); +``` + +If you want to explicitly use *local DNS resolution* (such as when explicitly +using SOCKS4), you can use the following code: + +```php +// set up Connector which uses Google's public DNS (8.8.8.8) +$connector = new React\Socket\Connector($loop, array( + 'tcp' => $client, + 'dns' => '8.8.8.8' +)); +``` + +See also the [fourth example](examples). + +Pending connection attempts can be canceled by canceling its pending promise +as usual. + +> Also note how local DNS resolution is in fact entirely handled outside of this + SOCKS client implementation. + +If you've explicitly set the client to SOCKS4 and stick to the default +*remote DNS resolution*, then you may only connect to IPv4 addresses because +the protocol lacks a way to communicate hostnames. +If you try to connect to a hostname despite, the resulting promise will be +rejected right away. + +#### Authentication + +This library supports username/password authentication for SOCKS5 servers as +defined in [RFC 1929](http://tools.ietf.org/html/rfc1929). + +On the client side, simply pass your username and password to use for +authentication (see below). +For each further connection the client will merely send a flag to the server +indicating authentication information is available. +Only if the server requests authentication during the initial handshake, +the actual authentication credentials will be transmitted to the server. + +Note that the password is transmitted in cleartext to the SOCKS proxy server, +so this methods should not be used on a network where you have to worry about eavesdropping. + +You can simply pass the authentication information as part of the SOCKS URI: + +```php +$client = new Client('username:password@127.0.0.1', $connector); +``` + +Note that both the username and password must be percent-encoded if they contain +special characters: + +```php +$user = 'he:llo'; +$pass = 'p@ss'; + +$client = new Client( + rawurlencode($user) . ':' . rawurlencode($pass) . '@127.0.0.1', + $connector +); +``` + +> The authentication details will be transmitted in cleartext to the SOCKS proxy + server only if it requires username/password authentication. + If the authentication details are missing or not accepted by the remote SOCKS + proxy server, it is expected to reject each connection attempt with an + exception error code of `SOCKET_EACCES` (13). + +Authentication is only supported by protocol version 5 (SOCKS5), +so passing authentication to the `Client` enforces communication with protocol +version 5 and complains if you have explicitly set anything else: + +```php +// throws InvalidArgumentException +new Client('socks4://user:pass@127.0.0.1', $connector); +``` + +#### Proxy chaining + +The `Client` is responsible for creating connections to the SOCKS server which +then connects to the target host. + +``` +Client -> SocksServer -> TargetHost +``` + +Sometimes it may be required to establish outgoing connections via another SOCKS +server. +For example, this can be useful if you want to conceal your origin address. + +``` +Client -> MiddlemanSocksServer -> TargetSocksServer -> TargetHost +``` + +The `Client` uses any instance of the `ConnectorInterface` to establish +outgoing connections. +In order to connect through another SOCKS server, you can simply use another +SOCKS connector from another SOCKS client like this: + +```php +// https via the proxy chain "MiddlemanSocksServer -> TargetSocksServer -> TargetHost" +// please note how the client uses TargetSocksServer (not MiddlemanSocksServer!), +// which in turn then uses MiddlemanSocksServer. +// this creates a TCP/IP connection to MiddlemanSocksServer, which then connects +// to TargetSocksServer, which then connects to the TargetHost +$middle = new Client('127.0.0.1:1080', new Connector($loop)); +$target = new Client('example.com:1080', $middle); + +$connector = new React\Socket\Connector($loop, array( + 'tcp' => $target, + 'dns' => false +)); + +$connector->connect('tls://www.google.com:443')->then(function ($stream) { + // … +}); +``` + +See also the [third example](examples). + +Pending connection attempts can be canceled by canceling its pending promise +as usual. + +Proxy chaining can happen on the server side and/or the client side: + +* If you ask your client to chain through multiple proxies, then each proxy + server does not really know anything about chaining at all. + This means that this is a client-only property. + +* If you ask your server to chain through another proxy, then your client does + not really know anything about chaining at all. + This means that this is a server-only property and not part of this class. + For example, you can find this in the below [`Server`](#server-proxy-chaining) + class or somewhat similar when you're using the + [Tor network](#using-the-tor-anonymity-network-to-tunnel-socks-connections). + +#### Connection timeout + +By default, the `Client` does not implement any timeouts for establishing remote +connections. +Your underlying operating system may impose limits on pending and/or idle TCP/IP +connections, anywhere in a range of a few minutes to several hours. + +Many use cases require more control over the timeout and likely values much +smaller, usually in the range of a few seconds only. + +You can use React's [`Connector`](https://github.com/reactphp/socket#connector) +or the low-level +[`TimeoutConnector`](https://github.com/reactphp/socket#timeoutconnector) +to decorate any given `ConnectorInterface` instance. +It provides the same `connect()` method, but will automatically reject the +underlying connection attempt if it takes too long: + +```php +$connector = new Connector($loop, array( + 'tcp' => $client, + 'dns' => false, + 'timeout' => 3.0 +)); + +$connector->connect('tcp://google.com:80')->then(function ($stream) { + // connection succeeded within 3.0 seconds +}); +``` + +See also any of the [examples](examples). + +Pending connection attempts can be canceled by canceling its pending promise +as usual. + +> Also note how connection timeout is in fact entirely handled outside of this + SOCKS client implementation. + +#### SOCKS over TLS + +All [SOCKS protocol versions](#protocol-version) support forwarding TCP/IP +based connections and higher level protocols. +This implies that you can also use [secure TLS connections](#secure-tls-connections) +to transfer sensitive data across SOCKS proxy servers. +This means that no eavesdropper nor the proxy server will be able to decrypt +your data. + +However, the initial SOCKS communication between the client and the proxy is +usually via an unencrypted, plain TCP/IP connection. +This means that an eavesdropper may be able to see *where* you connect to and +may also be able to see your [SOCKS authentication](#authentication) details +in cleartext. + +As an alternative, you may establish a secure TLS connection to your SOCKS +proxy before starting the initial SOCKS communication. +This means that no eavesdroppper will be able to see the destination address +you want to connect to or your [SOCKS authentication](#authentication) details. + +You can use the `sockss://` URI scheme or use an explicit +[SOCKS protocol version](#protocol-version) like this: + +```php +$client = new Client('sockss://127.0.0.1:1080', new Connector($loop)); + +$client = new Client('socks5s://127.0.0.1:1080', new Connector($loop)); +``` + +See also [example 32](examples). + +Simiarly, you can also combine this with [authentication](#authentication) +like this: + +```php +$client = new Client('sockss://user:pass@127.0.0.1:1080', new Connector($loop)); +``` + +> Note that for most use cases, [secure TLS connections](#secure-tls-connections) + should be used instead. SOCKS over TLS is considered advanced usage and is + used very rarely in practice. + In particular, the SOCKS server has to accept secure TLS connections, see + also [Server SOCKS over TLS](#server-socks-over-tls) for more details. + Also, PHP does not support "double encryption" over a single connection. + This means that enabling [secure TLS connections](#secure-tls-connections) + over a communication channel that has been opened with SOCKS over TLS + may not be supported. + +> Note that the SOCKS protocol does not support the notion of TLS. The above + works reasonably well because TLS is only used for the connection between + client and proxy server and the SOCKS protocol data is otherwise identical. + This implies that this may also have only limited support for + [proxy chaining](#proxy-chaining) over multiple TLS paths. + +#### Unix domain sockets + +All [SOCKS protocol versions](#protocol-version) support forwarding TCP/IP +based connections and higher level protocols. +In some advanced cases, it may be useful to let your SOCKS server listen on a +Unix domain socket (UDS) path instead of a IP:port combination. +For example, this allows you to rely on file system permissions instead of +having to rely on explicit [authentication](#authentication). + +You can use the `socks+unix://` URI scheme or use an explicit +[SOCKS protocol version](#protocol-version) like this: + +```php +$client = new Client('socks+unix:///tmp/proxy.sock', new Connector($loop)); + +$client = new Client('socks5+unix:///tmp/proxy.sock', new Connector($loop)); +``` + +Simiarly, you can also combine this with [authentication](#authentication) +like this: + +```php +$client = new Client('socks+unix://user:pass@/tmp/proxy.sock', new Connector($loop)); +``` + +> Note that Unix domain sockets (UDS) are considered advanced usage and PHP only + has limited support for this. + In particular, enabling [secure TLS](#secure-tls-connections) may not be + supported. + +> Note that SOCKS protocol does not support the notion of UDS paths. The above + works reasonably well because UDS is only used for the connection between + client and proxy server and the path will not actually passed over the protocol. + This implies that this does also not support [proxy chaining](#proxy-chaining) + over multiple UDS paths. + +### Server + +The `Server` is responsible for accepting incoming communication from SOCKS clients +and forwarding the requested connection to the target host. +It also registers everything with the main [`EventLoop`](https://github.com/reactphp/event-loop#usage) +and an underlying TCP/IP socket server like this: + +```php +$loop = \React\EventLoop\Factory::create(); + +// listen on localhost:$port +$socket = new Socket($port, $loop); + +$server = new Server($loop, $socket); +``` + +#### Server connector + +The `Server` uses an instance of the [`ConnectorInterface`](#connectorinterface) +to establish outgoing connections for each incoming connection request. + +If you need custom connector settings (DNS resolution, timeouts etc.), you can explicitly pass a +custom instance of the [`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface): + +```php +// use local DNS server +$dnsResolverFactory = new DnsFactory(); +$resolver = $dnsResolverFactory->createCached('127.0.0.1', $loop); + +// outgoing connections to target host via interface 192.168.10.1 +$connector = new DnsConnector( + new TcpConnector($loop, array('bindto' => '192.168.10.1:0')), + $resolver +); + +$server = new Server($loop, $socket, $connector); +``` + +If you want to forward the outgoing connection through another SOCKS proxy, you +may also pass a [`Client`](#client) instance as a connector, see also +[server proxy chaining](#server-proxy-chaining) for more details. + +Internally, the `Server` uses the normal [`connect()`](#connect) method, but +it also passes the original client IP as the `?source={remote}` parameter. +The `source` parameter contains the full remote URI, including the protocol +and any authentication details, for example `socks5://user:pass@1.2.3.4:5678`. +You can use this parameter for logging purposes or to restrict connection +requests for certain clients by providing a custom implementation of the +[`ConnectorInterface`](#connectorinterface). + +#### Server protocol version + +The `Server` supports all protocol versions (SOCKS4, SOCKS4a and SOCKS5) by default. + +If want to explicitly set the protocol version, use the supported values `4`, `4a` or `5`: + +```PHP +$server->setProtocolVersion(5); +``` + +In order to reset the protocol version to its default (i.e. automatic detection), +use `null` as protocol version. + +```PHP +$server->setProtocolVersion(null); +``` + +#### Server authentication + +By default, the `Server` does not require any authentication from the clients. +You can enable authentication support so that clients need to pass a valid +username and password before forwarding any connections. + +Setting authentication on the `Server` enforces each further connected client +to use protocol version 5 (SOCKS5). +If a client tries to use any other protocol version, does not send along +authentication details or if authentication details can not be verified, +the connection will be rejected. + +Because your authentication mechanism might take some time to actually check +the provided authentication credentials (like querying a remote database or webservice), +the server side uses a [Promise](https://github.com/reactphp/promise) based interface. +While this might seem complex at first, it actually provides a very simple way +to handle simultanous connections in a non-blocking fashion and increases overall performance. + +```PHP +$server->setAuth(function ($username, $password, $remote) { + // either return a boolean success value right away + // or use promises for delayed authentication + + // $remote is a full URI à la socks5://user:pass@192.168.1.1:1234 + // or socks5s://user:pass@192.168.1.1:1234 for SOCKS over TLS + // useful for logging or extracting parts, such as the remote IP + $ip = parse_url($remote, PHP_URL_HOST); + + return ($username === 'root' && $ip === '127.0.0.1'); +}); +``` + +Or if you only accept static authentication details, you can use the simple +array-based authentication method as a shortcut: + +```PHP +$server->setAuthArray(array( + 'tom' => 'password', + 'admin' => 'root' +)); +``` + +See also [example #12](examples). + +If you do not want to use authentication anymore: + +```PHP +$server->unsetAuth(); +``` + +#### Server proxy chaining + +The `Server` is responsible for creating connections to the target host. + +``` +Client -> SocksServer -> TargetHost +``` + +Sometimes it may be required to establish outgoing connections via another SOCKS +server. +For example, this can be useful if your target SOCKS server requires +authentication, but your client does not support sending authentication +information (e.g. like most webbrowser). + +``` +Client -> MiddlemanSocksServer -> TargetSocksServer -> TargetHost +``` + +The `Server` uses any instance of the `ConnectorInterface` to establish outgoing +connections. +In order to connect through another SOCKS server, you can simply use the +[`Client`](#client) SOCKS connector from above. +You can create a SOCKS `Client` instance like this: + +```php +// set next SOCKS server example.com:1080 as target +$connector = new React\Socket\Connector($loop); +$client = new Client('user:pass@example.com:1080', $connector); + +// listen on localhost:1080 +$socket = new Socket('127.0.0.1:1080', $loop); + +// start a new server which forwards all connections to the other SOCKS server +$server = new Server($loop, $socket, $client); +``` + +See also [example #21](examples). + +Proxy chaining can happen on the server side and/or the client side: + +* If you ask your client to chain through multiple proxies, then each proxy + server does not really know anything about chaining at all. + This means that this is a client-only property and not part of this class. + For example, you can find this in the above [`Client`](#proxy-chaining) class. + +* If you ask your server to chain through another proxy, then your client does + not really know anything about chaining at all. + This means that this is a server-only property and can be implemented as above. + +#### Server SOCKS over TLS + +All [SOCKS protocol versions](#server-protocol-version) support forwarding TCP/IP +based connections and higher level protocols. +This implies that you can also use [secure TLS connections](#secure-tls-connections) +to transfer sensitive data across SOCKS proxy servers. +This means that no eavesdropper nor the proxy server will be able to decrypt +your data. + +However, the initial SOCKS communication between the client and the proxy is +usually via an unencrypted, plain TCP/IP connection. +This means that an eavesdropper may be able to see *where* the client connects +to and may also be able to see the [SOCKS authentication](#authentication) +details in cleartext. + +As an alternative, you may listen for SOCKS over TLS connections so +that the client has to establish a secure TLS connection to your SOCKS +proxy before starting the initial SOCKS communication. +This means that no eavesdroppper will be able to see the destination address +the client wants to connect to or their [SOCKS authentication](#authentication) +details. + +You can simply start your listening socket on the `tls://` URI scheme like this: + +```php +$loop = \React\EventLoop\Factory::create(); + +// listen on tls://127.0.0.1:1080 with the given server certificate +$socket = new React\Socket\Server('tls://127.0.0.1:1080', $loop, array( + 'tls' => array( + 'local_cert' => __DIR__ . '/localhost.pem', + ) +)); +$server = new Server($loop, $socket); +``` + +See also [example 31](examples). + +> Note that for most use cases, [secure TLS connections](#secure-tls-connections) + should be used instead. SOCKS over TLS is considered advanced usage and is + used very rarely in practice. + +> Note that the SOCKS protocol does not support the notion of TLS. The above + works reasonably well because TLS is only used for the connection between + client and proxy server and the SOCKS protocol data is otherwise identical. + This implies that this does also not support [proxy chaining](#server-proxy-chaining) + over multiple TLS paths. + +#### Server Unix domain sockets + +All [SOCKS protocol versions](#server-protocol-version) support forwarding TCP/IP +based connections and higher level protocols. +In some advanced cases, it may be useful to let your SOCKS server listen on a +Unix domain socket (UDS) path instead of a IP:port combination. +For example, this allows you to rely on file system permissions instead of +having to rely on explicit [authentication](#server-authentication). + +You can simply start your listening socket on the `unix://` URI scheme like this: + +```php +$loop = \React\EventLoop\Factory::create(); + +// listen on /tmp/proxy.sock +$socket = new React\Socket\Server('unix:///tmp/proxy.sock', $loop); +$server = new Server($loop, $socket); +``` + +> Note that Unix domain sockets (UDS) are considered advanced usage and that + the SOCKS protocol does not support the notion of UDS paths. The above + works reasonably well because UDS is only used for the connection between + client and proxy server and the path will not actually passed over the protocol. + This implies that this does also not support [proxy chaining](#server-proxy-chaining) + over multiple UDS paths. + +## Servers + +### Using a PHP SOCKS server + +* If you're looking for an end-user SOCKS server daemon, you may want to use + [LeProxy](https://leproxy.org/) or [clue/psocksd](https://github.com/clue/psocksd). +* If you're looking for a SOCKS server implementation, consider using + the above [`Server`](#server) class. + +### Using SSH as a SOCKS server + +If you already have an SSH server set up, you can easily use it as a SOCKS +tunnel end point. On your client, simply start your SSH client and use +the `-D ` option to start a local SOCKS server (quoting the man page: +a `local "dynamic" application-level port forwarding`). + +You can start a local SOCKS server by creating a loopback connection to your +local system if you already run an SSH daemon: + +```bash +$ ssh -D 1080 localhost +``` + +Alternatively, you can start a local SOCKS server tunneling through a given +remote host that runs an SSH daemon: + +```bash +$ ssh -D 1080 example.com +``` + +Now you can simply use this SSH SOCKS server like this: + +```PHP +$client = new Client('127.0.0.1:1080', $connector); +``` + +Note that the above will allow all users on the local system to connect over +your SOCKS server without authentication which may or may not be what you need. +As an alternative, recent OpenSSH client versions also support +[Unix domain sockets](#unix-domain-sockets) (UDS) paths so that you can rely +on Unix file system permissions instead: + +```bash +$ ssh -D/tmp/proxy.sock example.com +``` + +Now you can simply use this SSH SOCKS server like this: + +```PHP +$client = new Client('socks+unix:///tmp/proxy.sock', $connector); +``` + +### Using the Tor (anonymity network) to tunnel SOCKS connections + +The [Tor anonymity network](http://www.torproject.org) client software is designed +to encrypt your traffic and route it over a network of several nodes to conceal its origin. +It presents a SOCKS4 and SOCKS5 interface on TCP port 9050 by default +which allows you to tunnel any traffic through the anonymity network. +In most scenarios you probably don't want your client to resolve the target hostnames, +because you would leak DNS information to anybody observing your local traffic. +Also, Tor provides hidden services through an `.onion` pseudo top-level domain +which have to be resolved by Tor. + +```PHP +$client = new Client('127.0.0.1:9050', $connector); +``` + +## Install + +The recommended way to install this library is [through Composer](https://getcomposer.org). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) + +This will install the latest supported version: + +```bash +$ composer require clue/socks-react:^0.8.7 +``` + +See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. + +## Tests + +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org): + +```bash +$ composer install +``` + +To run the test suite, go to the project root and run: + +```bash +$ php vendor/bin/phpunit +``` + +The test suite contains a number of tests that rely on a working internet +connection, alternatively you can also run it like this: + +```bash +$ php vendor/bin/phpunit --exclude-group internet +``` + +## License + +MIT, see LICENSE + +## More + +* If you want to learn more about processing streams of data, refer to the + documentation of the underlying + [react/stream](https://github.com/reactphp/stream) component. +* If you want to learn more about how the + [`ConnectorInterface`](#connectorinterface) and its usual implementations look + like, refer to the documentation of the underlying + [react/socket component](https://github.com/reactphp/socket). +* As an alternative to a SOCKS (SOCKS4/SOCKS5) proxy, you may also want to look into + using an HTTP CONNECT proxy instead. + You may want to use [clue/http-proxy-react](https://github.com/clue/php-http-proxy-react) + which also provides an implementation of the + [`ConnectorInterface`](#connectorinterface) so that supporting either proxy + protocol should be fairly trivial. +* If you're dealing with public proxies, you'll likely have to work with mixed + quality and unreliable proxies. You may want to look into using + [clue/connection-manager-extra](https://github.com/clue/php-connection-manager-extra) + which allows retrying unreliable ones, implying connection timeouts, + concurrently working with multiple connectors and more. +* If you're looking for an end-user SOCKS server daemon, you may want to use + [LeProxy](https://leproxy.org/) or [clue/psocksd](https://github.com/clue/psocksd). diff --git a/instafeed/vendor/clue/socks-react/composer.json b/instafeed/vendor/clue/socks-react/composer.json new file mode 100755 index 0000000..50ef83a --- /dev/null +++ b/instafeed/vendor/clue/socks-react/composer.json @@ -0,0 +1,28 @@ +{ + "name": "clue/socks-react", + "description": "Async SOCKS4, SOCKS4a and SOCKS5 proxy client and server implementation, built on top of ReactPHP", + "keywords": ["socks client", "socks server", "proxy", "tcp tunnel", "socks protocol", "async", "ReactPHP"], + "homepage": "https://github.com/clue/php-socks-react", + "license": "MIT", + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "autoload": { + "psr-4": {"Clue\\React\\Socks\\": "src/"} + }, + "require": { + "php": ">=5.3", + "react/socket": "^1.0 || ^0.8.6", + "react/promise": "^2.1 || ^1.2", + "evenement/evenement": "~3.0|~1.0|~2.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3", + "clue/connection-manager-extra": "^1.0 || ^0.7", + "clue/block-react": "^1.1" + } +} diff --git a/instafeed/vendor/clue/socks-react/examples/01-http.php b/instafeed/vendor/clue/socks-react/examples/01-http.php new file mode 100755 index 0000000..584b6c4 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/01-http.php @@ -0,0 +1,30 @@ + $client, + 'timeout' => 3.0, + 'dns' => false +)); + +echo 'Demo SOCKS client connecting to SOCKS server ' . $proxy . PHP_EOL; + +$connector->connect('tcp://www.google.com:80')->then(function (ConnectionInterface $stream) { + echo 'connected' . PHP_EOL; + $stream->write("GET / HTTP/1.0\r\n\r\n"); + $stream->on('data', function ($data) { + echo $data; + }); +}, 'printf'); + +$loop->run(); diff --git a/instafeed/vendor/clue/socks-react/examples/02-https.php b/instafeed/vendor/clue/socks-react/examples/02-https.php new file mode 100755 index 0000000..f763fc2 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/02-https.php @@ -0,0 +1,30 @@ + $client, + 'timeout' => 3.0, + 'dns' => false +)); + +echo 'Demo SOCKS client connecting to SOCKS server ' . $proxy . PHP_EOL; + +$connector->connect('tls://www.google.com:443')->then(function (ConnectionInterface $stream) { + echo 'connected' . PHP_EOL; + $stream->write("GET / HTTP/1.0\r\n\r\n"); + $stream->on('data', function ($data) { + echo $data; + }); +}, 'printf'); + +$loop->run(); diff --git a/instafeed/vendor/clue/socks-react/examples/03-proxy-chaining.php b/instafeed/vendor/clue/socks-react/examples/03-proxy-chaining.php new file mode 100755 index 0000000..5278d2c --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/03-proxy-chaining.php @@ -0,0 +1,46 @@ + [...]' . PHP_EOL; + echo 'You can add 1..n proxies in the path' . PHP_EOL; + exit(1); +} + +$path = array_slice($argv, 1); + +// Alternatively, you can also hard-code this value like this: +//$path = array('127.0.0.1:9051', '127.0.0.1:9052', '127.0.0.1:9053'); + +$loop = React\EventLoop\Factory::create(); + +// set next SOCKS server chain via p1 -> p2 -> p3 -> destination +$connector = new Connector($loop); +foreach ($path as $proxy) { + $connector = new Client($proxy, $connector); +} + +// please note how the client uses p3 (not p1!), which in turn then uses the complete chain +// this creates a TCP/IP connection to p1, which then connects to p2, then to p3, which then connects to the target +$connector = new Connector($loop, array( + 'tcp' => $connector, + 'timeout' => 3.0, + 'dns' => false +)); + +echo 'Demo SOCKS client connecting to SOCKS proxy server chain ' . implode(' -> ', $path) . PHP_EOL; + +$connector->connect('tls://www.google.com:443')->then(function (ConnectionInterface $stream) { + echo 'connected' . PHP_EOL; + $stream->write("GET / HTTP/1.0\r\n\r\n"); + $stream->on('data', function ($data) { + echo $data; + }); +}, 'printf'); + +$loop->run(); diff --git a/instafeed/vendor/clue/socks-react/examples/04-local-dns.php b/instafeed/vendor/clue/socks-react/examples/04-local-dns.php new file mode 100755 index 0000000..2ea39dd --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/04-local-dns.php @@ -0,0 +1,31 @@ + $client, + 'timeout' => 3.0, + 'dns' => '8.8.8.8' +)); + +echo 'Demo SOCKS client connecting to SOCKS server ' . $proxy . PHP_EOL; + +$connector->connect('tls://www.google.com:443')->then(function (ConnectionInterface $stream) { + echo 'connected' . PHP_EOL; + $stream->write("GET / HTTP/1.0\r\n\r\n"); + $stream->on('data', function ($data) { + echo $data; + }); +}, 'printf'); + +$loop->run(); diff --git a/instafeed/vendor/clue/socks-react/examples/11-server.php b/instafeed/vendor/clue/socks-react/examples/11-server.php new file mode 100755 index 0000000..da0a1a1 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/11-server.php @@ -0,0 +1,19 @@ +getAddress() . PHP_EOL; + +$loop->run(); diff --git a/instafeed/vendor/clue/socks-react/examples/12-server-with-password.php b/instafeed/vendor/clue/socks-react/examples/12-server-with-password.php new file mode 100755 index 0000000..55cc30b --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/12-server-with-password.php @@ -0,0 +1,24 @@ +setAuthArray(array( + 'tom' => 'god', + 'user' => 'p@ssw0rd' +)); + +echo 'SOCKS5 server requiring authentication listening on ' . $socket->getAddress() . PHP_EOL; + +$loop->run(); diff --git a/instafeed/vendor/clue/socks-react/examples/13-server-blacklist.php b/instafeed/vendor/clue/socks-react/examples/13-server-blacklist.php new file mode 100755 index 0000000..c153049 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/13-server-blacklist.php @@ -0,0 +1,40 @@ + $reject, + 'www.google.com:80' => $reject, + '*' => $permit +)); + +// listen on 127.0.0.1:1080 or first argument +$listen = isset($argv[1]) ? $argv[1] : '127.0.0.1:1080'; +$socket = new Socket($listen, $loop); + +// start the actual socks server on the given server socket and using our connection manager for outgoing connections +$server = new Server($loop, $socket, $connector); + +echo 'SOCKS server listening on ' . $socket->getAddress() . PHP_EOL; + +$loop->run(); diff --git a/instafeed/vendor/clue/socks-react/examples/21-server-proxy-chaining.php b/instafeed/vendor/clue/socks-react/examples/21-server-proxy-chaining.php new file mode 100755 index 0000000..0d0dee2 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/21-server-proxy-chaining.php @@ -0,0 +1,42 @@ + [...]' . PHP_EOL; + echo 'You can add 1..n proxies in the path' . PHP_EOL; + exit(1); +} + +$listen = $argv[1]; +$path = array_slice($argv, 2); + +// Alternatively, you can also hard-code these values like this: +//$listen = '127.0.0.1:9050'; +//$path = array('127.0.0.1:9051', '127.0.0.1:9052', '127.0.0.1:9053'); + +$loop = React\EventLoop\Factory::create(); + +// set next SOCKS server chain -> p1 -> p2 -> p3 -> destination +$connector = new Connector($loop); +foreach ($path as $proxy) { + $connector = new Client($proxy, $connector); +} + +// listen on 127.0.0.1:1080 or first argument +$socket = new Socket($listen, $loop); + +// start a new server which forwards all connections to the other SOCKS server +$server = new Server($loop, $socket, $connector); + +echo 'SOCKS server listening on ' . $socket->getAddress() . PHP_EOL; +echo 'Forwarding via: ' . implode(' -> ', $path) . PHP_EOL; + +$loop->run(); diff --git a/instafeed/vendor/clue/socks-react/examples/22-server-proxy-chaining-from-random-pool.php b/instafeed/vendor/clue/socks-react/examples/22-server-proxy-chaining-from-random-pool.php new file mode 100755 index 0000000..39245c9 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/22-server-proxy-chaining-from-random-pool.php @@ -0,0 +1,46 @@ + ...' . PHP_EOL; + echo 'You can add 2..n proxies in the pool' . PHP_EOL; + exit(1); +} + +$listen = $argv[1]; +$pool = array_slice($argv, 2); + +// Alternatively, you can also hard-code these values like this: +//$listen = '127.0.0.1:9050'; +//$pool = array('127.0.0.1:9051', '127.0.0.1:9052', '127.0.0.1:9053'); + +$loop = LoopFactory::create(); + +// forward to socks server listening on 127.0.0.1:9051-9053 +// this connector randomly picks one of the the attached connectors from the pool +$connector = new Connector($loop); +$clients = array(); +foreach ($pool as $proxy) { + $clients []= new Client($proxy, $connector); +} +$connector = new ConnectionManagerRandom($clients); + +$socket = new Socket($listen, $loop); + +// start the actual socks server on the given server socket and using our connection manager for outgoing connections +$server = new Server($loop, $socket, $connector); + +echo 'SOCKS server listening on ' . $socket->getAddress() . PHP_EOL; +echo 'Randomly picking from: ' . implode(', ', $pool) . PHP_EOL; + +$loop->run(); diff --git a/instafeed/vendor/clue/socks-react/examples/31-server-secure.php b/instafeed/vendor/clue/socks-react/examples/31-server-secure.php new file mode 100755 index 0000000..b4b2109 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/31-server-secure.php @@ -0,0 +1,21 @@ + array( + 'local_cert' => __DIR__ . '/localhost.pem', +))); + +// start a new server listening for incoming connection on the given socket +$server = new Server($loop, $socket); + +echo 'SOCKS over TLS server listening on ' . str_replace('tls:', 'sockss:', $socket->getAddress()) . PHP_EOL; + +$loop->run(); diff --git a/instafeed/vendor/clue/socks-react/examples/32-http-secure.php b/instafeed/vendor/clue/socks-react/examples/32-http-secure.php new file mode 100755 index 0000000..d304bd4 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/32-http-secure.php @@ -0,0 +1,33 @@ + array( + 'verify_peer' => false, + 'verify_peer_name' => false +)))); +$connector = new Connector($loop, array( + 'tcp' => $client, + 'timeout' => 3.0, + 'dns' => false +)); + +echo 'Demo SOCKS over TLS client connecting to secure SOCKS server ' . $proxy . PHP_EOL; + +$connector->connect('tcp://www.google.com:80')->then(function (ConnectionInterface $stream) { + echo 'connected' . PHP_EOL; + $stream->write("GET / HTTP/1.0\r\n\r\n"); + $stream->on('data', function ($data) { + echo $data; + }); +}, 'printf'); + +$loop->run(); diff --git a/instafeed/vendor/clue/socks-react/examples/localhost.pem b/instafeed/vendor/clue/socks-react/examples/localhost.pem new file mode 100755 index 0000000..be69279 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/examples/localhost.pem @@ -0,0 +1,49 @@ +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBZMRIwEAYDVQQDDAkxMjcu +MC4wLjExCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQK +DBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTYxMjMwMTQ1OTA2WhcNMjYx +MjI4MTQ1OTA2WjBZMRIwEAYDVQQDDAkxMjcuMC4wLjExCzAJBgNVBAYTAkFVMRMw +EQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0 +eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC8SZWNS+Ktg0Py +W8dx5uXZ+ZUawd3wnzLMHW7EhoUpIrIdp3kDU9NezF68dOhPMJY/Kh+6btRCxWXN +2OVTqS5Xi826j3TSE07iF83JRLeveW0PcodjUBd+RzdwCWWo2pfMJz4v7x1wu1c9 +zNi6JxxpDAXTFSB4GiWsI4tFu2XmMRhfm6LRK4WPfsZIJKokdiG5fKSPDn7nrVj0 +UUXr2eBsEAzdwL14U9+mwbLdaAkz3qK3fqi8sEC09lEWm95gKMOhkQf5qvXODtT4 +wdVrrKDTyehLv0xaItnUDnXzrkMBU5QS9TQzzqSW6ZaBsSxtONEFUiXiN9dtyXsY +YCUE54G/AgMBAAGjUDBOMB0GA1UdDgQWBBQ2GRz3QsQzdXaTMnPVCKfpigA10DAf +BgNVHSMEGDAWgBQ2GRz3QsQzdXaTMnPVCKfpigA10DAMBgNVHRMEBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQA77iZ4KrpPY18Ezjt0mngYAuAxunKddXYdLZ2khywN +0uI/VzYnkFVtrsC7y2jLHSxlmE2/viPPGZDUplENV2acN6JNW+tlt7/bsrQHDQw3 +7VCF27EWiDxHsaghhLkqC+kcop5YR5c0oDQTdEWEKSbow2zayUXDYbRRs76SClTe +824Yul+Ts8Mka+AX2PXDg47iZ84fJRN/nKavcJUTJ2iS1uYw0GNnFMge/uwsfMR3 +V47qN0X5emky8fcq99FlMCbcy0gHAeSWAjClgr2dd2i0LDatUbj7YmdmFcskOgII +IwGfvuWR2yPevYGAE0QgFeLHniN3RW8zmpnX/XtrJ4a7 +-----END CERTIFICATE----- +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC8SZWNS+Ktg0Py +W8dx5uXZ+ZUawd3wnzLMHW7EhoUpIrIdp3kDU9NezF68dOhPMJY/Kh+6btRCxWXN +2OVTqS5Xi826j3TSE07iF83JRLeveW0PcodjUBd+RzdwCWWo2pfMJz4v7x1wu1c9 +zNi6JxxpDAXTFSB4GiWsI4tFu2XmMRhfm6LRK4WPfsZIJKokdiG5fKSPDn7nrVj0 +UUXr2eBsEAzdwL14U9+mwbLdaAkz3qK3fqi8sEC09lEWm95gKMOhkQf5qvXODtT4 +wdVrrKDTyehLv0xaItnUDnXzrkMBU5QS9TQzzqSW6ZaBsSxtONEFUiXiN9dtyXsY +YCUE54G/AgMBAAECggEBAKiO/3FE1CMddkCLZVtUp8ShqJgRokx9WI5ecwFApAkV +ZHsjqDQQYRNmxhDUX/w0tOzLGyhde2xjJyZG29YviKsbHwu6zYwbeOzy/mkGOaK/ +g6DmmMmRs9Z6juifoQCu4GIFZ6il2adIL2vF7OeJh+eKudQj/7NFRSB7mXzNrQWK +tZY3eux5zXWmio7pgZrx1HFZQiiL9NVLwT9J7oBnaoO3fREiu5J2xBpljG9Cr0j1 +LLiVLhukWJYRlHDtGt1CzI9w8iKo44PCRzpKyxpbsOrQxeSyEWUYQRv9VHA59LC7 +tVAJTbnTX1BNHkGZkOkoOpoZLwBaM2XbbDtcOGCAZMECgYEA+mTURFQ85/pxawvk +9ndqZ+5He1u/bMLYIJDp0hdB/vgD+vw3gb2UyRwp0I6Wc6Si4FEEnbY7L0pzWsiR +43CpLs+cyLfnD9NycuIasxs5fKb/1s1nGTkRAp7x9x/ZTtEf8v4YTmmMXFHzdo7V +pv+czO89ppEDkxEtMf/b5SifhO8CgYEAwIDIUvXLduGhL+RPDwjc2SKdydXGV6om +OEdt/V8oS801Z7k8l3gHXFm7zL/MpHmh9cag+F9dHK42kw2RSjDGsBlXXiAO1Z0I +2A34OdPw/kow8fmIKWTMu3+28Kca+3RmUqeyaq0vazQ/bWMO9px+Ud3YfLo1Tn5I +li0MecAx8DECgYEAvsLceKYYtL83c09fg2oc1ctSCCgw4WJcGAtvJ9DyRZacKbXH +b/+H/+OF8879zmKqd+0hcCnqUzAMTCisBLPLIM+o6b45ufPkqKObpcJi/JWaKgLY +vf2c+Psw6o4IF6T5Cz4MNIjzF06UBknxecYZpoPJ20F1kLCwVvxPgfl99l8CgYAb +XfOcv67WTstgiJ+oroTfJamy+P5ClkDqvVTosW+EHz9ZaJ8xlXHOcj9do2LPey9I +Rp250azmF+pQS5x9JKQKgv/FtN8HBVUtigbhCb14GUoODICMCfWFLmnumoMefnTR +iV+3BLn6Dqp5vZxx+NuIffZ5/Or5JsDhALSGVomC8QKBgAi3Z/dNQrDHfkXMNn/L ++EAoLuAbFgLs76r9VGgNaRQ/q5gex2bZEGoBj4Sxvs95NUIcfD9wKT7FF8HdxARv +y3o6Bfc8Xp9So9SlFXrje+gkdEJ0rQR67d+XBuJZh86bXJHVrMwpoNL+ahLGdVSe +81oh1uCH1YPLM29hPyaohxL8 +-----END PRIVATE KEY----- diff --git a/instafeed/vendor/clue/socks-react/phpunit.xml.dist b/instafeed/vendor/clue/socks-react/phpunit.xml.dist new file mode 100755 index 0000000..d451dff --- /dev/null +++ b/instafeed/vendor/clue/socks-react/phpunit.xml.dist @@ -0,0 +1,14 @@ + + + + + + ./tests/ + + + + + ./src/ + + + diff --git a/instafeed/vendor/clue/socks-react/src/Client.php b/instafeed/vendor/clue/socks-react/src/Client.php new file mode 100755 index 0000000..ee643b6 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/src/Client.php @@ -0,0 +1,382 @@ + SOCKS5 authentication + if (isset($parts['user']) || isset($parts['pass'])) { + if ($parts['scheme'] === 'socks') { + // default to using SOCKS5 if not given explicitly + $parts['scheme'] = 'socks5'; + } elseif ($parts['scheme'] !== 'socks5') { + // fail if any other protocol version given explicitly + throw new InvalidArgumentException('Authentication requires SOCKS5. Consider using protocol version 5 or waive authentication'); + } + $parts += array('user' => '', 'pass' => ''); + $this->setAuth(rawurldecode($parts['user']), rawurldecode($parts['pass'])); + } + + // check for valid protocol version from URI scheme + $this->setProtocolVersionFromScheme($parts['scheme']); + + $this->socksUri = $parts['host'] . ':' . $parts['port']; + $this->connector = $connector; + } + + private function setProtocolVersionFromScheme($scheme) + { + if ($scheme === 'socks' || $scheme === 'socks4a') { + $this->protocolVersion = '4a'; + } elseif ($scheme === 'socks5') { + $this->protocolVersion = '5'; + } elseif ($scheme === 'socks4') { + $this->protocolVersion = '4'; + } else { + throw new InvalidArgumentException('Invalid protocol version given "' . $scheme . '://"'); + } + } + + /** + * set login data for username/password authentication method (RFC1929) + * + * @param string $username + * @param string $password + * @link http://tools.ietf.org/html/rfc1929 + */ + private function setAuth($username, $password) + { + if (strlen($username) > 255 || strlen($password) > 255) { + throw new InvalidArgumentException('Both username and password MUST NOT exceed a length of 255 bytes each'); + } + $this->auth = pack('C2', 0x01, strlen($username)) . $username . pack('C', strlen($password)) . $password; + } + + /** + * Establish a TCP/IP connection to the given target URI through the SOCKS server + * + * Many higher-level networking protocols build on top of TCP. It you're dealing + * with one such client implementation, it probably uses/accepts an instance + * implementing React's `ConnectorInterface` (and usually its default `Connector` + * instance). In this case you can also pass this `Connector` instance instead + * to make this client implementation SOCKS-aware. That's it. + * + * @param string $uri + * @return PromiseInterface Promise + */ + public function connect($uri) + { + if (strpos($uri, '://') === false) { + $uri = 'tcp://' . $uri; + } + + $parts = parse_url($uri); + if (!$parts || !isset($parts['scheme'], $parts['host'], $parts['port']) || $parts['scheme'] !== 'tcp') { + return Promise\reject(new InvalidArgumentException('Invalid target URI specified')); + } + + $host = trim($parts['host'], '[]'); + $port = $parts['port']; + + if ($this->protocolVersion === '4' && false === filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + return Promise\reject(new InvalidArgumentException('Requires an IPv4 address for SOCKS4')); + } + + if (strlen($host) > 255 || $port > 65535 || $port < 0 || (string)$port !== (string)(int)$port) { + return Promise\reject(new InvalidArgumentException('Invalid target specified')); + } + + // construct URI to SOCKS server to connect to + $socksUri = $this->socksUri; + + // append path from URI if given + if (isset($parts['path'])) { + $socksUri .= $parts['path']; + } + + // parse query args + $args = array(); + if (isset($parts['query'])) { + parse_str($parts['query'], $args); + } + + // append hostname from URI to query string unless explicitly given + if (!isset($args['hostname'])) { + $args['hostname'] = $host; + } + + // append query string + $socksUri .= '?' . http_build_query($args, '', '&'); + + // append fragment from URI if given + if (isset($parts['fragment'])) { + $socksUri .= '#' . $parts['fragment']; + } + + $that = $this; + + // start TCP/IP connection to SOCKS server and then + // handle SOCKS protocol once connection is ready + // resolve plain connection once SOCKS protocol is completed + return $this->connector->connect($socksUri)->then( + function (ConnectionInterface $stream) use ($that, $host, $port) { + return $that->handleConnectedSocks($stream, $host, $port); + }, + function (Exception $e) { + throw new RuntimeException('Unable to connect to proxy (ECONNREFUSED)', defined('SOCKET_ECONNREFUSED') ? SOCKET_ECONNREFUSED : 111, $e); + } + ); + } + + /** + * Internal helper used to handle the communication with the SOCKS server + * + * @param ConnectionInterface $stream + * @param string $host + * @param int $port + * @return Promise Promise + * @internal + */ + public function handleConnectedSocks(ConnectionInterface $stream, $host, $port) + { + $deferred = new Deferred(function ($_, $reject) { + $reject(new RuntimeException('Connection canceled while establishing SOCKS session (ECONNABORTED)', defined('SOCKET_ECONNABORTED') ? SOCKET_ECONNABORTED : 103)); + }); + + $reader = new StreamReader(); + $stream->on('data', array($reader, 'write')); + + $stream->on('error', $onError = function (Exception $e) use ($deferred) { + $deferred->reject(new RuntimeException('Stream error while waiting for response from proxy (EIO)', defined('SOCKET_EIO') ? SOCKET_EIO : 5, $e)); + }); + + $stream->on('close', $onClose = function () use ($deferred) { + $deferred->reject(new RuntimeException('Connection to proxy lost while waiting for response (ECONNRESET)', defined('SOCKET_ECONNRESET') ? SOCKET_ECONNRESET : 104)); + }); + + if ($this->protocolVersion === '5') { + $promise = $this->handleSocks5($stream, $host, $port, $reader); + } else { + $promise = $this->handleSocks4($stream, $host, $port, $reader); + } + $promise->then(function () use ($deferred, $stream) { + $deferred->resolve($stream); + }, function (Exception $error) use ($deferred) { + // pass custom RuntimeException through as-is, otherwise wrap in protocol error + if (!$error instanceof RuntimeException) { + $error = new RuntimeException('Invalid response received from proxy (EBADMSG)', defined('SOCKET_EBADMSG') ? SOCKET_EBADMSG: 71, $error); + } + + $deferred->reject($error); + }); + + return $deferred->promise()->then( + function (ConnectionInterface $stream) use ($reader, $onError, $onClose) { + $stream->removeListener('data', array($reader, 'write')); + $stream->removeListener('error', $onError); + $stream->removeListener('close', $onClose); + + return $stream; + }, + function ($error) use ($stream, $onClose) { + $stream->removeListener('close', $onClose); + $stream->close(); + + throw $error; + } + ); + } + + private function handleSocks4(ConnectionInterface $stream, $host, $port, StreamReader $reader) + { + // do not resolve hostname. only try to convert to IP + $ip = ip2long($host); + + // send IP or (0.0.0.1) if invalid + $data = pack('C2nNC', 0x04, 0x01, $port, $ip === false ? 1 : $ip, 0x00); + + if ($ip === false) { + // host is not a valid IP => send along hostname (SOCKS4a) + $data .= $host . pack('C', 0x00); + } + + $stream->write($data); + + return $reader->readBinary(array( + 'null' => 'C', + 'status' => 'C', + 'port' => 'n', + 'ip' => 'N' + ))->then(function ($data) { + if ($data['null'] !== 0x00) { + throw new Exception('Invalid SOCKS response'); + } + if ($data['status'] !== 0x5a) { + throw new RuntimeException('Proxy refused connection with SOCKS error code ' . sprintf('0x%02X', $data['status']) . ' (ECONNREFUSED)', defined('SOCKET_ECONNREFUSED') ? SOCKET_ECONNREFUSED : 111); + } + }); + } + + private function handleSocks5(ConnectionInterface $stream, $host, $port, StreamReader $reader) + { + // protocol version 5 + $data = pack('C', 0x05); + + $auth = $this->auth; + if ($auth === null) { + // one method, no authentication + $data .= pack('C2', 0x01, 0x00); + } else { + // two methods, username/password and no authentication + $data .= pack('C3', 0x02, 0x02, 0x00); + } + $stream->write($data); + + $that = $this; + + return $reader->readBinary(array( + 'version' => 'C', + 'method' => 'C' + ))->then(function ($data) use ($auth, $stream, $reader) { + if ($data['version'] !== 0x05) { + throw new Exception('Version/Protocol mismatch'); + } + + if ($data['method'] === 0x02 && $auth !== null) { + // username/password authentication requested and provided + $stream->write($auth); + + return $reader->readBinary(array( + 'version' => 'C', + 'status' => 'C' + ))->then(function ($data) { + if ($data['version'] !== 0x01 || $data['status'] !== 0x00) { + throw new RuntimeException('Username/Password authentication failed (EACCES)', defined('SOCKET_EACCES') ? SOCKET_EACCES : 13); + } + }); + } else if ($data['method'] !== 0x00) { + // any other method than "no authentication" + throw new RuntimeException('No acceptable authentication method found (EACCES)', defined('SOCKET_EACCES') ? SOCKET_EACCES : 13); + } + })->then(function () use ($stream, $reader, $host, $port) { + // do not resolve hostname. only try to convert to (binary/packed) IP + $ip = @inet_pton($host); + + $data = pack('C3', 0x05, 0x01, 0x00); + if ($ip === false) { + // not an IP, send as hostname + $data .= pack('C2', 0x03, strlen($host)) . $host; + } else { + // send as IPv4 / IPv6 + $data .= pack('C', (strpos($host, ':') === false) ? 0x01 : 0x04) . $ip; + } + $data .= pack('n', $port); + + $stream->write($data); + + return $reader->readBinary(array( + 'version' => 'C', + 'status' => 'C', + 'null' => 'C', + 'type' => 'C' + )); + })->then(function ($data) use ($reader) { + if ($data['version'] !== 0x05 || $data['null'] !== 0x00) { + throw new Exception('Invalid SOCKS response'); + } + if ($data['status'] !== 0x00) { + // map limited list of SOCKS error codes to common socket error conditions + // @link https://tools.ietf.org/html/rfc1928#section-6 + if ($data['status'] === Server::ERROR_GENERAL) { + throw new RuntimeException('SOCKS server reported a general server failure (ECONNREFUSED)', defined('SOCKET_ECONNREFUSED') ? SOCKET_ECONNREFUSED : 111); + } elseif ($data['status'] === Server::ERROR_NOT_ALLOWED_BY_RULESET) { + throw new RuntimeException('SOCKS server reported connection is not allowed by ruleset (EACCES)', defined('SOCKET_EACCES') ? SOCKET_EACCES : 13); + } elseif ($data['status'] === Server::ERROR_NETWORK_UNREACHABLE) { + throw new RuntimeException('SOCKS server reported network unreachable (ENETUNREACH)', defined('SOCKET_ENETUNREACH') ? SOCKET_ENETUNREACH : 101); + } elseif ($data['status'] === Server::ERROR_HOST_UNREACHABLE) { + throw new RuntimeException('SOCKS server reported host unreachable (EHOSTUNREACH)', defined('SOCKET_EHOSTUNREACH') ? SOCKET_EHOSTUNREACH : 113); + } elseif ($data['status'] === Server::ERROR_CONNECTION_REFUSED) { + throw new RuntimeException('SOCKS server reported connection refused (ECONNREFUSED)', defined('SOCKET_ECONNREFUSED') ? SOCKET_ECONNREFUSED : 111); + } elseif ($data['status'] === Server::ERROR_TTL) { + throw new RuntimeException('SOCKS server reported TTL/timeout expired (ETIMEDOUT)', defined('SOCKET_ETIMEDOUT') ? SOCKET_ETIMEDOUT : 110); + } elseif ($data['status'] === Server::ERROR_COMMAND_UNSUPPORTED) { + throw new RuntimeException('SOCKS server does not support the CONNECT command (EPROTO)', defined('SOCKET_EPROTO') ? SOCKET_EPROTO : 71); + } elseif ($data['status'] === Server::ERROR_ADDRESS_UNSUPPORTED) { + throw new RuntimeException('SOCKS server does not support this address type (EPROTO)', defined('SOCKET_EPROTO') ? SOCKET_EPROTO : 71); + } + + throw new RuntimeException('SOCKS server reported an unassigned error code ' . sprintf('0x%02X', $data['status']) . ' (ECONNREFUSED)', defined('SOCKET_ECONNREFUSED') ? SOCKET_ECONNREFUSED : 111); + } + if ($data['type'] === 0x01) { + // IPv4 address => skip IP and port + return $reader->readLength(6); + } elseif ($data['type'] === 0x03) { + // domain name => read domain name length + return $reader->readBinary(array( + 'length' => 'C' + ))->then(function ($data) use ($reader) { + // skip domain name and port + return $reader->readLength($data['length'] + 2); + }); + } elseif ($data['type'] === 0x04) { + // IPv6 address => skip IP and port + return $reader->readLength(18); + } else { + throw new Exception('Invalid SOCKS reponse: Invalid address type'); + } + }); + } +} diff --git a/instafeed/vendor/clue/socks-react/src/Server.php b/instafeed/vendor/clue/socks-react/src/Server.php new file mode 100755 index 0000000..0a069e2 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/src/Server.php @@ -0,0 +1,422 @@ +loop = $loop; + $this->connector = $connector; + + $that = $this; + $serverInterface->on('connection', function ($connection) use ($that) { + $that->emit('connection', array($connection)); + $that->onConnection($connection); + }); + } + + public function setProtocolVersion($version) + { + if ($version !== null) { + $version = (string)$version; + if (!in_array($version, array('4', '4a', '5'), true)) { + throw new InvalidArgumentException('Invalid protocol version given'); + } + if ($version !== '5' && $this->auth !== null){ + throw new UnexpectedValueException('Unable to change protocol version to anything but SOCKS5 while authentication is used. Consider removing authentication info or sticking to SOCKS5'); + } + } + $this->protocolVersion = $version; + } + + public function setAuth($auth) + { + if (!is_callable($auth)) { + throw new InvalidArgumentException('Given authenticator is not a valid callable'); + } + if ($this->protocolVersion !== null && $this->protocolVersion !== '5') { + throw new UnexpectedValueException('Authentication requires SOCKS5. Consider using protocol version 5 or waive authentication'); + } + // wrap authentication callback in order to cast its return value to a promise + $this->auth = function($username, $password, $remote) use ($auth) { + $ret = call_user_func($auth, $username, $password, $remote); + if ($ret instanceof PromiseInterface) { + return $ret; + } + $deferred = new Deferred(); + $ret ? $deferred->resolve() : $deferred->reject(); + return $deferred->promise(); + }; + } + + public function setAuthArray(array $login) + { + $this->setAuth(function ($username, $password) use ($login) { + return (isset($login[$username]) && (string)$login[$username] === $password); + }); + } + + public function unsetAuth() + { + $this->auth = null; + } + + public function onConnection(ConnectionInterface $connection) + { + $that = $this; + $handling = $this->handleSocks($connection)->then(function($remote) use ($connection){ + $connection->emit('ready',array($remote)); + }, function ($error) use ($connection, $that) { + if (!($error instanceof \Exception)) { + $error = new \Exception($error); + } + $connection->emit('error', array($error)); + $that->endConnection($connection); + }); + + $connection->on('close', function () use ($handling) { + $handling->cancel(); + }); + } + + /** + * gracefully shutdown connection by flushing all remaining data and closing stream + */ + public function endConnection(ConnectionInterface $stream) + { + $tid = true; + $loop = $this->loop; + + // cancel below timer in case connection is closed in time + $stream->once('close', function () use (&$tid, $loop) { + // close event called before the timer was set up, so everything is okay + if ($tid === true) { + // make sure to not start a useless timer + $tid = false; + } else { + $loop->cancelTimer($tid); + } + }); + + // shut down connection by pausing input data, flushing outgoing buffer and then exit + $stream->pause(); + $stream->end(); + + // check if connection is not already closed + if ($tid === true) { + // fall back to forcefully close connection in 3 seconds if buffer can not be flushed + $tid = $loop->addTimer(3.0, array($stream,'close')); + } + } + + private function handleSocks(ConnectionInterface $stream) + { + $reader = new StreamReader(); + $stream->on('data', array($reader, 'write')); + + $that = $this; + $that = $this; + + $auth = $this->auth; + $protocolVersion = $this->protocolVersion; + + // authentication requires SOCKS5 + if ($auth !== null) { + $protocolVersion = '5'; + } + + return $reader->readByte()->then(function ($version) use ($stream, $that, $protocolVersion, $auth, $reader){ + if ($version === 0x04) { + if ($protocolVersion === '5') { + throw new UnexpectedValueException('SOCKS4 not allowed due to configuration'); + } + return $that->handleSocks4($stream, $protocolVersion, $reader); + } else if ($version === 0x05) { + if ($protocolVersion !== null && $protocolVersion !== '5') { + throw new UnexpectedValueException('SOCKS5 not allowed due to configuration'); + } + return $that->handleSocks5($stream, $auth, $reader); + } + throw new UnexpectedValueException('Unexpected/unknown version number'); + }); + } + + public function handleSocks4(ConnectionInterface $stream, $protocolVersion, StreamReader $reader) + { + // suppliying hostnames is only allowed for SOCKS4a (or automatically detected version) + $supportsHostname = ($protocolVersion === null || $protocolVersion === '4a'); + + $remote = $stream->getRemoteAddress(); + if ($remote !== null) { + // remove transport scheme and prefix socks4:// instead + $secure = strpos($remote, 'tls://') === 0; + if (($pos = strpos($remote, '://')) !== false) { + $remote = substr($remote, $pos + 3); + } + $remote = 'socks4' . ($secure ? 's' : '') . '://' . $remote; + } + + $that = $this; + return $reader->readByteAssert(0x01)->then(function () use ($reader) { + return $reader->readBinary(array( + 'port' => 'n', + 'ipLong' => 'N', + 'null' => 'C' + )); + })->then(function ($data) use ($reader, $supportsHostname, $remote) { + if ($data['null'] !== 0x00) { + throw new Exception('Not a null byte'); + } + if ($data['ipLong'] === 0) { + throw new Exception('Invalid IP'); + } + if ($data['port'] === 0) { + throw new Exception('Invalid port'); + } + if ($data['ipLong'] < 256 && $supportsHostname) { + // invalid IP => probably a SOCKS4a request which appends the hostname + return $reader->readStringNull()->then(function ($string) use ($data, $remote){ + return array($string, $data['port'], $remote); + }); + } else { + $ip = long2ip($data['ipLong']); + return array($ip, $data['port'], $remote); + } + })->then(function ($target) use ($stream, $that) { + return $that->connectTarget($stream, $target)->then(function (ConnectionInterface $remote) use ($stream){ + $stream->write(pack('C8', 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)); + + return $remote; + }, function($error) use ($stream){ + $stream->end(pack('C8', 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)); + + throw $error; + }); + }, function($error) { + throw new UnexpectedValueException('SOCKS4 protocol error',0,$error); + }); + } + + public function handleSocks5(ConnectionInterface $stream, $auth=null, StreamReader $reader) + { + $remote = $stream->getRemoteAddress(); + if ($remote !== null) { + // remove transport scheme and prefix socks5:// instead + $secure = strpos($remote, 'tls://') === 0; + if (($pos = strpos($remote, '://')) !== false) { + $remote = substr($remote, $pos + 3); + } + $remote = 'socks5' . ($secure ? 's' : '') . '://' . $remote; + } + + $that = $this; + return $reader->readByte()->then(function ($num) use ($reader) { + // $num different authentication mechanisms offered + return $reader->readLength($num); + })->then(function ($methods) use ($reader, $stream, $auth, &$remote) { + if ($auth === null && strpos($methods,"\x00") !== false) { + // accept "no authentication" + $stream->write(pack('C2', 0x05, 0x00)); + + return 0x00; + } else if ($auth !== null && strpos($methods,"\x02") !== false) { + // username/password authentication (RFC 1929) sub negotiation + $stream->write(pack('C2', 0x05, 0x02)); + return $reader->readByteAssert(0x01)->then(function () use ($reader) { + return $reader->readByte(); + })->then(function ($length) use ($reader) { + return $reader->readLength($length); + })->then(function ($username) use ($reader, $auth, $stream, &$remote) { + return $reader->readByte()->then(function ($length) use ($reader) { + return $reader->readLength($length); + })->then(function ($password) use ($username, $auth, $stream, &$remote) { + // username and password given => authenticate + + // prefix username/password to remote URI + if ($remote !== null) { + $remote = str_replace('://', '://' . rawurlencode($username) . ':' . rawurlencode($password) . '@', $remote); + } + + return $auth($username, $password, $remote)->then(function () use ($stream, $username) { + // accept + $stream->emit('auth', array($username)); + $stream->write(pack('C2', 0x01, 0x00)); + }, function() use ($stream) { + // reject => send any code but 0x00 + $stream->end(pack('C2', 0x01, 0xFF)); + throw new UnexpectedValueException('Unable to authenticate'); + }); + }); + }); + } else { + // reject all offered authentication methods + $stream->write(pack('C2', 0x05, 0xFF)); + throw new UnexpectedValueException('No acceptable authentication mechanism found'); + } + })->then(function ($method) use ($reader, $stream) { + return $reader->readBinary(array( + 'version' => 'C', + 'command' => 'C', + 'null' => 'C', + 'type' => 'C' + )); + })->then(function ($data) use ($reader) { + if ($data['version'] !== 0x05) { + throw new UnexpectedValueException('Invalid SOCKS version'); + } + if ($data['command'] !== 0x01) { + throw new UnexpectedValueException('Only CONNECT requests supported', Server::ERROR_COMMAND_UNSUPPORTED); + } +// if ($data['null'] !== 0x00) { +// throw new UnexpectedValueException('Reserved byte has to be NULL'); +// } + if ($data['type'] === 0x03) { + // target hostname string + return $reader->readByte()->then(function ($len) use ($reader) { + return $reader->readLength($len); + }); + } else if ($data['type'] === 0x01) { + // target IPv4 + return $reader->readLength(4)->then(function ($addr) { + return inet_ntop($addr); + }); + } else if ($data['type'] === 0x04) { + // target IPv6 + return $reader->readLength(16)->then(function ($addr) { + return inet_ntop($addr); + }); + } else { + throw new UnexpectedValueException('Invalid address type', Server::ERROR_ADDRESS_UNSUPPORTED); + } + })->then(function ($host) use ($reader, &$remote) { + return $reader->readBinary(array('port'=>'n'))->then(function ($data) use ($host, &$remote) { + return array($host, $data['port'], $remote); + }); + })->then(function ($target) use ($that, $stream) { + return $that->connectTarget($stream, $target); + }, function($error) use ($stream) { + throw new UnexpectedValueException('SOCKS5 protocol error', $error->getCode(), $error); + })->then(function (ConnectionInterface $remote) use ($stream) { + $stream->write(pack('C4Nn', 0x05, 0x00, 0x00, 0x01, 0, 0)); + + return $remote; + }, function(Exception $error) use ($stream){ + $stream->write(pack('C4Nn', 0x05, $error->getCode() === 0 ? Server::ERROR_GENERAL : $error->getCode(), 0x00, 0x01, 0, 0)); + + throw $error; + }); + } + + public function connectTarget(ConnectionInterface $stream, array $target) + { + $uri = $target[0]; + if (strpos($uri, ':') !== false) { + $uri = '[' . $uri . ']'; + } + $uri .= ':' . $target[1]; + + // validate URI so a string hostname can not pass excessive URI parts + $parts = parse_url('tcp://' . $uri); + if (!$parts || !isset($parts['scheme'], $parts['host'], $parts['port']) || count($parts) !== 3) { + return Promise\reject(new InvalidArgumentException('Invalid target URI given')); + } + + if (isset($target[2])) { + $uri .= '?source=' . rawurlencode($target[2]); + } + + $stream->emit('target', $target); + $that = $this; + $connecting = $this->connector->connect($uri); + + $stream->on('close', function () use ($connecting) { + $connecting->cancel(); + }); + + return $connecting->then(function (ConnectionInterface $remote) use ($stream, $that) { + $stream->pipe($remote, array('end'=>false)); + $remote->pipe($stream, array('end'=>false)); + + // remote end closes connection => stop reading from local end, try to flush buffer to local and disconnect local + $remote->on('end', function() use ($stream, $that) { + $stream->emit('shutdown', array('remote', null)); + $that->endConnection($stream); + }); + + // local end closes connection => stop reading from remote end, try to flush buffer to remote and disconnect remote + $stream->on('end', function() use ($remote, $that) { + $that->endConnection($remote); + }); + + // set bigger buffer size of 100k to improve performance + $stream->bufferSize = $remote->bufferSize = 100 * 1024 * 1024; + + return $remote; + }, function(Exception $error) { + // default to general/unknown error + $code = Server::ERROR_GENERAL; + + // map common socket error conditions to limited list of SOCKS error codes + if ((defined('SOCKET_EACCES') && $error->getCode() === SOCKET_EACCES) || $error->getCode() === 13) { + $code = Server::ERROR_NOT_ALLOWED_BY_RULESET; + } elseif ((defined('SOCKET_EHOSTUNREACH') && $error->getCode() === SOCKET_EHOSTUNREACH) || $error->getCode() === 113) { + $code = Server::ERROR_HOST_UNREACHABLE; + } elseif ((defined('SOCKET_ENETUNREACH') && $error->getCode() === SOCKET_ENETUNREACH) || $error->getCode() === 101) { + $code = Server::ERROR_NETWORK_UNREACHABLE; + } elseif ((defined('SOCKET_ECONNREFUSED') && $error->getCode() === SOCKET_ECONNREFUSED) || $error->getCode() === 111 || $error->getMessage() === 'Connection refused') { + // Socket component does not currently assign an error code for this, so we have to resort to checking the exception message + $code = Server::ERROR_CONNECTION_REFUSED; + } elseif ((defined('SOCKET_ETIMEDOUT') && $error->getCode() === SOCKET_ETIMEDOUT) || $error->getCode() === 110 || $error instanceof TimeoutException) { + // Socket component does not currently assign an error code for this, but we can rely on the TimeoutException + $code = Server::ERROR_TTL; + } + + throw new UnexpectedValueException('Unable to connect to remote target', $code, $error); + }); + } +} diff --git a/instafeed/vendor/clue/socks-react/src/StreamReader.php b/instafeed/vendor/clue/socks-react/src/StreamReader.php new file mode 100755 index 0000000..6dbf51c --- /dev/null +++ b/instafeed/vendor/clue/socks-react/src/StreamReader.php @@ -0,0 +1,149 @@ +buffer .= $data; + + do { + $current = reset($this->queue); + + if ($current === false) { + break; + } + + /* @var $current Closure */ + + $ret = $current($this->buffer); + + if ($ret === self::RET_INCOMPLETE) { + // current is incomplete, so wait for further data to arrive + break; + } else { + // current is done, remove from list and continue with next + array_shift($this->queue); + } + } while (true); + } + + public function readBinary($structure) + { + $length = 0; + $unpack = ''; + foreach ($structure as $name=>$format) { + if ($length !== 0) { + $unpack .= '/'; + } + $unpack .= $format . $name; + + if ($format === 'C') { + ++$length; + } else if ($format === 'n') { + $length += 2; + } else if ($format === 'N') { + $length += 4; + } else { + throw new InvalidArgumentException('Invalid format given'); + } + } + + return $this->readLength($length)->then(function ($response) use ($unpack) { + return unpack($unpack, $response); + }); + } + + public function readLength($bytes) + { + $deferred = new Deferred(); + + $this->readBufferCallback(function (&$buffer) use ($bytes, $deferred) { + if (strlen($buffer) >= $bytes) { + $deferred->resolve((string)substr($buffer, 0, $bytes)); + $buffer = (string)substr($buffer, $bytes); + + return StreamReader::RET_DONE; + } + }); + + return $deferred->promise(); + } + + public function readByte() + { + return $this->readBinary(array( + 'byte' => 'C' + ))->then(function ($data) { + return $data['byte']; + }); + } + + public function readByteAssert($expect) + { + return $this->readByte()->then(function ($byte) use ($expect) { + if ($byte !== $expect) { + throw new UnexpectedValueException('Unexpected byte encountered'); + } + return $byte; + }); + } + + public function readStringNull() + { + $deferred = new Deferred(); + $string = ''; + + $that = $this; + $readOne = function () use (&$readOne, $that, $deferred, &$string) { + $that->readByte()->then(function ($byte) use ($deferred, &$string, $readOne) { + if ($byte === 0x00) { + $deferred->resolve($string); + } else { + $string .= chr($byte); + $readOne(); + } + }); + }; + $readOne(); + + return $deferred->promise(); + } + + public function readBufferCallback(/* callable */ $callable) + { + if (!is_callable($callable)) { + throw new InvalidArgumentException('Given function must be callable'); + } + + if ($this->queue) { + $this->queue []= $callable; + } else { + $this->queue = array($callable); + + if ($this->buffer !== '') { + // this is the first element in the queue and the buffer is filled => trigger write procedure + $this->write(''); + } + } + } + + public function getBuffer() + { + return $this->buffer; + } +} diff --git a/instafeed/vendor/clue/socks-react/tests/ClientTest.php b/instafeed/vendor/clue/socks-react/tests/ClientTest.php new file mode 100755 index 0000000..e304901 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/tests/ClientTest.php @@ -0,0 +1,403 @@ +loop = React\EventLoop\Factory::create(); + $this->connector = $this->getMockBuilder('React\Socket\ConnectorInterface')->getMock(); + $this->client = new Client('127.0.0.1:1080', $this->connector); + } + + public function testCtorAcceptsUriWithHostAndPort() + { + $client = new Client('127.0.0.1:9050', $this->connector); + + $this->assertTrue(true); + } + + public function testCtorAcceptsUriWithScheme() + { + $client = new Client('socks://127.0.0.1:9050', $this->connector); + + $this->assertTrue(true); + } + + public function testCtorAcceptsUriWithHostOnlyAssumesDefaultPort() + { + $client = new Client('127.0.0.1', $this->connector); + + $this->assertTrue(true); + } + + public function testCtorAcceptsUriWithSecureScheme() + { + $client = new Client('sockss://127.0.0.1:9050', $this->connector); + + $this->assertTrue(true); + } + + public function testCtorAcceptsUriWithSecureVersionScheme() + { + $client = new Client('socks5s://127.0.0.1:9050', $this->connector); + + $this->assertTrue(true); + } + + public function testCtorAcceptsUriWithSocksUnixScheme() + { + $client = new Client('socks+unix:///tmp/socks.socket', $this->connector); + + $this->assertTrue(true); + } + + public function testCtorAcceptsUriWithSocks5UnixScheme() + { + $client = new Client('socks5+unix:///tmp/socks.socket', $this->connector); + + $this->assertTrue(true); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testCtorThrowsForInvalidUri() + { + new Client('////', $this->connector); + } + + public function testValidAuthFromUri() + { + $this->client = new Client('username:password@127.0.0.1', $this->connector); + + $this->assertTrue(true); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testInvalidAuthInformation() + { + new Client(str_repeat('a', 256) . ':test@127.0.0.1', $this->connector); + } + + public function testValidAuthAndVersionFromUri() + { + $this->client = new Client('socks5://username:password@127.0.0.1:9050', $this->connector); + + $this->assertTrue(true); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testInvalidCanNotSetAuthenticationForSocks4Uri() + { + $this->client = new Client('socks4://username:password@127.0.0.1:9050', $this->connector); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testInvalidProtocolVersion() + { + $this->client = new Client('socks3://127.0.0.1:9050', $this->connector); + } + + public function testCreateWillConnectToProxy() + { + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=localhost')->willReturn($promise); + + $promise = $this->client->connect('localhost:80'); + + $this->assertInstanceOf('\React\Promise\PromiseInterface', $promise); + } + + public function testCreateWillConnectToProxyWithFullUri() + { + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080/?hostname=test#fragment')->willReturn($promise); + + $promise = $this->client->connect('localhost:80/?hostname=test#fragment'); + + $this->assertInstanceOf('\React\Promise\PromiseInterface', $promise); + } + + public function testCreateWithInvalidHostDoesNotConnect() + { + $promise = new Promise(function () { }); + + $this->connector->expects($this->never())->method('connect'); + + $promise = $this->client->connect(str_repeat('a', '256') . ':80'); + + $this->assertInstanceOf('\React\Promise\PromiseInterface', $promise); + } + + public function testCreateWithInvalidPortDoesNotConnect() + { + $promise = new Promise(function () { }); + + $this->connector->expects($this->never())->method('connect'); + + $promise = $this->client->connect('some-random-site:some-random-port'); + + $this->assertInstanceOf('\React\Promise\PromiseInterface', $promise); + } + + public function testConnectorRejectsWillRejectConnection() + { + $promise = \React\Promise\reject(new RuntimeException()); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=google.com')->willReturn($promise); + + $promise = $this->client->connect('google.com:80'); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_ECONNREFUSED)); + } + + public function testCancelConnectionDuringConnectionWillCancelConnection() + { + $promise = new Promise(function () { }, function () { + throw new \RuntimeException(); + }); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=google.com')->willReturn($promise); + + $promise = $this->client->connect('google.com:80'); + $promise->cancel(); + + $this->expectPromiseReject($promise); + } + + public function testCancelConnectionDuringSessionWillCloseStream() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->getMock(); + $stream->expects($this->once())->method('close'); + + $promise = new Promise(function ($resolve) use ($stream) { $resolve($stream); }); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=google.com')->willReturn($promise); + + $promise = $this->client->connect('google.com:80'); + $promise->cancel(); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_ECONNABORTED)); + } + + public function testEmitConnectionCloseDuringSessionWillRejectConnection() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('write', 'close'))->getMock(); + + $promise = \React\Promise\resolve($stream); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=google.com')->willReturn($promise); + + $promise = $this->client->connect('google.com:80'); + + $stream->emit('close'); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_ECONNRESET)); + } + + public function testEmitConnectionErrorDuringSessionWillRejectConnection() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('write', 'close'))->getMock(); + $stream->expects($this->once())->method('close'); + + $promise = \React\Promise\resolve($stream); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=google.com')->willReturn($promise); + + $promise = $this->client->connect('google.com:80'); + + $stream->emit('error', array(new RuntimeException())); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_EIO)); + } + + public function testEmitInvalidSocks4DataDuringSessionWillRejectConnection() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('write', 'close'))->getMock(); + $stream->expects($this->once())->method('close'); + + $promise = \React\Promise\resolve($stream); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=google.com')->willReturn($promise); + + $promise = $this->client->connect('google.com:80'); + + $stream->emit('data', array("HTTP/1.1 400 Bad Request\r\n\r\n")); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_EBADMSG)); + } + + public function testEmitInvalidSocks5DataDuringSessionWillRejectConnection() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('write', 'close'))->getMock(); + $stream->expects($this->once())->method('close'); + + $promise = \React\Promise\resolve($stream); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=google.com')->willReturn($promise); + + $this->client = new Client('socks5://127.0.0.1:1080', $this->connector); + + $promise = $this->client->connect('google.com:80'); + + $stream->emit('data', array("HTTP/1.1 400 Bad Request\r\n\r\n")); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_EBADMSG)); + } + + public function testEmitSocks5DataErrorDuringSessionWillRejectConnection() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('write', 'close'))->getMock(); + $stream->expects($this->once())->method('close'); + + $promise = \React\Promise\resolve($stream); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=google.com')->willReturn($promise); + + $this->client = new Client('socks5://127.0.0.1:1080', $this->connector); + + $promise = $this->client->connect('google.com:80'); + + $stream->emit('data', array("\x05\x00" . "\x05\x01\x00\x00")); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_ECONNREFUSED)); + } + + public function testEmitSocks5DataInvalidAddressTypeWillRejectConnection() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('write', 'close'))->getMock(); + $stream->expects($this->once())->method('close'); + + $promise = \React\Promise\resolve($stream); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=google.com')->willReturn($promise); + + $this->client = new Client('socks5://127.0.0.1:1080', $this->connector); + + $promise = $this->client->connect('google.com:80'); + + $stream->emit('data', array("\x05\x00" . "\x05\x00\x00\x00")); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode(SOCKET_EBADMSG)); + } + + public function testEmitSocks5DataIpv6AddressWillResolveConnection() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('write', 'close'))->getMock(); + $stream->expects($this->never())->method('close'); + + $promise = \React\Promise\resolve($stream); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=%3A%3A1')->willReturn($promise); + + $this->client = new Client('socks5://127.0.0.1:1080', $this->connector); + + $promise = $this->client->connect('[::1]:80'); + + $stream->emit('data', array("\x05\x00" . "\x05\x00\x00\x04" . inet_pton('::1') . "\x00\x50")); + + $promise->then($this->expectCallableOnce()); + } + + public function testEmitSocks5DataHostnameAddressWillResolveConnection() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('write', 'close'))->getMock(); + $stream->expects($this->never())->method('close'); + + $promise = \React\Promise\resolve($stream); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=google.com')->willReturn($promise); + + $this->client = new Client('socks5://127.0.0.1:1080', $this->connector); + + $promise = $this->client->connect('google.com:80'); + + $stream->emit('data', array("\x05\x00" . "\x05\x00\x00\x03\x0Agoogle.com\x00\x50")); + + $promise->then($this->expectCallableOnce()); + } + + public function provideConnectionErrors() + { + return array( + array( + Server::ERROR_GENERAL, + SOCKET_ECONNREFUSED + ), + array( + Server::ERROR_NOT_ALLOWED_BY_RULESET, + SOCKET_EACCES + ), + array( + Server::ERROR_NETWORK_UNREACHABLE, + SOCKET_ENETUNREACH + ), + array( + Server::ERROR_HOST_UNREACHABLE, + SOCKET_EHOSTUNREACH + ), + array( + Server::ERROR_CONNECTION_REFUSED, + SOCKET_ECONNREFUSED + ), + array( + Server::ERROR_TTL, + SOCKET_ETIMEDOUT + ), + array( + Server::ERROR_COMMAND_UNSUPPORTED, + SOCKET_EPROTO + ), + array( + Server::ERROR_ADDRESS_UNSUPPORTED, + SOCKET_EPROTO + ), + array( + 200, + SOCKET_ECONNREFUSED + ) + ); + } + + /** + * @dataProvider provideConnectionErrors + * @param int $error + * @param int $expectedCode + */ + public function testEmitSocks5DataErrorMapsToExceptionCode($error, $expectedCode) + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('write', 'close'))->getMock(); + $stream->expects($this->once())->method('close'); + + $promise = \React\Promise\resolve($stream); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:1080?hostname=google.com')->willReturn($promise); + + $this->client = new Client('socks5://127.0.0.1:1080', $this->connector); + + $promise = $this->client->connect('google.com:80'); + + $stream->emit('data', array("\x05\x00" . "\x05" . chr($error) . "\x00\x00")); + + $promise->then(null, $this->expectCallableOnceWithExceptionCode($expectedCode)); + } +} diff --git a/instafeed/vendor/clue/socks-react/tests/FunctionalTest.php b/instafeed/vendor/clue/socks-react/tests/FunctionalTest.php new file mode 100755 index 0000000..2f1190e --- /dev/null +++ b/instafeed/vendor/clue/socks-react/tests/FunctionalTest.php @@ -0,0 +1,437 @@ +loop = React\EventLoop\Factory::create(); + + $socket = new React\Socket\Server(0, $this->loop); + $address = $socket->getAddress(); + if (strpos($address, '://') === false) { + $address = 'tcp://' . $address; + } + $this->port = parse_url($address, PHP_URL_PORT); + $this->assertNotEquals(0, $this->port); + + $this->server = new Server($this->loop, $socket); + $this->connector = new TcpConnector($this->loop); + $this->client = new Client('127.0.0.1:' . $this->port, $this->connector); + } + + /** @group internet */ + public function testConnection() + { + $this->assertResolveStream($this->client->connect('www.google.com:80')); + } + + /** @group internet */ + public function testConnectionInvalid() + { + $this->assertRejectPromise($this->client->connect('www.google.com.invalid:80')); + } + + public function testConnectionWithIpViaSocks4() + { + $this->server->setProtocolVersion('4'); + + $this->client = new Client('socks4://127.0.0.1:' . $this->port, $this->connector); + + $this->assertResolveStream($this->client->connect('127.0.0.1:' . $this->port)); + } + + /** @group internet */ + public function testConnectionWithHostnameViaSocks4Fails() + { + $this->client = new Client('socks4://127.0.0.1:' . $this->port, $this->connector); + + $this->assertRejectPromise($this->client->connect('www.google.com:80')); + } + + /** @group internet */ + public function testConnectionWithInvalidPortFails() + { + $this->assertRejectPromise($this->client->connect('www.google.com:100000')); + } + + public function testConnectionWithIpv6ViaSocks4Fails() + { + $this->client = new Client('socks4://127.0.0.1:' . $this->port, $this->connector); + + $this->assertRejectPromise($this->client->connect('[::1]:80')); + } + + /** @group internet */ + public function testConnectionSocks4a() + { + $this->server->setProtocolVersion('4a'); + $this->client = new Client('socks4a://127.0.0.1:' . $this->port, $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + } + + /** @group internet */ + public function testConnectionSocks5() + { + $this->server->setProtocolVersion(5); + $this->client = new Client('socks5://127.0.0.1:' . $this->port, $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + } + + /** @group internet */ + public function testConnectionSocksOverTls() + { + if (!function_exists('stream_socket_enable_crypto')) { + $this->markTestSkipped('Required function does not exist in your environment (HHVM?)'); + } + + $socket = new \React\Socket\Server('tls://127.0.0.1:0', $this->loop, array('tls' => array( + 'local_cert' => __DIR__ . '/../examples/localhost.pem', + ))); + $this->server = new Server($this->loop, $socket); + + $this->connector = new Connector($this->loop, array('tls' => array( + 'verify_peer' => false, + 'verify_peer_name' => false + ))); + $this->client = new Client(str_replace('tls:', 'sockss:', $socket->getAddress()), $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + } + + /** + * @group internet + * @requires PHP 5.6 + */ + public function testConnectionSocksOverTlsUsesPeerNameFromSocksUri() + { + if (!function_exists('stream_socket_enable_crypto')) { + $this->markTestSkipped('Required function does not exist in your environment (HHVM?)'); + } + + $socket = new \React\Socket\Server('tls://127.0.0.1:0', $this->loop, array('tls' => array( + 'local_cert' => __DIR__ . '/../examples/localhost.pem', + ))); + $this->server = new Server($this->loop, $socket); + + $this->connector = new Connector($this->loop, array('tls' => array( + 'verify_peer' => false, + 'verify_peer_name' => true + ))); + $this->client = new Client(str_replace('tls:', 'sockss:', $socket->getAddress()), $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + } + + /** @group internet */ + public function testConnectionSocksOverUnix() + { + if (!in_array('unix', stream_get_transports())) { + $this->markTestSkipped('System does not support unix:// scheme'); + } + + $path = sys_get_temp_dir() . '/test' . mt_rand(1000, 9999) . '.sock'; + $socket = new UnixServer($path, $this->loop); + $this->server = new Server($this->loop, $socket); + + $this->connector = new Connector($this->loop); + $this->client = new Client('socks+unix://' . $path, $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + + unlink($path); + } + + /** @group internet */ + public function testConnectionSocks5OverUnix() + { + if (!in_array('unix', stream_get_transports())) { + $this->markTestSkipped('System does not support unix:// scheme'); + } + + $path = sys_get_temp_dir() . '/test' . mt_rand(1000, 9999) . '.sock'; + $socket = new UnixServer($path, $this->loop); + $this->server = new Server($this->loop, $socket); + $this->server->setProtocolVersion(5); + + $this->connector = new Connector($this->loop); + $this->client = new Client('socks5+unix://' . $path, $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + + unlink($path); + } + + /** @group internet */ + public function testConnectionSocksWithAuthenticationOverUnix() + { + if (!in_array('unix', stream_get_transports())) { + $this->markTestSkipped('System does not support unix:// scheme'); + } + + $path = sys_get_temp_dir() . '/test' . mt_rand(1000, 9999) . '.sock'; + $socket = new UnixServer($path, $this->loop); + $this->server = new Server($this->loop, $socket); + $this->server->setAuthArray(array('name' => 'pass')); + + $this->connector = new Connector($this->loop); + $this->client = new Client('socks+unix://name:pass@' . $path, $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + + unlink($path); + } + + /** @group internet */ + public function testConnectionAuthenticationFromUri() + { + $this->server->setAuthArray(array('name' => 'pass')); + + $this->client = new Client('name:pass@127.0.0.1:' . $this->port, $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + } + + /** @group internet */ + public function testConnectionAuthenticationCallback() + { + $called = 0; + $that = $this; + $this->server->setAuth(function ($name, $pass, $remote) use ($that, &$called) { + ++$called; + $that->assertEquals('name', $name); + $that->assertEquals('pass', $pass); + $that->assertStringStartsWith('socks5://name:pass@127.0.0.1:', $remote); + + return true; + }); + + $this->client = new Client('name:pass@127.0.0.1:' . $this->port, $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + $this->assertEquals(1, $called); + } + + /** @group internet */ + public function testConnectionAuthenticationCallbackWillNotBeInvokedIfClientsSendsNoAuth() + { + $called = 0; + $this->server->setAuth(function () use (&$called) { + ++$called; + + return true; + }); + + $this->client = new Client('127.0.0.1:' . $this->port, $this->connector); + + $this->assertRejectPromise($this->client->connect('www.google.com:80')); + $this->assertEquals(0, $called); + } + + /** @group internet */ + public function testConnectionAuthenticationFromUriEncoded() + { + $this->server->setAuthArray(array('name' => 'p@ss:w0rd')); + + $this->client = new Client(rawurlencode('name') . ':' . rawurlencode('p@ss:w0rd') . '@127.0.0.1:' . $this->port, $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + } + + /** @group internet */ + public function testConnectionAuthenticationFromUriWithOnlyUserAndNoPassword() + { + $this->server->setAuthArray(array('empty' => '')); + + $this->client = new Client('empty@127.0.0.1:' . $this->port, $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + } + + /** @group internet */ + public function testConnectionAuthenticationEmptyPassword() + { + $this->server->setAuthArray(array('user' => '')); + $this->client = new Client('user@127.0.0.1:' . $this->port, $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + } + + /** @group internet */ + public function testConnectionAuthenticationUnused() + { + $this->client = new Client('name:pass@127.0.0.1:' . $this->port, $this->connector); + + $this->assertResolveStream($this->client->connect('www.google.com:80')); + } + + public function testConnectionInvalidProtocolDoesNotMatchSocks5() + { + $this->server->setProtocolVersion(5); + $this->client = new Client('socks4a://127.0.0.1:' . $this->port, $this->connector); + + $this->assertRejectPromise($this->client->connect('www.google.com:80'), null, SOCKET_ECONNRESET); + } + + public function testConnectionInvalidProtocolDoesNotMatchSocks4() + { + $this->server->setProtocolVersion(4); + $this->client = new Client('socks5://127.0.0.1:' . $this->port, $this->connector); + + $this->assertRejectPromise($this->client->connect('www.google.com:80'), null, SOCKET_ECONNRESET); + } + + public function testConnectionInvalidNoAuthentication() + { + $this->server->setAuthArray(array('name' => 'pass')); + + $this->client = new Client('socks5://127.0.0.1:' . $this->port, $this->connector); + + $this->assertRejectPromise($this->client->connect('www.google.com:80'), null, SOCKET_EACCES); + } + + public function testConnectionInvalidAuthenticationMismatch() + { + $this->server->setAuthArray(array('name' => 'pass')); + + $this->client = new Client('user:pass@127.0.0.1:' . $this->port, $this->connector); + + $this->assertRejectPromise($this->client->connect('www.google.com:80'), null, SOCKET_EACCES); + } + + /** @group internet */ + public function testConnectorOkay() + { + $this->assertResolveStream($this->client->connect('www.google.com:80')); + } + + /** @group internet */ + public function testConnectorInvalidDomain() + { + $this->assertRejectPromise($this->client->connect('www.google.commm:80')); + } + + /** @group internet */ + public function testConnectorCancelConnection() + { + $promise = $this->client->connect('www.google.com:80'); + $promise->cancel(); + + $this->assertRejectPromise($promise); + } + + /** @group internet */ + public function testConnectorInvalidUnboundPortTimeout() + { + // time out the connection attempt in 0.1s (as expected) + $tcp = new TimeoutConnector($this->client, 0.1, $this->loop); + + $this->assertRejectPromise($tcp->connect('www.google.com:8080')); + } + + /** @group internet */ + public function testSecureConnectorOkay() + { + if (!function_exists('stream_socket_enable_crypto')) { + $this->markTestSkipped('Required function does not exist in your environment (HHVM?)'); + } + + $ssl = new SecureConnector($this->client, $this->loop); + + $this->assertResolveStream($ssl->connect('www.google.com:443')); + } + + /** @group internet */ + public function testSecureConnectorToBadSslWithVerifyFails() + { + if (!function_exists('stream_socket_enable_crypto')) { + $this->markTestSkipped('Required function does not exist in your environment (HHVM?)'); + } + + $ssl = new SecureConnector($this->client, $this->loop, array('verify_peer' => true)); + + $this->assertRejectPromise($ssl->connect('self-signed.badssl.com:443')); + } + + /** @group internet */ + public function testSecureConnectorToBadSslWithoutVerifyWorks() + { + if (!function_exists('stream_socket_enable_crypto')) { + $this->markTestSkipped('Required function does not exist in your environment (HHVM?)'); + } + + $ssl = new SecureConnector($this->client, $this->loop, array('verify_peer' => false)); + + $this->assertResolveStream($ssl->connect('self-signed.badssl.com:443')); + } + + /** @group internet */ + public function testSecureConnectorInvalidPlaintextIsNotSsl() + { + if (!function_exists('stream_socket_enable_crypto')) { + $this->markTestSkipped('Required function does not exist in your environment (HHVM?)'); + } + + $ssl = new SecureConnector($this->client, $this->loop); + + $this->assertRejectPromise($ssl->connect('www.google.com:80')); + } + + /** @group internet */ + public function testSecureConnectorInvalidUnboundPortTimeout() + { + $ssl = new SecureConnector($this->client, $this->loop); + + // time out the connection attempt in 0.1s (as expected) + $ssl = new TimeoutConnector($ssl, 0.1, $this->loop); + + $this->assertRejectPromise($ssl->connect('www.google.com:8080')); + } + + private function assertResolveStream($promise) + { + $this->expectPromiseResolve($promise); + + $promise->then(function ($stream) { + $stream->close(); + }); + + Block\await($promise, $this->loop, 2.0); + } + + private function assertRejectPromise($promise, $message = null, $code = null) + { + $this->expectPromiseReject($promise); + + if (method_exists($this, 'expectException')) { + $this->expectException('Exception'); + if ($message !== null) { + $this->expectExceptionMessage($message); + } + if ($code !== null) { + $this->expectExceptionCode($code); + } + } else { + $this->setExpectedException('Exception', $message, $code); + } + + Block\await($promise, $this->loop, 2.0); + } +} diff --git a/instafeed/vendor/clue/socks-react/tests/ServerTest.php b/instafeed/vendor/clue/socks-react/tests/ServerTest.php new file mode 100755 index 0000000..5c73845 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/tests/ServerTest.php @@ -0,0 +1,428 @@ +getMockBuilder('React\Socket\ServerInterface') + ->getMock(); + + $loop = $this->getMockBuilder('React\EventLoop\LoopInterface') + ->getMock(); + + $this->connector = $this->getMockBuilder('React\Socket\ConnectorInterface') + ->getMock(); + + $this->server = new Server($loop, $socket, $this->connector); + } + + public function testSetProtocolVersion() + { + $this->server->setProtocolVersion(4); + $this->server->setProtocolVersion('4a'); + $this->server->setProtocolVersion(5); + $this->server->setProtocolVersion(null); + + $this->assertTrue(true); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testSetInvalidProtocolVersion() + { + $this->server->setProtocolVersion(6); + } + + public function testSetAuthArray() + { + $this->server->setAuthArray(array()); + + $this->server->setAuthArray(array( + 'name1' => 'password1', + 'name2' => 'password2' + )); + + $this->assertTrue(true); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testSetAuthInvalid() + { + $this->server->setAuth(true); + } + + /** + * @expectedException UnexpectedValueException + */ + public function testUnableToSetAuthIfProtocolDoesNotSupportAuth() + { + $this->server->setProtocolVersion(4); + + $this->server->setAuthArray(array()); + } + + /** + * @expectedException UnexpectedValueException + */ + public function testUnableToSetProtocolWhichDoesNotSupportAuth() + { + $this->server->setAuthArray(array()); + + // this is okay + $this->server->setProtocolVersion(5); + + $this->server->setProtocolVersion(4); + } + + public function testConnectWillCreateConnection() + { + $stream = $this->getMockBuilder('React\Socket\ConnectionInterface')->getMock(); + + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('google.com:80')->willReturn($promise); + + $promise = $this->server->connectTarget($stream, array('google.com', 80)); + + $this->assertInstanceOf('React\Promise\PromiseInterface', $promise); + } + + public function testConnectWillCreateConnectionWithSourceUri() + { + $stream = $this->getMockBuilder('React\Socket\ConnectionInterface')->getMock(); + + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('google.com:80?source=socks5%3A%2F%2F10.20.30.40%3A5060')->willReturn($promise); + + $promise = $this->server->connectTarget($stream, array('google.com', 80, 'socks5://10.20.30.40:5060')); + + $this->assertInstanceOf('React\Promise\PromiseInterface', $promise); + } + + public function testConnectWillRejectIfConnectionFails() + { + $stream = $this->getMockBuilder('React\Socket\ConnectionInterface')->getMock(); + + $promise = new Promise(function ($_, $reject) { $reject(new \RuntimeException()); }); + + $this->connector->expects($this->once())->method('connect')->with('google.com:80')->willReturn($promise); + + $promise = $this->server->connectTarget($stream, array('google.com', 80)); + + $promise->then(null, $this->expectCallableOnce()); + } + + public function testConnectWillCancelConnectionIfStreamCloses() + { + $stream = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('close'))->getMock(); + + $promise = new Promise(function () { }, function () { + throw new \RuntimeException(); + }); + + + $this->connector->expects($this->once())->method('connect')->with('google.com:80')->willReturn($promise); + + $promise = $this->server->connectTarget($stream, array('google.com', 80)); + + $stream->emit('close'); + + $promise->then(null, $this->expectCallableOnce()); + } + + public function testConnectWillAbortIfPromiseIsCanceled() + { + $stream = $this->getMockBuilder('React\Socket\ConnectionInterface')->getMock(); + + $promise = new Promise(function () { }, function () { + throw new \RuntimeException(); + }); + + $this->connector->expects($this->once())->method('connect')->with('google.com:80')->willReturn($promise); + + $promise = $this->server->connectTarget($stream, array('google.com', 80)); + + $promise->cancel(); + + $promise->then(null, $this->expectCallableOnce()); + } + + public function provideConnectionErrors() + { + return array( + array( + new RuntimeException('', SOCKET_EACCES), + Server::ERROR_NOT_ALLOWED_BY_RULESET + ), + array( + new RuntimeException('', SOCKET_ENETUNREACH), + Server::ERROR_NETWORK_UNREACHABLE + ), + array( + new RuntimeException('', SOCKET_EHOSTUNREACH), + Server::ERROR_HOST_UNREACHABLE, + ), + array( + new RuntimeException('', SOCKET_ECONNREFUSED), + Server::ERROR_CONNECTION_REFUSED + ), + array( + new RuntimeException('Connection refused'), + Server::ERROR_CONNECTION_REFUSED + ), + array( + new RuntimeException('', SOCKET_ETIMEDOUT), + Server::ERROR_TTL + ), + array( + new TimeoutException(1.0), + Server::ERROR_TTL + ), + array( + new RuntimeException(), + Server::ERROR_GENERAL + ) + ); + } + + /** + * @dataProvider provideConnectionErrors + * @param Exception $error + * @param int $expectedCode + */ + public function testConnectWillReturnMappedSocks5ErrorCodeFromConnector($error, $expectedCode) + { + $stream = $this->getMockBuilder('React\Socket\ConnectionInterface')->getMock(); + + $promise = \React\Promise\reject($error); + + $this->connector->expects($this->once())->method('connect')->willReturn($promise); + + $promise = $this->server->connectTarget($stream, array('google.com', 80)); + + $code = null; + $promise->then(null, function ($error) use (&$code) { + $code = $error->getCode(); + }); + + $this->assertEquals($expectedCode, $code); + } + + public function testHandleSocksConnectionWillEndOnInvalidData() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end'))->getMock(); + $connection->expects($this->once())->method('pause'); + $connection->expects($this->once())->method('end'); + + $this->server->onConnection($connection); + + $connection->emit('data', array('asdasdasdasdasd')); + } + + public function testHandleSocks4ConnectionWithIpv4WillEstablishOutgoingConnection() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end'))->getMock(); + + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:80')->willReturn($promise); + + $this->server->onConnection($connection); + + $connection->emit('data', array("\x04\x01" . "\x00\x50" . pack('N', ip2long('127.0.0.1')) . "\x00")); + } + + public function testHandleSocks4aConnectionWithHostnameWillEstablishOutgoingConnection() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end'))->getMock(); + + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('example.com:80')->willReturn($promise); + + $this->server->onConnection($connection); + + $connection->emit('data', array("\x04\x01" . "\x00\x50" . "\x00\x00\x00\x01" . "\x00" . "example.com" . "\x00")); + } + + public function testHandleSocks4aConnectionWithHostnameAndSourceAddressWillEstablishOutgoingConnection() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end', 'getRemoteAddress'))->getMock(); + $connection->expects($this->once())->method('getRemoteAddress')->willReturn('tcp://10.20.30.40:5060'); + + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('example.com:80?source=socks4%3A%2F%2F10.20.30.40%3A5060')->willReturn($promise); + + $this->server->onConnection($connection); + + $connection->emit('data', array("\x04\x01" . "\x00\x50" . "\x00\x00\x00\x01" . "\x00" . "example.com" . "\x00")); + } + + public function testHandleSocks4aConnectionWithSecureTlsSourceAddressWillEstablishOutgoingConnection() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end', 'getRemoteAddress'))->getMock(); + $connection->expects($this->once())->method('getRemoteAddress')->willReturn('tls://10.20.30.40:5060'); + + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('example.com:80?source=socks4s%3A%2F%2F10.20.30.40%3A5060')->willReturn($promise); + + $this->server->onConnection($connection); + + $connection->emit('data', array("\x04\x01" . "\x00\x50" . "\x00\x00\x00\x01" . "\x00" . "example.com" . "\x00")); + } + + public function testHandleSocks4aConnectionWithInvalidHostnameWillNotEstablishOutgoingConnection() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end'))->getMock(); + + $this->connector->expects($this->never())->method('connect'); + + $this->server->onConnection($connection); + + $connection->emit('data', array("\x04\x01" . "\x00\x50" . "\x00\x00\x00\x01" . "\x00" . "tls://example.com:80?" . "\x00")); + } + + public function testHandleSocks5ConnectionWithIpv4WillEstablishOutgoingConnection() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end', 'write'))->getMock(); + + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:80')->willReturn($promise); + + $this->server->onConnection($connection); + + $connection->emit('data', array("\x05\x01\x00" . "\x05\x01\x00\x01" . pack('N', ip2long('127.0.0.1')) . "\x00\x50")); + } + + public function testHandleSocks5ConnectionWithIpv4AndSourceAddressWillEstablishOutgoingConnection() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end', 'write', 'getRemoteAddress'))->getMock(); + $connection->expects($this->once())->method('getRemoteAddress')->willReturn('tcp://10.20.30.40:5060'); + + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:80?source=socks5%3A%2F%2F10.20.30.40%3A5060')->willReturn($promise); + + $this->server->onConnection($connection); + + $connection->emit('data', array("\x05\x01\x00" . "\x05\x01\x00\x01" . pack('N', ip2long('127.0.0.1')) . "\x00\x50")); + } + + public function testHandleSocks5ConnectionWithSecureTlsIpv4AndSourceAddressWillEstablishOutgoingConnection() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end', 'write', 'getRemoteAddress'))->getMock(); + $connection->expects($this->once())->method('getRemoteAddress')->willReturn('tls://10.20.30.40:5060'); + + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:80?source=socks5s%3A%2F%2F10.20.30.40%3A5060')->willReturn($promise); + + $this->server->onConnection($connection); + + $connection->emit('data', array("\x05\x01\x00" . "\x05\x01\x00\x01" . pack('N', ip2long('127.0.0.1')) . "\x00\x50")); + } + + public function testHandleSocks5ConnectionWithIpv6WillEstablishOutgoingConnection() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end', 'write'))->getMock(); + + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('[::1]:80')->willReturn($promise); + + $this->server->onConnection($connection); + + $connection->emit('data', array("\x05\x01\x00" . "\x05\x01\x00\x04" . inet_pton('::1') . "\x00\x50")); + } + + public function testHandleSocks5ConnectionWithHostnameWillEstablishOutgoingConnection() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end', 'write'))->getMock(); + + $promise = new Promise(function () { }); + + $this->connector->expects($this->once())->method('connect')->with('example.com:80')->willReturn($promise); + + $this->server->onConnection($connection); + + $connection->emit('data', array("\x05\x01\x00" . "\x05\x01\x00\x03\x0B" . "example.com" . "\x00\x50")); + } + + public function testHandleSocks5ConnectionWithConnectorRefusedWillReturnReturnRefusedError() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end', 'write'))->getMock(); + + $promise = \React\Promise\reject(new RuntimeException('Connection refused')); + + $this->connector->expects($this->once())->method('connect')->with('example.com:80')->willReturn($promise); + + $this->server->onConnection($connection); + + $connection->expects($this->exactly(2))->method('write')->withConsecutive(array("\x05\x00"), array("\x05\x05" . "\x00\x01\x00\x00\x00\x00\x00\x00")); + + $connection->emit('data', array("\x05\x01\x00" . "\x05\x01\x00\x03\x0B" . "example.com" . "\x00\x50")); + } + + public function testHandleSocks5UdpCommandWillNotEstablishOutgoingConnectionAndReturnCommandError() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end', 'write'))->getMock(); + + $this->connector->expects($this->never())->method('connect'); + + $this->server->onConnection($connection); + + $connection->expects($this->exactly(2))->method('write')->withConsecutive(array("\x05\x00"), array("\x05\x07" . "\x00\x01\x00\x00\x00\x00\x00\x00")); + + $connection->emit('data', array("\x05\x01\x00" . "\x05\x03\x00\x03\x0B" . "example.com" . "\x00\x50")); + } + + public function testHandleSocks5ConnectionWithInvalidHostnameWillNotEstablishOutgoingConnectionAndReturnGeneralError() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end', 'write'))->getMock(); + + $this->connector->expects($this->never())->method('connect'); + + $this->server->onConnection($connection); + + $connection->expects($this->exactly(2))->method('write')->withConsecutive(array("\x05\x00"), array("\x05\x01" . "\x00\x01\x00\x00\x00\x00\x00\x00")); + + $connection->emit('data', array("\x05\x01\x00" . "\x05\x01\x00\x03\x15" . "tls://example.com:80?" . "\x00\x50")); + } + + public function testHandleSocksConnectionWillCancelOutputConnectionIfIncomingCloses() + { + $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(array('pause', 'end'))->getMock(); + + $promise = new Promise(function () { }, $this->expectCallableOnce()); + + $this->connector->expects($this->once())->method('connect')->with('127.0.0.1:80')->willReturn($promise); + + $this->server->onConnection($connection); + + $connection->emit('data', array("\x04\x01" . "\x00\x50" . pack('N', ip2long('127.0.0.1')) . "\x00")); + $connection->emit('close'); + } + + public function testUnsetAuth() + { + $this->server->unsetAuth(); + $this->server->unsetAuth(); + + $this->assertTrue(true); + } +} diff --git a/instafeed/vendor/clue/socks-react/tests/StreamReaderTest.php b/instafeed/vendor/clue/socks-react/tests/StreamReaderTest.php new file mode 100755 index 0000000..a2a0d95 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/tests/StreamReaderTest.php @@ -0,0 +1,82 @@ +reader = new StreamReader(); + } + + public function testReadByteAssertCorrect() + { + $this->reader->readByteAssert(0x01)->then($this->expectCallableOnce(0x01)); + + $this->reader->write("\x01"); + } + + public function testReadByteAssertInvalid() + { + $this->reader->readByteAssert(0x02)->then(null, $this->expectCallableOnce()); + + $this->reader->write("\x03"); + } + + public function testReadStringNull() + { + $this->reader->readStringNull()->then($this->expectCallableOnce('hello')); + + $this->reader->write("hello\x00"); + } + + public function testReadStringLength() + { + $this->reader->readLength(5)->then($this->expectCallableOnce('hello')); + + $this->reader->write('he'); + $this->reader->write('ll'); + $this->reader->write('o '); + + $this->assertEquals(' ', $this->reader->getBuffer()); + } + + public function testReadBuffered() + { + $this->reader->write('hello'); + + $this->reader->readLength(5)->then($this->expectCallableOnce('hello')); + + $this->assertEquals('', $this->reader->getBuffer()); + } + + public function testSequence() + { + $this->reader->readByte()->then($this->expectCallableOnce(ord('h'))); + $this->reader->readByteAssert(ord('e'))->then($this->expectCallableOnce(ord('e'))); + $this->reader->readLength(4)->then($this->expectCallableOnce('llo ')); + $this->reader->readBinary(array('w'=>'C', 'o' => 'C'))->then($this->expectCallableOnce(array('w' => ord('w'), 'o' => ord('o')))); + + $this->reader->write('hello world'); + + $this->assertEquals('rld', $this->reader->getBuffer()); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testInvalidStructure() + { + $this->reader->readBinary(array('invalid' => 'y')); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testInvalidCallback() + { + $this->reader->readBufferCallback(array()); + } +} diff --git a/instafeed/vendor/clue/socks-react/tests/bootstrap.php b/instafeed/vendor/clue/socks-react/tests/bootstrap.php new file mode 100755 index 0000000..029c6b9 --- /dev/null +++ b/instafeed/vendor/clue/socks-react/tests/bootstrap.php @@ -0,0 +1,103 @@ +createCallableMock(); + + + if (func_num_args() > 0) { + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->equalTo(func_get_arg(0))); + } else { + $mock + ->expects($this->once()) + ->method('__invoke'); + } + + return $mock; + } + + protected function expectCallableNever() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->never()) + ->method('__invoke'); + + return $mock; + } + + protected function expectCallableOnceWithExceptionCode($code) + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->callback(function ($e) use ($code) { + return $e->getCode() === $code; + })); + + return $mock; + } + + protected function expectCallableOnceParameter($type) + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->isInstanceOf($type)); + + return $mock; + } + + /** + * @link https://github.com/reactphp/react/blob/master/tests/React/Tests/Socket/TestCase.php (taken from reactphp/react) + */ + protected function createCallableMock() + { + return $this->getMockBuilder('CallableStub')->getMock(); + } + + protected function expectPromiseResolve($promise) + { + $this->assertInstanceOf('React\Promise\PromiseInterface', $promise); + + $that = $this; + $promise->then(null, function($error) use ($that) { + $that->assertNull($error); + $that->fail('promise rejected'); + }); + $promise->then($this->expectCallableOnce(), $this->expectCallableNever()); + + return $promise; + } + + protected function expectPromiseReject($promise) + { + $this->assertInstanceOf('React\Promise\PromiseInterface', $promise); + + $that = $this; + $promise->then(function($value) use ($that) { + $that->assertNull($value); + $that->fail('promise resolved'); + }); + + $promise->then($this->expectCallableNever(), $this->expectCallableOnce()); + + return $promise; + } +} + +class CallableStub +{ + public function __invoke() + { + } +} diff --git a/instafeed/vendor/composer/ClassLoader.php b/instafeed/vendor/composer/ClassLoader.php new file mode 100755 index 0000000..fce8549 --- /dev/null +++ b/instafeed/vendor/composer/ClassLoader.php @@ -0,0 +1,445 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/instafeed/vendor/composer/LICENSE b/instafeed/vendor/composer/LICENSE new file mode 100755 index 0000000..4b615a3 --- /dev/null +++ b/instafeed/vendor/composer/LICENSE @@ -0,0 +1,56 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: Composer +Upstream-Contact: Jordi Boggiano +Source: https://github.com/composer/composer + +Files: * +Copyright: 2016, Nils Adermann + 2016, Jordi Boggiano +License: Expat + +Files: src/Composer/Util/TlsHelper.php +Copyright: 2016, Nils Adermann + 2016, Jordi Boggiano + 2013, Evan Coury +License: Expat and BSD-2-Clause + +License: BSD-2-Clause + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + . + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + . + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +License: Expat + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. diff --git a/instafeed/vendor/composer/autoload_classmap.php b/instafeed/vendor/composer/autoload_classmap.php new file mode 100755 index 0000000..7a91153 --- /dev/null +++ b/instafeed/vendor/composer/autoload_classmap.php @@ -0,0 +1,9 @@ + $vendorDir . '/react/promise/src/functions_include.php', + '972fda704d680a3a53c68e34e193cb22' => $vendorDir . '/react/promise-timer/src/functions_include.php', + '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', + 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', + 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', + 'ebf8799635f67b5d7248946fe2154f4a' => $vendorDir . '/ringcentral/psr7/src/functions_include.php', + '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', +); diff --git a/instafeed/vendor/composer/autoload_namespaces.php b/instafeed/vendor/composer/autoload_namespaces.php new file mode 100755 index 0000000..02066fb --- /dev/null +++ b/instafeed/vendor/composer/autoload_namespaces.php @@ -0,0 +1,10 @@ + array($vendorDir . '/evenement/evenement/src'), +); diff --git a/instafeed/vendor/composer/autoload_psr4.php b/instafeed/vendor/composer/autoload_psr4.php new file mode 100755 index 0000000..5d4f0c7 --- /dev/null +++ b/instafeed/vendor/composer/autoload_psr4.php @@ -0,0 +1,32 @@ + array($vendorDir . '/winbox/args/src'), + 'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), + 'RingCentral\\Psr7\\' => array($vendorDir . '/ringcentral/psr7/src'), + 'React\\Stream\\' => array($vendorDir . '/react/stream/src'), + 'React\\Socket\\' => array($vendorDir . '/react/socket/src'), + 'React\\Promise\\Timer\\' => array($vendorDir . '/react/promise-timer/src'), + 'React\\Promise\\' => array($vendorDir . '/react/promise/src'), + 'React\\EventLoop\\' => array($vendorDir . '/react/event-loop/src'), + 'React\\Dns\\' => array($vendorDir . '/react/dns/src'), + 'React\\Cache\\' => array($vendorDir . '/react/cache/src'), + 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), + 'LazyJsonMapper\\' => array($vendorDir . '/lazyjsonmapper/lazyjsonmapper/src'), + 'InstagramAPI\\' => array($vendorDir . '/mgp25/instagram-php/src'), + 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), + 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), + 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), + 'GetOptionKit\\' => array($vendorDir . '/corneltek/getoptionkit/src'), + 'Fbns\\Client\\' => array($vendorDir . '/valga/fbns-react/src'), + 'Clue\\React\\Socks\\' => array($vendorDir . '/clue/socks-react/src'), + 'Clue\\React\\HttpProxy\\' => array($vendorDir . '/clue/http-proxy-react/src'), + 'BinSoul\\Net\\Mqtt\\Client\\React\\' => array($vendorDir . '/binsoul/net-mqtt-client-react/src'), + 'BinSoul\\Net\\Mqtt\\' => array($vendorDir . '/binsoul/net-mqtt/src'), +); diff --git a/instafeed/vendor/composer/autoload_real.php b/instafeed/vendor/composer/autoload_real.php new file mode 100755 index 0000000..6a318f4 --- /dev/null +++ b/instafeed/vendor/composer/autoload_real.php @@ -0,0 +1,70 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInit331ae81537359437b02a96bc74f11b80::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInit331ae81537359437b02a96bc74f11b80::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequire331ae81537359437b02a96bc74f11b80($fileIdentifier, $file); + } + + return $loader; + } +} + +function composerRequire331ae81537359437b02a96bc74f11b80($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + } +} diff --git a/instafeed/vendor/composer/autoload_static.php b/instafeed/vendor/composer/autoload_static.php new file mode 100755 index 0000000..5c67b20 --- /dev/null +++ b/instafeed/vendor/composer/autoload_static.php @@ -0,0 +1,189 @@ + __DIR__ . '/..' . '/react/promise/src/functions_include.php', + '972fda704d680a3a53c68e34e193cb22' => __DIR__ . '/..' . '/react/promise-timer/src/functions_include.php', + '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', + 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', + 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', + 'ebf8799635f67b5d7248946fe2154f4a' => __DIR__ . '/..' . '/ringcentral/psr7/src/functions_include.php', + '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'W' => + array ( + 'Winbox\\' => 7, + ), + 'S' => + array ( + 'Symfony\\Component\\Process\\' => 26, + ), + 'R' => + array ( + 'RingCentral\\Psr7\\' => 17, + 'React\\Stream\\' => 13, + 'React\\Socket\\' => 13, + 'React\\Promise\\Timer\\' => 20, + 'React\\Promise\\' => 14, + 'React\\EventLoop\\' => 16, + 'React\\Dns\\' => 10, + 'React\\Cache\\' => 12, + ), + 'P' => + array ( + 'Psr\\Log\\' => 8, + 'Psr\\Http\\Message\\' => 17, + ), + 'L' => + array ( + 'LazyJsonMapper\\' => 15, + ), + 'I' => + array ( + 'InstagramAPI\\' => 13, + ), + 'G' => + array ( + 'GuzzleHttp\\Psr7\\' => 16, + 'GuzzleHttp\\Promise\\' => 19, + 'GuzzleHttp\\' => 11, + 'GetOptionKit\\' => 13, + ), + 'F' => + array ( + 'Fbns\\Client\\' => 12, + ), + 'C' => + array ( + 'Clue\\React\\Socks\\' => 17, + 'Clue\\React\\HttpProxy\\' => 21, + ), + 'B' => + array ( + 'BinSoul\\Net\\Mqtt\\Client\\React\\' => 30, + 'BinSoul\\Net\\Mqtt\\' => 17, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Winbox\\' => + array ( + 0 => __DIR__ . '/..' . '/winbox/args/src', + ), + 'Symfony\\Component\\Process\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/process', + ), + 'RingCentral\\Psr7\\' => + array ( + 0 => __DIR__ . '/..' . '/ringcentral/psr7/src', + ), + 'React\\Stream\\' => + array ( + 0 => __DIR__ . '/..' . '/react/stream/src', + ), + 'React\\Socket\\' => + array ( + 0 => __DIR__ . '/..' . '/react/socket/src', + ), + 'React\\Promise\\Timer\\' => + array ( + 0 => __DIR__ . '/..' . '/react/promise-timer/src', + ), + 'React\\Promise\\' => + array ( + 0 => __DIR__ . '/..' . '/react/promise/src', + ), + 'React\\EventLoop\\' => + array ( + 0 => __DIR__ . '/..' . '/react/event-loop/src', + ), + 'React\\Dns\\' => + array ( + 0 => __DIR__ . '/..' . '/react/dns/src', + ), + 'React\\Cache\\' => + array ( + 0 => __DIR__ . '/..' . '/react/cache/src', + ), + 'Psr\\Log\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', + ), + 'Psr\\Http\\Message\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/http-message/src', + ), + 'LazyJsonMapper\\' => + array ( + 0 => __DIR__ . '/..' . '/lazyjsonmapper/lazyjsonmapper/src', + ), + 'InstagramAPI\\' => + array ( + 0 => __DIR__ . '/..' . '/mgp25/instagram-php/src', + ), + 'GuzzleHttp\\Psr7\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', + ), + 'GuzzleHttp\\Promise\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', + ), + 'GuzzleHttp\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', + ), + 'GetOptionKit\\' => + array ( + 0 => __DIR__ . '/..' . '/corneltek/getoptionkit/src', + ), + 'Fbns\\Client\\' => + array ( + 0 => __DIR__ . '/..' . '/valga/fbns-react/src', + ), + 'Clue\\React\\Socks\\' => + array ( + 0 => __DIR__ . '/..' . '/clue/socks-react/src', + ), + 'Clue\\React\\HttpProxy\\' => + array ( + 0 => __DIR__ . '/..' . '/clue/http-proxy-react/src', + ), + 'BinSoul\\Net\\Mqtt\\Client\\React\\' => + array ( + 0 => __DIR__ . '/..' . '/binsoul/net-mqtt-client-react/src', + ), + 'BinSoul\\Net\\Mqtt\\' => + array ( + 0 => __DIR__ . '/..' . '/binsoul/net-mqtt/src', + ), + ); + + public static $prefixesPsr0 = array ( + 'E' => + array ( + 'Evenement' => + array ( + 0 => __DIR__ . '/..' . '/evenement/evenement/src', + ), + ), + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit331ae81537359437b02a96bc74f11b80::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit331ae81537359437b02a96bc74f11b80::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInit331ae81537359437b02a96bc74f11b80::$prefixesPsr0; + + }, null, ClassLoader::class); + } +} diff --git a/instafeed/vendor/composer/installed.json b/instafeed/vendor/composer/installed.json new file mode 100755 index 0000000..46699b3 --- /dev/null +++ b/instafeed/vendor/composer/installed.json @@ -0,0 +1,1328 @@ +[ + { + "name": "binsoul/net-mqtt", + "version": "0.2.1", + "version_normalized": "0.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/binsoul/net-mqtt.git", + "reference": "286b28e6014739b19e0e7ce0cd5871cdd0cef9b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/binsoul/net-mqtt/zipball/286b28e6014739b19e0e7ce0cd5871cdd0cef9b3", + "reference": "286b28e6014739b19e0e7ce0cd5871cdd0cef9b3", + "shasum": "" + }, + "require": { + "php": "~5.6|~7.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.0", + "phpunit/phpunit": "~4.0||~5.0" + }, + "time": "2017-04-03T20:17:02+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "BinSoul\\Net\\Mqtt\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian Mößler", + "email": "code@binsoul.de", + "homepage": "https://github.com/binsoul", + "role": "Developer" + } + ], + "description": "MQTT protocol implementation", + "homepage": "https://github.com/binsoul/net-mqtt", + "keywords": [ + "mqtt", + "net" + ] + }, + { + "name": "binsoul/net-mqtt-client-react", + "version": "0.3.2", + "version_normalized": "0.3.2.0", + "source": { + "type": "git", + "url": "https://github.com/binsoul/net-mqtt-client-react.git", + "reference": "6a80fea50e927ebb8bb8a631ea7903c22742ded5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/binsoul/net-mqtt-client-react/zipball/6a80fea50e927ebb8bb8a631ea7903c22742ded5", + "reference": "6a80fea50e927ebb8bb8a631ea7903c22742ded5", + "shasum": "" + }, + "require": { + "binsoul/net-mqtt": "~0.2", + "php": "~5.6|~7.0", + "react/promise": "~2.0", + "react/socket": "~0.8" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.0", + "phpunit/phpunit": "~4.0||~5.0" + }, + "time": "2017-08-20T08:06:53+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "BinSoul\\Net\\Mqtt\\Client\\React\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian Mößler", + "email": "code@binsoul.de", + "homepage": "https://github.com/binsoul", + "role": "Developer" + } + ], + "description": "Asynchronous MQTT client built on React", + "homepage": "https://github.com/binsoul/net-mqtt-client-react", + "keywords": [ + "client", + "mqtt", + "net" + ] + }, + { + "name": "clue/http-proxy-react", + "version": "v1.3.0", + "version_normalized": "1.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/clue/php-http-proxy-react.git", + "reference": "eeff725640ed53386a6adb05ffdbfc2837404fdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/php-http-proxy-react/zipball/eeff725640ed53386a6adb05ffdbfc2837404fdf", + "reference": "eeff725640ed53386a6adb05ffdbfc2837404fdf", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/promise": " ^2.1 || ^1.2.1", + "react/socket": "^1.0 || ^0.8.4", + "ringcentral/psr7": "^1.2" + }, + "require-dev": { + "clue/block-react": "^1.1", + "phpunit/phpunit": "^5.0 || ^4.8", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" + }, + "time": "2018-02-13T16:31:32+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Clue\\React\\HttpProxy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "Async HTTP proxy connector, use any TCP/IP-based protocol through an HTTP CONNECT proxy server, built on top of ReactPHP", + "homepage": "https://github.com/clue/php-http-proxy-react", + "keywords": [ + "async", + "connect", + "http", + "proxy", + "reactphp" + ] + }, + { + "name": "clue/socks-react", + "version": "v0.8.7", + "version_normalized": "0.8.7.0", + "source": { + "type": "git", + "url": "https://github.com/clue/php-socks-react.git", + "reference": "0fcd6f2f506918ff003f1b995c6e78443f26e8ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/php-socks-react/zipball/0fcd6f2f506918ff003f1b995c6e78443f26e8ea", + "reference": "0fcd6f2f506918ff003f1b995c6e78443f26e8ea", + "shasum": "" + }, + "require": { + "evenement/evenement": "~3.0|~1.0|~2.0", + "php": ">=5.3", + "react/promise": "^2.1 || ^1.2", + "react/socket": "^1.0 || ^0.8.6" + }, + "require-dev": { + "clue/block-react": "^1.1", + "clue/connection-manager-extra": "^1.0 || ^0.7", + "phpunit/phpunit": "^6.0 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" + }, + "time": "2017-12-17T14:47:58+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Clue\\React\\Socks\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "Async SOCKS4, SOCKS4a and SOCKS5 proxy client and server implementation, built on top of ReactPHP", + "homepage": "https://github.com/clue/php-socks-react", + "keywords": [ + "async", + "proxy", + "reactphp", + "socks client", + "socks protocol", + "socks server", + "tcp tunnel" + ] + }, + { + "name": "corneltek/getoptionkit", + "version": "2.6.0", + "version_normalized": "2.6.0.0", + "source": { + "type": "git", + "url": "https://github.com/c9s/GetOptionKit.git", + "reference": "995607ddf4fc90ebdb4a7d58fe972d581ad8495f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/c9s/GetOptionKit/zipball/995607ddf4fc90ebdb4a7d58fe972d581ad8495f", + "reference": "995607ddf4fc90ebdb4a7d58fe972d581ad8495f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2017-06-30T14:54:48+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GetOptionKit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Yo-An Lin", + "email": "yoanlin93@gmail.com" + } + ], + "description": "Powerful command-line option toolkit", + "homepage": "http://github.com/c9s/GetOptionKit" + }, + { + "name": "evenement/evenement", + "version": "v3.0.1", + "version_normalized": "3.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "time": "2017-07-23T21:35:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Evenement": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ] + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.4.1", + "version_normalized": "6.4.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "0895c932405407fd3a7368b6910c09a24d26db11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0895c932405407fd3a7368b6910c09a24d26db11", + "reference": "0895c932405407fd3a7368b6910c09a24d26db11", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "time": "2019-10-23T15:58:00+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ] + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "version_normalized": "1.3.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "time": "2016-12-20T10:07:11+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ] + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "version_normalized": "1.6.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "time": "2019-07-01T23:21:34+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ] + }, + { + "name": "lazyjsonmapper/lazyjsonmapper", + "version": "v1.6.3", + "version_normalized": "1.6.3.0", + "source": { + "type": "git", + "url": "https://github.com/lazyjsonmapper/lazyjsonmapper.git", + "reference": "51e093b50f4de15d2d64548b3ca743713eed6ee9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lazyjsonmapper/lazyjsonmapper/zipball/51e093b50f4de15d2d64548b3ca743713eed6ee9", + "reference": "51e093b50f4de15d2d64548b3ca743713eed6ee9", + "shasum": "" + }, + "require": { + "corneltek/getoptionkit": "2.*", + "php": ">=5.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.7.1", + "phpunit/phpunit": "6.*" + }, + "time": "2018-05-02T16:57:09+00:00", + "bin": [ + "bin/lazydoctor" + ], + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "LazyJsonMapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "SteveJobzniak", + "role": "Developer", + "homepage": "https://github.com/SteveJobzniak" + } + ], + "description": "Advanced, intelligent & automatic object-oriented JSON containers for PHP.", + "homepage": "https://github.com/SteveJobzniak/LazyJsonMapper", + "keywords": [ + "development", + "json" + ] + }, + { + "name": "mgp25/instagram-php", + "version": "v7.0.1", + "version_normalized": "7.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/mgp25/Instagram-API.git", + "reference": "53421f90b9ef7743f1c6221c4963f2b9f7a592e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mgp25/Instagram-API/zipball/53421f90b9ef7743f1c6221c4963f2b9f7a592e8", + "reference": "53421f90b9ef7743f1c6221c4963f2b9f7a592e8", + "shasum": "" + }, + "require": { + "binsoul/net-mqtt-client-react": "^0.3.2", + "clue/http-proxy-react": "^1.1.0", + "clue/socks-react": "^0.8.2", + "ext-bcmath": "*", + "ext-curl": "*", + "ext-exif": "*", + "ext-gd": "*", + "ext-mbstring": "*", + "ext-zlib": "*", + "guzzlehttp/guzzle": "^6.2", + "lazyjsonmapper/lazyjsonmapper": "^1.6.1", + "php": ">=5.6", + "psr/log": "^1.0", + "react/event-loop": "^0.4.3", + "react/promise": "^2.5", + "react/socket": "^0.8", + "symfony/process": "^3.4|^4.0", + "valga/fbns-react": "^0.1.8", + "winbox/args": "1.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.11.0", + "monolog/monolog": "^1.23", + "phpunit/phpunit": "^5.7 || ^6.2", + "react/http": "^0.7.2" + }, + "suggest": { + "ext-event": "Installing PHP's native Event extension enables faster Realtime class event handling." + }, + "time": "2019-09-17T00:56:42+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "InstagramAPI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "RPL-1.5", + "proprietary" + ], + "authors": [ + { + "name": "mgp25", + "email": "me@mgp25.com", + "role": "Founder" + }, + { + "name": "SteveJobzniak", + "homepage": "https://github.com/SteveJobzniak", + "role": "Developer" + } + ], + "description": "Instagram's private API for PHP", + "keywords": [ + "api", + "instagram", + "php", + "private" + ] + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2016-08-06T14:39:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ] + }, + { + "name": "psr/log", + "version": "1.1.1", + "version_normalized": "1.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "bf73deb2b3b896a9d9c75f3f0d88185d2faa27e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/bf73deb2b3b896a9d9c75f3f0d88185d2faa27e2", + "reference": "bf73deb2b3b896a9d9c75f3f0d88185d2faa27e2", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2019-10-25T08:06:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ] + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "version_normalized": "3.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "time": "2019-03-08T08:55:37+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders." + }, + { + "name": "react/cache", + "version": "v1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "aa10d63a1b40a36a486bdf527f28bac607ee6466" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/aa10d63a1b40a36a486bdf527f28bac607ee6466", + "reference": "aa10d63a1b40a36a486bdf527f28bac607ee6466", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "~2.0|~1.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "time": "2019-07-11T13:45:28+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ] + }, + { + "name": "react/dns", + "version": "v0.4.19", + "version_normalized": "0.4.19.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9", + "reference": "6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", + "react/promise": "^2.1 || ^1.2.1", + "react/promise-timer": "^1.2", + "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.5" + }, + "require-dev": { + "clue/block-react": "^1.2", + "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35" + }, + "time": "2019-07-10T21:00:53+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\Dns\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ] + }, + { + "name": "react/event-loop", + "version": "v0.4.3", + "version_normalized": "0.4.3.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/8bde03488ee897dc6bb3d91e4e17c353f9c5252f", + "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "suggest": { + "ext-event": "~1.0", + "ext-libev": "*", + "ext-libevent": ">=0.1.0" + }, + "time": "2017-04-27T10:56:23+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Event loop abstraction layer that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ] + }, + { + "name": "react/promise", + "version": "v2.7.1", + "version_normalized": "2.7.1.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/31ffa96f8d2ed0341a57848cbb84d88b89dd664d", + "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "time": "2019-01-07T21:25:54+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ] + }, + { + "name": "react/promise-timer", + "version": "v1.5.1", + "version_normalized": "1.5.1.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise-timer.git", + "reference": "35fb910604fd86b00023fc5cda477c8074ad0abc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/35fb910604fd86b00023fc5cda477c8074ad0abc", + "reference": "35fb910604fd86b00023fc5cda477c8074ad0abc", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", + "react/promise": "^2.7.0 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "time": "2019-03-27T18:10:32+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\Promise\\Timer\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.", + "homepage": "https://github.com/reactphp/promise-timer", + "keywords": [ + "async", + "event-loop", + "promise", + "reactphp", + "timeout", + "timer" + ] + }, + { + "name": "react/socket", + "version": "v0.8.12", + "version_normalized": "0.8.12.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "7f7e6c56ccda7418a1a264892a625f38a5bdee0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/7f7e6c56ccda7418a1a264892a625f38a5bdee0c", + "reference": "7f7e6c56ccda7418a1a264892a625f38a5bdee0c", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^0.4.13", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", + "react/promise": "^2.6.0 || ^1.2.1", + "react/promise-timer": "^1.4.0", + "react/stream": "^1.0 || ^0.7.1" + }, + "require-dev": { + "clue/block-react": "^1.2", + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "time": "2018-06-11T14:33:43+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\Socket\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ] + }, + { + "name": "react/stream", + "version": "v1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "50426855f7a77ddf43b9266c22320df5bf6c6ce6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/50426855f7a77ddf43b9266c22320df5bf6c6ce6", + "reference": "50426855f7a77ddf43b9266c22320df5bf6c6ce6", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" + }, + "time": "2019-01-01T16:15:09+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\Stream\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ] + }, + { + "name": "ringcentral/psr7", + "version": "1.2.2", + "version_normalized": "1.2.2.0", + "source": { + "type": "git", + "url": "https://github.com/ringcentral/psr7.git", + "reference": "dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ringcentral/psr7/zipball/dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c", + "reference": "dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "time": "2018-01-15T21:00:49+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "RingCentral\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "PSR-7 message implementation", + "keywords": [ + "http", + "message", + "stream", + "uri" + ] + }, + { + "name": "symfony/process", + "version": "v4.3.5", + "version_normalized": "4.3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/50556892f3cc47d4200bfd1075314139c4c9ff4b", + "reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "time": "2019-09-26T21:17:10+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com" + }, + { + "name": "valga/fbns-react", + "version": "0.1.8", + "version_normalized": "0.1.8.0", + "source": { + "type": "git", + "url": "https://github.com/valga/fbns-react.git", + "reference": "4bbf513a8ffed7e0c9ca10776033d34515bb8b37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/valga/fbns-react/zipball/4bbf513a8ffed7e0c9ca10776033d34515bb8b37", + "reference": "4bbf513a8ffed7e0c9ca10776033d34515bb8b37", + "shasum": "" + }, + "require": { + "binsoul/net-mqtt": "~0.2", + "evenement/evenement": "~2.0|~3.0", + "ext-mbstring": "*", + "ext-zlib": "*", + "php": "~5.6|~7.0", + "psr/log": "~1.0", + "react/event-loop": "^0.4.3", + "react/promise": "~2.0", + "react/socket": "~0.8" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.4", + "monolog/monolog": "~1.23" + }, + "suggest": { + "ext-event": "For more efficient event loop implementation.", + "ext-gmp": "To be able to run this code on x86 PHP builds." + }, + "time": "2017-10-09T07:54:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Fbns\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Abyr Valg", + "email": "valga.github@abyrga.ru" + } + ], + "description": "A PHP client for the FBNS built on top of ReactPHP", + "keywords": [ + "FBNS", + "client", + "php" + ] + }, + { + "name": "winbox/args", + "version": "v1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/johnstevenson/winbox-args.git", + "reference": "389a9ed9410e6f422b1031b3e55a402ace716296" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/johnstevenson/winbox-args/zipball/389a9ed9410e6f422b1031b3e55a402ace716296", + "reference": "389a9ed9410e6f422b1031b3e55a402ace716296", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2016-08-04T14:30:27+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Winbox\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Windows command-line formatter", + "homepage": "http://github.com/johnstevenson/winbox-args", + "keywords": [ + "Escape", + "command", + "windows" + ] + } +] diff --git a/instafeed/vendor/corneltek/getoptionkit/.gitignore b/instafeed/vendor/corneltek/getoptionkit/.gitignore new file mode 100755 index 0000000..f32e02a --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/.gitignore @@ -0,0 +1,3 @@ +/build +/vendor +*.tgz diff --git a/instafeed/vendor/corneltek/getoptionkit/.travis.yml b/instafeed/vendor/corneltek/getoptionkit/.travis.yml new file mode 100755 index 0000000..147e77c --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/.travis.yml @@ -0,0 +1,29 @@ +language: php +php: +- 5.6 +- 7.0 +- 7.1 +- hhvm +install: +- phpenv rehash +- composer require "satooshi/php-coveralls" "^1" --dev --no-update +- composer install --no-interaction +script: +- phpunit -c phpunit.xml.dist +after_success: +- php vendor/bin/coveralls -v +matrix: + fast_finish: true + allow_failures: + - php: hhvm + - php: '5.6' +cache: + apt: true + directories: + - vendor +notifications: + email: + on_success: change + on_failure: change + slack: + secure: dKH3qw9myjwDO+OIz6qBqn5vJJqoFyD2frS4eH68jI5gtxHX2PJVwaP9waXTSu+FFq9wILsHGQezrawWHcMkbEo4gxbri2Ne7gFT4CJD0DAOyf02JgQ1A/cJaqQ5XrLO9CwjP0/8PKaMCHiND4SLEWgmtlFRoB7gr33QjbQjBvc= diff --git a/instafeed/vendor/corneltek/getoptionkit/CHANGELOG.md b/instafeed/vendor/corneltek/getoptionkit/CHANGELOG.md new file mode 100755 index 0000000..2446ddb --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/CHANGELOG.md @@ -0,0 +1,56 @@ +CHANGELOG +================== + +## v2.3.0 - Thu May 12 10:29:19 2016 + +- Fixed bugs for multiple value parsing with arguments. +- OptionParser::parse(argv) now expects the first argument to be the program name, + so you can pass argv directly to the parser. + +## v2.2.5-6 - Wed May 11 2016 + +- Fixed bugs for ContinuousOptionParser. + +## v2.2.4 - Fri Oct 2 15:53:33 2015 + +- ContinuousOptionParser improvements. + +## v2.2.2 - Tue Jul 14 00:15:26 2015 + +- Added PathType. + +## v2.2.1 - Tue Jul 14 00:17:19 2015 + +Merged PRs: + +- Commit 7bbb91b: Merge pull request #34 from 1Franck/master + + added value type option(s) support, added class RegexType + +- Commit 3722992: Merge pull request #33 from 1Franck/patch-1 + + Clarified InvalidOptionValue exception message + + +## v2.2.0 - Thu Jun 4 13:51:47 2015 + +- Added more types for type constraint option. url, ip, ipv4, ipv6, email by @1Franck++ +- Several bug fixes by @1Franck++ + + + +## v2.1.0 - Fri Apr 24 16:43:00 2015 + +- Added incremental option value support. +- Fixed #21 for negative value. +- Used autoloading with PSR-4 + +## v2.0.12 - Tue Apr 21 18:51:12 2015 + +- Improved hinting text for default value +- Some coding style fix +- Added default value support +- Updated default value support for ContinuousOptionParser +- Added getValue() accessor on OptionSpec class +- Merged pull request #22 from Gasol/zero-option. @Gasol++ + - Fix option that can't not be 0 diff --git a/instafeed/vendor/corneltek/getoptionkit/CONTRIBUTORS.txt b/instafeed/vendor/corneltek/getoptionkit/CONTRIBUTORS.txt new file mode 100755 index 0000000..59cb935 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/CONTRIBUTORS.txt @@ -0,0 +1,11 @@ +Bitdeli Chef +Dlussky Kirill +Francois Lajoie +Gasol Wu +Igor Santos +Jevon Wright +MartyIX +Michał Kniotek +Robbert Klarenbeek +Yo-An Lin +Yo-An Lin diff --git a/instafeed/vendor/corneltek/getoptionkit/LICENSE b/instafeed/vendor/corneltek/getoptionkit/LICENSE new file mode 100755 index 0000000..30a0180 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013 Yo-An Lin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/instafeed/vendor/corneltek/getoptionkit/README.md b/instafeed/vendor/corneltek/getoptionkit/README.md new file mode 100755 index 0000000..1e5794b --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/README.md @@ -0,0 +1,370 @@ +GetOptionKit +============ + +Code Quality + +[![Build Status](https://travis-ci.org/c9s/GetOptionKit.svg?branch=master)](https://travis-ci.org/c9s/GetOptionKit) +[![Coverage Status](https://coveralls.io/repos/github/c9s/GetOptionKit/badge.svg?branch=master)](https://coveralls.io/github/c9s/GetOptionKit?branch=master) + +Versions & Stats + +[![Latest Stable Version](https://poser.pugx.org/corneltek/getoptionkit/v/stable)](https://packagist.org/packages/corneltek/getoptionkit) +[![Latest Unstable Version](https://poser.pugx.org/corneltek/getoptionkit/v/unstable)](https://packagist.org/packages/corneltek/getoptionkit) +[![Total Downloads](https://poser.pugx.org/corneltek/getoptionkit/downloads)](https://packagist.org/packages/corneltek/getoptionkit) +[![Monthly Downloads](https://poser.pugx.org/corneltek/getoptionkit/d/monthly)](https://packagist.org/packages/corneltek/getoptionkit) +[![Daily Downloads](https://poser.pugx.org/corneltek/getoptionkit/d/daily)](https://packagist.org/packages/corneltek/getoptionkit) +[![License](https://poser.pugx.org/corneltek/getoptionkit/license)](https://packagist.org/packages/corneltek/getoptionkit) + +A powerful option parser toolkit for PHP, supporting type constraints, +flag, multiple flag, multiple values and required value checking. + +GetOptionKit supports PHP5.3, with fine unit testing with PHPUnit testing +framework. + +GetOptionKit is object-oriented, it's flexible and extendable. + +Powering PHPBrew , CLIFramework and AssetKit + + + +## Features + +- Simple format. +- Type constrant. +- Multiple value, requried value, optional value checking. +- Auto-generated help text from defined options. +- Support app/subcommand option parsing. +- Option Value Validator +- Option Suggestions +- SPL library. +- HHVM support. + +## Requirements + +* PHP 5.3+ + +## Install From Composer + +```sh +composer require corneltek/getoptionkit +``` + + +## Supported Option Formats + +simple flags: + +```sh +program.php -a -b -c +program.php -abc +program.php -vvv # incremental flag v=3 +program.php -a -bc +``` + +with multiple values: + +```sh +program.php -a foo -a bar -a zoo -b -b -b +``` + +specify value with equal sign: + +```sh +program.php -a=foo +program.php --long=foo +``` + +with normal arguments: + +``` +program.php -a=foo -b=bar arg1 arg2 arg3 +program.php arg1 arg2 arg3 -a=foo -b=bar +``` + +## Option SPEC + + v|verbose flag option (with boolean value true) + d|dir: option require a value (MUST require) + d|dir+ option with multiple values. + d|dir? option with optional value + dir:=string option with type constraint of string + dir:=number option with type constraint of number + dir:=file option with type constraint of file + dir:=date option with type constraint of date + dir:=boolean option with type constraint of boolean + d single character only option + dir long option name + +## Command Line Forms + + app [app-opts] [app arguments] + + app [app-opts] subcommand [subcommand-opts] [subcommand-args] + + app [app-opts] subcmd1 [subcmd-opts1] subcmd2 [subcmd-opts] subcmd3 [subcmd-opts3] [subcommand arguments....] + + +## Documentation + +See more details in the [documentation](https://github.com/c9s/GetOptionKit/wiki) + +## Demo + +Please check `examples/demo.php`. + +Run: + +```sh +% php examples/demo.php -f test -b 123 -b 333 +``` + +Print: + + * Available options: + -f, --foo option requires a value. + -b, --bar + option with multiple value. + -z, --zoo [] option with optional value. + -v, --verbose verbose message. + -d, --debug debug message. + --long long option name only. + -s short option name only. + Enabled options: + * key:foo spec:-f, --foo desc:option requires a value. + value => test + + * key:bar spec:-b, --bar + desc:option with multiple value. + Array + ( + [0] => 123 + [1] => 333 + ) + +## Synopsis + +```php +use GetOptionKit\OptionCollection; +use GetOptionKit\OptionParser; +use GetOptionKit\OptionPrinter\ConsoleOptionPrinter; + +$specs = new OptionCollection; +$specs->add('f|foo:', 'option requires a value.' ) + ->isa('String'); + +$specs->add('b|bar+', 'option with multiple value.' ) + ->isa('Number'); + +$specs->add('ip+', 'Ip constraint' ) + ->isa('Ip'); + +$specs->add('email+', 'Email address constraint' ) + ->isa('Email'); + +$specs->add('z|zoo?', 'option with optional value.' ) + ->isa('Boolean'); + +$specs->add('file:', 'option value should be a file.' ) + ->isa('File'); + +$specs->add('v|verbose', 'verbose message.' ); +$specs->add('d|debug', 'debug message.' ); +$specs->add('long', 'long option name only.' ); +$specs->add('s', 'short option name only.' ); + +$printer = new ConsoleOptionPrinter(); +echo $printer->render($specs); + +$parser = new OptionParser($specs); + +echo "Enabled options: \n"; +try { + $result = $parser->parse( $argv ); + foreach ($result->keys as $key => $spec) { + print_r($spec); + } + + $opt = $result->keys['foo']; // return the option object. + $str = $result->keys['foo']->value; // return the option value + + print_r($opt); + var_dump($str); + +} catch( Exception $e ) { + echo $e->getMessage(); +} +``` + + +## Documentation + +See for more details. + +### Option Value Type + +The option value type help you validate the input, +the following list is the current supported types: + +- `string` +- `number` +- `boolean` +- `file` +- `date` +- `url` +- `email` +- `ip` +- `ipv4` +- `ipv6` +- `regex` + +And here is the related sample code: + +```php +$opt->add( 'f|foo:' , 'with string type value' ) + ->isa('string'); + +$opt->add( 'b|bar+' , 'with number type value' ) + ->isa('number'); + +$opt->add( 'z|zoo?' , 'with boolean type value' ) + ->isa('boolean'); + +$opt->add( 'file:' , 'with file type value' ) + ->isa('file'); + +$opt->add( 'date:' , 'with date type value' ) + ->isa('date'); + +$opt->add( 'url:' , 'with url type value' ) + ->isa('url'); + +$opt->add( 'email:' , 'with email type value' ) + ->isa('email'); + +$opt->add( 'ip:' , 'with ip(v4/v6) type value' ) + ->isa('ip'); + +$opt->add( 'ipv4:' , 'with ipv4 type value' ) + ->isa('ipv4'); + +$opt->add( 'ipv6:' , 'with ipv6 type value' ) + ->isa('ipv6'); + +$specs->add('r|regex:', 'with custom regex type value') + ->isa('Regex', '/^([a-z]+)$/'); +``` + +> Please note that currently only `string`, `number`, `boolean` types can be validated. + +### ContinuousOptionParser + +```php +$specs = new OptionCollection; +$spec_verbose = $specs->add('v|verbose'); +$spec_color = $specs->add('c|color'); +$spec_debug = $specs->add('d|debug'); +$spec_verbose->description = 'verbose flag'; + +// ContinuousOptionParser +$parser = new ContinuousOptionParser( $specs ); +$result = $parser->parse(explode(' ','program -v -d test -a -b -c subcommand -e -f -g subcommand2')); +$result2 = $parser->continueParse(); +``` + +### OptionPrinter + +GetOptionKit\OptionPrinter can print options for you: + + * Available options: + -f, --foo option requires a value. + -b, --bar option with multiple value. + -z, --zoo option with optional value. + -v, --verbose verbose message. + -d, --debug debug message. + --long long option name only. + -s short option name only. + + +## Command-line app with subcommands + +For application with subcommands is designed by following form: + + + [app name] [app opts] + [subcommand1] [subcommand-opts] + [subcommand2] [subcommand-opts] + [subcommand3] [subcommand-opts] + [arguments] + +You can check the `tests/GetOptionKit/ContinuousOptionParserTest.php` unit test file: + +```php +// subcommand stack +$subcommands = array('subcommand1','subcommand2','subcommand3'); + +// different command has its own options +$subcommandSpecs = array( + 'subcommand1' => $cmdspecs, + 'subcommand2' => $cmdspecs, + 'subcommand3' => $cmdspecs, +); + +// for saved options +$subcommandOptions = array(); + +// command arguments +$arguments = array(); + +$argv = explode(' ','program -v -d -c subcommand1 -a -b -c subcommand2 -c subcommand3 arg1 arg2 arg3'); + +// parse application options first +$parser = new ContinuousOptionParser( $appspecs ); +$app_options = $parser->parse( $argv ); +while (! $parser->isEnd()) { + if (@$subcommands[0] && $parser->getCurrentArgument() == $subcommands[0]) { + $parser->advance(); + $subcommand = array_shift( $subcommands ); + $parser->setSpecs( $subcommandSpecs[$subcommand] ); + $subcommandOptions[ $subcommand ] = $parser->continueParse(); + } else { + $arguments[] = $parser->advance(); + } +} +``` + +## Todo + +* Option Spec group. +* option valid value checking. +* custom command mapping. + +## Command Line Utility Design Concept + +* main program name should be easy to type, easy to remember. +* subcommand should be easy to type, easy to remember. length should be shorter than 7 characters. +* options should always have long descriptive name +* a program should be easy to check usage. + +## General command interface + +To list usage of all subcommands or the program itself: + + $ prog help + +To list the subcommand usage + + $ prog help subcommand subcommand2 subcommand3 + +## Hacking + +Fork this repository and clone it: + + $ git clone git://github.com/c9s/GetOptionKit.git + $ cd GetOptionKit + $ composer install + +Run PHPUnit to test: + + $ phpunit + +## License + +This project is released under MIT License. diff --git a/instafeed/vendor/corneltek/getoptionkit/build.xml b/instafeed/vendor/corneltek/getoptionkit/build.xml new file mode 100755 index 0000000..f53f06d --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/build.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/instafeed/vendor/corneltek/getoptionkit/composer.json b/instafeed/vendor/corneltek/getoptionkit/composer.json new file mode 100755 index 0000000..e6577d5 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/composer.json @@ -0,0 +1,16 @@ +{ + "name": "corneltek/getoptionkit", + "homepage": "http://github.com/c9s/GetOptionKit", + "description": "Powerful command-line option toolkit", + "require": { + "php": ">=5.3.0" + }, + "license": "MIT", + "authors": [ { "name": "Yo-An Lin", "email": "yoanlin93@gmail.com" } ], + "autoload": { + "psr-4": { + "GetOptionKit\\": "src/" + } + }, + "extra": { "branch-alias": { "dev-master": "2.6.x-dev" } } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/composer.lock b/instafeed/vendor/corneltek/getoptionkit/composer.lock new file mode 100755 index 0000000..1dd27fe --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/composer.lock @@ -0,0 +1,19 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "content-hash": "5a9b6e9fccaf89d121650d35313e842b", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.3.0" + }, + "platform-dev": [] +} diff --git a/instafeed/vendor/corneltek/getoptionkit/examples/demo.php b/instafeed/vendor/corneltek/getoptionkit/examples/demo.php new file mode 100755 index 0000000..905f5c3 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/examples/demo.php @@ -0,0 +1,76 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +require 'vendor/autoload.php'; + +use GetOptionKit\OptionCollection; +use GetOptionKit\OptionParser; +use GetOptionKit\OptionPrinter\ConsoleOptionPrinter; + +$specs = new OptionCollection; +$specs->add('f|foo:', 'option requires a value.' ) + ->isa('String'); + +$specs->add('b|bar+', 'option with multiple value.' ) + ->isa('Number'); + +$specs->add('z|zoo?', 'option with optional value.' ) + ->isa('Boolean') + ; + +$specs->add('o|output?', 'option with optional value.' ) + ->isa('File') + ->defaultValue('output.txt') + ; + +// works for -vvv => verbose = 3 +$specs->add('v|verbose', 'verbose') + ->isa('Number') + ->incremental(); + +$specs->add('file:', 'option value should be a file.' ) + ->trigger(function($value) { + echo "Set value to :"; + var_dump($value); + }) + ->isa('File'); + +$specs->add('r|regex:', 'with custom regex type value') + ->isa('Regex', '/^([a-z]+)$/'); + +$specs->add('d|debug', 'debug message.' ); +$specs->add('long', 'long option name only.' ); +$specs->add('s', 'short option name only.' ); +$specs->add('m', 'short option m'); +$specs->add('4', 'short option with digit'); + +$printer = new ConsoleOptionPrinter; +echo $printer->render($specs); + +$parser = new OptionParser($specs); + +echo "Enabled options: \n"; +try { + $result = $parser->parse( $argv ); + foreach ($result->keys as $key => $spec) { + print_r($spec); + } + + $opt = $result->keys['foo']; // return the option object. + $str = $result->keys['foo']->value; // return the option value + + print_r($opt); + var_dump($str); + +} catch( Exception $e ) { + echo $e->getMessage(); +} + diff --git a/instafeed/vendor/corneltek/getoptionkit/package.ini b/instafeed/vendor/corneltek/getoptionkit/package.ini new file mode 100755 index 0000000..4d71095 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/package.ini @@ -0,0 +1,15 @@ +[package] +name = GetOptionKit +version = 1.2.2 +desc = "A powerful GetOpt toolkit for PHP, which supports type constraints, flag, +multiple flag, multiple values, required value checking." + +author = "Yo-An Lin (c9s) " +channel = pear.corneltek.com +stability = stable + +[require] +php = 5.3 +pearinstaller = 1.4.1 +pear.corneltek.com/Universal = +pear.corneltek.com/PHPUnit_TestMore = diff --git a/instafeed/vendor/corneltek/getoptionkit/phpdox.xml b/instafeed/vendor/corneltek/getoptionkit/phpdox.xml new file mode 100755 index 0000000..c727483 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/phpdox.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/instafeed/vendor/corneltek/getoptionkit/phprelease.ini b/instafeed/vendor/corneltek/getoptionkit/phprelease.ini new file mode 100755 index 0000000..a5c5cc9 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/phprelease.ini @@ -0,0 +1,2 @@ +Steps = PHPUnit, BumpVersion, GitCommit, GitTag, GitPush, GitPushTags +; VersionFrom = src/PHPRelease/Console.php \ No newline at end of file diff --git a/instafeed/vendor/corneltek/getoptionkit/phpunit-ci.xml b/instafeed/vendor/corneltek/getoptionkit/phpunit-ci.xml new file mode 100755 index 0000000..0fed2fa --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/phpunit-ci.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + tests + + + + + + + + + diff --git a/instafeed/vendor/corneltek/getoptionkit/phpunit.xml.dist b/instafeed/vendor/corneltek/getoptionkit/phpunit.xml.dist new file mode 100755 index 0000000..87bb483 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/phpunit.xml.dist @@ -0,0 +1,29 @@ + + + + + + src + + + + + + tests + + + + + + + + + + + diff --git a/instafeed/vendor/corneltek/getoptionkit/src/Argument.php b/instafeed/vendor/corneltek/getoptionkit/src/Argument.php new file mode 100755 index 0000000..2a92717 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/Argument.php @@ -0,0 +1,119 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit; + +class Argument +{ + public $arg; + + public function __construct($arg) + { + $this->arg = $arg; + } + + public function isLongOption() + { + return substr($this->arg, 0, 2) === '--'; + } + + public function isShortOption() + { + return (substr($this->arg, 0, 1) === '-') + && (substr($this->arg, 1, 1) !== '-'); + } + + public function isEmpty() + { + return $this->arg === null || empty($this->arg) && ('0' !== $this->arg); + } + + /** + * Check if an option is one of the option in the collection. + */ + public function anyOfOptions(OptionCollection $options) + { + $name = $this->getOptionName(); + $keys = $options->keys(); + + return in_array($name, $keys); + } + + /** + * Check current argument is an option by the preceding dash. + * note this method does not work for string with negative value. + * + * -a + * --foo + */ + public function isOption() + { + return $this->isShortOption() || $this->isLongOption(); + } + + /** + * Parse option and return the name after dash. e.g., + * '--foo' returns 'foo' + * '-f' returns 'f'. + * + * @return string + */ + public function getOptionName() + { + if (preg_match('/^[-]+([a-zA-Z0-9-]+)/', $this->arg, $regs)) { + return $regs[1]; + } + } + + public function splitAsOption() + { + return explode('=', $this->arg, 2); + } + + public function containsOptionValue() + { + return preg_match('/=.+/', $this->arg); + } + + public function getOptionValue() + { + if (preg_match('/=(.+)/', $this->arg, $regs)) { + return $regs[1]; + } + + return; + } + + /** + * Check combined short flags for "-abc" or "-vvv". + * + * like: -abc + */ + public function withExtraFlagOptions() + { + return preg_match('/^-[a-zA-Z0-9]{2,}/', $this->arg); + } + + public function extractExtraFlagOptions() + { + $args = array(); + for ($i = 2;$i < strlen($this->arg); ++$i) { + $args[] = '-'.$this->arg[$i]; + } + $this->arg = substr($this->arg, 0, 2); # -[a-z] + return $args; + } + + public function __toString() + { + return $this->arg; + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/ContinuousOptionParser.php b/instafeed/vendor/corneltek/getoptionkit/src/ContinuousOptionParser.php new file mode 100755 index 0000000..fa592fd --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/ContinuousOptionParser.php @@ -0,0 +1,201 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit; + +use Exception; +use LogicException; +use GetOptionKit\Exception\InvalidOptionException; +use GetOptionKit\Exception\RequireValueException; + +/** + * A common command line argument format:. + * + * app.php + * [--app-options] + * + * [subcommand + * --subcommand-options] + * [subcommand + * --subcommand-options] + * [subcommand + * --subcommand-options] + * + * [arguments] + * + * ContinuousOptionParser is for the process flow: + * + * init app options, + * parse app options + * + * + * + * while not end + * if stop at command + * shift command + * parse command options + * else if stop at arguments + * shift arguments + * execute current command with the arguments. + * + * Example code: + * + * + * // subcommand stack + * $subcommands = array('subcommand1','subcommand2','subcommand3'); + * + * // different command has its own options + * $subcommand_specs = array( + * 'subcommand1' => $cmdspecs, + * 'subcommand2' => $cmdspecs, + * 'subcommand3' => $cmdspecs, + * ); + * + * // for saved options + * $subcommand_options = array(); + * + * // command arguments + * $arguments = array(); + * + * $argv = explode(' ','-v -d -c subcommand1 -a -b -c subcommand2 -c subcommand3 arg1 arg2 arg3'); + * + * // parse application options first + * $parser = new ContinuousOptionParser( $appspecs ); + * $app_options = $parser->parse( $argv ); + * while (! $parser->isEnd()) { + * if( $parser->getCurrentArgument() == $subcommands[0] ) { + * $parser->advance(); + * $subcommand = array_shift( $subcommands ); + * $parser->setSpecs( $subcommand_specs[$subcommand] ); + * $subcommand_options[ $subcommand ] = $parser->continueParse(); + * } else { + * $arguments[] = $parser->advance(); + * } + * } + **/ +class ContinuousOptionParser extends OptionParser +{ + public $index; + public $length; + public $argv; + + /* for the constructor , the option specs is application options */ + public function __construct(OptionCollection $specs) + { + parent::__construct($specs); + $this->index = 1; + } + + /** + * @codeCoverageIgnore + */ + public function startFrom($index) + { + $this->index = $index; + } + + public function isEnd() + { + # echo "!! {$this->index} >= {$this->length}\n"; + return $this->index >= $this->length; + } + + /** + * Return the current argument and advance to the next position. + * + * @return string + */ + public function advance() + { + if ($this->index >= $this->length) { + throw new LogicException("Argument index out of bounds."); + } + return $this->argv[$this->index++]; + } + + /** + * Return the current argument that the index pointed to. + * + * @return string + */ + public function getCurrentArgument() + { + return $this->argv[$this->index]; + } + + public function continueParse() + { + return $this->parse($this->argv); + } + + + protected function fillDefaultValues(OptionCollection $opts, OptionResult $result) + { + // register option result from options with default value + foreach ($opts as $opt) { + if ($opt->value === null && $opt->defaultValue !== null) { + $opt->setValue($opt->getDefaultValue()); + $result->set($opt->getId(), $opt); + } + } + } + + + public function parse(array $argv) + { + // create new Result object. + $result = new OptionResult(); + list($this->argv, $extra) = $this->preprocessingArguments($argv); + $this->length = count($this->argv); + + // from last parse index + for (; $this->index < $this->length; ++$this->index) { + $arg = new Argument($this->argv[$this->index]); + + /* let the application decide for: command or arguments */ + if (!$arg->isOption()) { + # echo "stop at {$this->index}\n"; + $this->fillDefaultValues($this->specs, $result); + return $result; + } + + // if the option is with extra flags, + // split it out, and insert into the argv array + // + // like -abc + if ($arg->withExtraFlagOptions()) { + $extra = $arg->extractExtraFlagOptions(); + array_splice($this->argv, $this->index + 1, 0, $extra); + $this->argv[$this->index] = $arg->arg; // update argument to current argv list. + $this->length = count($this->argv); // update argv list length + } + + $next = null; + if ($this->index + 1 < count($this->argv)) { + $next = new Argument($this->argv[$this->index + 1]); + } + + $spec = $this->specs->get($arg->getOptionName()); + if (!$spec) { + throw new InvalidOptionException('Invalid option: '.$arg); + } + + // This if block is unnecessary + // if ($spec->isRequired() || $spec->isMultiple() || $spec->isOptional() || $spec->isFlag()) { + $this->index += $this->consumeOptionToken($spec, $arg, $next); + $result->set($spec->getId(), $spec); + } + + $this->fillDefaultValues($this->specs, $result); + + return $result; + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/Exception/InvalidOptionException.php b/instafeed/vendor/corneltek/getoptionkit/src/Exception/InvalidOptionException.php new file mode 100755 index 0000000..dea01de --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/Exception/InvalidOptionException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit\Exception; + +use Exception; + +class InvalidOptionException extends Exception +{ +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/Exception/InvalidOptionValueException.php b/instafeed/vendor/corneltek/getoptionkit/src/Exception/InvalidOptionValueException.php new file mode 100755 index 0000000..fa4b163 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/Exception/InvalidOptionValueException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit\Exception; + +use Exception; + +class InvalidOptionValueException extends Exception +{ +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/Exception/NonNumericException.php b/instafeed/vendor/corneltek/getoptionkit/src/Exception/NonNumericException.php new file mode 100755 index 0000000..757d214 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/Exception/NonNumericException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit\Exception; + +use Exception; + +class NonNumericException extends Exception +{ +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/Exception/OptionConflictException.php b/instafeed/vendor/corneltek/getoptionkit/src/Exception/OptionConflictException.php new file mode 100755 index 0000000..6a3c9e1 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/Exception/OptionConflictException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit\Exception; + +use Exception; + +class OptionConflictException extends Exception +{ +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/Exception/RequireValueException.php b/instafeed/vendor/corneltek/getoptionkit/src/Exception/RequireValueException.php new file mode 100755 index 0000000..c9e69ef --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/Exception/RequireValueException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit\Exception; + +use Exception; + +class RequireValueException extends Exception +{ +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/Option.php b/instafeed/vendor/corneltek/getoptionkit/src/Option.php new file mode 100755 index 0000000..f11a93a --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/Option.php @@ -0,0 +1,557 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit; + + +use Exception; +use LogicException; +use InvalidArgumentException; +use GetOptionKit\Exception\InvalidOptionValueException; + +class Option +{ + public $short; + + public $long; + + /** + * @var string the description of this option + */ + public $desc; + + /** + * @var string The option key + */ + public $key; /* key to store values */ + + public $value; + + public $type; + + public $valueName; /* name for the value place holder, for printing */ + + public $isa; + + public $isaOption; + + public $validValues; + + public $suggestions; + + public $defaultValue; + + public $incremental = false; + + /** + * @var Closure The filter closure of the option value. + */ + public $filter; + + public $validator; + + public $multiple = false; + + public $optional = false; + + public $required = false; + + public $flag = false; + + /** + * @var callable trigger callback after value is set. + */ + protected $trigger; + + public function __construct($spec) + { + $this->initFromSpecString($spec); + } + + /** + * Build spec attributes from spec string. + * + * @param string $specString + */ + protected function initFromSpecString($specString) + { + $pattern = '/ + ( + (?:[a-zA-Z0-9-]+) + (?: + \| + (?:[a-zA-Z0-9-]+) + )? + ) + + # option attribute operators + ([:+?])? + + # value types + (?:=(boolean|string|number|date|file|dir|url|email|ip|ipv6|ipv4))? + /x'; + $ret = preg_match($pattern, $specString, $regs); + if ($ret === false || $ret === 0) { + throw new Exception('Incorrect spec string'); + } + + $orig = $regs[0]; + $name = $regs[1]; + $attributes = isset($regs[2]) ? $regs[2] : null; + $type = isset($regs[3]) ? $regs[3] : null; + + $short = null; + $long = null; + + // check long,short option name. + if (strpos($name, '|') !== false) { + list($short, $long) = explode('|', $name); + } else if (strlen($name) === 1) { + $short = $name; + } else if (strlen($name) > 1) { + $long = $name; + } + + $this->short = $short; + $this->long = $long; + + // option is required. + if (strpos($attributes, ':') !== false) { + $this->required(); + } else if (strpos($attributes, '+') !== false) { + // option with multiple value + $this->multiple(); + } else if (strpos($attributes, '?') !== false) { + // option is optional.(zero or one value) + $this->optional(); + } else { + $this->flag(); + } + if ($type) { + $this->isa($type); + } + } + + /* + * get the option key for result key mapping. + */ + public function getId() + { + return $this->key ?: $this->long ?: $this->short; + } + + /** + * To make -v, -vv, -vvv works. + */ + public function incremental() + { + $this->incremental = true; + + return $this; + } + + public function required() + { + $this->required = true; + + return $this; + } + + /** + * Set default value + * + * @param mixed|Closure $value + */ + public function defaultValue($value) + { + $this->defaultValue = $value; + + return $this; + } + + public function multiple() + { + $this->multiple = true; + $this->value = array(); # for value pushing + return $this; + } + + public function optional() + { + $this->optional = true; + + return $this; + } + + public function flag() + { + $this->flag = true; + + return $this; + } + + public function trigger(callable $trigger) + { + $this->trigger = $trigger; + + return $this; + } + + public function isIncremental() + { + return $this->incremental; + } + + public function isFlag() + { + return $this->flag; + } + + public function isMultiple() + { + return $this->multiple; + } + + public function isRequired() + { + return $this->required; + } + + public function isOptional() + { + return $this->optional; + } + + public function isTypeNumber() + { + return $this->isa == 'number'; + } + + public function isType($type) + { + return $this->isa === $type; + } + + public function getTypeClass() + { + $class = 'GetOptionKit\\ValueType\\'.ucfirst($this->isa).'Type'; + if (class_exists($class, true)) { + return new $class($this->isaOption); + } + throw new Exception("Type class '$class' not found."); + } + + public function testValue($value) + { + $type = $this->getTypeClass(); + return $type->test($value); + } + + protected function _preprocessValue($value) + { + $val = $value; + + if ($isa = ucfirst($this->isa)) { + $type = $this->getTypeClass(); + if ($type->test($value)) { + $val = $type->parse($value); + } else { + if (strtolower($isa) === 'regex') { + $isa .= '('.$this->isaOption.')'; + } + throw new InvalidOptionValueException("Invalid value for {$this->renderReadableSpec(false)}. Requires a type $isa."); + } + } + + // check pre-filter for option value + if ($this->filter) { + $val = call_user_func($this->filter, $val); + } + + // check validValues + if ($validValues = $this->getValidValues()) { + if (!in_array($value, $validValues)) { + throw new InvalidOptionValueException('valid values are: '.implode(', ', $validValues)); + } + } + + if (!$this->validate($value)[0]) { + throw new InvalidOptionValueException('option is invalid'); + } + + return $val; + } + + protected function callTrigger() + { + if ($this->trigger) { + if ($ret = call_user_func($this->trigger, $this->value)) { + $this->value = $ret; + } + } + } + + /* + * set option value + */ + public function setValue($value) + { + $this->value = $this->_preprocessValue($value); + $this->callTrigger(); + } + + /** + * This method is for incremental option. + */ + public function increaseValue() + { + if (!$this->value) { + $this->value = 1; + } else { + ++$this->value; + } + $this->callTrigger(); + } + + /** + * push option value, when the option accept multiple values. + * + * @param mixed + */ + public function pushValue($value) + { + $value = $this->_preprocessValue($value); + $this->value[] = $value; + $this->callTrigger(); + } + + public function desc($desc) + { + $this->desc = $desc; + } + + /** + * valueName is for option value hinting:. + * + * --name= + */ + public function valueName($name) + { + $this->valueName = $name; + + return $this; + } + + public function renderValueHint() + { + $n = null; + if ($this->valueName) { + $n = $this->valueName; + } else if ($values = $this->getValidValues()) { + $n = '('.implode(',', $values).')'; + } else if ($values = $this->getSuggestions()) { + $n = '['.implode(',', $values).']'; + } else if ($val = $this->getDefaultValue()) { + // This allows for `0` and `false` values to be displayed also. + if ((is_scalar($val) && strlen((string) $val)) || is_bool($val)) { + if (is_bool($val)) { + $n = ($val ? 'true' : 'false'); + } else { + $n = $val; + } + } + } + + if (!$n && $this->isa !== null) { + $n = '<'.$this->isa.'>'; + } + if ($this->isRequired()) { + return sprintf('=%s', $n); + } else if ($this->isOptional() || $this->defaultValue) { + return sprintf('[=%s]', $n); + } else if ($n) { + return '='.$n; + } + + return ''; + } + + public function getDefaultValue() + { + if (is_callable($this->defaultValue)) { + return $this->defaultValue; + } + + return $this->defaultValue; + } + + public function getValue() + { + if (null !== $this->value) { + if (is_callable($this->value)) { + return call_user_func($this->value); + } + return $this->value; + } + + return $this->getDefaultValue(); + } + + /** + * get readable spec for printing. + * + * @param string $renderHint render also value hint + */ + public function renderReadableSpec($renderHint = true) + { + $c1 = ''; + if ($this->short && $this->long) { + $c1 = sprintf('-%s, --%s', $this->short, $this->long); + } else if ($this->short) { + $c1 = sprintf('-%s', $this->short); + } else if ($this->long) { + $c1 = sprintf('--%s', $this->long); + } + if ($renderHint) { + return $c1.$this->renderValueHint(); + } + + return $c1; + } + + public function __toString() + { + $c1 = $this->renderReadableSpec(); + $return = ''; + $return .= sprintf('* key:%-8s spec:%s desc:%s', $this->getId(), $c1, $this->desc)."\n"; + $val = $this->getValue(); + if (is_array($val)) { + $return .= ' value => ' . join(',', array_map(function($v) { return var_export($v, true); }, $val))."\n"; + } else { + $return .= sprintf(' value => %s', $val)."\n"; + } + + return $return; + } + + /** + * Value Type Setters. + * + * @param string $type the value type, valid values are 'number', 'string', + * 'file', 'boolean', you can also use your own value type name. + * @param mixed $option option(s) for value type class (optionnal) + */ + public function isa($type, $option = null) + { + // "bool" was kept for backward compatibility + if ($type === 'bool') { + $type = 'boolean'; + } + $this->isa = $type; + $this->isaOption = $option; + + return $this; + } + + /** + * Assign validValues to member value. + */ + public function validValues($values) + { + $this->validValues = $values; + + return $this; + } + + /** + * Assign suggestions. + * + * @param Closure|array + */ + public function suggestions($suggestions) + { + $this->suggestions = $suggestions; + + return $this; + } + + /** + * Return valud values array. + * + * @return string[] or nil + */ + public function getValidValues() + { + if ($this->validValues) { + if (is_callable($this->validValues)) { + return call_user_func($this->validValues); + } + + return $this->validValues; + } + + return; + } + + /** + * Return suggestions. + * + * @return string[] or nil + */ + public function getSuggestions() + { + if ($this->suggestions) { + if (is_callable($this->suggestions)) { + return call_user_func($this->suggestions); + } + + return $this->suggestions; + } + + return; + } + + public function validate($value) + { + if ($this->validator) { + $ret = call_user_func($this->validator, $value); + if (is_array($ret)) { + return $ret; + } else if ($ret === false) { + return array(false, "Invalid value: $value"); + } else if ($ret === true) { + return array(true, 'Successfully validated.'); + } + throw new InvalidArgumentException('Invalid return value from the validator.'); + } + + return array(true); + } + + public function validator($cb) + { + $this->validator = $cb; + + return $this; + } + + /** + * Set up a filter function for the option value. + * + * todo: add "callable" type hint later. + */ + public function filter($cb) + { + $this->filter = $cb; + + return $this; + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/OptionCollection.php b/instafeed/vendor/corneltek/getoptionkit/src/OptionCollection.php new file mode 100755 index 0000000..22cb638 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/OptionCollection.php @@ -0,0 +1,207 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit; + + +use ArrayIterator; +use IteratorAggregate; +use Countable; +use Exception; +use LogicException; +use GetOptionKit\Exception\OptionConflictException; + +class OptionCollection + implements IteratorAggregate, Countable +{ + public $data = array(); + + /** + * @var Option[string] + * + * read-only property + */ + public $longOptions = array(); + + /** + * @var Option[string] + * + * read-only property + */ + public $shortOptions = array(); + + /** + * @var Option[] + * + * read-only property + */ + public $options = array(); + + public function __construct() + { + $this->data = array(); + } + + public function __clone() + { + foreach ($this->data as $k => $v) { + $this->data[ $k ] = clone $v; + } + foreach ($this->longOptions as $k => $v) { + $this->longOptions[ $k ] = clone $v; + } + foreach ($this->shortOptions as $k => $v) { + $this->shortOptions[ $k ] = clone $v; + } + foreach ($this->options as $k => $v) { + $this->options[ $k ] = clone $v; + } + } + + /** + * add( [spec string], [desc string] ). + * + * add( [option object] ) + */ + public function add() + { + $num = func_num_args(); + $args = func_get_args(); + $first = $args[0]; + + if ($first instanceof Option) { + + $this->addOption($first); + + } else if (is_string($first)) { + + $specString = $args[0]; + $desc = isset($args[1]) ? $args[1] : null; + $key = isset($args[2]) ? $args[2] : null; + + // parse spec string + $spec = new Option($specString); + if ($desc) { + $spec->desc($desc); + } + if ($key) { + $spec->key = $key; + } + $this->addOption($spec); + return $spec; + + } else { + + throw new LogicException('Unknown Spec Type'); + + } + } + + /** + * Add option object. + * + * @param object $spec the option object. + */ + public function addOption(Option $spec) + { + $this->data[$spec->getId()] = $spec; + if ($spec->long) { + if (isset($this->longOptions[$spec->long])) { + throw new OptionConflictException('Option conflict: --'.$spec->long.' is already defined.'); + } + $this->longOptions[$spec->long] = $spec; + } + if ($spec->short) { + if (isset($this->shortOptions[$spec->short])) { + throw new OptionConflictException('Option conflict: -'.$spec->short.' is already defined.'); + } + $this->shortOptions[$spec->short] = $spec; + } + $this->options[] = $spec; + if (!$spec->long && !$spec->short) { + throw new Exception('Neither long option name nor short name is not given.'); + } + } + + public function getLongOption($name) + { + return isset($this->longOptions[ $name ]) ? $this->longOptions[ $name ] : null; + } + + public function getShortOption($name) + { + return isset($this->shortOptions[ $name ]) ? $this->shortOptions[ $name ] : null; + } + + /* Get spec by spec id */ + public function get($id) + { + if (isset($this->data[$id])) { + return $this->data[$id]; + } else if (isset($this->longOptions[$id])) { + return $this->longOptions[$id]; + } else if (isset($this->shortOptions[$id])) { + return $this->shortOptions[$id]; + } + } + + public function find($name) + { + foreach ($this->options as $option) { + if ($option->short === $name || $option->long === $name) { + return $option; + } + } + } + + public function size() + { + return count($this->data); + } + + public function all() + { + return $this->data; + } + + public function toArray() + { + $array = array(); + foreach ($this->data as $k => $spec) { + $item = array(); + if ($spec->long) { + $item['long'] = $spec->long; + } + if ($spec->short) { + $item['short'] = $spec->short; + } + $item['desc'] = $spec->desc; + $array[] = $item; + } + + return $array; + } + + public function keys() + { + return array_merge(array_keys($this->longOptions), array_keys($this->shortOptions)); + } + + public function count() + { + return count($this->data); + } + + public function getIterator() + { + return new ArrayIterator($this->data); + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/OptionParser.php b/instafeed/vendor/corneltek/getoptionkit/src/OptionParser.php new file mode 100755 index 0000000..da9cba5 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/OptionParser.php @@ -0,0 +1,193 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit; + +use Exception; +use GetOptionKit\Exception\InvalidOptionException; +use GetOptionKit\Exception\RequireValueException; + +class OptionParser +{ + public $specs; + public $longOptions; + public $shortOptions; + + public function __construct(OptionCollection $specs) + { + $this->specs = $specs; + } + + public function setSpecs(OptionCollection $specs) + { + $this->specs = $specs; + } + + /** + * consume option value from current argument or from the next argument + * + * @return boolean next token consumed? + */ + protected function consumeOptionToken(Option $spec, $arg, $next, & $success = false) + { + // Check options doesn't require next token before + // all options that require values. + if ($spec->isFlag()) { + + if ($spec->isIncremental()) { + $spec->increaseValue(); + } else { + $spec->setValue(true); + } + return 0; + + } else if ($spec->isRequired()) { + + if ($next && !$next->isEmpty() && !$next->anyOfOptions($this->specs)) { + $spec->setValue($next->arg); + return 1; + } else { + throw new RequireValueException("Option '{$arg->getOptionName()}' requires a value."); + } + + } else if ($spec->isMultiple()) { + + if ($next && !$next->isEmpty() && !$next->anyOfOptions($this->specs)) { + $this->pushOptionValue($spec, $arg, $next); + return 1; + } + + } else if ($spec->isOptional() && $next && !$next->isEmpty() && !$next->anyOfOptions($this->specs)) { + + $spec->setValue($next->arg); + return 1; + + } + return 0; + } + + /* + * push value to multipl value option + */ + protected function pushOptionValue(Option $spec, $arg, $next) + { + if ($next && !$next->anyOfOptions($this->specs)) { + $spec->pushValue($next->arg); + } + } + + /** + * preprocess the argv array + * + * - split option and option value + * - separate arguments after "--" + */ + protected function preprocessingArguments(array $argv) + { + // preprocessing arguments + $newArgv = array(); + $extra = array(); + $afterDash = false; + foreach ($argv as $arg) { + if ($arg === '--') { + $afterDash = true; + continue; + } + if ($afterDash) { + $extra[] = $arg; + continue; + } + + $a = new Argument($arg); + if ($a->anyOfOptions($this->specs) && $a->containsOptionValue()) { + list($opt, $val) = $a->splitAsOption(); + array_push($newArgv, $opt, $val); + } else { + $newArgv[] = $arg; + } + } + return array($newArgv, $extra); + } + + protected function fillDefaultValues(OptionCollection $opts, OptionResult $result) + { + // register option result from options with default value + foreach ($opts as $opt) { + if ($opt->value === null && $opt->defaultValue !== null) { + $opt->setValue($opt->getDefaultValue()); + $result->set($opt->getId(), $opt); + } + } + } + + /** + * @param array $argv + * + * @return OptionResult|Option[] + * + * @throws Exception\RequireValueException + * @throws Exception\InvalidOptionException + * @throws \Exception + */ + public function parse(array $argv) + { + $result = new OptionResult(); + + list($argv, $extra) = $this->preprocessingArguments($argv); + + $len = count($argv); + + // some people might still pass only the option names here. + $first = new Argument($argv[0]); + if ($first->isOption()) { + throw new Exception('parse(argv) expects the first argument to be the program name.'); + } + + for ($i = 1; $i < $len; ++$i) { + $arg = new Argument($argv[$i]); + + // if looks like not an option, push it to argument list. + // TODO: we might want to support argument with preceding dash (?) + if (!$arg->isOption()) { + $result->addArgument($arg); + continue; + } + + // if the option is with extra flags, + // split the string, and insert into the argv array + if ($arg->withExtraFlagOptions()) { + $extra = $arg->extractExtraFlagOptions(); + array_splice($argv, $i + 1, 0, $extra); + $argv[$i] = $arg->arg; // update argument to current argv list. + $len = count($argv); // update argv list length + } + + $next = null; + if ($i + 1 < count($argv)) { + $next = new Argument($argv[$i + 1]); + } + + $spec = $this->specs->get($arg->getOptionName()); + if (!$spec) { + throw new InvalidOptionException('Invalid option: '.$arg); + } + + // This if expr might be unnecessary, becase we have default mode - flag + // if ($spec->isRequired() || $spec->isMultiple() || $spec->isOptional() || $spec->isFlag()) { + $i += $this->consumeOptionToken($spec, $arg, $next); + $result->set($spec->getId(), $spec); + } + + $this->fillDefaultValues($this->specs, $result); + + return $result; + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/OptionPrinter/ConsoleOptionPrinter.php b/instafeed/vendor/corneltek/getoptionkit/src/OptionPrinter/ConsoleOptionPrinter.php new file mode 100755 index 0000000..dba0a50 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/OptionPrinter/ConsoleOptionPrinter.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace GetOptionKit\OptionPrinter; + +use GetOptionKit\OptionCollection; +use GetOptionKit\Option; + +class ConsoleOptionPrinter implements OptionPrinter +{ + public $screenWidth = 78; + + /** + * Render readable spec. + */ + public function renderOption(Option $opt) + { + $c1 = ''; + if ($opt->short && $opt->long) { + $c1 = sprintf('-%s, --%s', $opt->short, $opt->long); + } else if ($opt->short) { + $c1 = sprintf('-%s', $opt->short); + } else if ($opt->long) { + $c1 = sprintf('--%s', $opt->long); + } + $c1 .= $opt->renderValueHint(); + + return $c1; + } + + /** + * render option descriptions. + * + * @return string output + */ + public function render(OptionCollection $options) + { + # echo "* Available options:\n"; + $lines = array(); + foreach ($options as $option) { + $c1 = $this->renderOption($option); + $lines[] = "\t".$c1; + $lines[] = wordwrap("\t\t".$option->desc, $this->screenWidth, "\n\t\t"); # wrap text + $lines[] = ''; + } + + return implode("\n", $lines); + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/OptionPrinter/OptionPrinter.php b/instafeed/vendor/corneltek/getoptionkit/src/OptionPrinter/OptionPrinter.php new file mode 100755 index 0000000..4ed0c70 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/OptionPrinter/OptionPrinter.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit; + +use ArrayIterator; +use ArrayAccess; +use IteratorAggregate; +use Countable; + +/** + * Define the getopt parsing result. + * + * create option result from array() + * + * OptionResult::create($spec, array( + * 'key' => 'value' + * ), array( ... arguments ... ) ); + */ +class OptionResult + implements IteratorAggregate, ArrayAccess, Countable +{ + /** + * @var array option specs, key => Option object + * */ + public $keys = array(); + + private $currentKey; + + /* arguments */ + public $arguments = array(); + + public function getIterator() + { + return new ArrayIterator($this->keys); + } + + public function count() + { + return count($this->keys); + } + + public function merge(OptionResult $a) + { + $this->keys = array_merge($this->keys, $a->keys); + $this->arguments = array_merge($this->arguments, $a->arguments); + } + + public function __isset($key) + { + return isset($this->keys[$key]); + } + + public function __get($key) + { + return $this->get($key); + } + + public function get($key) + { + if (isset($this->keys[$key])) { + return $this->keys[$key]->getValue(); + } + + // verifying if we got a camelCased key: http://stackoverflow.com/a/7599674/102960 + // get $options->baseDir as $option->{'base-dir'} + $parts = preg_split('/(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/', $key); + if (sizeof($parts) > 1) { + $key = implode('-', array_map('strtolower', $parts)); + } + if (isset($this->keys[$key])) { + return $this->keys[$key]->getValue(); + } + } + + public function __set($key, $value) + { + $this->keys[ $key ] = $value; + } + + public function has($key) + { + return isset($this->keys[ $key ]); + } + + public function set($key, Option $value) + { + $this->keys[ $key ] = $value; + } + + public function addArgument(Argument $arg) + { + $this->arguments[] = $arg; + } + + public function getArguments() + { + return array_map(function ($e) { return $e->__toString(); }, $this->arguments); + } + + public function offsetSet($name, $value) + { + $this->keys[ $name ] = $value; + } + + public function offsetExists($name) + { + return isset($this->keys[ $name ]); + } + + public function offsetGet($name) + { + return $this->keys[ $name ]; + } + + public function offsetUnset($name) + { + unset($this->keys[$name]); + } + + public function toArray() + { + $array = array(); + foreach ($this->keys as $key => $option) { + $array[ $key ] = $option->getValue(); + } + + return $array; + } + + public static function create($specs, array $values = array(), array $arguments = null) + { + $new = new self(); + foreach ($specs as $spec) { + $id = $spec->getId(); + if (isset($values[$id])) { + $new->$id = $spec; + $spec->setValue($values[$id]); + } + if ($arguments) { + foreach ($arguments as $arg) { + $new->addArgument(new Argument($arg)); + } + } + } + + return $new; + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/ValueType/BaseType.php b/instafeed/vendor/corneltek/getoptionkit/src/ValueType/BaseType.php new file mode 100755 index 0000000..98477bf --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/ValueType/BaseType.php @@ -0,0 +1,34 @@ +option = $option; + } + } + + /** + * Test a value to see if it fit the type. + * + * @param mixed $value + */ + abstract public function test($value); + + /** + * Parse a string value into it's type value. + * + * @param mixed $value + */ + abstract public function parse($value); +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/ValueType/BoolType.php b/instafeed/vendor/corneltek/getoptionkit/src/ValueType/BoolType.php new file mode 100755 index 0000000..e2922d8 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/ValueType/BoolType.php @@ -0,0 +1,10 @@ + DateTime::ATOM, + ); + + public function test($value) + { + return DateTime::createFromFormat($this->option['format'], $value) !== false; + } + + public function parse($value) + { + return DateTime::createFromFormat($this->option['format'], $value); + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/ValueType/DateType.php b/instafeed/vendor/corneltek/getoptionkit/src/ValueType/DateType.php new file mode 100755 index 0000000..d168ef4 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/ValueType/DateType.php @@ -0,0 +1,20 @@ + 0) { + return false; + } + return true; + } + + public function parse($value) + { + return date_parse($value); + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/ValueType/DirType.php b/instafeed/vendor/corneltek/getoptionkit/src/ValueType/DirType.php new file mode 100755 index 0000000..de28279 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/ValueType/DirType.php @@ -0,0 +1,18 @@ +option = $option; + } + + public function test($value) + { + return preg_match($this->option, $value) !== 0; + } + + public function parse($value) + { + preg_match($this->option, $value, $this->matches); + return strval($value); + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/src/ValueType/StringType.php b/instafeed/vendor/corneltek/getoptionkit/src/ValueType/StringType.php new file mode 100755 index 0000000..cf41b7b --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/src/ValueType/StringType.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +use GetOptionKit\Argument; +class ArgumentTest extends \PHPUnit\Framework\TestCase +{ + function test() + { + $arg = new Argument( '--option' ); + $this->assertTrue( $arg->isLongOption() ); + $this->assertFalse( $arg->isShortOption() ); + $this->assertEquals('option' , $arg->getOptionName()); + + $this->assertEquals(null, $arg->getOptionValue()); + } + + function test2() + { + $arg = new Argument('--option=value'); + $this->assertNotNull( $arg->containsOptionValue() ); + $this->assertEquals('value' , $arg->getOptionValue()); + $this->assertEquals('option' , $arg->getOptionName()); + } + + function test3() + { + $arg = new Argument( '-abc' ); + $this->assertNotNull( $arg->withExtraFlagOptions() ); + + $args = $arg->extractExtraFlagOptions(); + $this->assertNotNull( $args ); + $this->assertCount( 2, $args ); + + $this->assertEquals( '-b', $args[0] ); + $this->assertEquals( '-c', $args[1] ); + $this->assertEquals( '-a', $arg->arg); + } + + function testZeroValue() + { + $arg = new Argument( '0' ); + $this->assertFalse( $arg->isShortOption() ); + $this->assertFalse( $arg->isLongOption() ); + $this->assertFalse( $arg->isEmpty() ); + } +} + + diff --git a/instafeed/vendor/corneltek/getoptionkit/tests/ContinuousOptionParserTest.php b/instafeed/vendor/corneltek/getoptionkit/tests/ContinuousOptionParserTest.php new file mode 100755 index 0000000..b1c2ad1 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/tests/ContinuousOptionParserTest.php @@ -0,0 +1,335 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace tests\GetOptionKit; +use GetOptionKit\ContinuousOptionParser; +use GetOptionKit\OptionCollection; + +class ContinuousOptionParserTest extends \PHPUnit\Framework\TestCase +{ + + public function testOptionCollection() + { + $specs = new OptionCollection; + $specVerbose = $specs->add('v|verbose'); + $specColor = $specs->add('c|color'); + $specDebug = $specs->add('d|debug'); + } + + + + public function argumentProvider() + { + return [ + [ + ['program','subcommand1', 'arg1', 'arg2', 'arg3', 'subcommand2', '-b', 1, 'subcommand3', '-b', 2], + [ + 'args' => ['arg1', 'arg2', 'arg3'] + ], + ], + [ + ['program','-v', '-c', 'subcommand1', '--as', 99, 'arg1', 'arg2', 'arg3'], + [ + 'app' => ['verbose' => true ], + 'args' => ['arg1', 'arg2', 'arg3'] + ], + ], + [ + ['program','-v', '-c', 'subcommand1', '--as', 99, 'arg1', 'arg2', 'arg3', '--','zz','xx','vv'], + [ + 'app' => ['verbose' => true], + 'args' => ['arg1', 'arg2', 'arg3'] + ], + ], + ]; + } + + + + /** + * @dataProvider argumentProvider + */ + public function testParseSubCommandOptions($argv, $expected) + { + $appspecs = new OptionCollection; + $appspecs->add('v|verbose'); + $appspecs->add('c|color'); + $appspecs->add('d|debug'); + + $cmdspecs = new OptionCollection; + $cmdspecs->add('as:'); + $cmdspecs->add('b:'); + $cmdspecs->add('c:'); + $cmdspecs->add('def:')->isa('number')->defaultValue(3); + + $parser = new ContinuousOptionParser( $appspecs ); + + $subcommands = array('subcommand1','subcommand2','subcommand3'); + $subcommand_specs = array( + 'subcommand1' => clone $cmdspecs, + 'subcommand2' => clone $cmdspecs, + 'subcommand3' => clone $cmdspecs, + ); + $subcommand_options = array(); + + // $argv = explode(' ','program -v -c subcommand1 --as 99 arg1 arg2 arg3 -- zz xx vv'); + // $argv = explode(' ','program subcommand1 -a 1 subcommand2 -a 2 subcommand3 -a 3 arg1 arg2 arg3'); + $app_options = $parser->parse( $argv ); + $arguments = array(); + while (! $parser->isEnd()) { + if (!empty($subcommands) && $parser->getCurrentArgument() == $subcommands[0]) { + $parser->advance(); + $subcommand = array_shift($subcommands); + $parser->setSpecs($subcommand_specs[$subcommand]); + $subcommand_options[$subcommand] = $parser->continueParse(); + } else { + $arguments[] = $parser->advance(); + } + } + $this->assertSame($expected['args'], $arguments); + if (isset($expected['app'])) { + foreach ($expected['app'] as $k => $v) { + $this->assertEquals($v, $app_options->get($k)); + } + } + + // $this->assertEquals(99, $subcommand_options['subcommand1']->as); + } + + + + public function testParser3() + { + $appspecs = new OptionCollection; + $appspecs->add('v|verbose'); + $appspecs->add('c|color'); + $appspecs->add('d|debug'); + + $cmdspecs = new OptionCollection; + $cmdspecs->add('n|name:=string'); + $cmdspecs->add('p|phone:=string'); + $cmdspecs->add('a|address:=string'); + + + $subcommands = array('subcommand1','subcommand2','subcommand3'); + $subcommand_specs = array( + 'subcommand1' => $cmdspecs, + 'subcommand2' => $cmdspecs, + 'subcommand3' => $cmdspecs, + ); + $subcommand_options = array(); + $arguments = array(); + + $argv = explode(' ','program -v -d -c subcommand1 --name=c9s --phone=123123123 --address=somewhere arg1 arg2 arg3'); + $parser = new ContinuousOptionParser( $appspecs ); + $app_options = $parser->parse( $argv ); + while (! $parser->isEnd()) { + if (@$subcommands[0] && $parser->getCurrentArgument() == $subcommands[0]) { + $parser->advance(); + $subcommand = array_shift( $subcommands ); + $parser->setSpecs( $subcommand_specs[$subcommand] ); + $subcommand_options[ $subcommand ] = $parser->continueParse(); + } else { + $arguments[] = $parser->advance(); + } + } + + $this->assertCount(3, $arguments); + $this->assertEquals('arg1', $arguments[0]); + $this->assertEquals('arg2', $arguments[1]); + $this->assertEquals('arg3', $arguments[2]); + + $this->assertNotNull($subcommand_options['subcommand1']); + $this->assertEquals('c9s', $subcommand_options['subcommand1']->name ); + $this->assertEquals('123123123', $subcommand_options['subcommand1']->phone ); + $this->assertEquals('somewhere', $subcommand_options['subcommand1']->address ); + } + + + /* test parser without options */ + function testParser4() + { + $appspecs = new OptionCollection; + $appspecs->add('v|verbose'); + $appspecs->add('c|color'); + $appspecs->add('d|debug'); + + $cmdspecs = new OptionCollection; + $cmdspecs->add('a:'); // required + $cmdspecs->add('b?'); // optional + $cmdspecs->add('c+'); // multiple (required) + + + + $parser = new ContinuousOptionParser( $appspecs ); + $this->assertNotNull( $parser ); + + $subcommands = array('subcommand1','subcommand2','subcommand3'); + $subcommand_specs = array( + 'subcommand1' => clone $cmdspecs, + 'subcommand2' => clone $cmdspecs, + 'subcommand3' => clone $cmdspecs, + ); + $subcommand_options = array(); + + $argv = explode(' ','program subcommand1 subcommand2 subcommand3 -a a -b b -c c'); + $app_options = $parser->parse( $argv ); + $arguments = array(); + while( ! $parser->isEnd() ) { + if( @$subcommands[0] && $parser->getCurrentArgument() == $subcommands[0] ) { + $parser->advance(); + $subcommand = array_shift( $subcommands ); + $parser->setSpecs( $subcommand_specs[$subcommand] ); + $subcommand_options[ $subcommand ] = $parser->continueParse(); + } else { + $arguments[] = $parser->advance(); + } + } + + $this->assertNotNull( $subcommand_options ); + $this->assertNotNull( $subcommand_options['subcommand1'] ); + $this->assertNotNull( $subcommand_options['subcommand2'] ); + $this->assertNotNull( $subcommand_options['subcommand3'] ); + + $r = $subcommand_options['subcommand3']; + $this->assertNotNull( $r ); + + + + $this->assertNotNull( $r->a , 'option a' ); + $this->assertNotNull( $r->b , 'option b' ); + $this->assertNotNull( $r->c , 'option c' ); + + $this->assertEquals( 'a', $r->a ); + $this->assertEquals( 'b', $r->b ); + $this->assertEquals( 'c', $r->c[0] ); + } + + /* test parser without options */ + function testParser5() + { + $appspecs = new OptionCollection; + $appspecs->add('v|verbose'); + $appspecs->add('c|color'); + $appspecs->add('d|debug'); + + $cmdspecs = new OptionCollection; + $cmdspecs->add('a:'); + $cmdspecs->add('b'); + $cmdspecs->add('c'); + + $parser = new ContinuousOptionParser( $appspecs ); + $this->assertNotNull( $parser ); + + $subcommands = array('subcommand1','subcommand2','subcommand3'); + $subcommand_specs = array( + 'subcommand1' => clone $cmdspecs, + 'subcommand2' => clone $cmdspecs, + 'subcommand3' => clone $cmdspecs, + ); + $subcommand_options = array(); + + $argv = explode(' ','program subcommand1 -a 1 subcommand2 -a 2 subcommand3 -a 3 arg1 arg2 arg3'); + $app_options = $parser->parse( $argv ); + $arguments = array(); + while (! $parser->isEnd()) { + if (!empty($subcommands) && $parser->getCurrentArgument() == $subcommands[0] ) { + $parser->advance(); + $subcommand = array_shift( $subcommands ); + $parser->setSpecs($subcommand_specs[$subcommand]); + $subcommand_options[ $subcommand ] = $parser->continueParse(); + } else { + $arguments[] = $parser->advance(); + } + } + + $this->assertEquals( 'arg1', $arguments[0] ); + $this->assertEquals( 'arg2', $arguments[1] ); + $this->assertEquals( 'arg3', $arguments[2] ); + $this->assertNotNull( $subcommand_options ); + + $this->assertEquals(1, $subcommand_options['subcommand1']->a); + $this->assertNotNull( 2, $subcommand_options['subcommand2']->a ); + $this->assertNotNull( 3, $subcommand_options['subcommand3']->a ); + } + + /** + * @expectedException GetOptionKit\Exception\InvalidOptionException + */ + public function testParseInvalidOptionException() + { + $parser = new ContinuousOptionParser(new OptionCollection); + $parser->parse(array('app','--foo')); + $arguments = array(); + while (!$parser->isEnd()) + { + $arguments[] = $parser->getCurrentArgument(); + $parser->advance(); + } + } + + + + public function testMultipleShortOption() + { + $options = new OptionCollection; + $options->add("a"); + $options->add("b"); + $options->add("c"); + + $parser = new ContinuousOptionParser($options); + + $result = $parser->parse(array('app', '-ab', 'foo', 'bar')); + while (!$parser->isEnd()) + { + $arguments[] = $parser->getCurrentArgument(); + $parser->advance(); + } + + $this->assertTrue($result->keys["a"]->value); + $this->assertTrue($result->keys["b"]->value); + } + + public function testIncrementalValue() + { + $options = new OptionCollection; + $options->add("v|verbose")->incremental(); + $parser = new ContinuousOptionParser($options); + $result = $parser->parse(array('app', '-vvv')); + $this->assertEquals(3, $result->keys["verbose"]->value); + } + + + /** + * @expectedException GetOptionKit\Exception\InvalidOptionException + */ + public function testUnknownOption() + { + $options = new OptionCollection; + $options->add("v|verbose"); + $parser = new ContinuousOptionParser($options); + $result = $parser->parse(array('app', '-b')); + } + + /** + * @expectedException LogicException + */ + public function testAdvancedOutOfBounds() + { + $options = new OptionCollection; + $options->add("v|verbose"); + $parser = new ContinuousOptionParser($options); + $result = $parser->parse(array('app', '-v')); + $parser->advance(); + } + +} + diff --git a/instafeed/vendor/corneltek/getoptionkit/tests/OptionCollectionTest.php b/instafeed/vendor/corneltek/getoptionkit/tests/OptionCollectionTest.php new file mode 100755 index 0000000..542b293 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/tests/OptionCollectionTest.php @@ -0,0 +1,46 @@ +add($o = new Option('v|verbose')); + $this->assertSame($o, $opts->getLongOption('verbose')); + $this->assertSame($o, $opts->getShortOption('v')); + } + + + /** + * @expectedException LogicException + */ + public function testAddInvalidOption() + { + $opts = new OptionCollection; + $opts->add(123); + } + + /** + * @expectedException GetOptionKit\Exception\OptionConflictException + */ + public function testOptionConflictShort() + { + $opts = new OptionCollection; + $opts->add('r|repeat'); + $opts->add('t|time'); + $opts->add('r|regex'); + } + + /** + * @expectedException GetOptionKit\Exception\OptionConflictException + */ + public function testOptionConflictLong() + { + $opts = new OptionCollection; + $opts->add('r|repeat'); + $opts->add('t|time'); + $opts->add('c|repeat'); + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/tests/OptionParserTest.php b/instafeed/vendor/corneltek/getoptionkit/tests/OptionParserTest.php new file mode 100755 index 0000000..5d5a9b9 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/tests/OptionParserTest.php @@ -0,0 +1,477 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +use GetOptionKit\InvalidOptionValue; +use GetOptionKit\OptionCollection; +use GetOptionKit\OptionParser; +use GetOptionKit\Option; + +class OptionParserTest extends \PHPUnit\Framework\TestCase +{ + public $parser; + public $specs; + + public function setUp() + { + $this->specs = new OptionCollection; + $this->parser = new OptionParser($this->specs); + } + + /** + * @expectedException Exception + */ + public function testInvalidOption() + { + $options = new OptionCollection; + $options->addOption(new Option(0)); + } + + + public function testResultArrayAccessor() + { + $options = new OptionCollection; + $options->add('n|nice:' , 'I take negative value'); + $parser = new OptionParser($options); + $result = $parser->parse(array('a', '-n', '-1', '--', '......')); + + $this->assertTrue(isset($result->nice)); + $this->assertTrue($result->has('nice')); + $this->assertTrue(isset($result['nice'])); + $this->assertEquals(-1, $result['nice']->value); + + $res = clone $result['nice']; + $res->value = 10; + $result['nice'] = $res; + $this->assertEquals(10, $result['nice']->value); + + unset($result['nice']); + } + + public function testCamelCaseOptionName() + { + $this->specs->add('base-dir:=dir' , 'I take path'); + $result = $this->parser->parse(array('a', '--base-dir', 'src')); + $this->assertInstanceOf('SplFileInfo', $result->baseDir); + } + + public function testOptionWithNegativeValue() + { + $this->specs->add('n|nice:' , 'I take negative value'); + $result = $this->parser->parse(array('a', '-n', '-1')); + $this->assertEquals(-1, $result->nice); + } + + public function testShortOptionName() + { + $this->specs->add('f:' , 'file'); + $result = $this->parser->parse(array('a', '-f', 'aaa')); + $this->assertEquals('aaa',$result['f']->getValue()); + } + + public function testOptionWithShortNameAndLongName() + { + $this->specs->add( 'f|foo' , 'flag' ); + $result = $this->parser->parse(array('a', '-f')); + $this->assertTrue($result->foo); + + $result = $this->parser->parse(array('a', '--foo')); + $this->assertTrue($result->foo); + } + + public function testSpec() + { + $options = new OptionCollection; + $options->add( 'f|foo:' , 'option require value' ); + $options->add( 'b|bar+' , 'option with multiple value' ); + $options->add( 'z|zoo?' , 'option with optional value' ); + $options->add( 'v|verbose' , 'verbose message' ); + $options->add( 'd|debug' , 'debug message' ); + $this->assertEquals(5, $options->size()); + $this->assertEquals(5, count($options)); + + + $opt = $options->get('foo'); + $this->assertTrue($opt->isRequired()); + + $opt = $options->get('bar'); + $this->assertTrue( $opt->isMultiple() ); + + $opt = $options->get('zoo'); + $this->assertTrue( $opt->isOptional() ); + + $opt = $options->get( 'debug' ); + $this->assertNotNull( $opt ); + $this->assertInstanceOf('GetOptionKit\\Option', $opt); + $this->assertEquals('debug', $opt->long); + $this->assertEquals('d', $opt->short); + $this->assertTrue($opt->isFlag()); + + return $options; + } + + /** + * @depends testSpec + */ + public function testOptionFinder($options) + { + $this->assertNotNull($options->find('f')); + $this->assertNotNull($options->find('foo')); + $this->assertNull($options->find('xyz')); + } + + public function testRequire() + { + $this->specs->add( 'f|foo:' , 'option require value' ); + $this->specs->add( 'b|bar+' , 'option with multiple value' ); + $this->specs->add( 'z|zoo?' , 'option with optional value' ); + $this->specs->add( 'v|verbose' , 'verbose message' ); + $this->specs->add( 'd|debug' , 'debug message' ); + + $firstExceptionRaised = false; + $secondExceptionRaised = false; + + // option required a value should throw an exception + try { + $result = $this->parser->parse( array('a', '-f' , '-v' , '-d' ) ); + } + catch (Exception $e) { + $firstExceptionRaised = true; + } + + // even if only one option presented in args array + try { + $result = $this->parser->parse(array('a','-f')); + } catch (Exception $e) { + $secondExceptionRaised = true; + } + if ($firstExceptionRaised && $secondExceptionRaised) { + return; + } + $this->fail('An expected exception has not been raised.'); + } + + public function testMultiple() + { + $opt = new OptionCollection; + $opt->add( 'b|bar+' , 'option with multiple value' ); + $parser = new OptionParser($opt); + $result = $parser->parse(explode(' ','app -b 1 -b 2 --bar 3')); + $this->assertNotNull($result->bar); + $this->assertCount(3,$result->bar); + } + + + public function testMultipleNumber() + { + $opt = new OptionCollection; + $opt->add('b|bar+=number' , 'option with multiple value'); + $parser = new OptionParser($opt); + $result = $parser->parse(explode(' ','app --bar 1 --bar 2 --bar 3')); + $this->assertNotNull($result->bar); + $this->assertCount(3,$result->bar); + $this->assertSame(array(1,2,3),$result->bar); + } + + public function testSimpleOptionWithDefaultValue() + { + $opts = new OptionCollection; + $opts->add('p|proc=number' , 'option with required value') + ->defaultValue(10) + ; + $parser = new OptionParser($opts); + $result = $parser->parse(explode(' ','app')); + $this->assertEquals(10, $result['proc']->value); + } + + public function testOptionalOptionWithDefaultValue() + { + $opts = new OptionCollection; + $opts->add('p|proc?=number' , 'option with required value') + ->defaultValue(10) + ; + $parser = new OptionParser($opts); + $result = $parser->parse(explode(' ','app --proc')); + $this->assertEquals(10, $result['proc']->value); + } + + public function testMultipleString() + { + $opts = new OptionCollection; + $opts->add('b|bar+=string' , 'option with multiple value'); + $bar = $opts->get('bar'); + $this->assertNotNull($bar); + $this->assertTrue($bar->isMultiple()); + $this->assertTrue($bar->isType('string')); + $this->assertFalse($bar->isType('number')); + + + $parser = new OptionParser($opts); + $result = $parser->parse(explode(' ','app --bar lisa --bar mary --bar john a b c')); + $this->assertNotNull($result->bar); + $this->assertCount(3,$result->bar); + $this->assertSame(array('lisa', 'mary', 'john'),$result->bar); + $this->assertSame(array('a','b','c'), $result->getArguments()); + } + + public function testParseIncrementalOption() + { + $opts = new OptionCollection; + $opts->add('v|verbose' , 'verbose') + ->isa("number") + ->incremental(); + + $parser = new OptionParser($opts); + $result = $parser->parse(explode(' ','app -vvv arg1 arg2')); + $this->assertInstanceOf('GetOptionKit\Option',$result['verbose']); + $this->assertNotNull($result['verbose']); + $this->assertEquals(3, $result['verbose']->value); + } + + + /** + * @expectedException Exception + */ + public function testIntegerTypeNonNumeric() + { + $opt = new OptionCollection; + $opt->add( 'b|bar:=number' , 'option with integer type' ); + + $parser = new OptionParser($opt); + $spec = $opt->get('bar'); + $this->assertTrue($spec->isTypeNumber()); + + // test non numeric + $result = $parser->parse(explode(' ','app -b test')); + $this->assertNotNull($result->bar); + } + + + public function testIntegerTypeNumericWithoutEqualSign() + { + $opt = new OptionCollection; + $opt->add('b|bar:=number', 'option with integer type'); + + $spec = $opt->get('bar'); + $this->assertTrue($spec->isTypeNumber()); + + $parser = new OptionParser($opt); + $result = $parser->parse(explode(' ','app -b 123123')); + $this->assertNotNull($result); + $this->assertEquals(123123, $result->bar); + } + + public function testIntegerTypeNumericWithEqualSign() + { + $opt = new OptionCollection; + $opt->add('b|bar:=number' , 'option with integer type'); + + $spec = $opt->get('bar'); + $this->assertTrue($spec->isTypeNumber()); + + $parser = new OptionParser($opt); + $result = $parser->parse(explode(' ','app -b=123123')); + $this->assertNotNull($result); + $this->assertNotNull($result->bar); + $this->assertEquals(123123, $result->bar); + } + + public function testStringType() + { + $this->specs->add( 'b|bar:=string' , 'option with type' ); + + $spec = $this->specs->get('bar'); + + $result = $this->parser->parse(explode(' ','app -b text arg1 arg2 arg3')); + $this->assertNotNull($result->bar); + + $result = $this->parser->parse(explode(' ','app -b=text arg1 arg2 arg3')); + $this->assertNotNull($result->bar); + + $args = $result->getArguments(); + $this->assertNotEmpty($args); + $this->assertCount(3,$args); + $this->assertEquals('arg1', $args[0]); + $this->assertEquals('arg2', $args[1]); + $this->assertEquals('arg3', $args[2]); + } + + public function testStringQuoteOptionValue() + { + $opts = new OptionCollection(); + $opts->add('f|foo:' , 'option requires a value.'); + $parser = new OptionParser($opts); + $res = $parser->parse(['app','--foo=aa bb cc']); + $this->assertEquals('aa bb cc', $res->get('foo')); + } + + public function testSpec2() + { + $this->specs->add('long' , 'long option name only.'); + $this->specs->add('a' , 'short option name only.'); + $this->specs->add('b' , 'short option name only.'); + $this->assertNotNull($this->specs->all()); + $this->assertNotNull($this->specs); + $this->assertNotNull($result = $this->parser->parse(explode(' ','app -a -b --long')) ); + $this->assertNotNull($result->a); + $this->assertNotNull($result->b); + } + + + public function testSpecCollection() + { + $this->specs->add( 'f|foo:' , 'option requires a value.' ); + $this->specs->add( 'b|bar+' , 'option with multiple value.' ); + $this->specs->add( 'z|zoo?' , 'option with optional value.' ); + $this->specs->add( 'v|verbose' , 'verbose message.' ); + $this->specs->add( 'd|debug' , 'debug message.' ); + $this->specs->add( 'long' , 'long option name only.' ); + $this->specs->add( 's' , 'short option name only.' ); + + $this->assertNotNull( $this->specs->all() ); + $this->assertNotNull( $this->specs ); + + $this->assertCount( 7 , $array = $this->specs->toArray() ); + $this->assertNotEmpty( isset($array[0]['long'] )); + $this->assertNotEmpty( isset($array[0]['short'] )); + $this->assertNotEmpty( isset($array[0]['desc'] )); + } + + public function optionTestProvider() + { + return array( + array( 'foo', 'simple boolean option', 'foo', true, + [['a','--foo','a', 'b', 'c']] + ), + array( 'f|foo', 'simple boolean option', 'foo', true, + [['a','--foo'], ['a','-f']] + ), + array( 'f|foo:=string', 'string option', 'foo', 'xxx', + [['a','--foo','xxx'], ['a','-f', 'xxx']] + ), + array( 'f|foo:=string', 'string option', 'foo', 'xxx', + [['a','b', 'c', '--foo','xxx'], ['a', 'a', 'b', 'c', '-f', 'xxx']] + ), + ); + } + + /** + * @dataProvider optionTestProvider + */ + public function test($specString, $desc, $key, $expectedValue, array $argvList) + { + $opts = new OptionCollection(); + $opts->add($specString, $desc); + $parser = new OptionParser($opts); + foreach ($argvList as $argv) { + $res = $parser->parse($argv); + $this->assertSame($expectedValue, $res->get($key)); + } + } + + /** + * @expectedException Exception + */ + public function testParseWithoutProgramName() + { + $parser = new OptionParser(new OptionCollection); + $parser->parse(array('--foo')); + } + + /** + * @expectedException GetOptionKit\Exception\InvalidOptionException + */ + public function testParseInvalidOptionException() + { + $parser = new OptionParser(new OptionCollection); + $parser->parse(array('app','--foo')); + } + + /** + * @expectedException GetOptionKit\Exception\RequireValueException + */ + public function testParseOptionRequireValueException() + { + $options = new OptionCollection; + $options->add('name:=string', 'name'); + + $parser = new OptionParser($options); + $parser->parse(array('app','--name')); + } + + + + public function testMore() + { + $this->specs->add('f|foo:' , 'option require value' ); + $this->specs->add('b|bar+' , 'option with multiple value' ); + $this->specs->add('z|zoo?' , 'option with optional value' ); + $this->specs->add('v|verbose' , 'verbose message' ); + $this->specs->add('d|debug' , 'debug message' ); + + $result = $this->parser->parse( array('a', '-f' , 'foo value' , '-v' , '-d' ) ); + $this->assertNotNull($result->foo); + $this->assertNotNull($result->verbose); + $this->assertNotNull($result->debug); + $this->assertEquals( 'foo value', $result->foo ); + $this->assertNotNull( $result->verbose ); + $this->assertNotNull( $result->debug ); + + foreach ($result as $k => $v) { + $this->assertTrue(in_array($k, ['foo','bar','zoo','verbose', 'debug'])); + $this->assertInstanceOf('GetOptionKit\\Option', $v); + } + $this->assertSame([ + 'foo' => 'foo value', + 'verbose' => true, + 'debug' => true + ], $result->toArray()); + + $result = $this->parser->parse( array('a', '-f=foo value' , '-v' , '-d' ) ); + $this->assertNotNull( $result ); + $this->assertNotNull( $result->foo ); + $this->assertNotNull( $result->verbose ); + $this->assertNotNull( $result->debug ); + + $this->assertEquals( 'foo value', $result->foo ); + $this->assertNotNull( $result->verbose ); + $this->assertNotNull( $result->debug ); + + $result = $this->parser->parse( array('a', '-vd' ) ); + $this->assertNotNull( $result->verbose ); + $this->assertNotNull( $result->debug ); + } + + public function testParseAcceptsValidOption() + { + $this->specs + ->add('f:foo', 'test option') + ->validator(function($value) { + return $value === 'valid-option'; + }); + + $result = $this->parser->parse(array('a', '-f' , 'valid-option')); + + $this->assertArrayHasKey('f', $result); + } + + /** + * @expectedException GetOptionKit\Exception\InvalidOptionValueException + */ + public function testParseThrowsExceptionOnInvalidOption() + { + $this->specs + ->add('f:foo', 'test option') + ->validator(function($value) { + return $value === 'valid-option'; + }); + + $this->parser->parse(array('a', '-f' , 'not-a-valid-option')); + } +} diff --git a/instafeed/vendor/corneltek/getoptionkit/tests/OptionPrinter/ConsoleOptionPrinterTest.php b/instafeed/vendor/corneltek/getoptionkit/tests/OptionPrinter/ConsoleOptionPrinterTest.php new file mode 100755 index 0000000..2f06767 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/tests/OptionPrinter/ConsoleOptionPrinterTest.php @@ -0,0 +1,32 @@ +add('f|foo:', 'option requires a value.' ) + ->isa('String'); + + $options->add('b|bar+', 'option with multiple value.' ) + ->isa('Number'); + + $options->add('z|zoo?', 'option with optional value.' ) + ->isa('Boolean') + ; + + $options->add('n', 'n flag' ); + + $options->add('verbose', 'verbose'); + + $options->add('o|output?', 'option with optional value.' ) + ->isa('File') + ->defaultValue('output.txt') + ; + $printer = new ConsoleOptionPrinter; + $output = $printer->render($options); + } + +} diff --git a/instafeed/vendor/corneltek/getoptionkit/tests/OptionResultTest.php b/instafeed/vendor/corneltek/getoptionkit/tests/OptionResultTest.php new file mode 100755 index 0000000..01be96d --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/tests/OptionResultTest.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +class OptionResultTest extends \PHPUnit\Framework\TestCase +{ + + function testOption() + { + $option = new \GetOptionKit\OptionResult; + $this->assertNotNull( $option ); + + $specs = new \GetOptionKit\OptionCollection; + $specs->add('name:','name'); + $result = \GetOptionKit\OptionResult::create($specs,array( 'name' => 'c9s' ),array( 'arg1' )); + $this->assertNotNull( $result ); + $this->assertNotNull( $result->arguments ); + $this->assertNotNull( $result->name ); + $this->assertEquals( 'c9s', $result->name ); + $this->assertEquals( $result->arguments[0] , 'arg1' ); + } + +} + + diff --git a/instafeed/vendor/corneltek/getoptionkit/tests/OptionTest.php b/instafeed/vendor/corneltek/getoptionkit/tests/OptionTest.php new file mode 100755 index 0000000..7b06f1d --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/tests/OptionTest.php @@ -0,0 +1,227 @@ +assertNotNull($opt); + } + + /** + * @expectedException Exception + */ + public function testInvalidOptionSpec() + { + new Option('....'); + } + + public function testValueName() + { + $opt = new Option('z'); + $opt->defaultValue(10); + $opt->valueName('priority'); + $this->assertEquals('[=priority]', $opt->renderValueHint()); + $this->assertEquals('-z[=priority]', $opt->renderReadableSpec()); + } + + + public function testDefaultValue() + { + $opt = new Option('z'); + $opt->defaultValue(10); + $this->assertEquals(10, $opt->getValue()); + $this->assertEquals('-z[=10]',$opt->renderReadableSpec(true)); + } + + public function testBackwardCompatibleBoolean() + { + $opt = new Option('scope'); + $opt->isa('bool'); + $this->assertEquals('boolean', $opt->isa); + $this->assertEquals('--scope=',$opt->renderReadableSpec(true)); + } + + + + public function validatorProvider() + { + return [ + [function($a) { return in_array($a, ['public', 'private']); }], + [function($a) { return [in_array($a, ['public', 'private']), "message"]; }] + ]; + } + + /** + * @dataProvider validatorProvider + */ + public function testValidator($cb) + { + $opt = new Option('scope'); + $opt->validator($cb); + $ret = $opt->validate('public'); + $this->assertTrue($ret[0]); + $ret = $opt->validate('private'); + $this->assertTrue($ret[0]); + $ret = $opt->validate('foo'); + $this->assertFalse($ret[0]); + $this->assertEquals('--scope', $opt->renderReadableSpec(true)); + } + + /** + * @expectedException Exception + */ + public function testInvalidTypeClass() + { + $opt = new Option('scope'); + $opt->isa('SomethingElse'); + $class = $opt->getTypeClass(); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testValidatorReturnValue() + { + $opt = new Option('scope'); + $opt->validator(function($val) { + return 123454; + }); + $ret = $opt->validate('public'); + } + + public function testOptionWithoutValidator() + { + $opt = new Option('scope'); + $ret = $opt->validate('public'); + $this->assertTrue($ret[0]); + $ret = $opt->validate('private'); + $this->assertTrue($ret[0]); + $ret = $opt->validate('foo'); + $this->assertTrue($ret[0]); + $this->assertEquals('--scope',$opt->renderReadableSpec(true)); + } + + + + + public function testSuggestionsCallback() + { + $opt = new Option('scope'); + $this->assertEmpty($opt->getSuggestions()); + + $opt->suggestions(function() { + return ['public', 'private']; + }); + $this->assertNotEmpty($opt->getSuggestions()); + $this->assertSame(['public', 'private'],$opt->getSuggestions()); + $opt->setValue('public'); + $opt->setValue('private'); + $this->assertEquals('private',$opt->value); + + $this->assertEquals('--scope=[public,private]',$opt->renderReadableSpec(true)); + } + + public function testSuggestions() + { + $opt = new Option('scope'); + $opt->suggestions(['public', 'private']); + $this->assertNotEmpty($opt->getSuggestions()); + $this->assertSame(['public', 'private'],$opt->getSuggestions()); + $opt->setValue('public'); + $opt->setValue('private'); + $this->assertEquals('private',$opt->value); + + $this->assertEquals('--scope=[public,private]',$opt->renderReadableSpec(true)); + } + + public function testValidValuesCallback() { + $opt = new Option('scope'); + $opt->validValues(function() { + return ['public', 'private']; + }); + $this->assertNotNull($opt->getValidValues()); + $this->assertNotEmpty($opt->getValidValues()); + + $opt->setValue('public'); + $opt->setValue('private'); + $this->assertEquals('private',$opt->value); + $this->assertEquals('--scope=(public,private)',$opt->renderReadableSpec(true)); + } + + public function testTrigger() + { + $opt = new Option('scope'); + $opt->validValues([ 'public', 'private' ]); + + $state = 0; + $opt->trigger(function($val) use(& $state) { + $state++; + }); + $this->assertNotEmpty($opt->getValidValues()); + $opt->setValue('public'); + + $this->assertEquals(1, $state); + $opt->setValue('private'); + $this->assertEquals(2, $state); + + } + + + + public function testArrayValueToString() + { + $opt = new Option('uid'); + $opt->setValue([1,2,3,4]); + $toString = '* key:uid spec:--uid desc: + value => 1,2,3,4 +'; + $this->assertEquals($toString,$opt->__toString()); + } + + public function testValidValues() + { + $opt = new Option('scope'); + $opt->validValues([ 'public', 'private' ]) + ; + $this->assertNotEmpty($opt->getValidValues()); + $this->assertTrue(is_array($opt->getValidValues())); + + $opt->setValue('public'); + $opt->setValue('private'); + $this->assertEquals('private',$opt->value); + $this->assertEquals('--scope=(public,private)',$opt->renderReadableSpec(true)); + $this->assertNotEmpty($opt->__toString()); + } + + + public function testFilter() { + $opt = new Option('scope'); + $opt->filter(function($val) { + return preg_replace('#a#', 'x', $val); + }) + ; + $opt->setValue('aa'); + $this->assertEquals('xx', $opt->value); + } +} + diff --git a/instafeed/vendor/corneltek/getoptionkit/tests/RegexValueTypeTest.php b/instafeed/vendor/corneltek/getoptionkit/tests/RegexValueTypeTest.php new file mode 100755 index 0000000..6917918 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/tests/RegexValueTypeTest.php @@ -0,0 +1,26 @@ +assertEquals($regex->option, '#^Test$#'); + } + + public function testValidation() + { + $regex = new RegexType('#^Test$#'); + $this->assertTrue($regex->test('Test')); + $this->assertFalse($regex->test('test')); + + $regex->option = '/^([a-z]+)$/'; + $this->assertTrue($regex->test('barfoo')); + $this->assertFalse($regex->test('foobar234')); + $ret = $regex->parse('foobar234'); + $this->assertNotNull($ret); + } +} + diff --git a/instafeed/vendor/corneltek/getoptionkit/tests/ValueTypeTest.php b/instafeed/vendor/corneltek/getoptionkit/tests/ValueTypeTest.php new file mode 100755 index 0000000..08472c5 --- /dev/null +++ b/instafeed/vendor/corneltek/getoptionkit/tests/ValueTypeTest.php @@ -0,0 +1,200 @@ +assertNotNull( new BooleanType ); + $this->assertNotNull( new StringType ); + $this->assertNotNull( new FileType ); + $this->assertNotNull( new DateType ); + $this->assertNotNull( new DateTimeType ); + $this->assertNotNull( new NumberType ); + $this->assertNotNull( new UrlType ); + $this->assertNotNull( new IpType ); + $this->assertNotNull( new Ipv4Type ); + $this->assertNotNull( new Ipv6Type ); + $this->assertNotNull( new EmailType ); + $this->assertNotNull( new PathType ); + $this->assertNotNull( new RegexType("/[a-z]/")); + } + + + public function testDateTimeType() + { + $type = new DateTimeType([ 'format' => 'Y-m-d' ]); + $this->assertTrue($type->test('2016-12-30')); + $a = $type->parse('2016-12-30'); + $this->assertEquals(2016, $a->format('Y')); + $this->assertEquals(12, $a->format('m')); + $this->assertEquals(30, $a->format('d')); + $this->assertFalse($type->test('foo')); + } + + public function testDateType() + { + $type = new DateType; + $this->assertTrue($type->test('2016-12-30')); + $a = $type->parse('2016-12-30'); + $this->assertEquals(2016, $a['year']); + $this->assertEquals(12, $a['month']); + $this->assertEquals(30, $a['day']); + $this->assertFalse($type->test('foo')); + } + + + + public function booleanTestProvider() + { + return [ + [true , true, true], + [false , true, false], + ['true' , true, true], + ['false' , true, false], + ['0' , true, false], + ['1' , true, true], + ['foo' , false, null], + ['123' , false, null], + ]; + } + + /** + * @dataProvider booleanTestProvider + */ + public function testBooleanType($a, $test, $expected) + { + $bool = new BooleanType; + $this->assertEquals($test, $bool->test($a)); + if ($bool->test($a)) { + $this->assertEquals($expected, $bool->parse($a)); + } + } + + public function testDirType() + { + $type = new DirType; + $this->assertTrue($type->test('tests')); + $this->assertFalse($type->test('composer.json')); + $this->assertFalse($type->test('foo/bar')); + $this->assertInstanceOf('SplFileInfo',$type->parse('tests')); + } + + public function testFileType() + { + $type = new FileType; + $this->assertFalse($type->test('tests')); + $this->assertTrue($type->test('composer.json')); + $this->assertFalse($type->test('foo/bar')); + $this->assertInstanceOf('SplFileInfo', $type->parse('composer.json')); + } + + public function testPathType() + { + $type = new PathType; + $this->assertTrue($type->test('tests')); + $this->assertTrue($type->test('composer.json')); + $this->assertFalse($type->test('foo/bar')); + $this->assertInstanceOf('SplFileInfo', $type->parse('composer.json')); + } + + public function testUrlType() + { + $url = new UrlType; + $this->assertTrue($url->test('http://t')); + $this->assertTrue($url->test('http://t.c')); + $this->assertFalse($url->test('t.c')); + $this->assertEquals('http://t.c', $url->parse('http://t.c')); + } + + public function ipV4Provider() + { + return [ + ['192.168.25.58', true], + ['8.8.8.8', true], + ['github.com', false], + ]; + } + + public function ipV6Provider() + { + return [ + ['192.168.25.58', false], + ['2607:f0d0:1002:51::4', true], + ['2607:f0d0:1002:0051:0000:0000:0000:0004', true], + ['::1', true], + ['10.10.15.10/16', false], + ['github.com', false], + ]; + } + + public function ipProvider() + { + return [ + ['192.168.25.58', true], + ['2607:f0d0:1002:51::4', true], + ['::1', true], + ['10.10.15.10/16', false], + ['github.com', false], + ]; + } + + /** + * @dataProvider ipProvider + */ + public function testIpType($ipstr, $pass = true) + { + $ip = new IpType; + $this->assertEquals($pass, $ip->test($ipstr)); + if ($pass) { + $this->assertNotNull($ip->parse($ipstr)); + } + } + + /** + * @dataProvider ipV4Provider + */ + public function testIpv4Type($ipstr, $pass = true) + { + $ipv4 = new Ipv4Type; + $this->assertEquals($pass, $ipv4->test($ipstr)); + if ($pass) { + $this->assertNotNull($ipv4->parse($ipstr)); + } + } + + /** + * @dataProvider ipV6Provider + */ + public function testIpv6Type($ipstr, $pass = true) + { + $ipv6 = new Ipv6Type; + $this->assertEquals($pass, $ipv6->test($ipstr)); + if ($pass) { + $this->assertNotNull($ipv6->parse($ipstr)); + } + } + + public function testEmailType() + { + $email = new EmailType; + $this->assertTrue($email->test('test@gmail.com')); + $this->assertFalse($email->test('test@test')); + $email->parse('test@gmail.com'); + } +} + diff --git a/instafeed/vendor/evenement/evenement/.gitignore b/instafeed/vendor/evenement/evenement/.gitignore new file mode 100755 index 0000000..987e2a2 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/.gitignore @@ -0,0 +1,2 @@ +composer.lock +vendor diff --git a/instafeed/vendor/evenement/evenement/.travis.yml b/instafeed/vendor/evenement/evenement/.travis.yml new file mode 100755 index 0000000..65ba0ce --- /dev/null +++ b/instafeed/vendor/evenement/evenement/.travis.yml @@ -0,0 +1,24 @@ +language: php + +php: + - 7.0 + - 7.1 + - hhvm + - nightly + +matrix: + allow_failures: + - php: hhvm + - php: nightly + +before_script: + - wget http://getcomposer.org/composer.phar + - php composer.phar install + +script: + - ./vendor/bin/phpunit --coverage-text + - php -n examples/benchmark-emit-no-arguments.php + - php -n examples/benchmark-emit-one-argument.php + - php -n examples/benchmark-emit.php + - php -n examples/benchmark-emit-once.php + - php -n examples/benchmark-remove-listener-once.php diff --git a/instafeed/vendor/evenement/evenement/CHANGELOG.md b/instafeed/vendor/evenement/evenement/CHANGELOG.md new file mode 100755 index 0000000..568f229 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/CHANGELOG.md @@ -0,0 +1,35 @@ +CHANGELOG +========= + + +* v3.0.1 (2017-07-23) + + * Resolved regression introduced in once listeners in v3.0.0 [#49](https://github.com/igorw/evenement/pull/49) + +* v3.0.0 (2017-07-23) + + * Passing null as event name throw exception [#46](https://github.com/igorw/evenement/pull/46), and [#47](https://github.com/igorw/evenement/pull/47) + * Performance improvements [#39](https://github.com/igorw/evenement/pull/39), and [#45](https://github.com/igorw/evenement/pull/45) + * Remove once listeners [#44](https://github.com/igorw/evenement/pull/44), [#45](https://github.com/igorw/evenement/pull/45) + +* v2.1.0 (2017-07-17) + + * Chaining for "on" method [#30](https://github.com/igorw/evenement/pull/30) + * Unit tests (on Travis) improvements [#33](https://github.com/igorw/evenement/pull/33), [#36](https://github.com/igorw/evenement/pull/36), and [#37](https://github.com/igorw/evenement/pull/37) + * Benchmarks added [#35](https://github.com/igorw/evenement/pull/35), and [#40](https://github.com/igorw/evenement/pull/40) + * Minor performance improvements [#42](https://github.com/igorw/evenement/pull/42), and [#38](https://github.com/igorw/evenement/pull/38) + +* v2.0.0 (2012-11-02) + + * Require PHP >=5.4.0 + * Added EventEmitterTrait + * Removed EventEmitter2 + +* v1.1.0 (2017-07-17) + + * Chaining for "on" method [#29](https://github.com/igorw/evenement/pull/29) + * Minor performance improvements [#43](https://github.com/igorw/evenement/pull/43) + +* v1.0.0 (2012-05-30) + + * Inital stable release diff --git a/instafeed/vendor/evenement/evenement/LICENSE b/instafeed/vendor/evenement/evenement/LICENSE new file mode 100755 index 0000000..d9a37d0 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011 Igor Wiedler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/instafeed/vendor/evenement/evenement/README.md b/instafeed/vendor/evenement/evenement/README.md new file mode 100755 index 0000000..9443011 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/README.md @@ -0,0 +1,83 @@ +# Événement + +Événement is a very simple event dispatching library for PHP. + +It has the same design goals as [Silex](http://silex-project.org) and +[Pimple](http://pimple-project.org), to empower the user while staying concise +and simple. + +It is very strongly inspired by the EventEmitter API found in +[node.js](http://nodejs.org). + +[![Build Status](https://secure.travis-ci.org/igorw/evenement.png?branch=master)](http://travis-ci.org/igorw/evenement) + +## Fetch + +The recommended way to install Événement is [through composer](http://getcomposer.org). + +Just create a composer.json file for your project: + +```JSON +{ + "require": { + "evenement/evenement": "^3.0 || ^2.0" + } +} +``` + +**Note:** The `3.x` version of Événement requires PHP 7 and the `2.x` version requires PHP 5.4. If you are +using PHP 5.3, please use the `1.x` version: + +```JSON +{ + "require": { + "evenement/evenement": "^1.0" + } +} +``` + +And run these two commands to install it: + + $ curl -s http://getcomposer.org/installer | php + $ php composer.phar install + +Now you can add the autoloader, and you will have access to the library: + +```php +on('user.created', function (User $user) use ($logger) { + $logger->log(sprintf("User '%s' was created.", $user->getLogin())); +}); +``` + +### Emitting Events + +```php +emit('user.created', [$user]); +``` + +Tests +----- + + $ ./vendor/bin/phpunit + +License +------- +MIT, see LICENSE. diff --git a/instafeed/vendor/evenement/evenement/composer.json b/instafeed/vendor/evenement/evenement/composer.json new file mode 100755 index 0000000..cbb4827 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/composer.json @@ -0,0 +1,29 @@ +{ + "name": "evenement/evenement", + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": ["event-dispatcher", "event-emitter"], + "license": "MIT", + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "autoload": { + "psr-0": { + "Evenement": "src" + } + }, + "autoload-dev": { + "psr-0": { + "Evenement": "tests" + }, + "files": ["tests/Evenement/Tests/functions.php"] + } +} diff --git a/instafeed/vendor/evenement/evenement/doc/00-intro.md b/instafeed/vendor/evenement/evenement/doc/00-intro.md new file mode 100755 index 0000000..6c28a2a --- /dev/null +++ b/instafeed/vendor/evenement/evenement/doc/00-intro.md @@ -0,0 +1,28 @@ +# Introduction + +Événement is is French and means "event". The événement library aims to +provide a simple way of subscribing to events and notifying those subscribers +whenever an event occurs. + +The API that it exposes is almost a direct port of the EventEmitter API found +in node.js. It also includes an "EventEmitter". There are some minor +differences however. + +The EventEmitter is an implementation of the publish-subscribe pattern, which +is a generalized version of the observer pattern. The observer pattern +specifies an observable subject, which observers can register themselves to. +Once something interesting happens, the subject notifies its observers. + +Pub/sub takes the same idea but encapsulates the observation logic inside a +separate object which manages all of its subscribers or listeners. Subscribers +are bound to an event name, and will only receive notifications of the events +they subscribed to. + +**TLDR: What does evenement do, in short? It provides a mapping from event +names to a list of listener functions and triggers each listener for a given +event when it is emitted.** + +Why do we do this, you ask? To achieve decoupling. + +It allows you to design a system where the core will emit events, and modules +are able to subscribe to these events. And respond to them. diff --git a/instafeed/vendor/evenement/evenement/doc/01-api.md b/instafeed/vendor/evenement/evenement/doc/01-api.md new file mode 100755 index 0000000..17ba333 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/doc/01-api.md @@ -0,0 +1,91 @@ +# API + +The API that événement exposes is defined by the +`Evenement\EventEmitterInterface`. The interface is useful if you want to +define an interface that extends the emitter and implicitly defines certain +events to be emitted, or if you want to type hint an `EventEmitter` to be +passed to a method without coupling to the specific implementation. + +## on($event, callable $listener) + +Allows you to subscribe to an event. + +Example: + +```php +$emitter->on('user.created', function (User $user) use ($logger) { + $logger->log(sprintf("User '%s' was created.", $user->getLogin())); +}); +``` + +Since the listener can be any callable, you could also use an instance method +instead of the anonymous function: + +```php +$loggerSubscriber = new LoggerSubscriber($logger); +$emitter->on('user.created', array($loggerSubscriber, 'onUserCreated')); +``` + +This has the benefit that listener does not even need to know that the emitter +exists. + +You can also accept more than one parameter for the listener: + +```php +$emitter->on('numbers_added', function ($result, $a, $b) {}); +``` + +## once($event, callable $listener) + +Convenience method that adds a listener which is guaranteed to only be called +once. + +Example: + +```php +$conn->once('connected', function () use ($conn, $data) { + $conn->send($data); +}); +``` + +## emit($event, array $arguments = []) + +Emit an event, which will call all listeners. + +Example: + +```php +$conn->emit('data', [$data]); +``` + +The second argument to emit is an array of listener arguments. This is how you +specify more args: + +```php +$result = $a + $b; +$emitter->emit('numbers_added', [$result, $a, $b]); +``` + +## listeners($event) + +Allows you to inspect the listeners attached to an event. Particularly useful +to check if there are any listeners at all. + +Example: + +```php +$e = new \RuntimeException('Everything is broken!'); +if (0 === count($emitter->listeners('error'))) { + throw $e; +} +``` + +## removeListener($event, callable $listener) + +Remove a specific listener for a specific event. + +## removeAllListeners($event = null) + +Remove all listeners for a specific event or all listeners all together. This +is useful for long-running processes, where you want to remove listeners in +order to allow them to get garbage collected. diff --git a/instafeed/vendor/evenement/evenement/doc/02-plugin-system.md b/instafeed/vendor/evenement/evenement/doc/02-plugin-system.md new file mode 100755 index 0000000..6a08371 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/doc/02-plugin-system.md @@ -0,0 +1,155 @@ +# Example: Plugin system + +In this example I will show you how to create a generic plugin system with +événement where plugins can alter the behaviour of the app. The app is a blog. +Boring, I know. By using the EventEmitter it will be easy to extend this blog +with additional functionality without modifying the core system. + +The blog is quite basic. Users are able to create blog posts when they log in. +The users are stored in a static config file, so there is no sign up process. +Once logged in they get a "new post" link which gives them a form where they +can create a new blog post with plain HTML. That will store the post in a +document database. The index lists all blog post titles by date descending. +Clicking on the post title will take you to the full post. + +## Plugin structure + +The goal of the plugin system is to allow features to be added to the blog +without modifying any core files of the blog. + +The plugins are managed through a config file, `plugins.json`. This JSON file +contains a JSON-encoded list of class-names for plugin classes. This allows +you to enable and disable plugins in a central location. The initial +`plugins.json` is just an empty array: +```json +[] +``` + +A plugin class must implement the `PluginInterface`: +```php +interface PluginInterface +{ + function attachEvents(EventEmitterInterface $emitter); +} +``` + +The `attachEvents` method allows the plugin to attach any events to the +emitter. For example: +```php +class FooPlugin implements PluginInterface +{ + public function attachEvents(EventEmitterInterface $emitter) + { + $emitter->on('foo', function () { + echo 'bar!'; + }); + } +} +``` + +The blog system creates an emitter instance and loads the plugins: +```php +$emitter = new EventEmitter(); + +$pluginClasses = json_decode(file_get_contents('plugins.json'), true); +foreach ($pluginClasses as $pluginClass) { + $plugin = new $pluginClass(); + $pluginClass->attachEvents($emitter); +} +``` + +This is the base system. There are no plugins yet, and there are no events yet +either. That's because I don't know which extension points will be needed. I +will add them on demand. + +## Feature: Markdown + +Writing blog posts in HTML sucks! Wouldn't it be great if I could write them +in a nice format such as markdown, and have that be converted to HTML for me? + +This feature will need two extension points. I need to be able to mark posts +as markdown, and I need to be able to hook into the rendering of the post body +and convert it from markdown to HTML. So the blog needs two new events: +`post.create` and `post.render`. + +In the code that creates the post, I'll insert the `post.create` event: +```php +class PostEvent +{ + public $post; + + public function __construct(array $post) + { + $this->post = $post; + } +} + +$post = createPostFromRequest($_POST); + +$event = new PostEvent($post); +$emitter->emit('post.create', [$event]); +$post = $event->post; + +$db->save('post', $post); +``` + +This shows that you can wrap a value in an event object to make it mutable, +allowing listeners to change it. + +The same thing for the `post.render` event: +```php +public function renderPostBody(array $post) +{ + $emitter = $this->emitter; + + $event = new PostEvent($post); + $emitter->emit('post.render', [$event]); + $post = $event->post; + + return $post['body']; +} + +

+

+``` + +Ok, the events are in place. It's time to create the first plugin, woohoo! I +will call this the `MarkdownPlugin`, so here's `plugins.json`: +```json +[ + "MarkdownPlugin" +] +``` + +The `MarkdownPlugin` class will be autoloaded, so I don't have to worry about +including any files. I just have to worry about implementing the plugin class. +The `markdown` function represents a markdown to HTML converter. +```php +class MarkdownPlugin implements PluginInterface +{ + public function attachEvents(EventEmitterInterface $emitter) + { + $emitter->on('post.create', function (PostEvent $event) { + $event->post['format'] = 'markdown'; + }); + + $emitter->on('post.render', function (PostEvent $event) { + if (isset($event->post['format']) && 'markdown' === $event->post['format']) { + $event->post['body'] = markdown($event->post['body']); + } + }); + } +} +``` + +There you go, the blog now renders posts as markdown. But all of the previous +posts before the addition of the markdown plugin are still rendered correctly +as raw HTML. + +## Feature: Comments + +TODO + +## Feature: Comment spam control + +TODO diff --git a/instafeed/vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php b/instafeed/vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php new file mode 100755 index 0000000..53d7f4b --- /dev/null +++ b/instafeed/vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +const ITERATIONS = 10000000; + +use Evenement\EventEmitter; + +require __DIR__.'/../vendor/autoload.php'; + +$emitter = new EventEmitter(); + +$emitter->on('event', function () {}); + +$start = microtime(true); +for ($i = 0; $i < ITERATIONS; $i++) { + $emitter->emit('event'); +} +$time = microtime(true) - $start; + +echo 'Emitting ', number_format(ITERATIONS), ' events took: ', number_format($time, 2), 's', PHP_EOL; diff --git a/instafeed/vendor/evenement/evenement/examples/benchmark-emit-once.php b/instafeed/vendor/evenement/evenement/examples/benchmark-emit-once.php new file mode 100755 index 0000000..74f4d17 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/examples/benchmark-emit-once.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +ini_set('memory_limit', '512M'); + +const ITERATIONS = 100000; + +use Evenement\EventEmitter; + +require __DIR__.'/../vendor/autoload.php'; + +$emitter = new EventEmitter(); + +for ($i = 0; $i < ITERATIONS; $i++) { + $emitter->once('event', function ($a, $b, $c) {}); +} + +$start = microtime(true); +$emitter->emit('event', [1, 2, 3]); +$time = microtime(true) - $start; + +echo 'Emitting one event to ', number_format(ITERATIONS), ' once listeners took: ', number_format($time, 2), 's', PHP_EOL; diff --git a/instafeed/vendor/evenement/evenement/examples/benchmark-emit-one-argument.php b/instafeed/vendor/evenement/evenement/examples/benchmark-emit-one-argument.php new file mode 100755 index 0000000..39fc4ba --- /dev/null +++ b/instafeed/vendor/evenement/evenement/examples/benchmark-emit-one-argument.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +const ITERATIONS = 10000000; + +use Evenement\EventEmitter; + +require __DIR__.'/../vendor/autoload.php'; + +$emitter = new EventEmitter(); + +$emitter->on('event', function ($a) {}); + +$start = microtime(true); +for ($i = 0; $i < ITERATIONS; $i++) { + $emitter->emit('event', [1]); +} +$time = microtime(true) - $start; + +echo 'Emitting ', number_format(ITERATIONS), ' events took: ', number_format($time, 2), 's', PHP_EOL; diff --git a/instafeed/vendor/evenement/evenement/examples/benchmark-emit.php b/instafeed/vendor/evenement/evenement/examples/benchmark-emit.php new file mode 100755 index 0000000..3ab639e --- /dev/null +++ b/instafeed/vendor/evenement/evenement/examples/benchmark-emit.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +const ITERATIONS = 10000000; + +use Evenement\EventEmitter; + +require __DIR__.'/../vendor/autoload.php'; + +$emitter = new EventEmitter(); + +$emitter->on('event', function ($a, $b, $c) {}); + +$start = microtime(true); +for ($i = 0; $i < ITERATIONS; $i++) { + $emitter->emit('event', [1, 2, 3]); +} +$time = microtime(true) - $start; + +echo 'Emitting ', number_format(ITERATIONS), ' events took: ', number_format($time, 2), 's', PHP_EOL; diff --git a/instafeed/vendor/evenement/evenement/examples/benchmark-remove-listener-once.php b/instafeed/vendor/evenement/evenement/examples/benchmark-remove-listener-once.php new file mode 100755 index 0000000..414be3b --- /dev/null +++ b/instafeed/vendor/evenement/evenement/examples/benchmark-remove-listener-once.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +ini_set('memory_limit', '512M'); + +const ITERATIONS = 100000; + +use Evenement\EventEmitter; + +require __DIR__.'/../vendor/autoload.php'; + +$emitter = new EventEmitter(); + +$listeners = []; +for ($i = 0; $i < ITERATIONS; $i++) { + $listeners[] = function ($a, $b, $c) {}; +} + +$start = microtime(true); +foreach ($listeners as $listener) { + $emitter->once('event', $listener); +} +$time = microtime(true) - $start; +echo 'Adding ', number_format(ITERATIONS), ' once listeners took: ', number_format($time, 2), 's', PHP_EOL; + +$start = microtime(true); +foreach ($listeners as $listener) { + $emitter->removeListener('event', $listener); +} +$time = microtime(true) - $start; +echo 'Removing ', number_format(ITERATIONS), ' once listeners took: ', number_format($time, 2), 's', PHP_EOL; diff --git a/instafeed/vendor/evenement/evenement/phpunit.xml.dist b/instafeed/vendor/evenement/evenement/phpunit.xml.dist new file mode 100755 index 0000000..70bc693 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/phpunit.xml.dist @@ -0,0 +1,24 @@ + + + + + + ./tests/Evenement/ + + + + + + ./src/ + + + diff --git a/instafeed/vendor/evenement/evenement/src/Evenement/EventEmitter.php b/instafeed/vendor/evenement/evenement/src/Evenement/EventEmitter.php new file mode 100755 index 0000000..db189b9 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/src/Evenement/EventEmitter.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement; + +class EventEmitter implements EventEmitterInterface +{ + use EventEmitterTrait; +} diff --git a/instafeed/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php b/instafeed/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php new file mode 100755 index 0000000..310631a --- /dev/null +++ b/instafeed/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement; + +interface EventEmitterInterface +{ + public function on($event, callable $listener); + public function once($event, callable $listener); + public function removeListener($event, callable $listener); + public function removeAllListeners($event = null); + public function listeners($event = null); + public function emit($event, array $arguments = []); +} diff --git a/instafeed/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php b/instafeed/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php new file mode 100755 index 0000000..a78e65c --- /dev/null +++ b/instafeed/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php @@ -0,0 +1,135 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement; + +use InvalidArgumentException; + +trait EventEmitterTrait +{ + protected $listeners = []; + protected $onceListeners = []; + + public function on($event, callable $listener) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + if (!isset($this->listeners[$event])) { + $this->listeners[$event] = []; + } + + $this->listeners[$event][] = $listener; + + return $this; + } + + public function once($event, callable $listener) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + if (!isset($this->onceListeners[$event])) { + $this->onceListeners[$event] = []; + } + + $this->onceListeners[$event][] = $listener; + + return $this; + } + + public function removeListener($event, callable $listener) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + if (isset($this->listeners[$event])) { + $index = \array_search($listener, $this->listeners[$event], true); + if (false !== $index) { + unset($this->listeners[$event][$index]); + if (\count($this->listeners[$event]) === 0) { + unset($this->listeners[$event]); + } + } + } + + if (isset($this->onceListeners[$event])) { + $index = \array_search($listener, $this->onceListeners[$event], true); + if (false !== $index) { + unset($this->onceListeners[$event][$index]); + if (\count($this->onceListeners[$event]) === 0) { + unset($this->onceListeners[$event]); + } + } + } + } + + public function removeAllListeners($event = null) + { + if ($event !== null) { + unset($this->listeners[$event]); + } else { + $this->listeners = []; + } + + if ($event !== null) { + unset($this->onceListeners[$event]); + } else { + $this->onceListeners = []; + } + } + + public function listeners($event = null): array + { + if ($event === null) { + $events = []; + $eventNames = \array_unique( + \array_merge(\array_keys($this->listeners), \array_keys($this->onceListeners)) + ); + foreach ($eventNames as $eventName) { + $events[$eventName] = \array_merge( + isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : [], + isset($this->onceListeners[$eventName]) ? $this->onceListeners[$eventName] : [] + ); + } + return $events; + } + + return \array_merge( + isset($this->listeners[$event]) ? $this->listeners[$event] : [], + isset($this->onceListeners[$event]) ? $this->onceListeners[$event] : [] + ); + } + + public function emit($event, array $arguments = []) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + if (isset($this->listeners[$event])) { + foreach ($this->listeners[$event] as $listener) { + $listener(...$arguments); + } + } + + if (isset($this->onceListeners[$event])) { + $listeners = $this->onceListeners[$event]; + unset($this->onceListeners[$event]); + foreach ($listeners as $listener) { + $listener(...$arguments); + } + } + } +} diff --git a/instafeed/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php b/instafeed/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php new file mode 100755 index 0000000..28f3011 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php @@ -0,0 +1,438 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement\Tests; + +use Evenement\EventEmitter; +use InvalidArgumentException; +use PHPUnit\Framework\TestCase; + +class EventEmitterTest extends TestCase +{ + private $emitter; + + public function setUp() + { + $this->emitter = new EventEmitter(); + } + + public function testAddListenerWithLambda() + { + $this->emitter->on('foo', function () {}); + } + + public function testAddListenerWithMethod() + { + $listener = new Listener(); + $this->emitter->on('foo', [$listener, 'onFoo']); + } + + public function testAddListenerWithStaticMethod() + { + $this->emitter->on('bar', ['Evenement\Tests\Listener', 'onBar']); + } + + public function testAddListenerWithInvalidListener() + { + try { + $this->emitter->on('foo', 'not a callable'); + $this->fail(); + } catch (\Exception $e) { + } catch (\TypeError $e) { + } + } + + public function testOnce() + { + $listenerCalled = 0; + + $this->emitter->once('foo', function () use (&$listenerCalled) { + $listenerCalled++; + }); + + $this->assertSame(0, $listenerCalled); + + $this->emitter->emit('foo'); + + $this->assertSame(1, $listenerCalled); + + $this->emitter->emit('foo'); + + $this->assertSame(1, $listenerCalled); + } + + public function testOnceWithArguments() + { + $capturedArgs = []; + + $this->emitter->once('foo', function ($a, $b) use (&$capturedArgs) { + $capturedArgs = array($a, $b); + }); + + $this->emitter->emit('foo', array('a', 'b')); + + $this->assertSame(array('a', 'b'), $capturedArgs); + } + + public function testEmitWithoutArguments() + { + $listenerCalled = false; + + $this->emitter->on('foo', function () use (&$listenerCalled) { + $listenerCalled = true; + }); + + $this->assertSame(false, $listenerCalled); + $this->emitter->emit('foo'); + $this->assertSame(true, $listenerCalled); + } + + public function testEmitWithOneArgument() + { + $test = $this; + + $listenerCalled = false; + + $this->emitter->on('foo', function ($value) use (&$listenerCalled, $test) { + $listenerCalled = true; + + $test->assertSame('bar', $value); + }); + + $this->assertSame(false, $listenerCalled); + $this->emitter->emit('foo', ['bar']); + $this->assertSame(true, $listenerCalled); + } + + public function testEmitWithTwoArguments() + { + $test = $this; + + $listenerCalled = false; + + $this->emitter->on('foo', function ($arg1, $arg2) use (&$listenerCalled, $test) { + $listenerCalled = true; + + $test->assertSame('bar', $arg1); + $test->assertSame('baz', $arg2); + }); + + $this->assertSame(false, $listenerCalled); + $this->emitter->emit('foo', ['bar', 'baz']); + $this->assertSame(true, $listenerCalled); + } + + public function testEmitWithNoListeners() + { + $this->emitter->emit('foo'); + $this->emitter->emit('foo', ['bar']); + $this->emitter->emit('foo', ['bar', 'baz']); + } + + public function testEmitWithTwoListeners() + { + $listenersCalled = 0; + + $this->emitter->on('foo', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->emitter->on('foo', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->assertSame(2, $listenersCalled); + } + + public function testRemoveListenerMatching() + { + $listenersCalled = 0; + + $listener = function () use (&$listenersCalled) { + $listenersCalled++; + }; + + $this->emitter->on('foo', $listener); + $this->emitter->removeListener('foo', $listener); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->assertSame(0, $listenersCalled); + } + + public function testRemoveListenerNotMatching() + { + $listenersCalled = 0; + + $listener = function () use (&$listenersCalled) { + $listenersCalled++; + }; + + $this->emitter->on('foo', $listener); + $this->emitter->removeListener('bar', $listener); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->assertSame(1, $listenersCalled); + } + + public function testRemoveAllListenersMatching() + { + $listenersCalled = 0; + + $this->emitter->on('foo', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->emitter->removeAllListeners('foo'); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->assertSame(0, $listenersCalled); + } + + public function testRemoveAllListenersNotMatching() + { + $listenersCalled = 0; + + $this->emitter->on('foo', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->emitter->removeAllListeners('bar'); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->assertSame(1, $listenersCalled); + } + + public function testRemoveAllListenersWithoutArguments() + { + $listenersCalled = 0; + + $this->emitter->on('foo', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->emitter->on('bar', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->emitter->removeAllListeners(); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->emitter->emit('bar'); + $this->assertSame(0, $listenersCalled); + } + + public function testCallablesClosure() + { + $calledWith = null; + + $this->emitter->on('foo', function ($data) use (&$calledWith) { + $calledWith = $data; + }); + + $this->emitter->emit('foo', ['bar']); + + self::assertSame('bar', $calledWith); + } + + public function testCallablesClass() + { + $listener = new Listener(); + $this->emitter->on('foo', [$listener, 'onFoo']); + + $this->emitter->emit('foo', ['bar']); + + self::assertSame(['bar'], $listener->getData()); + } + + + public function testCallablesClassInvoke() + { + $listener = new Listener(); + $this->emitter->on('foo', $listener); + + $this->emitter->emit('foo', ['bar']); + + self::assertSame(['bar'], $listener->getMagicData()); + } + + public function testCallablesStaticClass() + { + $this->emitter->on('foo', '\Evenement\Tests\Listener::onBar'); + + $this->emitter->emit('foo', ['bar']); + + self::assertSame(['bar'], Listener::getStaticData()); + } + + public function testCallablesFunction() + { + $this->emitter->on('foo', '\Evenement\Tests\setGlobalTestData'); + + $this->emitter->emit('foo', ['bar']); + + self::assertSame('bar', $GLOBALS['evenement-evenement-test-data']); + + unset($GLOBALS['evenement-evenement-test-data']); + } + + public function testListeners() + { + $onA = function () {}; + $onB = function () {}; + $onC = function () {}; + $onceA = function () {}; + $onceB = function () {}; + $onceC = function () {}; + + self::assertCount(0, $this->emitter->listeners('event')); + $this->emitter->on('event', $onA); + self::assertCount(1, $this->emitter->listeners('event')); + self::assertSame([$onA], $this->emitter->listeners('event')); + $this->emitter->once('event', $onceA); + self::assertCount(2, $this->emitter->listeners('event')); + self::assertSame([$onA, $onceA], $this->emitter->listeners('event')); + $this->emitter->once('event', $onceB); + self::assertCount(3, $this->emitter->listeners('event')); + self::assertSame([$onA, $onceA, $onceB], $this->emitter->listeners('event')); + $this->emitter->on('event', $onB); + self::assertCount(4, $this->emitter->listeners('event')); + self::assertSame([$onA, $onB, $onceA, $onceB], $this->emitter->listeners('event')); + $this->emitter->removeListener('event', $onceA); + self::assertCount(3, $this->emitter->listeners('event')); + self::assertSame([$onA, $onB, $onceB], $this->emitter->listeners('event')); + $this->emitter->once('event', $onceC); + self::assertCount(4, $this->emitter->listeners('event')); + self::assertSame([$onA, $onB, $onceB, $onceC], $this->emitter->listeners('event')); + $this->emitter->on('event', $onC); + self::assertCount(5, $this->emitter->listeners('event')); + self::assertSame([$onA, $onB, $onC, $onceB, $onceC], $this->emitter->listeners('event')); + $this->emitter->once('event', $onceA); + self::assertCount(6, $this->emitter->listeners('event')); + self::assertSame([$onA, $onB, $onC, $onceB, $onceC, $onceA], $this->emitter->listeners('event')); + $this->emitter->removeListener('event', $onB); + self::assertCount(5, $this->emitter->listeners('event')); + self::assertSame([$onA, $onC, $onceB, $onceC, $onceA], $this->emitter->listeners('event')); + $this->emitter->emit('event'); + self::assertCount(2, $this->emitter->listeners('event')); + self::assertSame([$onA, $onC], $this->emitter->listeners('event')); + } + + public function testOnceCallIsNotRemovedWhenWorkingOverOnceListeners() + { + $aCalled = false; + $aCallable = function () use (&$aCalled) { + $aCalled = true; + }; + $bCalled = false; + $bCallable = function () use (&$bCalled, $aCallable) { + $bCalled = true; + $this->emitter->once('event', $aCallable); + }; + $this->emitter->once('event', $bCallable); + + self::assertFalse($aCalled); + self::assertFalse($bCalled); + $this->emitter->emit('event'); + + self::assertFalse($aCalled); + self::assertTrue($bCalled); + $this->emitter->emit('event'); + + self::assertTrue($aCalled); + self::assertTrue($bCalled); + } + + public function testEventNameMustBeStringOn() + { + self::expectException(InvalidArgumentException::class); + self::expectExceptionMessage('event name must not be null'); + + $this->emitter->on(null, function () {}); + } + + public function testEventNameMustBeStringOnce() + { + self::expectException(InvalidArgumentException::class); + self::expectExceptionMessage('event name must not be null'); + + $this->emitter->once(null, function () {}); + } + + public function testEventNameMustBeStringRemoveListener() + { + self::expectException(InvalidArgumentException::class); + self::expectExceptionMessage('event name must not be null'); + + $this->emitter->removeListener(null, function () {}); + } + + public function testEventNameMustBeStringEmit() + { + self::expectException(InvalidArgumentException::class); + self::expectExceptionMessage('event name must not be null'); + + $this->emitter->emit(null); + } + + public function testListenersGetAll() + { + $a = function () {}; + $b = function () {}; + $c = function () {}; + $d = function () {}; + + $this->emitter->once('event2', $c); + $this->emitter->on('event', $a); + $this->emitter->once('event', $b); + $this->emitter->on('event', $c); + $this->emitter->once('event', $d); + + self::assertSame( + [ + 'event' => [ + $a, + $c, + $b, + $d, + ], + 'event2' => [ + $c, + ], + ], + $this->emitter->listeners() + ); + } + + public function testOnceNestedCallRegression() + { + $first = 0; + $second = 0; + + $this->emitter->once('event', function () use (&$first, &$second) { + $first++; + $this->emitter->once('event', function () use (&$second) { + $second++; + }); + $this->emitter->emit('event'); + }); + $this->emitter->emit('event'); + + self::assertSame(1, $first); + self::assertSame(1, $second); + } +} diff --git a/instafeed/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php b/instafeed/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php new file mode 100755 index 0000000..df17424 --- /dev/null +++ b/instafeed/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement\Tests; + +class Listener +{ + private $data = []; + + private $magicData = []; + + private static $staticData = []; + + public function onFoo($data) + { + $this->data[] = $data; + } + + public function __invoke($data) + { + $this->magicData[] = $data; + } + + public static function onBar($data) + { + self::$staticData[] = $data; + } + + public function getData() + { + return $this->data; + } + + public function getMagicData() + { + return $this->magicData; + } + + public static function getStaticData() + { + return self::$staticData; + } +} diff --git a/instafeed/vendor/evenement/evenement/tests/Evenement/Tests/functions.php b/instafeed/vendor/evenement/evenement/tests/Evenement/Tests/functions.php new file mode 100755 index 0000000..7f11f5b --- /dev/null +++ b/instafeed/vendor/evenement/evenement/tests/Evenement/Tests/functions.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement\Tests; + +function setGlobalTestData($data) +{ + $GLOBALS['evenement-evenement-test-data'] = $data; +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/.php_cs b/instafeed/vendor/guzzlehttp/guzzle/.php_cs new file mode 100755 index 0000000..a8ace8a --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/.php_cs @@ -0,0 +1,21 @@ +setRiskyAllowed(true) + ->setRules([ + '@PSR2' => true, + 'array_syntax' => ['syntax' => 'short'], + 'declare_strict_types' => false, + 'concat_space' => ['spacing'=>'one'], + // 'ordered_imports' => true, + // 'phpdoc_align' => ['align'=>'vertical'], + // 'native_function_invocation' => true, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->in(__DIR__.'/src') + ->name('*.php') + ) +; + +return $config; diff --git a/instafeed/vendor/guzzlehttp/guzzle/CHANGELOG.md b/instafeed/vendor/guzzlehttp/guzzle/CHANGELOG.md new file mode 100755 index 0000000..6555749 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/CHANGELOG.md @@ -0,0 +1,1304 @@ +# Change Log + +## 6.4.1 - 2019-10-23 + +* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that +* Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar` + +## 6.4.0 - 2019-10-23 + +* Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108) +* Fix: Test if response is readable before returning a summary in `RequestException::getResponseBodySummary()` [#2081](https://github.com/guzzle/guzzle/pull/2081) +* Fix: Add support for GUZZLE_CURL_SELECT_TIMEOUT environment variable [#2161](https://github.com/guzzle/guzzle/pull/2161) +* Improvement: Added `GuzzleHttp\Exception\InvalidArgumentException` [#2163](https://github.com/guzzle/guzzle/pull/2163) +* Improvement: Added `GuzzleHttp\_current_time()` to use `hrtime()` if that function exists. [#2242](https://github.com/guzzle/guzzle/pull/2242) +* Improvement: Added curl's `appconnect_time` in `TransferStats` [#2284](https://github.com/guzzle/guzzle/pull/2284) +* Improvement: Make GuzzleException extend Throwable wherever it's available [#2273](https://github.com/guzzle/guzzle/pull/2273) +* Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335) +* Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362) + +## 6.3.3 - 2018-04-22 + +* Fix: Default headers when decode_content is specified + + +## 6.3.2 - 2018-03-26 + +* Fix: Release process + + +## 6.3.1 - 2018-03-26 + +* Bug fix: Parsing 0 epoch expiry times in cookies [#2014](https://github.com/guzzle/guzzle/pull/2014) +* Improvement: Better ConnectException detection [#2012](https://github.com/guzzle/guzzle/pull/2012) +* Bug fix: Malformed domain that contains a "/" [#1999](https://github.com/guzzle/guzzle/pull/1999) +* Bug fix: Undefined offset when a cookie has no first key-value pair [#1998](https://github.com/guzzle/guzzle/pull/1998) +* Improvement: Support PHPUnit 6 [#1953](https://github.com/guzzle/guzzle/pull/1953) +* Bug fix: Support empty headers [#1915](https://github.com/guzzle/guzzle/pull/1915) +* Bug fix: Ignore case during header modifications [#1916](https://github.com/guzzle/guzzle/pull/1916) + ++ Minor code cleanups, documentation fixes and clarifications. + + +## 6.3.0 - 2017-06-22 + +* Feature: force IP resolution (ipv4 or ipv6) [#1608](https://github.com/guzzle/guzzle/pull/1608), [#1659](https://github.com/guzzle/guzzle/pull/1659) +* Improvement: Don't include summary in exception message when body is empty [#1621](https://github.com/guzzle/guzzle/pull/1621) +* Improvement: Handle `on_headers` option in MockHandler [#1580](https://github.com/guzzle/guzzle/pull/1580) +* Improvement: Added SUSE Linux CA path [#1609](https://github.com/guzzle/guzzle/issues/1609) +* Improvement: Use class reference for getting the name of the class instead of using hardcoded strings [#1641](https://github.com/guzzle/guzzle/pull/1641) +* Feature: Added `read_timeout` option [#1611](https://github.com/guzzle/guzzle/pull/1611) +* Bug fix: PHP 7.x fixes [#1685](https://github.com/guzzle/guzzle/pull/1685), [#1686](https://github.com/guzzle/guzzle/pull/1686), [#1811](https://github.com/guzzle/guzzle/pull/1811) +* Deprecation: BadResponseException instantiation without a response [#1642](https://github.com/guzzle/guzzle/pull/1642) +* Feature: Added NTLM auth [#1569](https://github.com/guzzle/guzzle/pull/1569) +* Feature: Track redirect HTTP status codes [#1711](https://github.com/guzzle/guzzle/pull/1711) +* Improvement: Check handler type during construction [#1745](https://github.com/guzzle/guzzle/pull/1745) +* Improvement: Always include the Content-Length if there's a body [#1721](https://github.com/guzzle/guzzle/pull/1721) +* Feature: Added convenience method to access a cookie by name [#1318](https://github.com/guzzle/guzzle/pull/1318) +* Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684) +* Improvement: Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827) + + ++ Minor code cleanups, documentation fixes and clarifications. + +## 6.2.3 - 2017-02-28 + +* Fix deprecations with guzzle/psr7 version 1.4 + +## 6.2.2 - 2016-10-08 + +* Allow to pass nullable Response to delay callable +* Only add scheme when host is present +* Fix drain case where content-length is the literal string zero +* Obfuscate in-URL credentials in exceptions + +## 6.2.1 - 2016-07-18 + +* Address HTTP_PROXY security vulnerability, CVE-2016-5385: + https://httpoxy.org/ +* Fixing timeout bug with StreamHandler: + https://github.com/guzzle/guzzle/pull/1488 +* Only read up to `Content-Length` in PHP StreamHandler to avoid timeouts when + a server does not honor `Connection: close`. +* Ignore URI fragment when sending requests. + +## 6.2.0 - 2016-03-21 + +* Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`. + https://github.com/guzzle/guzzle/pull/1389 +* Bug fix: Fix sleep calculation when waiting for delayed requests. + https://github.com/guzzle/guzzle/pull/1324 +* Feature: More flexible history containers. + https://github.com/guzzle/guzzle/pull/1373 +* Bug fix: defer sink stream opening in StreamHandler. + https://github.com/guzzle/guzzle/pull/1377 +* Bug fix: do not attempt to escape cookie values. + https://github.com/guzzle/guzzle/pull/1406 +* Feature: report original content encoding and length on decoded responses. + https://github.com/guzzle/guzzle/pull/1409 +* Bug fix: rewind seekable request bodies before dispatching to cURL. + https://github.com/guzzle/guzzle/pull/1422 +* Bug fix: provide an empty string to `http_build_query` for HHVM workaround. + https://github.com/guzzle/guzzle/pull/1367 + +## 6.1.1 - 2015-11-22 + +* Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler + https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f63e4e4 +* Feature: HandlerStack is now more generic. + https://github.com/guzzle/guzzle/commit/f2102941331cda544745eedd97fc8fd46e1ee33e +* Bug fix: setting verify to false in the StreamHandler now disables peer + verification. https://github.com/guzzle/guzzle/issues/1256 +* Feature: Middleware now uses an exception factory, including more error + context. https://github.com/guzzle/guzzle/pull/1282 +* Feature: better support for disabled functions. + https://github.com/guzzle/guzzle/pull/1287 +* Bug fix: fixed regression where MockHandler was not using `sink`. + https://github.com/guzzle/guzzle/pull/1292 + +## 6.1.0 - 2015-09-08 + +* Feature: Added the `on_stats` request option to provide access to transfer + statistics for requests. https://github.com/guzzle/guzzle/pull/1202 +* Feature: Added the ability to persist session cookies in CookieJars. + https://github.com/guzzle/guzzle/pull/1195 +* Feature: Some compatibility updates for Google APP Engine + https://github.com/guzzle/guzzle/pull/1216 +* Feature: Added support for NO_PROXY to prevent the use of a proxy based on + a simple set of rules. https://github.com/guzzle/guzzle/pull/1197 +* Feature: Cookies can now contain square brackets. + https://github.com/guzzle/guzzle/pull/1237 +* Bug fix: Now correctly parsing `=` inside of quotes in Cookies. + https://github.com/guzzle/guzzle/pull/1232 +* Bug fix: Cusotm cURL options now correctly override curl options of the + same name. https://github.com/guzzle/guzzle/pull/1221 +* Bug fix: Content-Type header is now added when using an explicitly provided + multipart body. https://github.com/guzzle/guzzle/pull/1218 +* Bug fix: Now ignoring Set-Cookie headers that have no name. +* Bug fix: Reason phrase is no longer cast to an int in some cases in the + cURL handler. https://github.com/guzzle/guzzle/pull/1187 +* Bug fix: Remove the Authorization header when redirecting if the Host + header changes. https://github.com/guzzle/guzzle/pull/1207 +* Bug fix: Cookie path matching fixes + https://github.com/guzzle/guzzle/issues/1129 +* Bug fix: Fixing the cURL `body_as_string` setting + https://github.com/guzzle/guzzle/pull/1201 +* Bug fix: quotes are no longer stripped when parsing cookies. + https://github.com/guzzle/guzzle/issues/1172 +* Bug fix: `form_params` and `query` now always uses the `&` separator. + https://github.com/guzzle/guzzle/pull/1163 +* Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set. + https://github.com/guzzle/guzzle/pull/1189 + +## 6.0.2 - 2015-07-04 + +* Fixed a memory leak in the curl handlers in which references to callbacks + were not being removed by `curl_reset`. +* Cookies are now extracted properly before redirects. +* Cookies now allow more character ranges. +* Decoded Content-Encoding responses are now modified to correctly reflect + their state if the encoding was automatically removed by a handler. This + means that the `Content-Encoding` header may be removed an the + `Content-Length` modified to reflect the message size after removing the + encoding. +* Added a more explicit error message when trying to use `form_params` and + `multipart` in the same request. +* Several fixes for HHVM support. +* Functions are now conditionally required using an additional level of + indirection to help with global Composer installations. + +## 6.0.1 - 2015-05-27 + +* Fixed a bug with serializing the `query` request option where the `&` + separator was missing. +* Added a better error message for when `body` is provided as an array. Please + use `form_params` or `multipart` instead. +* Various doc fixes. + +## 6.0.0 - 2015-05-26 + +* See the UPGRADING.md document for more information. +* Added `multipart` and `form_params` request options. +* Added `synchronous` request option. +* Added the `on_headers` request option. +* Fixed `expect` handling. +* No longer adding default middlewares in the client ctor. These need to be + present on the provided handler in order to work. +* Requests are no longer initiated when sending async requests with the + CurlMultiHandler. This prevents unexpected recursion from requests completing + while ticking the cURL loop. +* Removed the semantics of setting `default` to `true`. This is no longer + required now that the cURL loop is not ticked for async requests. +* Added request and response logging middleware. +* No longer allowing self signed certificates when using the StreamHandler. +* Ensuring that `sink` is valid if saving to a file. +* Request exceptions now include a "handler context" which provides handler + specific contextual information. +* Added `GuzzleHttp\RequestOptions` to allow request options to be applied + using constants. +* `$maxHandles` has been removed from CurlMultiHandler. +* `MultipartPostBody` is now part of the `guzzlehttp/psr7` package. + +## 5.3.0 - 2015-05-19 + +* Mock now supports `save_to` +* Marked `AbstractRequestEvent::getTransaction()` as public. +* Fixed a bug in which multiple headers using different casing would overwrite + previous headers in the associative array. +* Added `Utils::getDefaultHandler()` +* Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated. +* URL scheme is now always lowercased. + +## 6.0.0-beta.1 + +* Requires PHP >= 5.5 +* Updated to use PSR-7 + * Requires immutable messages, which basically means an event based system + owned by a request instance is no longer possible. + * Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7). + * Removed the dependency on `guzzlehttp/streams`. These stream abstractions + are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\Psr7` + namespace. +* Added middleware and handler system + * Replaced the Guzzle event and subscriber system with a middleware system. + * No longer depends on RingPHP, but rather places the HTTP handlers directly + in Guzzle, operating on PSR-7 messages. + * Retry logic is now encapsulated in `GuzzleHttp\Middleware::retry`, which + means the `guzzlehttp/retry-subscriber` is now obsolete. + * Mocking responses is now handled using `GuzzleHttp\Handler\MockHandler`. +* Asynchronous responses + * No longer supports the `future` request option to send an async request. + Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`, + `getAsync`, etc.). + * Utilizing `GuzzleHttp\Promise` instead of React's promise library to avoid + recursion required by chaining and forwarding react promises. See + https://github.com/guzzle/promises + * Added `requestAsync` and `sendAsync` to send request asynchronously. + * Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests + asynchronously. +* Request options + * POST and form updates + * Added the `form_fields` and `form_files` request options. + * Removed the `GuzzleHttp\Post` namespace. + * The `body` request option no longer accepts an array for POST requests. + * The `exceptions` request option has been deprecated in favor of the + `http_errors` request options. + * The `save_to` request option has been deprecated in favor of `sink` request + option. +* Clients no longer accept an array of URI template string and variables for + URI variables. You will need to expand URI templates before passing them + into a client constructor or request method. +* Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are + now magic methods that will send synchronous requests. +* Replaced `Utils.php` with plain functions in `functions.php`. +* Removed `GuzzleHttp\Collection`. +* Removed `GuzzleHttp\BatchResults`. Batched pool results are now returned as + an array. +* Removed `GuzzleHttp\Query`. Query string handling is now handled using an + associative array passed into the `query` request option. The query string + is serialized using PHP's `http_build_query`. If you need more control, you + can pass the query string in as a string. +* `GuzzleHttp\QueryParser` has been replaced with the + `GuzzleHttp\Psr7\parse_query`. + +## 5.2.0 - 2015-01-27 + +* Added `AppliesHeadersInterface` to make applying headers to a request based + on the body more generic and not specific to `PostBodyInterface`. +* Reduced the number of stack frames needed to send requests. +* Nested futures are now resolved in the client rather than the RequestFsm +* Finishing state transitions is now handled in the RequestFsm rather than the + RingBridge. +* Added a guard in the Pool class to not use recursion for request retries. + +## 5.1.0 - 2014-12-19 + +* Pool class no longer uses recursion when a request is intercepted. +* The size of a Pool can now be dynamically adjusted using a callback. + See https://github.com/guzzle/guzzle/pull/943. +* Setting a request option to `null` when creating a request with a client will + ensure that the option is not set. This allows you to overwrite default + request options on a per-request basis. + See https://github.com/guzzle/guzzle/pull/937. +* Added the ability to limit which protocols are allowed for redirects by + specifying a `protocols` array in the `allow_redirects` request option. +* Nested futures due to retries are now resolved when waiting for synchronous + responses. See https://github.com/guzzle/guzzle/pull/947. +* `"0"` is now an allowed URI path. See + https://github.com/guzzle/guzzle/pull/935. +* `Query` no longer typehints on the `$query` argument in the constructor, + allowing for strings and arrays. +* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle + specific exceptions if necessary. + +## 5.0.3 - 2014-11-03 + +This change updates query strings so that they are treated as un-encoded values +by default where the value represents an un-encoded value to send over the +wire. A Query object then encodes the value before sending over the wire. This +means that even value query string values (e.g., ":") are url encoded. This +makes the Query class match PHP's http_build_query function. However, if you +want to send requests over the wire using valid query string characters that do +not need to be encoded, then you can provide a string to Url::setQuery() and +pass true as the second argument to specify that the query string is a raw +string that should not be parsed or encoded (unless a call to getQuery() is +subsequently made, forcing the query-string to be converted into a Query +object). + +## 5.0.2 - 2014-10-30 + +* Added a trailing `\r\n` to multipart/form-data payloads. See + https://github.com/guzzle/guzzle/pull/871 +* Added a `GuzzleHttp\Pool::send()` convenience method to match the docs. +* Status codes are now returned as integers. See + https://github.com/guzzle/guzzle/issues/881 +* No longer overwriting an existing `application/x-www-form-urlencoded` header + when sending POST requests, allowing for customized headers. See + https://github.com/guzzle/guzzle/issues/877 +* Improved path URL serialization. + + * No longer double percent-encoding characters in the path or query string if + they are already encoded. + * Now properly encoding the supplied path to a URL object, instead of only + encoding ' ' and '?'. + * Note: This has been changed in 5.0.3 to now encode query string values by + default unless the `rawString` argument is provided when setting the query + string on a URL: Now allowing many more characters to be present in the + query string without being percent encoded. See http://tools.ietf.org/html/rfc3986#appendix-A + +## 5.0.1 - 2014-10-16 + +Bugfix release. + +* Fixed an issue where connection errors still returned response object in + error and end events event though the response is unusable. This has been + corrected so that a response is not returned in the `getResponse` method of + these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867 +* Fixed an issue where transfer statistics were not being populated in the + RingBridge. https://github.com/guzzle/guzzle/issues/866 + +## 5.0.0 - 2014-10-12 + +Adding support for non-blocking responses and some minor API cleanup. + +### New Features + +* Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`. +* Added a public API for creating a default HTTP adapter. +* Updated the redirect plugin to be non-blocking so that redirects are sent + concurrently. Other plugins like this can now be updated to be non-blocking. +* Added a "progress" event so that you can get upload and download progress + events. +* Added `GuzzleHttp\Pool` which implements FutureInterface and transfers + requests concurrently using a capped pool size as efficiently as possible. +* Added `hasListeners()` to EmitterInterface. +* Removed `GuzzleHttp\ClientInterface::sendAll` and marked + `GuzzleHttp\Client::sendAll` as deprecated (it's still there, just not the + recommended way). + +### Breaking changes + +The breaking changes in this release are relatively minor. The biggest thing to +look out for is that request and response objects no longer implement fluent +interfaces. + +* Removed the fluent interfaces (i.e., `return $this`) from requests, + responses, `GuzzleHttp\Collection`, `GuzzleHttp\Url`, + `GuzzleHttp\Query`, `GuzzleHttp\Post\PostBody`, and + `GuzzleHttp\Cookie\SetCookie`. This blog post provides a good outline of + why I did this: http://ocramius.github.io/blog/fluent-interfaces-are-evil/. + This also makes the Guzzle message interfaces compatible with the current + PSR-7 message proposal. +* Removed "functions.php", so that Guzzle is truly PSR-4 compliant. Except + for the HTTP request functions from function.php, these functions are now + implemented in `GuzzleHttp\Utils` using camelCase. `GuzzleHttp\json_decode` + moved to `GuzzleHttp\Utils::jsonDecode`. `GuzzleHttp\get_path` moved to + `GuzzleHttp\Utils::getPath`. `GuzzleHttp\set_path` moved to + `GuzzleHttp\Utils::setPath`. `GuzzleHttp\batch` should now be + `GuzzleHttp\Pool::batch`, which returns an `objectStorage`. Using functions.php + caused problems for many users: they aren't PSR-4 compliant, require an + explicit include, and needed an if-guard to ensure that the functions are not + declared multiple times. +* Rewrote adapter layer. + * Removing all classes from `GuzzleHttp\Adapter`, these are now + implemented as callables that are stored in `GuzzleHttp\Ring\Client`. + * Removed the concept of "parallel adapters". Sending requests serially or + concurrently is now handled using a single adapter. + * Moved `GuzzleHttp\Adapter\Transaction` to `GuzzleHttp\Transaction`. The + Transaction object now exposes the request, response, and client as public + properties. The getters and setters have been removed. +* Removed the "headers" event. This event was only useful for changing the + body a response once the headers of the response were known. You can implement + a similar behavior in a number of ways. One example might be to use a + FnStream that has access to the transaction being sent. For example, when the + first byte is written, you could check if the response headers match your + expectations, and if so, change the actual stream body that is being + written to. +* Removed the `asArray` parameter from + `GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header + value as an array, then use the newly added `getHeaderAsArray()` method of + `MessageInterface`. This change makes the Guzzle interfaces compatible with + the PSR-7 interfaces. +* `GuzzleHttp\Message\MessageFactory` no longer allows subclasses to add + custom request options using double-dispatch (this was an implementation + detail). Instead, you should now provide an associative array to the + constructor which is a mapping of the request option name mapping to a + function that applies the option value to a request. +* Removed the concept of "throwImmediately" from exceptions and error events. + This control mechanism was used to stop a transfer of concurrent requests + from completing. This can now be handled by throwing the exception or by + cancelling a pool of requests or each outstanding future request individually. +* Updated to "GuzzleHttp\Streams" 3.0. + * `GuzzleHttp\Stream\StreamInterface::getContents()` no longer accepts a + `maxLen` parameter. This update makes the Guzzle streams project + compatible with the current PSR-7 proposal. + * `GuzzleHttp\Stream\Stream::__construct`, + `GuzzleHttp\Stream\Stream::factory`, and + `GuzzleHttp\Stream\Utils::create` no longer accept a size in the second + argument. They now accept an associative array of options, including the + "size" key and "metadata" key which can be used to provide custom metadata. + +## 4.2.2 - 2014-09-08 + +* Fixed a memory leak in the CurlAdapter when reusing cURL handles. +* No longer using `request_fulluri` in stream adapter proxies. +* Relative redirects are now based on the last response, not the first response. + +## 4.2.1 - 2014-08-19 + +* Ensuring that the StreamAdapter does not always add a Content-Type header +* Adding automated github releases with a phar and zip + +## 4.2.0 - 2014-08-17 + +* Now merging in default options using a case-insensitive comparison. + Closes https://github.com/guzzle/guzzle/issues/767 +* Added the ability to automatically decode `Content-Encoding` response bodies + using the `decode_content` request option. This is set to `true` by default + to decode the response body if it comes over the wire with a + `Content-Encoding`. Set this value to `false` to disable decoding the + response content, and pass a string to provide a request `Accept-Encoding` + header and turn on automatic response decoding. This feature now allows you + to pass an `Accept-Encoding` header in the headers of a request but still + disable automatic response decoding. + Closes https://github.com/guzzle/guzzle/issues/764 +* Added the ability to throw an exception immediately when transferring + requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760 +* Updating guzzlehttp/streams dependency to ~2.1 +* No longer utilizing the now deprecated namespaced methods from the stream + package. + +## 4.1.8 - 2014-08-14 + +* Fixed an issue in the CurlFactory that caused setting the `stream=false` + request option to throw an exception. + See: https://github.com/guzzle/guzzle/issues/769 +* TransactionIterator now calls rewind on the inner iterator. + See: https://github.com/guzzle/guzzle/pull/765 +* You can now set the `Content-Type` header to `multipart/form-data` + when creating POST requests to force multipart bodies. + See https://github.com/guzzle/guzzle/issues/768 + +## 4.1.7 - 2014-08-07 + +* Fixed an error in the HistoryPlugin that caused the same request and response + to be logged multiple times when an HTTP protocol error occurs. +* Ensuring that cURL does not add a default Content-Type when no Content-Type + has been supplied by the user. This prevents the adapter layer from modifying + the request that is sent over the wire after any listeners may have already + put the request in a desired state (e.g., signed the request). +* Throwing an exception when you attempt to send requests that have the + "stream" set to true in parallel using the MultiAdapter. +* Only calling curl_multi_select when there are active cURL handles. This was + previously changed and caused performance problems on some systems due to PHP + always selecting until the maximum select timeout. +* Fixed a bug where multipart/form-data POST fields were not correctly + aggregated (e.g., values with "&"). + +## 4.1.6 - 2014-08-03 + +* Added helper methods to make it easier to represent messages as strings, + including getting the start line and getting headers as a string. + +## 4.1.5 - 2014-08-02 + +* Automatically retrying cURL "Connection died, retrying a fresh connect" + errors when possible. +* cURL implementation cleanup +* Allowing multiple event subscriber listeners to be registered per event by + passing an array of arrays of listener configuration. + +## 4.1.4 - 2014-07-22 + +* Fixed a bug that caused multi-part POST requests with more than one field to + serialize incorrectly. +* Paths can now be set to "0" +* `ResponseInterface::xml` now accepts a `libxml_options` option and added a + missing default argument that was required when parsing XML response bodies. +* A `save_to` stream is now created lazily, which means that files are not + created on disk unless a request succeeds. + +## 4.1.3 - 2014-07-15 + +* Various fixes to multipart/form-data POST uploads +* Wrapping function.php in an if-statement to ensure Guzzle can be used + globally and in a Composer install +* Fixed an issue with generating and merging in events to an event array +* POST headers are only applied before sending a request to allow you to change + the query aggregator used before uploading +* Added much more robust query string parsing +* Fixed various parsing and normalization issues with URLs +* Fixing an issue where multi-valued headers were not being utilized correctly + in the StreamAdapter + +## 4.1.2 - 2014-06-18 + +* Added support for sending payloads with GET requests + +## 4.1.1 - 2014-06-08 + +* Fixed an issue related to using custom message factory options in subclasses +* Fixed an issue with nested form fields in a multi-part POST +* Fixed an issue with using the `json` request option for POST requests +* Added `ToArrayInterface` to `GuzzleHttp\Cookie\CookieJar` + +## 4.1.0 - 2014-05-27 + +* Added a `json` request option to easily serialize JSON payloads. +* Added a `GuzzleHttp\json_decode()` wrapper to safely parse JSON. +* Added `setPort()` and `getPort()` to `GuzzleHttp\Message\RequestInterface`. +* Added the ability to provide an emitter to a client in the client constructor. +* Added the ability to persist a cookie session using $_SESSION. +* Added a trait that can be used to add event listeners to an iterator. +* Removed request method constants from RequestInterface. +* Fixed warning when invalid request start-lines are received. +* Updated MessageFactory to work with custom request option methods. +* Updated cacert bundle to latest build. + +4.0.2 (2014-04-16) +------------------ + +* Proxy requests using the StreamAdapter now properly use request_fulluri (#632) +* Added the ability to set scalars as POST fields (#628) + +## 4.0.1 - 2014-04-04 + +* The HTTP status code of a response is now set as the exception code of + RequestException objects. +* 303 redirects will now correctly switch from POST to GET requests. +* The default parallel adapter of a client now correctly uses the MultiAdapter. +* HasDataTrait now initializes the internal data array as an empty array so + that the toArray() method always returns an array. + +## 4.0.0 - 2014-03-29 + +* For more information on the 4.0 transition, see: + http://mtdowling.com/blog/2014/03/15/guzzle-4-rc/ +* For information on changes and upgrading, see: + https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 +* Added `GuzzleHttp\batch()` as a convenience function for sending requests in + parallel without needing to write asynchronous code. +* Restructured how events are added to `GuzzleHttp\ClientInterface::sendAll()`. + You can now pass a callable or an array of associative arrays where each + associative array contains the "fn", "priority", and "once" keys. + +## 4.0.0.rc-2 - 2014-03-25 + +* Removed `getConfig()` and `setConfig()` from clients to avoid confusion + around whether things like base_url, message_factory, etc. should be able to + be retrieved or modified. +* Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface +* functions.php functions were renamed using snake_case to match PHP idioms +* Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and + `GUZZLE_CURL_SELECT_TIMEOUT` environment variables +* Added the ability to specify custom `sendAll()` event priorities +* Added the ability to specify custom stream context options to the stream + adapter. +* Added a functions.php function for `get_path()` and `set_path()` +* CurlAdapter and MultiAdapter now use a callable to generate curl resources +* MockAdapter now properly reads a body and emits a `headers` event +* Updated Url class to check if a scheme and host are set before adding ":" + and "//". This allows empty Url (e.g., "") to be serialized as "". +* Parsing invalid XML no longer emits warnings +* Curl classes now properly throw AdapterExceptions +* Various performance optimizations +* Streams are created with the faster `Stream\create()` function +* Marked deprecation_proxy() as internal +* Test server is now a collection of static methods on a class + +## 4.0.0-rc.1 - 2014-03-15 + +* See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 + +## 3.8.1 - 2014-01-28 + +* Bug: Always using GET requests when redirecting from a 303 response +* Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in + `Guzzle\Http\ClientInterface::setSslVerification()` +* Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL +* Bug: The body of a request can now be set to `"0"` +* Sending PHP stream requests no longer forces `HTTP/1.0` +* Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of + each sub-exception +* Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than + clobbering everything). +* Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators) +* Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`. + For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`. +* Now properly escaping the regular expression delimiter when matching Cookie domains. +* Network access is now disabled when loading XML documents + +## 3.8.0 - 2013-12-05 + +* Added the ability to define a POST name for a file +* JSON response parsing now properly walks additionalProperties +* cURL error code 18 is now retried automatically in the BackoffPlugin +* Fixed a cURL error when URLs contain fragments +* Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were + CurlExceptions +* CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e) +* Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS` +* Fixed a bug that was encountered when parsing empty header parameters +* UriTemplate now has a `setRegex()` method to match the docs +* The `debug` request parameter now checks if it is truthy rather than if it exists +* Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin +* Added the ability to combine URLs using strict RFC 3986 compliance +* Command objects can now return the validation errors encountered by the command +* Various fixes to cache revalidation (#437 and 29797e5) +* Various fixes to the AsyncPlugin +* Cleaned up build scripts + +## 3.7.4 - 2013-10-02 + +* Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430) +* Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp + (see https://github.com/aws/aws-sdk-php/issues/147) +* Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots +* Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420) +* Updated the bundled cacert.pem (#419) +* OauthPlugin now supports adding authentication to headers or query string (#425) + +## 3.7.3 - 2013-09-08 + +* Added the ability to get the exception associated with a request/command when using `MultiTransferException` and + `CommandTransferException`. +* Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description +* Schemas are only injected into response models when explicitly configured. +* No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of + an EntityBody. +* Bug fix: ChunkedIterator can now properly chunk a \Traversable as well as an \Iterator. +* Bug fix: FilterIterator now relies on `\Iterator` instead of `\Traversable`. +* Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody() +* Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin +* Bug fix: Visiting XML attributes first before visiting XML children when serializing requests +* Bug fix: Properly parsing headers that contain commas contained in quotes +* Bug fix: mimetype guessing based on a filename is now case-insensitive + +## 3.7.2 - 2013-08-02 + +* Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander + See https://github.com/guzzle/guzzle/issues/371 +* Bug fix: Cookie domains are now matched correctly according to RFC 6265 + See https://github.com/guzzle/guzzle/issues/377 +* Bug fix: GET parameters are now used when calculating an OAuth signature +* Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted +* `Guzzle\Common\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched +* `Guzzle\Http\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input. + See https://github.com/guzzle/guzzle/issues/379 +* Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See + https://github.com/guzzle/guzzle/pull/380 +* cURL multi cleanup and optimizations + +## 3.7.1 - 2013-07-05 + +* Bug fix: Setting default options on a client now works +* Bug fix: Setting options on HEAD requests now works. See #352 +* Bug fix: Moving stream factory before send event to before building the stream. See #353 +* Bug fix: Cookies no longer match on IP addresses per RFC 6265 +* Bug fix: Correctly parsing header parameters that are in `<>` and quotes +* Added `cert` and `ssl_key` as request options +* `Host` header can now diverge from the host part of a URL if the header is set manually +* `Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter +* OAuth parameters are only added via the plugin if they aren't already set +* Exceptions are now thrown when a URL cannot be parsed +* Returning `false` if `Guzzle\Http\EntityBody::getContentMd5()` fails +* Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin + +## 3.7.0 - 2013-06-10 + +* See UPGRADING.md for more information on how to upgrade. +* Requests now support the ability to specify an array of $options when creating a request to more easily modify a + request. You can pass a 'request.options' configuration setting to a client to apply default request options to + every request created by a client (e.g. default query string variables, headers, curl options, etc.). +* Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\Guzzle`. + See `Guzzle\Http\StaticClient::mount`. +* Added `command.request_options` to `Guzzle\Service\Command\AbstractCommand` to pass request options to requests + created by a command (e.g. custom headers, query string variables, timeout settings, etc.). +* Stream size in `Guzzle\Stream\PhpStreamRequestFactory` will now be set if Content-Length is returned in the + headers of a response +* Added `Guzzle\Common\Collection::setPath($path, $value)` to set a value into an array using a nested key + (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`) +* ServiceBuilders now support storing and retrieving arbitrary data +* CachePlugin can now purge all resources for a given URI +* CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource +* CachePlugin now uses the Vary header to determine if a resource is a cache hit +* `Guzzle\Http\Message\Response` now implements `\Serializable` +* Added `Guzzle\Cache\CacheAdapterFactory::fromCache()` to more easily create cache adapters +* `Guzzle\Service\ClientInterface::execute()` now accepts an array, single command, or Traversable +* Fixed a bug in `Guzzle\Http\Message\Header\Link::addLink()` +* Better handling of calculating the size of a stream in `Guzzle\Stream\Stream` using fstat() and caching the size +* `Guzzle\Common\Exception\ExceptionCollection` now creates a more readable exception message +* Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older + Symfony users can still use the old version of Monolog. +* Fixing BC break: Added the implementation back in for `Guzzle\Http\Message\AbstractMessage::getTokenizedHeader()`. + Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`. +* Several performance improvements to `Guzzle\Common\Collection` +* Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: + createRequest, head, delete, put, patch, post, options, prepareRequest +* Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` +* Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` +* Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to + `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a + resource, string, or EntityBody into the $options parameter to specify the download location of the response. +* Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a + default `array()` +* Added `Guzzle\Stream\StreamInterface::isRepeatable` +* Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use + $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or + $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`. +* Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`. +* Removed `Guzzle\Http\ClientInterface::expandTemplate()` +* Removed `Guzzle\Http\ClientInterface::setRequestFactory()` +* Removed `Guzzle\Http\ClientInterface::getCurlMulti()` +* Removed `Guzzle\Http\Message\RequestInterface::canCache` +* Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect` +* Removed `Guzzle\Http\Message\RequestInterface::isRedirect` +* Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. +* You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting + `Guzzle\Common\Version::$emitWarnings` to true. +* Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use + `$request->getResponseBody()->isRepeatable()` instead. +* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use + `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use + `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +* Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. +* Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. +* Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated +* Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. + These will work through Guzzle 4.0 +* Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use [request.options][params]. +* Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. +* Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`. +* Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. +* Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. +* Marked `Guzzle\Common\Collection::inject()` as deprecated. +* Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');` +* CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a + CacheStorageInterface. These two objects and interface will be removed in a future version. +* Always setting X-cache headers on cached responses +* Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin +* `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface + $request, Response $response);` +* `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` +* `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` +* Added `CacheStorageInterface::purge($url)` +* `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin + $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, + CanCacheStrategyInterface $canCache = null)` +* Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` + +## 3.6.0 - 2013-05-29 + +* ServiceDescription now implements ToArrayInterface +* Added command.hidden_params to blacklist certain headers from being treated as additionalParameters +* Guzzle can now correctly parse incomplete URLs +* Mixed casing of headers are now forced to be a single consistent casing across all values for that header. +* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution +* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). +* Specific header implementations can be created for complex headers. When a message creates a header, it uses a + HeaderFactory which can map specific headers to specific header classes. There is now a Link header and + CacheControl header implementation. +* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate +* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() +* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in + Guzzle\Http\Curl\RequestMediator +* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. +* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface +* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() +* Removed Guzzle\Parser\ParserRegister::get(). Use getParser() +* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). +* All response header helper functions return a string rather than mixing Header objects and strings inconsistently +* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle + directly via interfaces +* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist + but are a no-op until removed. +* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a + `Guzzle\Service\Command\ArrayCommandInterface`. +* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response + on a request while the request is still being transferred +* The ability to case-insensitively search for header values +* Guzzle\Http\Message\Header::hasExactHeader +* Guzzle\Http\Message\Header::raw. Use getAll() +* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object + instead. +* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess +* Added the ability to cast Model objects to a string to view debug information. + +## 3.5.0 - 2013-05-13 + +* Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times +* Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove + itself from the EventDispatcher) +* Bug: `Guzzle\Log\MessageFormatter` now properly writes "total_time" and "connect_time" values +* Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too +* Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a + non-existent key +* Bug: All __call() method arguments are now required (helps with mocking frameworks) +* Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference + to help with refcount based garbage collection of resources created by sending a request +* Deprecating ZF1 cache and log adapters. These will be removed in the next major version. +* Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the + HistoryPlugin for a history. +* Added a `responseBody` alias for the `response_body` location +* Refactored internals to no longer rely on Response::getRequest() +* HistoryPlugin can now be cast to a string +* HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests + and responses that are sent over the wire +* Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects + +## 3.4.3 - 2013-04-30 + +* Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response +* Added a check to re-extract the temp cacert bundle from the phar before sending each request + +## 3.4.2 - 2013-04-29 + +* Bug fix: Stream objects now work correctly with "a" and "a+" modes +* Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present +* Bug fix: AsyncPlugin no longer forces HEAD requests +* Bug fix: DateTime timezones are now properly handled when using the service description schema formatter +* Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails +* Setting a response on a request will write to the custom request body from the response body if one is specified +* LogPlugin now writes to php://output when STDERR is undefined +* Added the ability to set multiple POST files for the same key in a single call +* application/x-www-form-urlencoded POSTs now use the utf-8 charset by default +* Added the ability to queue CurlExceptions to the MockPlugin +* Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send) +* Configuration loading now allows remote files + +## 3.4.1 - 2013-04-16 + +* Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti + handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost. +* Exceptions are now properly grouped when sending requests in parallel +* Redirects are now properly aggregated when a multi transaction fails +* Redirects now set the response on the original object even in the event of a failure +* Bug fix: Model names are now properly set even when using $refs +* Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax +* Added support for oauth_callback in OAuth signatures +* Added support for oauth_verifier in OAuth signatures +* Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection + +## 3.4.0 - 2013-04-11 + +* Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289 +* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289 +* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263 +* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264. +* Bug fix: Added `number` type to service descriptions. +* Bug fix: empty parameters are removed from an OAuth signature +* Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header +* Bug fix: Fixed "array to string" error when validating a union of types in a service description +* Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream +* Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin. +* Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs. +* The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections. +* Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if + the Content-Type can be determined based on the entity body or the path of the request. +* Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder. +* Added support for a PSR-3 LogAdapter. +* Added a `command.after_prepare` event +* Added `oauth_callback` parameter to the OauthPlugin +* Added the ability to create a custom stream class when using a stream factory +* Added a CachingEntityBody decorator +* Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized. +* The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar. +* You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies +* POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This + means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use + POST fields or files (the latter is only used when emulating a form POST in the browser). +* Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest + +## 3.3.1 - 2013-03-10 + +* Added the ability to create PHP streaming responses from HTTP requests +* Bug fix: Running any filters when parsing response headers with service descriptions +* Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing +* Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across + response location visitors. +* Bug fix: Removed the possibility of creating configuration files with circular dependencies +* RequestFactory::create() now uses the key of a POST file when setting the POST file name +* Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set + +## 3.3.0 - 2013-03-03 + +* A large number of performance optimizations have been made +* Bug fix: Added 'wb' as a valid write mode for streams +* Bug fix: `Guzzle\Http\Message\Response::json()` now allows scalar values to be returned +* Bug fix: Fixed bug in `Guzzle\Http\Message\Response` where wrapping quotes were stripped from `getEtag()` +* BC: Removed `Guzzle\Http\Utils` class +* BC: Setting a service description on a client will no longer modify the client's command factories. +* BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using + the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' +* BC: `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to + lowercase +* Operation parameter objects are now lazy loaded internally +* Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses +* Added support for instantiating responseType=class responseClass classes. Classes must implement + `Guzzle\Service\Command\ResponseClassInterface` +* Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These + additional properties also support locations and can be used to parse JSON responses where the outermost part of the + JSON is an array +* Added support for nested renaming of JSON models (rename sentAs to name) +* CachePlugin + * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error + * Debug headers can now added to cached response in the CachePlugin + +## 3.2.0 - 2013-02-14 + +* CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients. +* URLs with no path no longer contain a "/" by default +* Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url. +* BadResponseException no longer includes the full request and response message +* Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface +* Adding getResponseBody() to Guzzle\Http\Message\RequestInterface +* Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription +* Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list +* xmlEncoding can now be customized for the XML declaration of a XML service description operation +* Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value + aggregation and no longer uses callbacks +* The URL encoding implementation of Guzzle\Http\QueryString can now be customized +* Bug fix: Filters were not always invoked for array service description parameters +* Bug fix: Redirects now use a target response body rather than a temporary response body +* Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded +* Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives + +## 3.1.2 - 2013-01-27 + +* Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the + response body. For example, the XmlVisitor now parses the XML response into an array in the before() method. +* Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent +* CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444) +* Fixed a bug where redirect responses were not chained correctly using getPreviousResponse() +* Setting default headers on a client after setting the user-agent will not erase the user-agent setting + +## 3.1.1 - 2013-01-20 + +* Adding wildcard support to Guzzle\Common\Collection::getPath() +* Adding alias support to ServiceBuilder configs +* Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface + +## 3.1.0 - 2013-01-12 + +* BC: CurlException now extends from RequestException rather than BadResponseException +* BC: Renamed Guzzle\Plugin\Cache\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse() +* Added getData to ServiceDescriptionInterface +* Added context array to RequestInterface::setState() +* Bug: Removing hard dependency on the BackoffPlugin from Guzzle\Http +* Bug: Adding required content-type when JSON request visitor adds JSON to a command +* Bug: Fixing the serialization of a service description with custom data +* Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing + an array of successful and failed responses +* Moved getPath from Guzzle\Service\Resource\Model to Guzzle\Common\Collection +* Added Guzzle\Http\IoEmittingEntityBody +* Moved command filtration from validators to location visitors +* Added `extends` attributes to service description parameters +* Added getModels to ServiceDescriptionInterface + +## 3.0.7 - 2012-12-19 + +* Fixing phar detection when forcing a cacert to system if null or true +* Allowing filename to be passed to `Guzzle\Http\Message\Request::setResponseBody()` +* Cleaning up `Guzzle\Common\Collection::inject` method +* Adding a response_body location to service descriptions + +## 3.0.6 - 2012-12-09 + +* CurlMulti performance improvements +* Adding setErrorResponses() to Operation +* composer.json tweaks + +## 3.0.5 - 2012-11-18 + +* Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin +* Bug: Response body can now be a string containing "0" +* Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert +* Bug: QueryString::fromString now properly parses query string parameters that contain equal signs +* Added support for XML attributes in service description responses +* DefaultRequestSerializer now supports array URI parameter values for URI template expansion +* Added better mimetype guessing to requests and post files + +## 3.0.4 - 2012-11-11 + +* Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value +* Bug: Cookies can now be added that have a name, domain, or value set to "0" +* Bug: Using the system cacert bundle when using the Phar +* Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures +* Enhanced cookie jar de-duplication +* Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added +* Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies +* Added the ability to create any sort of hash for a stream rather than just an MD5 hash + +## 3.0.3 - 2012-11-04 + +* Implementing redirects in PHP rather than cURL +* Added PECL URI template extension and using as default parser if available +* Bug: Fixed Content-Length parsing of Response factory +* Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams. +* Adding ToArrayInterface throughout library +* Fixing OauthPlugin to create unique nonce values per request + +## 3.0.2 - 2012-10-25 + +* Magic methods are enabled by default on clients +* Magic methods return the result of a command +* Service clients no longer require a base_url option in the factory +* Bug: Fixed an issue with URI templates where null template variables were being expanded + +## 3.0.1 - 2012-10-22 + +* Models can now be used like regular collection objects by calling filter, map, etc. +* Models no longer require a Parameter structure or initial data in the constructor +* Added a custom AppendIterator to get around a PHP bug with the `\AppendIterator` + +## 3.0.0 - 2012-10-15 + +* Rewrote service description format to be based on Swagger + * Now based on JSON schema + * Added nested input structures and nested response models + * Support for JSON and XML input and output models + * Renamed `commands` to `operations` + * Removed dot class notation + * Removed custom types +* Broke the project into smaller top-level namespaces to be more component friendly +* Removed support for XML configs and descriptions. Use arrays or JSON files. +* Removed the Validation component and Inspector +* Moved all cookie code to Guzzle\Plugin\Cookie +* Magic methods on a Guzzle\Service\Client now return the command un-executed. +* Calling getResult() or getResponse() on a command will lazily execute the command if needed. +* Now shipping with cURL's CA certs and using it by default +* Added previousResponse() method to response objects +* No longer sending Accept and Accept-Encoding headers on every request +* Only sending an Expect header by default when a payload is greater than 1MB +* Added/moved client options: + * curl.blacklist to curl.option.blacklist + * Added ssl.certificate_authority +* Added a Guzzle\Iterator component +* Moved plugins from Guzzle\Http\Plugin to Guzzle\Plugin +* Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin) +* Added a more robust caching plugin +* Added setBody to response objects +* Updating LogPlugin to use a more flexible MessageFormatter +* Added a completely revamped build process +* Cleaning up Collection class and removing default values from the get method +* Fixed ZF2 cache adapters + +## 2.8.8 - 2012-10-15 + +* Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did + +## 2.8.7 - 2012-09-30 + +* Bug: Fixed config file aliases for JSON includes +* Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests +* Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload +* Bug: Hardening request and response parsing to account for missing parts +* Bug: Fixed PEAR packaging +* Bug: Fixed Request::getInfo +* Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail +* Adding the ability for the namespace Iterator factory to look in multiple directories +* Added more getters/setters/removers from service descriptions +* Added the ability to remove POST fields from OAuth signatures +* OAuth plugin now supports 2-legged OAuth + +## 2.8.6 - 2012-09-05 + +* Added the ability to modify and build service descriptions +* Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command +* Added a `json` parameter location +* Now allowing dot notation for classes in the CacheAdapterFactory +* Using the union of two arrays rather than an array_merge when extending service builder services and service params +* Ensuring that a service is a string before doing strpos() checks on it when substituting services for references + in service builder config files. +* Services defined in two different config files that include one another will by default replace the previously + defined service, but you can now create services that extend themselves and merge their settings over the previous +* The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like + '_default' with a default JSON configuration file. + +## 2.8.5 - 2012-08-29 + +* Bug: Suppressed empty arrays from URI templates +* Bug: Added the missing $options argument from ServiceDescription::factory to enable caching +* Added support for HTTP responses that do not contain a reason phrase in the start-line +* AbstractCommand commands are now invokable +* Added a way to get the data used when signing an Oauth request before a request is sent + +## 2.8.4 - 2012-08-15 + +* Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin +* Added the ability to transfer entity bodies as a string rather than streamed. This gets around curl error 65. Set `body_as_string` in a request's curl options to enable. +* Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\Common\Stream +* Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream +* Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5()) +* Added additional response status codes +* Removed SSL information from the default User-Agent header +* DELETE requests can now send an entity body +* Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries +* Added the ability of the MockPlugin to consume mocked request bodies +* LogPlugin now exposes request and response objects in the extras array + +## 2.8.3 - 2012-07-30 + +* Bug: Fixed a case where empty POST requests were sent as GET requests +* Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body +* Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new +* Added multiple inheritance to service description commands +* Added an ApiCommandInterface and added `getParamNames()` and `hasParam()` +* Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything +* Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles + +## 2.8.2 - 2012-07-24 + +* Bug: Query string values set to 0 are no longer dropped from the query string +* Bug: A Collection object is no longer created each time a call is made to `Guzzle\Service\Command\AbstractCommand::getRequestHeaders()` +* Bug: `+` is now treated as an encoded space when parsing query strings +* QueryString and Collection performance improvements +* Allowing dot notation for class paths in filters attribute of a service descriptions + +## 2.8.1 - 2012-07-16 + +* Loosening Event Dispatcher dependency +* POST redirects can now be customized using CURLOPT_POSTREDIR + +## 2.8.0 - 2012-07-15 + +* BC: Guzzle\Http\Query + * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl) + * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding() + * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool) + * Changed the aggregation functions of QueryString to be static methods + * Can now use fromString() with querystrings that have a leading ? +* cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters +* Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body +* Cookies are no longer URL decoded by default +* Bug: URI template variables set to null are no longer expanded + +## 2.7.2 - 2012-07-02 + +* BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\Http\Parser to Guzzle\Parser. +* BC: Removing Guzzle\Common\Batch\Batch::count() and replacing it with isEmpty() +* CachePlugin now allows for a custom request parameter function to check if a request can be cached +* Bug fix: CachePlugin now only caches GET and HEAD requests by default +* Bug fix: Using header glue when transferring headers over the wire +* Allowing deeply nested arrays for composite variables in URI templates +* Batch divisors can now return iterators or arrays + +## 2.7.1 - 2012-06-26 + +* Minor patch to update version number in UA string +* Updating build process + +## 2.7.0 - 2012-06-25 + +* BC: Inflection classes moved to Guzzle\Inflection. No longer static methods. Can now inject custom inflectors into classes. +* BC: Removed magic setX methods from commands +* BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method +* Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable. +* Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity) +* Guzzle\Service\Resource\ResourceIteratorApplyBatched now internally uses the Guzzle\Common\Batch namespace +* Added Guzzle\Service\Plugin namespace and a PluginCollectionPlugin +* Added the ability to set POST fields and files in a service description +* Guzzle\Http\EntityBody::factory() now accepts objects with a __toString() method +* Adding a command.before_prepare event to clients +* Added BatchClosureTransfer and BatchClosureDivisor +* BatchTransferException now includes references to the batch divisor and transfer strategies +* Fixed some tests so that they pass more reliably +* Added Guzzle\Common\Log\ArrayLogAdapter + +## 2.6.6 - 2012-06-10 + +* BC: Removing Guzzle\Http\Plugin\BatchQueuePlugin +* BC: Removing Guzzle\Service\Command\CommandSet +* Adding generic batching system (replaces the batch queue plugin and command set) +* Updating ZF cache and log adapters and now using ZF's composer repository +* Bug: Setting the name of each ApiParam when creating through an ApiCommand +* Adding result_type, result_doc, deprecated, and doc_url to service descriptions +* Bug: Changed the default cookie header casing back to 'Cookie' + +## 2.6.5 - 2012-06-03 + +* BC: Renaming Guzzle\Http\Message\RequestInterface::getResourceUri() to getResource() +* BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from +* BC: Guzzle\Http\Cookie is now used to manage Set-Cookie data, not Cookie data +* BC: Renaming methods in the CookieJarInterface +* Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations +* Making the default glue for HTTP headers ';' instead of ',' +* Adding a removeValue to Guzzle\Http\Message\Header +* Adding getCookies() to request interface. +* Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber() + +## 2.6.4 - 2012-05-30 + +* BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class. +* BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand +* Bug: Fixing magic method command calls on clients +* Bug: Email constraint only validates strings +* Bug: Aggregate POST fields when POST files are present in curl handle +* Bug: Fixing default User-Agent header +* Bug: Only appending or prepending parameters in commands if they are specified +* Bug: Not requiring response reason phrases or status codes to match a predefined list of codes +* Allowing the use of dot notation for class namespaces when using instance_of constraint +* Added any_match validation constraint +* Added an AsyncPlugin +* Passing request object to the calculateWait method of the ExponentialBackoffPlugin +* Allowing the result of a command object to be changed +* Parsing location and type sub values when instantiating a service description rather than over and over at runtime + +## 2.6.3 - 2012-05-23 + +* [BC] Guzzle\Common\FromConfigInterface no longer requires any config options. +* [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields. +* You can now use an array of data when creating PUT request bodies in the request factory. +* Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable. +* [Http] Adding support for Content-Type in multipart POST uploads per upload +* [Http] Added support for uploading multiple files using the same name (foo[0], foo[1]) +* Adding more POST data operations for easier manipulation of POST data. +* You can now set empty POST fields. +* The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files. +* Split the Guzzle\Service\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate. +* CS updates + +## 2.6.2 - 2012-05-19 + +* [Http] Better handling of nested scope requests in CurlMulti. Requests are now always prepares in the send() method rather than the addRequest() method. + +## 2.6.1 - 2012-05-19 + +* [BC] Removing 'path' support in service descriptions. Use 'uri'. +* [BC] Guzzle\Service\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache. +* [BC] Removing Guzzle\Common\NullObject. Use https://github.com/mtdowling/NullObject if you need it. +* [BC] Removing Guzzle\Common\XmlElement. +* All commands, both dynamic and concrete, have ApiCommand objects. +* Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits. +* Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored. +* Making the method signature of Guzzle\Service\Builder\ServiceBuilder::factory more flexible. + +## 2.6.0 - 2012-05-15 + +* [BC] Moving Guzzle\Service\Builder to Guzzle\Service\Builder\ServiceBuilder +* [BC] Executing a Command returns the result of the command rather than the command +* [BC] Moving all HTTP parsing logic to Guzzle\Http\Parsers. Allows for faster C implementations if needed. +* [BC] Changing the Guzzle\Http\Message\Response::setProtocol() method to accept a protocol and version in separate args. +* [BC] Moving ResourceIterator* to Guzzle\Service\Resource +* [BC] Completely refactored ResourceIterators to iterate over a cloned command object +* [BC] Moved Guzzle\Http\UriTemplate to Guzzle\Http\Parser\UriTemplate\UriTemplate +* [BC] Guzzle\Guzzle is now deprecated +* Moving Guzzle\Common\Guzzle::inject to Guzzle\Common\Collection::inject +* Adding Guzzle\Version class to give version information about Guzzle +* Adding Guzzle\Http\Utils class to provide getDefaultUserAgent() and getHttpDate() +* Adding Guzzle\Curl\CurlVersion to manage caching curl_version() data +* ServiceDescription and ServiceBuilder are now cacheable using similar configs +* Changing the format of XML and JSON service builder configs. Backwards compatible. +* Cleaned up Cookie parsing +* Trimming the default Guzzle User-Agent header +* Adding a setOnComplete() method to Commands that is called when a command completes +* Keeping track of requests that were mocked in the MockPlugin +* Fixed a caching bug in the CacheAdapterFactory +* Inspector objects can be injected into a Command object +* Refactoring a lot of code and tests to be case insensitive when dealing with headers +* Adding Guzzle\Http\Message\HeaderComparison for easy comparison of HTTP headers using a DSL +* Adding the ability to set global option overrides to service builder configs +* Adding the ability to include other service builder config files from within XML and JSON files +* Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method. + +## 2.5.0 - 2012-05-08 + +* Major performance improvements +* [BC] Simplifying Guzzle\Common\Collection. Please check to see if you are using features that are now deprecated. +* [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component. +* [BC] No longer supporting "{{ }}" for injecting into command or UriTemplates. Use "{}" +* Added the ability to passed parameters to all requests created by a client +* Added callback functionality to the ExponentialBackoffPlugin +* Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies. +* Rewinding request stream bodies when retrying requests +* Exception is thrown when JSON response body cannot be decoded +* Added configurable magic method calls to clients and commands. This is off by default. +* Fixed a defect that added a hash to every parsed URL part +* Fixed duplicate none generation for OauthPlugin. +* Emitting an event each time a client is generated by a ServiceBuilder +* Using an ApiParams object instead of a Collection for parameters of an ApiCommand +* cache.* request parameters should be renamed to params.cache.* +* Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle. +* Added the ability to disable type validation of service descriptions +* ServiceDescriptions and ServiceBuilders are now Serializable diff --git a/instafeed/vendor/guzzlehttp/guzzle/Dockerfile b/instafeed/vendor/guzzlehttp/guzzle/Dockerfile new file mode 100755 index 0000000..f6a0952 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/Dockerfile @@ -0,0 +1,18 @@ +FROM composer:latest as setup + +RUN mkdir /guzzle + +WORKDIR /guzzle + +RUN set -xe \ + && composer init --name=guzzlehttp/test --description="Simple project for testing Guzzle scripts" --author="Márk Sági-Kazár " --no-interaction \ + && composer require guzzlehttp/guzzle + + +FROM php:7.3 + +RUN mkdir /guzzle + +WORKDIR /guzzle + +COPY --from=setup /guzzle /guzzle diff --git a/instafeed/vendor/guzzlehttp/guzzle/LICENSE b/instafeed/vendor/guzzlehttp/guzzle/LICENSE new file mode 100755 index 0000000..50a177b --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-2018 Michael Dowling, https://github.com/mtdowling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/instafeed/vendor/guzzlehttp/guzzle/README.md b/instafeed/vendor/guzzlehttp/guzzle/README.md new file mode 100755 index 0000000..a5ef18a --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/README.md @@ -0,0 +1,90 @@ +Guzzle, PHP HTTP client +======================= + +[![Latest Version](https://img.shields.io/github/release/guzzle/guzzle.svg?style=flat-square)](https://github.com/guzzle/guzzle/releases) +[![Build Status](https://img.shields.io/travis/guzzle/guzzle.svg?style=flat-square)](https://travis-ci.org/guzzle/guzzle) +[![Total Downloads](https://img.shields.io/packagist/dt/guzzlehttp/guzzle.svg?style=flat-square)](https://packagist.org/packages/guzzlehttp/guzzle) + +Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and +trivial to integrate with web services. + +- Simple interface for building query strings, POST requests, streaming large + uploads, streaming large downloads, using HTTP cookies, uploading JSON data, + etc... +- Can send both synchronous and asynchronous requests using the same interface. +- Uses PSR-7 interfaces for requests, responses, and streams. This allows you + to utilize other PSR-7 compatible libraries with Guzzle. +- Abstracts away the underlying HTTP transport, allowing you to write + environment and transport agnostic code; i.e., no hard dependency on cURL, + PHP streams, sockets, or non-blocking event loops. +- Middleware system allows you to augment and compose client behavior. + +```php +$client = new \GuzzleHttp\Client(); +$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle'); + +echo $response->getStatusCode(); # 200 +echo $response->getHeaderLine('content-type'); # 'application/json; charset=utf8' +echo $response->getBody(); # '{"id": 1420053, "name": "guzzle", ...}' + +# Send an asynchronous request. +$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org'); +$promise = $client->sendAsync($request)->then(function ($response) { + echo 'I completed! ' . $response->getBody(); +}); + +$promise->wait(); +``` + +## Help and docs + +- [Documentation](http://guzzlephp.org/) +- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle) +- [Gitter](https://gitter.im/guzzle/guzzle) + + +## Installing Guzzle + +The recommended way to install Guzzle is through +[Composer](http://getcomposer.org). + +```bash +# Install Composer +curl -sS https://getcomposer.org/installer | php +``` + +Next, run the Composer command to install the latest stable version of Guzzle: + +```bash +composer require guzzlehttp/guzzle +``` + +After installing, you need to require Composer's autoloader: + +```php +require 'vendor/autoload.php'; +``` + +You can then later update Guzzle using composer: + + ```bash +composer update + ``` + + +## Version Guidance + +| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version | +|---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------| +| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >= 5.3.3 | +| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >= 5.4 | +| 5.x | Maintained | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >= 5.4 | +| 6.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >= 5.5 | + +[guzzle-3-repo]: https://github.com/guzzle/guzzle3 +[guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x +[guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3 +[guzzle-6-repo]: https://github.com/guzzle/guzzle +[guzzle-3-docs]: http://guzzle3.readthedocs.org +[guzzle-5-docs]: http://guzzle.readthedocs.org/en/5.3/ +[guzzle-6-docs]: http://guzzle.readthedocs.org/en/latest/ diff --git a/instafeed/vendor/guzzlehttp/guzzle/UPGRADING.md b/instafeed/vendor/guzzlehttp/guzzle/UPGRADING.md new file mode 100755 index 0000000..91d1dcc --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/UPGRADING.md @@ -0,0 +1,1203 @@ +Guzzle Upgrade Guide +==================== + +5.0 to 6.0 +---------- + +Guzzle now uses [PSR-7](http://www.php-fig.org/psr/psr-7/) for HTTP messages. +Due to the fact that these messages are immutable, this prompted a refactoring +of Guzzle to use a middleware based system rather than an event system. Any +HTTP message interaction (e.g., `GuzzleHttp\Message\Request`) need to be +updated to work with the new immutable PSR-7 request and response objects. Any +event listeners or subscribers need to be updated to become middleware +functions that wrap handlers (or are injected into a +`GuzzleHttp\HandlerStack`). + +- Removed `GuzzleHttp\BatchResults` +- Removed `GuzzleHttp\Collection` +- Removed `GuzzleHttp\HasDataTrait` +- Removed `GuzzleHttp\ToArrayInterface` +- The `guzzlehttp/streams` dependency has been removed. Stream functionality + is now present in the `GuzzleHttp\Psr7` namespace provided by the + `guzzlehttp/psr7` package. +- Guzzle no longer uses ReactPHP promises and now uses the + `guzzlehttp/promises` library. We use a custom promise library for three + significant reasons: + 1. React promises (at the time of writing this) are recursive. Promise + chaining and promise resolution will eventually blow the stack. Guzzle + promises are not recursive as they use a sort of trampolining technique. + Note: there has been movement in the React project to modify promises to + no longer utilize recursion. + 2. Guzzle needs to have the ability to synchronously block on a promise to + wait for a result. Guzzle promises allows this functionality (and does + not require the use of recursion). + 3. Because we need to be able to wait on a result, doing so using React + promises requires wrapping react promises with RingPHP futures. This + overhead is no longer needed, reducing stack sizes, reducing complexity, + and improving performance. +- `GuzzleHttp\Mimetypes` has been moved to a function in + `GuzzleHttp\Psr7\mimetype_from_extension` and + `GuzzleHttp\Psr7\mimetype_from_filename`. +- `GuzzleHttp\Query` and `GuzzleHttp\QueryParser` have been removed. Query + strings must now be passed into request objects as strings, or provided to + the `query` request option when creating requests with clients. The `query` + option uses PHP's `http_build_query` to convert an array to a string. If you + need a different serialization technique, you will need to pass the query + string in as a string. There are a couple helper functions that will make + working with query strings easier: `GuzzleHttp\Psr7\parse_query` and + `GuzzleHttp\Psr7\build_query`. +- Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware + system based on PSR-7, using RingPHP and it's middleware system as well adds + more complexity than the benefits it provides. All HTTP handlers that were + present in RingPHP have been modified to work directly with PSR-7 messages + and placed in the `GuzzleHttp\Handler` namespace. This significantly reduces + complexity in Guzzle, removes a dependency, and improves performance. RingPHP + will be maintained for Guzzle 5 support, but will no longer be a part of + Guzzle 6. +- As Guzzle now uses a middleware based systems the event system and RingPHP + integration has been removed. Note: while the event system has been removed, + it is possible to add your own type of event system that is powered by the + middleware system. + - Removed the `Event` namespace. + - Removed the `Subscriber` namespace. + - Removed `Transaction` class + - Removed `RequestFsm` + - Removed `RingBridge` + - `GuzzleHttp\Subscriber\Cookie` is now provided by + `GuzzleHttp\Middleware::cookies` + - `GuzzleHttp\Subscriber\HttpError` is now provided by + `GuzzleHttp\Middleware::httpError` + - `GuzzleHttp\Subscriber\History` is now provided by + `GuzzleHttp\Middleware::history` + - `GuzzleHttp\Subscriber\Mock` is now provided by + `GuzzleHttp\Handler\MockHandler` + - `GuzzleHttp\Subscriber\Prepare` is now provided by + `GuzzleHttp\PrepareBodyMiddleware` + - `GuzzleHttp\Subscriber\Redirect` is now provided by + `GuzzleHttp\RedirectMiddleware` +- Guzzle now uses `Psr\Http\Message\UriInterface` (implements in + `GuzzleHttp\Psr7\Uri`) for URI support. `GuzzleHttp\Url` is now gone. +- Static functions in `GuzzleHttp\Utils` have been moved to namespaced + functions under the `GuzzleHttp` namespace. This requires either a Composer + based autoloader or you to include functions.php. +- `GuzzleHttp\ClientInterface::getDefaultOption` has been renamed to + `GuzzleHttp\ClientInterface::getConfig`. +- `GuzzleHttp\ClientInterface::setDefaultOption` has been removed. +- The `json` and `xml` methods of response objects has been removed. With the + migration to strictly adhering to PSR-7 as the interface for Guzzle messages, + adding methods to message interfaces would actually require Guzzle messages + to extend from PSR-7 messages rather then work with them directly. + +## Migrating to middleware + +The change to PSR-7 unfortunately required significant refactoring to Guzzle +due to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event +system from plugins. The event system relied on mutability of HTTP messages and +side effects in order to work. With immutable messages, you have to change your +workflow to become more about either returning a value (e.g., functional +middlewares) or setting a value on an object. Guzzle v6 has chosen the +functional middleware approach. + +Instead of using the event system to listen for things like the `before` event, +you now create a stack based middleware function that intercepts a request on +the way in and the promise of the response on the way out. This is a much +simpler and more predictable approach than the event system and works nicely +with PSR-7 middleware. Due to the use of promises, the middleware system is +also asynchronous. + +v5: + +```php +use GuzzleHttp\Event\BeforeEvent; +$client = new GuzzleHttp\Client(); +// Get the emitter and listen to the before event. +$client->getEmitter()->on('before', function (BeforeEvent $e) { + // Guzzle v5 events relied on mutation + $e->getRequest()->setHeader('X-Foo', 'Bar'); +}); +``` + +v6: + +In v6, you can modify the request before it is sent using the `mapRequest` +middleware. The idiomatic way in v6 to modify the request/response lifecycle is +to setup a handler middleware stack up front and inject the handler into a +client. + +```php +use GuzzleHttp\Middleware; +// Create a handler stack that has all of the default middlewares attached +$handler = GuzzleHttp\HandlerStack::create(); +// Push the handler onto the handler stack +$handler->push(Middleware::mapRequest(function (RequestInterface $request) { + // Notice that we have to return a request object + return $request->withHeader('X-Foo', 'Bar'); +})); +// Inject the handler into the client +$client = new GuzzleHttp\Client(['handler' => $handler]); +``` + +## POST Requests + +This version added the [`form_params`](http://guzzle.readthedocs.org/en/latest/request-options.html#form_params) +and `multipart` request options. `form_params` is an associative array of +strings or array of strings and is used to serialize an +`application/x-www-form-urlencoded` POST request. The +[`multipart`](http://guzzle.readthedocs.org/en/latest/request-options.html#multipart) +option is now used to send a multipart/form-data POST request. + +`GuzzleHttp\Post\PostFile` has been removed. Use the `multipart` option to add +POST files to a multipart/form-data request. + +The `body` option no longer accepts an array to send POST requests. Please use +`multipart` or `form_params` instead. + +The `base_url` option has been renamed to `base_uri`. + +4.x to 5.0 +---------- + +## Rewritten Adapter Layer + +Guzzle now uses [RingPHP](http://ringphp.readthedocs.org/en/latest) to send +HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor +is still supported, but it has now been renamed to `handler`. Instead of +passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP +`callable` that follows the RingPHP specification. + +## Removed Fluent Interfaces + +[Fluent interfaces were removed](http://ocramius.github.io/blog/fluent-interfaces-are-evil) +from the following classes: + +- `GuzzleHttp\Collection` +- `GuzzleHttp\Url` +- `GuzzleHttp\Query` +- `GuzzleHttp\Post\PostBody` +- `GuzzleHttp\Cookie\SetCookie` + +## Removed functions.php + +Removed "functions.php", so that Guzzle is truly PSR-4 compliant. The following +functions can be used as replacements. + +- `GuzzleHttp\json_decode` -> `GuzzleHttp\Utils::jsonDecode` +- `GuzzleHttp\get_path` -> `GuzzleHttp\Utils::getPath` +- `GuzzleHttp\Utils::setPath` -> `GuzzleHttp\set_path` +- `GuzzleHttp\Pool::batch` -> `GuzzleHttp\batch`. This function is, however, + deprecated in favor of using `GuzzleHttp\Pool::batch()`. + +The "procedural" global client has been removed with no replacement (e.g., +`GuzzleHttp\get()`, `GuzzleHttp\post()`, etc.). Use a `GuzzleHttp\Client` +object as a replacement. + +## `throwImmediately` has been removed + +The concept of "throwImmediately" has been removed from exceptions and error +events. This control mechanism was used to stop a transfer of concurrent +requests from completing. This can now be handled by throwing the exception or +by cancelling a pool of requests or each outstanding future request +individually. + +## headers event has been removed + +Removed the "headers" event. This event was only useful for changing the +body a response once the headers of the response were known. You can implement +a similar behavior in a number of ways. One example might be to use a +FnStream that has access to the transaction being sent. For example, when the +first byte is written, you could check if the response headers match your +expectations, and if so, change the actual stream body that is being +written to. + +## Updates to HTTP Messages + +Removed the `asArray` parameter from +`GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header +value as an array, then use the newly added `getHeaderAsArray()` method of +`MessageInterface`. This change makes the Guzzle interfaces compatible with +the PSR-7 interfaces. + +3.x to 4.0 +---------- + +## Overarching changes: + +- Now requires PHP 5.4 or greater. +- No longer requires cURL to send requests. +- Guzzle no longer wraps every exception it throws. Only exceptions that are + recoverable are now wrapped by Guzzle. +- Various namespaces have been removed or renamed. +- No longer requiring the Symfony EventDispatcher. A custom event dispatcher + based on the Symfony EventDispatcher is + now utilized in `GuzzleHttp\Event\EmitterInterface` (resulting in significant + speed and functionality improvements). + +Changes per Guzzle 3.x namespace are described below. + +## Batch + +The `Guzzle\Batch` namespace has been removed. This is best left to +third-parties to implement on top of Guzzle's core HTTP library. + +## Cache + +The `Guzzle\Cache` namespace has been removed. (Todo: No suitable replacement +has been implemented yet, but hoping to utilize a PSR cache interface). + +## Common + +- Removed all of the wrapped exceptions. It's better to use the standard PHP + library for unrecoverable exceptions. +- `FromConfigInterface` has been removed. +- `Guzzle\Common\Version` has been removed. The VERSION constant can be found + at `GuzzleHttp\ClientInterface::VERSION`. + +### Collection + +- `getAll` has been removed. Use `toArray` to convert a collection to an array. +- `inject` has been removed. +- `keySearch` has been removed. +- `getPath` no longer supports wildcard expressions. Use something better like + JMESPath for this. +- `setPath` now supports appending to an existing array via the `[]` notation. + +### Events + +Guzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses +`GuzzleHttp\Event\Emitter`. + +- `Symfony\Component\EventDispatcher\EventDispatcherInterface` is replaced by + `GuzzleHttp\Event\EmitterInterface`. +- `Symfony\Component\EventDispatcher\EventDispatcher` is replaced by + `GuzzleHttp\Event\Emitter`. +- `Symfony\Component\EventDispatcher\Event` is replaced by + `GuzzleHttp\Event\Event`, and Guzzle now has an EventInterface in + `GuzzleHttp\Event\EventInterface`. +- `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and + `HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the + event emitter of a request, client, etc. now uses the `getEmitter` method + rather than the `getDispatcher` method. + +#### Emitter + +- Use the `once()` method to add a listener that automatically removes itself + the first time it is invoked. +- Use the `listeners()` method to retrieve a list of event listeners rather than + the `getListeners()` method. +- Use `emit()` instead of `dispatch()` to emit an event from an emitter. +- Use `attach()` instead of `addSubscriber()` and `detach()` instead of + `removeSubscriber()`. + +```php +$mock = new Mock(); +// 3.x +$request->getEventDispatcher()->addSubscriber($mock); +$request->getEventDispatcher()->removeSubscriber($mock); +// 4.x +$request->getEmitter()->attach($mock); +$request->getEmitter()->detach($mock); +``` + +Use the `on()` method to add a listener rather than the `addListener()` method. + +```php +// 3.x +$request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } ); +// 4.x +$request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } ); +``` + +## Http + +### General changes + +- The cacert.pem certificate has been moved to `src/cacert.pem`. +- Added the concept of adapters that are used to transfer requests over the + wire. +- Simplified the event system. +- Sending requests in parallel is still possible, but batching is no longer a + concept of the HTTP layer. Instead, you must use the `complete` and `error` + events to asynchronously manage parallel request transfers. +- `Guzzle\Http\Url` has moved to `GuzzleHttp\Url`. +- `Guzzle\Http\QueryString` has moved to `GuzzleHttp\Query`. +- QueryAggregators have been rewritten so that they are simply callable + functions. +- `GuzzleHttp\StaticClient` has been removed. Use the functions provided in + `functions.php` for an easy to use static client instance. +- Exceptions in `GuzzleHttp\Exception` have been updated to all extend from + `GuzzleHttp\Exception\TransferException`. + +### Client + +Calling methods like `get()`, `post()`, `head()`, etc. no longer create and +return a request, but rather creates a request, sends the request, and returns +the response. + +```php +// 3.0 +$request = $client->get('/'); +$response = $request->send(); + +// 4.0 +$response = $client->get('/'); + +// or, to mirror the previous behavior +$request = $client->createRequest('GET', '/'); +$response = $client->send($request); +``` + +`GuzzleHttp\ClientInterface` has changed. + +- The `send` method no longer accepts more than one request. Use `sendAll` to + send multiple requests in parallel. +- `setUserAgent()` has been removed. Use a default request option instead. You + could, for example, do something like: + `$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`. +- `setSslVerification()` has been removed. Use default request options instead, + like `$client->setConfig('defaults/verify', true)`. + +`GuzzleHttp\Client` has changed. + +- The constructor now accepts only an associative array. You can include a + `base_url` string or array to use a URI template as the base URL of a client. + You can also specify a `defaults` key that is an associative array of default + request options. You can pass an `adapter` to use a custom adapter, + `batch_adapter` to use a custom adapter for sending requests in parallel, or + a `message_factory` to change the factory used to create HTTP requests and + responses. +- The client no longer emits a `client.create_request` event. +- Creating requests with a client no longer automatically utilize a URI + template. You must pass an array into a creational method (e.g., + `createRequest`, `get`, `put`, etc.) in order to expand a URI template. + +### Messages + +Messages no longer have references to their counterparts (i.e., a request no +longer has a reference to it's response, and a response no loger has a +reference to its request). This association is now managed through a +`GuzzleHttp\Adapter\TransactionInterface` object. You can get references to +these transaction objects using request events that are emitted over the +lifecycle of a request. + +#### Requests with a body + +- `GuzzleHttp\Message\EntityEnclosingRequest` and + `GuzzleHttp\Message\EntityEnclosingRequestInterface` have been removed. The + separation between requests that contain a body and requests that do not + contain a body has been removed, and now `GuzzleHttp\Message\RequestInterface` + handles both use cases. +- Any method that previously accepts a `GuzzleHttp\Response` object now accept a + `GuzzleHttp\Message\ResponseInterface`. +- `GuzzleHttp\Message\RequestFactoryInterface` has been renamed to + `GuzzleHttp\Message\MessageFactoryInterface`. This interface is used to create + both requests and responses and is implemented in + `GuzzleHttp\Message\MessageFactory`. +- POST field and file methods have been removed from the request object. You + must now use the methods made available to `GuzzleHttp\Post\PostBodyInterface` + to control the format of a POST body. Requests that are created using a + standard `GuzzleHttp\Message\MessageFactoryInterface` will automatically use + a `GuzzleHttp\Post\PostBody` body if the body was passed as an array or if + the method is POST and no body is provided. + +```php +$request = $client->createRequest('POST', '/'); +$request->getBody()->setField('foo', 'bar'); +$request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r'))); +``` + +#### Headers + +- `GuzzleHttp\Message\Header` has been removed. Header values are now simply + represented by an array of values or as a string. Header values are returned + as a string by default when retrieving a header value from a message. You can + pass an optional argument of `true` to retrieve a header value as an array + of strings instead of a single concatenated string. +- `GuzzleHttp\PostFile` and `GuzzleHttp\PostFileInterface` have been moved to + `GuzzleHttp\Post`. This interface has been simplified and now allows the + addition of arbitrary headers. +- Custom headers like `GuzzleHttp\Message\Header\Link` have been removed. Most + of the custom headers are now handled separately in specific + subscribers/plugins, and `GuzzleHttp\Message\HeaderValues::parseParams()` has + been updated to properly handle headers that contain parameters (like the + `Link` header). + +#### Responses + +- `GuzzleHttp\Message\Response::getInfo()` and + `GuzzleHttp\Message\Response::setInfo()` have been removed. Use the event + system to retrieve this type of information. +- `GuzzleHttp\Message\Response::getRawHeaders()` has been removed. +- `GuzzleHttp\Message\Response::getMessage()` has been removed. +- `GuzzleHttp\Message\Response::calculateAge()` and other cache specific + methods have moved to the CacheSubscriber. +- Header specific helper functions like `getContentMd5()` have been removed. + Just use `getHeader('Content-MD5')` instead. +- `GuzzleHttp\Message\Response::setRequest()` and + `GuzzleHttp\Message\Response::getRequest()` have been removed. Use the event + system to work with request and response objects as a transaction. +- `GuzzleHttp\Message\Response::getRedirectCount()` has been removed. Use the + Redirect subscriber instead. +- `GuzzleHttp\Message\Response::isSuccessful()` and other related methods have + been removed. Use `getStatusCode()` instead. + +#### Streaming responses + +Streaming requests can now be created by a client directly, returning a +`GuzzleHttp\Message\ResponseInterface` object that contains a body stream +referencing an open PHP HTTP stream. + +```php +// 3.0 +use Guzzle\Stream\PhpStreamRequestFactory; +$request = $client->get('/'); +$factory = new PhpStreamRequestFactory(); +$stream = $factory->fromRequest($request); +$data = $stream->read(1024); + +// 4.0 +$response = $client->get('/', ['stream' => true]); +// Read some data off of the stream in the response body +$data = $response->getBody()->read(1024); +``` + +#### Redirects + +The `configureRedirects()` method has been removed in favor of a +`allow_redirects` request option. + +```php +// Standard redirects with a default of a max of 5 redirects +$request = $client->createRequest('GET', '/', ['allow_redirects' => true]); + +// Strict redirects with a custom number of redirects +$request = $client->createRequest('GET', '/', [ + 'allow_redirects' => ['max' => 5, 'strict' => true] +]); +``` + +#### EntityBody + +EntityBody interfaces and classes have been removed or moved to +`GuzzleHttp\Stream`. All classes and interfaces that once required +`GuzzleHttp\EntityBodyInterface` now require +`GuzzleHttp\Stream\StreamInterface`. Creating a new body for a request no +longer uses `GuzzleHttp\EntityBody::factory` but now uses +`GuzzleHttp\Stream\Stream::factory` or even better: +`GuzzleHttp\Stream\create()`. + +- `Guzzle\Http\EntityBodyInterface` is now `GuzzleHttp\Stream\StreamInterface` +- `Guzzle\Http\EntityBody` is now `GuzzleHttp\Stream\Stream` +- `Guzzle\Http\CachingEntityBody` is now `GuzzleHttp\Stream\CachingStream` +- `Guzzle\Http\ReadLimitEntityBody` is now `GuzzleHttp\Stream\LimitStream` +- `Guzzle\Http\IoEmittyinEntityBody` has been removed. + +#### Request lifecycle events + +Requests previously submitted a large number of requests. The number of events +emitted over the lifecycle of a request has been significantly reduced to make +it easier to understand how to extend the behavior of a request. All events +emitted during the lifecycle of a request now emit a custom +`GuzzleHttp\Event\EventInterface` object that contains context providing +methods and a way in which to modify the transaction at that specific point in +time (e.g., intercept the request and set a response on the transaction). + +- `request.before_send` has been renamed to `before` and now emits a + `GuzzleHttp\Event\BeforeEvent` +- `request.complete` has been renamed to `complete` and now emits a + `GuzzleHttp\Event\CompleteEvent`. +- `request.sent` has been removed. Use `complete`. +- `request.success` has been removed. Use `complete`. +- `error` is now an event that emits a `GuzzleHttp\Event\ErrorEvent`. +- `request.exception` has been removed. Use `error`. +- `request.receive.status_line` has been removed. +- `curl.callback.progress` has been removed. Use a custom `StreamInterface` to + maintain a status update. +- `curl.callback.write` has been removed. Use a custom `StreamInterface` to + intercept writes. +- `curl.callback.read` has been removed. Use a custom `StreamInterface` to + intercept reads. + +`headers` is a new event that is emitted after the response headers of a +request have been received before the body of the response is downloaded. This +event emits a `GuzzleHttp\Event\HeadersEvent`. + +You can intercept a request and inject a response using the `intercept()` event +of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and +`GuzzleHttp\Event\ErrorEvent` event. + +See: http://docs.guzzlephp.org/en/latest/events.html + +## Inflection + +The `Guzzle\Inflection` namespace has been removed. This is not a core concern +of Guzzle. + +## Iterator + +The `Guzzle\Iterator` namespace has been removed. + +- `Guzzle\Iterator\AppendIterator`, `Guzzle\Iterator\ChunkedIterator`, and + `Guzzle\Iterator\MethodProxyIterator` are nice, but not a core requirement of + Guzzle itself. +- `Guzzle\Iterator\FilterIterator` is no longer needed because an equivalent + class is shipped with PHP 5.4. +- `Guzzle\Iterator\MapIterator` is not really needed when using PHP 5.5 because + it's easier to just wrap an iterator in a generator that maps values. + +For a replacement of these iterators, see https://github.com/nikic/iter + +## Log + +The LogPlugin has moved to https://github.com/guzzle/log-subscriber. The +`Guzzle\Log` namespace has been removed. Guzzle now relies on +`Psr\Log\LoggerInterface` for all logging. The MessageFormatter class has been +moved to `GuzzleHttp\Subscriber\Log\Formatter`. + +## Parser + +The `Guzzle\Parser` namespace has been removed. This was previously used to +make it possible to plug in custom parsers for cookies, messages, URI +templates, and URLs; however, this level of complexity is not needed in Guzzle +so it has been removed. + +- Cookie: Cookie parsing logic has been moved to + `GuzzleHttp\Cookie\SetCookie::fromString`. +- Message: Message parsing logic for both requests and responses has been moved + to `GuzzleHttp\Message\MessageFactory::fromMessage`. Message parsing is only + used in debugging or deserializing messages, so it doesn't make sense for + Guzzle as a library to add this level of complexity to parsing messages. +- UriTemplate: URI template parsing has been moved to + `GuzzleHttp\UriTemplate`. The Guzzle library will automatically use the PECL + URI template library if it is installed. +- Url: URL parsing is now performed in `GuzzleHttp\Url::fromString` (previously + it was `Guzzle\Http\Url::factory()`). If custom URL parsing is necessary, + then developers are free to subclass `GuzzleHttp\Url`. + +## Plugin + +The `Guzzle\Plugin` namespace has been renamed to `GuzzleHttp\Subscriber`. +Several plugins are shipping with the core Guzzle library under this namespace. + +- `GuzzleHttp\Subscriber\Cookie`: Replaces the old CookiePlugin. Cookie jar + code has moved to `GuzzleHttp\Cookie`. +- `GuzzleHttp\Subscriber\History`: Replaces the old HistoryPlugin. +- `GuzzleHttp\Subscriber\HttpError`: Throws errors when a bad HTTP response is + received. +- `GuzzleHttp\Subscriber\Mock`: Replaces the old MockPlugin. +- `GuzzleHttp\Subscriber\Prepare`: Prepares the body of a request just before + sending. This subscriber is attached to all requests by default. +- `GuzzleHttp\Subscriber\Redirect`: Replaces the RedirectPlugin. + +The following plugins have been removed (third-parties are free to re-implement +these if needed): + +- `GuzzleHttp\Plugin\Async` has been removed. +- `GuzzleHttp\Plugin\CurlAuth` has been removed. +- `GuzzleHttp\Plugin\ErrorResponse\ErrorResponsePlugin` has been removed. This + functionality should instead be implemented with event listeners that occur + after normal response parsing occurs in the guzzle/command package. + +The following plugins are not part of the core Guzzle package, but are provided +in separate repositories: + +- `Guzzle\Http\Plugin\BackoffPlugin` has been rewritten to be much simpler + to build custom retry policies using simple functions rather than various + chained classes. See: https://github.com/guzzle/retry-subscriber +- `Guzzle\Http\Plugin\Cache\CachePlugin` has moved to + https://github.com/guzzle/cache-subscriber +- `Guzzle\Http\Plugin\Log\LogPlugin` has moved to + https://github.com/guzzle/log-subscriber +- `Guzzle\Http\Plugin\Md5\Md5Plugin` has moved to + https://github.com/guzzle/message-integrity-subscriber +- `Guzzle\Http\Plugin\Mock\MockPlugin` has moved to + `GuzzleHttp\Subscriber\MockSubscriber`. +- `Guzzle\Http\Plugin\Oauth\OauthPlugin` has moved to + https://github.com/guzzle/oauth-subscriber + +## Service + +The service description layer of Guzzle has moved into two separate packages: + +- http://github.com/guzzle/command Provides a high level abstraction over web + services by representing web service operations using commands. +- http://github.com/guzzle/guzzle-services Provides an implementation of + guzzle/command that provides request serialization and response parsing using + Guzzle service descriptions. + +## Stream + +Stream have moved to a separate package available at +https://github.com/guzzle/streams. + +`Guzzle\Stream\StreamInterface` has been given a large update to cleanly take +on the responsibilities of `Guzzle\Http\EntityBody` and +`Guzzle\Http\EntityBodyInterface` now that they have been removed. The number +of methods implemented by the `StreamInterface` has been drastically reduced to +allow developers to more easily extend and decorate stream behavior. + +## Removed methods from StreamInterface + +- `getStream` and `setStream` have been removed to better encapsulate streams. +- `getMetadata` and `setMetadata` have been removed in favor of + `GuzzleHttp\Stream\MetadataStreamInterface`. +- `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been + removed. This data is accessible when + using streams that implement `GuzzleHttp\Stream\MetadataStreamInterface`. +- `rewind` has been removed. Use `seek(0)` for a similar behavior. + +## Renamed methods + +- `detachStream` has been renamed to `detach`. +- `feof` has been renamed to `eof`. +- `ftell` has been renamed to `tell`. +- `readLine` has moved from an instance method to a static class method of + `GuzzleHttp\Stream\Stream`. + +## Metadata streams + +`GuzzleHttp\Stream\MetadataStreamInterface` has been added to denote streams +that contain additional metadata accessible via `getMetadata()`. +`GuzzleHttp\Stream\StreamInterface::getMetadata` and +`GuzzleHttp\Stream\StreamInterface::setMetadata` have been removed. + +## StreamRequestFactory + +The entire concept of the StreamRequestFactory has been removed. The way this +was used in Guzzle 3 broke the actual interface of sending streaming requests +(instead of getting back a Response, you got a StreamInterface). Streaming +PHP requests are now implemented through the `GuzzleHttp\Adapter\StreamAdapter`. + +3.6 to 3.7 +---------- + +### Deprecations + +- You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.: + +```php +\Guzzle\Common\Version::$emitWarnings = true; +``` + +The following APIs and options have been marked as deprecated: + +- Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead. +- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +- Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. +- Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. +- Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated +- Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. +- Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. +- Marked `Guzzle\Common\Collection::inject()` as deprecated. +- Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use + `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or + `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` + +3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational +request methods. When paired with a client's configuration settings, these options allow you to specify default settings +for various aspects of a request. Because these options make other previous configuration options redundant, several +configuration options and methods of a client and AbstractCommand have been deprecated. + +- Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`. +- Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`. +- Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')` +- Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0 + + $command = $client->getCommand('foo', array( + 'command.headers' => array('Test' => '123'), + 'command.response_body' => '/path/to/file' + )); + + // Should be changed to: + + $command = $client->getCommand('foo', array( + 'command.request_options' => array( + 'headers' => array('Test' => '123'), + 'save_as' => '/path/to/file' + ) + )); + +### Interface changes + +Additions and changes (you will need to update any implementations or subclasses you may have created): + +- Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: + createRequest, head, delete, put, patch, post, options, prepareRequest +- Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` +- Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` +- Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to + `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a + resource, string, or EntityBody into the $options parameter to specify the download location of the response. +- Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a + default `array()` +- Added `Guzzle\Stream\StreamInterface::isRepeatable` +- Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. + +The following methods were removed from interfaces. All of these methods are still available in the concrete classes +that implement them, but you should update your code to use alternative methods: + +- Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use + `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or + `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or + `$client->setDefaultOption('headers/{header_name}', 'value')`. or + `$client->setDefaultOption('headers', array('header_name' => 'value'))`. +- Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`. +- Removed `Guzzle\Http\ClientInterface::expandTemplate()`. This is an implementation detail. +- Removed `Guzzle\Http\ClientInterface::setRequestFactory()`. This is an implementation detail. +- Removed `Guzzle\Http\ClientInterface::getCurlMulti()`. This is a very specific implementation detail. +- Removed `Guzzle\Http\Message\RequestInterface::canCache`. Use the CachePlugin. +- Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`. Use the HistoryPlugin. +- Removed `Guzzle\Http\Message\RequestInterface::isRedirect`. Use the HistoryPlugin. + +### Cache plugin breaking changes + +- CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a + CacheStorageInterface. These two objects and interface will be removed in a future version. +- Always setting X-cache headers on cached responses +- Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin +- `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface + $request, Response $response);` +- `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` +- `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` +- Added `CacheStorageInterface::purge($url)` +- `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin + $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, + CanCacheStrategyInterface $canCache = null)` +- Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` + +3.5 to 3.6 +---------- + +* Mixed casing of headers are now forced to be a single consistent casing across all values for that header. +* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution +* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). + For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader(). + Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request. +* Specific header implementations can be created for complex headers. When a message creates a header, it uses a + HeaderFactory which can map specific headers to specific header classes. There is now a Link header and + CacheControl header implementation. +* Moved getLinks() from Response to just be used on a Link header object. + +If you previously relied on Guzzle\Http\Message\Header::raw(), then you will need to update your code to use the +HeaderInterface (e.g. toArray(), getAll(), etc.). + +### Interface changes + +* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate +* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() +* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in + Guzzle\Http\Curl\RequestMediator +* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. +* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface +* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() + +### Removed deprecated functions + +* Removed Guzzle\Parser\ParserRegister::get(). Use getParser() +* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). + +### Deprecations + +* The ability to case-insensitively search for header values +* Guzzle\Http\Message\Header::hasExactHeader +* Guzzle\Http\Message\Header::raw. Use getAll() +* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object + instead. + +### Other changes + +* All response header helper functions return a string rather than mixing Header objects and strings inconsistently +* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle + directly via interfaces +* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist + but are a no-op until removed. +* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a + `Guzzle\Service\Command\ArrayCommandInterface`. +* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response + on a request while the request is still being transferred +* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess + +3.3 to 3.4 +---------- + +Base URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs. + +3.2 to 3.3 +---------- + +### Response::getEtag() quote stripping removed + +`Guzzle\Http\Message\Response::getEtag()` no longer strips quotes around the ETag response header + +### Removed `Guzzle\Http\Utils` + +The `Guzzle\Http\Utils` class was removed. This class was only used for testing. + +### Stream wrapper and type + +`Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getStreamType()` are no longer converted to lowercase. + +### curl.emit_io became emit_io + +Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the +'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' + +3.1 to 3.2 +---------- + +### CurlMulti is no longer reused globally + +Before 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added +to a single client can pollute requests dispatched from other clients. + +If you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the +ServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is +created. + +```php +$multi = new Guzzle\Http\Curl\CurlMulti(); +$builder = Guzzle\Service\Builder\ServiceBuilder::factory('/path/to/config.json'); +$builder->addListener('service_builder.create_client', function ($event) use ($multi) { + $event['client']->setCurlMulti($multi); +} +}); +``` + +### No default path + +URLs no longer have a default path value of '/' if no path was specified. + +Before: + +```php +$request = $client->get('http://www.foo.com'); +echo $request->getUrl(); +// >> http://www.foo.com/ +``` + +After: + +```php +$request = $client->get('http://www.foo.com'); +echo $request->getUrl(); +// >> http://www.foo.com +``` + +### Less verbose BadResponseException + +The exception message for `Guzzle\Http\Exception\BadResponseException` no longer contains the full HTTP request and +response information. You can, however, get access to the request and response object by calling `getRequest()` or +`getResponse()` on the exception object. + +### Query parameter aggregation + +Multi-valued query parameters are no longer aggregated using a callback function. `Guzzle\Http\Query` now has a +setAggregator() method that accepts a `Guzzle\Http\QueryAggregator\QueryAggregatorInterface` object. This object is +responsible for handling the aggregation of multi-valued query string variables into a flattened hash. + +2.8 to 3.x +---------- + +### Guzzle\Service\Inspector + +Change `\Guzzle\Service\Inspector::fromConfig` to `\Guzzle\Common\Collection::fromConfig` + +**Before** + +```php +use Guzzle\Service\Inspector; + +class YourClient extends \Guzzle\Service\Client +{ + public static function factory($config = array()) + { + $default = array(); + $required = array('base_url', 'username', 'api_key'); + $config = Inspector::fromConfig($config, $default, $required); + + $client = new self( + $config->get('base_url'), + $config->get('username'), + $config->get('api_key') + ); + $client->setConfig($config); + + $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); + + return $client; + } +``` + +**After** + +```php +use Guzzle\Common\Collection; + +class YourClient extends \Guzzle\Service\Client +{ + public static function factory($config = array()) + { + $default = array(); + $required = array('base_url', 'username', 'api_key'); + $config = Collection::fromConfig($config, $default, $required); + + $client = new self( + $config->get('base_url'), + $config->get('username'), + $config->get('api_key') + ); + $client->setConfig($config); + + $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); + + return $client; + } +``` + +### Convert XML Service Descriptions to JSON + +**Before** + +```xml + + + + + + Get a list of groups + + + Uses a search query to get a list of groups + + + + Create a group + + + + + Delete a group by ID + + + + + + + Update a group + + + + + + +``` + +**After** + +```json +{ + "name": "Zendesk REST API v2", + "apiVersion": "2012-12-31", + "description":"Provides access to Zendesk views, groups, tickets, ticket fields, and users", + "operations": { + "list_groups": { + "httpMethod":"GET", + "uri": "groups.json", + "summary": "Get a list of groups" + }, + "search_groups":{ + "httpMethod":"GET", + "uri": "search.json?query=\"{query} type:group\"", + "summary": "Uses a search query to get a list of groups", + "parameters":{ + "query":{ + "location": "uri", + "description":"Zendesk Search Query", + "type": "string", + "required": true + } + } + }, + "create_group": { + "httpMethod":"POST", + "uri": "groups.json", + "summary": "Create a group", + "parameters":{ + "data": { + "type": "array", + "location": "body", + "description":"Group JSON", + "filters": "json_encode", + "required": true + }, + "Content-Type":{ + "type": "string", + "location":"header", + "static": "application/json" + } + } + }, + "delete_group": { + "httpMethod":"DELETE", + "uri": "groups/{id}.json", + "summary": "Delete a group", + "parameters":{ + "id":{ + "location": "uri", + "description":"Group to delete by ID", + "type": "integer", + "required": true + } + } + }, + "get_group": { + "httpMethod":"GET", + "uri": "groups/{id}.json", + "summary": "Get a ticket", + "parameters":{ + "id":{ + "location": "uri", + "description":"Group to get by ID", + "type": "integer", + "required": true + } + } + }, + "update_group": { + "httpMethod":"PUT", + "uri": "groups/{id}.json", + "summary": "Update a group", + "parameters":{ + "id": { + "location": "uri", + "description":"Group to update by ID", + "type": "integer", + "required": true + }, + "data": { + "type": "array", + "location": "body", + "description":"Group JSON", + "filters": "json_encode", + "required": true + }, + "Content-Type":{ + "type": "string", + "location":"header", + "static": "application/json" + } + } + } +} +``` + +### Guzzle\Service\Description\ServiceDescription + +Commands are now called Operations + +**Before** + +```php +use Guzzle\Service\Description\ServiceDescription; + +$sd = new ServiceDescription(); +$sd->getCommands(); // @returns ApiCommandInterface[] +$sd->hasCommand($name); +$sd->getCommand($name); // @returns ApiCommandInterface|null +$sd->addCommand($command); // @param ApiCommandInterface $command +``` + +**After** + +```php +use Guzzle\Service\Description\ServiceDescription; + +$sd = new ServiceDescription(); +$sd->getOperations(); // @returns OperationInterface[] +$sd->hasOperation($name); +$sd->getOperation($name); // @returns OperationInterface|null +$sd->addOperation($operation); // @param OperationInterface $operation +``` + +### Guzzle\Common\Inflection\Inflector + +Namespace is now `Guzzle\Inflection\Inflector` + +### Guzzle\Http\Plugin + +Namespace is now `Guzzle\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below. + +### Guzzle\Http\Plugin\LogPlugin and Guzzle\Common\Log + +Now `Guzzle\Plugin\Log\LogPlugin` and `Guzzle\Log` respectively. + +**Before** + +```php +use Guzzle\Common\Log\ClosureLogAdapter; +use Guzzle\Http\Plugin\LogPlugin; + +/** @var \Guzzle\Http\Client */ +$client; + +// $verbosity is an integer indicating desired message verbosity level +$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE); +``` + +**After** + +```php +use Guzzle\Log\ClosureLogAdapter; +use Guzzle\Log\MessageFormatter; +use Guzzle\Plugin\Log\LogPlugin; + +/** @var \Guzzle\Http\Client */ +$client; + +// $format is a string indicating desired message format -- @see MessageFormatter +$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT); +``` + +### Guzzle\Http\Plugin\CurlAuthPlugin + +Now `Guzzle\Plugin\CurlAuth\CurlAuthPlugin`. + +### Guzzle\Http\Plugin\ExponentialBackoffPlugin + +Now `Guzzle\Plugin\Backoff\BackoffPlugin`, and other changes. + +**Before** + +```php +use Guzzle\Http\Plugin\ExponentialBackoffPlugin; + +$backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge( + ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429) + )); + +$client->addSubscriber($backoffPlugin); +``` + +**After** + +```php +use Guzzle\Plugin\Backoff\BackoffPlugin; +use Guzzle\Plugin\Backoff\HttpBackoffStrategy; + +// Use convenient factory method instead -- see implementation for ideas of what +// you can do with chaining backoff strategies +$backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge( + HttpBackoffStrategy::getDefaultFailureCodes(), array(429) + )); +$client->addSubscriber($backoffPlugin); +``` + +### Known Issues + +#### [BUG] Accept-Encoding header behavior changed unintentionally. + +(See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e) + +In version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to +properly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen. +See issue #217 for a workaround, or use a version containing the fix. diff --git a/instafeed/vendor/guzzlehttp/guzzle/composer.json b/instafeed/vendor/guzzlehttp/guzzle/composer.json new file mode 100755 index 0000000..c553257 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/composer.json @@ -0,0 +1,58 @@ +{ + "name": "guzzlehttp/guzzle", + "type": "library", + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "framework", + "http", + "rest", + "web service", + "curl", + "client", + "HTTP client" + ], + "homepage": "http://guzzlephp.org/", + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "require": { + "php": ">=5.5", + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "config": { + "sort-packages": true + }, + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "autoload-dev": { + "psr-4": { + "GuzzleHttp\\Tests\\": "tests/" + } + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/phpstan.neon.dist b/instafeed/vendor/guzzlehttp/guzzle/phpstan.neon.dist new file mode 100755 index 0000000..4ef4192 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/phpstan.neon.dist @@ -0,0 +1,9 @@ +parameters: + level: 1 + paths: + - src + + ignoreErrors: + - + message: '#Function uri_template not found#' + path: %currentWorkingDirectory%/src/functions.php diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Client.php b/instafeed/vendor/guzzlehttp/guzzle/src/Client.php new file mode 100755 index 0000000..0f43c71 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Client.php @@ -0,0 +1,422 @@ + 'http://www.foo.com/1.0/', + * 'timeout' => 0, + * 'allow_redirects' => false, + * 'proxy' => '192.168.16.1:10' + * ]); + * + * Client configuration settings include the following options: + * + * - handler: (callable) Function that transfers HTTP requests over the + * wire. The function is called with a Psr7\Http\Message\RequestInterface + * and array of transfer options, and must return a + * GuzzleHttp\Promise\PromiseInterface that is fulfilled with a + * Psr7\Http\Message\ResponseInterface on success. "handler" is a + * constructor only option that cannot be overridden in per/request + * options. If no handler is provided, a default handler will be created + * that enables all of the request options below by attaching all of the + * default middleware to the handler. + * - base_uri: (string|UriInterface) Base URI of the client that is merged + * into relative URIs. Can be a string or instance of UriInterface. + * - **: any request option + * + * @param array $config Client configuration settings. + * + * @see \GuzzleHttp\RequestOptions for a list of available request options. + */ + public function __construct(array $config = []) + { + if (!isset($config['handler'])) { + $config['handler'] = HandlerStack::create(); + } elseif (!is_callable($config['handler'])) { + throw new \InvalidArgumentException('handler must be a callable'); + } + + // Convert the base_uri to a UriInterface + if (isset($config['base_uri'])) { + $config['base_uri'] = Psr7\uri_for($config['base_uri']); + } + + $this->configureDefaults($config); + } + + public function __call($method, $args) + { + if (count($args) < 1) { + throw new \InvalidArgumentException('Magic request methods require a URI and optional options array'); + } + + $uri = $args[0]; + $opts = isset($args[1]) ? $args[1] : []; + + return substr($method, -5) === 'Async' + ? $this->requestAsync(substr($method, 0, -5), $uri, $opts) + : $this->request($method, $uri, $opts); + } + + public function sendAsync(RequestInterface $request, array $options = []) + { + // Merge the base URI into the request URI if needed. + $options = $this->prepareDefaults($options); + + return $this->transfer( + $request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')), + $options + ); + } + + public function send(RequestInterface $request, array $options = []) + { + $options[RequestOptions::SYNCHRONOUS] = true; + return $this->sendAsync($request, $options)->wait(); + } + + public function requestAsync($method, $uri = '', array $options = []) + { + $options = $this->prepareDefaults($options); + // Remove request modifying parameter because it can be done up-front. + $headers = isset($options['headers']) ? $options['headers'] : []; + $body = isset($options['body']) ? $options['body'] : null; + $version = isset($options['version']) ? $options['version'] : '1.1'; + // Merge the URI into the base URI. + $uri = $this->buildUri($uri, $options); + if (is_array($body)) { + $this->invalidBody(); + } + $request = new Psr7\Request($method, $uri, $headers, $body, $version); + // Remove the option so that they are not doubly-applied. + unset($options['headers'], $options['body'], $options['version']); + + return $this->transfer($request, $options); + } + + public function request($method, $uri = '', array $options = []) + { + $options[RequestOptions::SYNCHRONOUS] = true; + return $this->requestAsync($method, $uri, $options)->wait(); + } + + public function getConfig($option = null) + { + return $option === null + ? $this->config + : (isset($this->config[$option]) ? $this->config[$option] : null); + } + + private function buildUri($uri, array $config) + { + // for BC we accept null which would otherwise fail in uri_for + $uri = Psr7\uri_for($uri === null ? '' : $uri); + + if (isset($config['base_uri'])) { + $uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri); + } + + return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri; + } + + /** + * Configures the default options for a client. + * + * @param array $config + */ + private function configureDefaults(array $config) + { + $defaults = [ + 'allow_redirects' => RedirectMiddleware::$defaultSettings, + 'http_errors' => true, + 'decode_content' => true, + 'verify' => true, + 'cookies' => false + ]; + + // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. + + // We can only trust the HTTP_PROXY environment variable in a CLI + // process due to the fact that PHP has no reliable mechanism to + // get environment variables that start with "HTTP_". + if (php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) { + $defaults['proxy']['http'] = getenv('HTTP_PROXY'); + } + + if ($proxy = getenv('HTTPS_PROXY')) { + $defaults['proxy']['https'] = $proxy; + } + + if ($noProxy = getenv('NO_PROXY')) { + $cleanedNoProxy = str_replace(' ', '', $noProxy); + $defaults['proxy']['no'] = explode(',', $cleanedNoProxy); + } + + $this->config = $config + $defaults; + + if (!empty($config['cookies']) && $config['cookies'] === true) { + $this->config['cookies'] = new CookieJar(); + } + + // Add the default user-agent header. + if (!isset($this->config['headers'])) { + $this->config['headers'] = ['User-Agent' => default_user_agent()]; + } else { + // Add the User-Agent header if one was not already set. + foreach (array_keys($this->config['headers']) as $name) { + if (strtolower($name) === 'user-agent') { + return; + } + } + $this->config['headers']['User-Agent'] = default_user_agent(); + } + } + + /** + * Merges default options into the array. + * + * @param array $options Options to modify by reference + * + * @return array + */ + private function prepareDefaults(array $options) + { + $defaults = $this->config; + + if (!empty($defaults['headers'])) { + // Default headers are only added if they are not present. + $defaults['_conditional'] = $defaults['headers']; + unset($defaults['headers']); + } + + // Special handling for headers is required as they are added as + // conditional headers and as headers passed to a request ctor. + if (array_key_exists('headers', $options)) { + // Allows default headers to be unset. + if ($options['headers'] === null) { + $defaults['_conditional'] = null; + unset($options['headers']); + } elseif (!is_array($options['headers'])) { + throw new \InvalidArgumentException('headers must be an array'); + } + } + + // Shallow merge defaults underneath options. + $result = $options + $defaults; + + // Remove null values. + foreach ($result as $k => $v) { + if ($v === null) { + unset($result[$k]); + } + } + + return $result; + } + + /** + * Transfers the given request and applies request options. + * + * The URI of the request is not modified and the request options are used + * as-is without merging in default options. + * + * @param RequestInterface $request + * @param array $options + * + * @return Promise\PromiseInterface + */ + private function transfer(RequestInterface $request, array $options) + { + // save_to -> sink + if (isset($options['save_to'])) { + $options['sink'] = $options['save_to']; + unset($options['save_to']); + } + + // exceptions -> http_errors + if (isset($options['exceptions'])) { + $options['http_errors'] = $options['exceptions']; + unset($options['exceptions']); + } + + $request = $this->applyOptions($request, $options); + $handler = $options['handler']; + + try { + return Promise\promise_for($handler($request, $options)); + } catch (\Exception $e) { + return Promise\rejection_for($e); + } + } + + /** + * Applies the array of request options to a request. + * + * @param RequestInterface $request + * @param array $options + * + * @return RequestInterface + */ + private function applyOptions(RequestInterface $request, array &$options) + { + $modify = [ + 'set_headers' => [], + ]; + + if (isset($options['headers'])) { + $modify['set_headers'] = $options['headers']; + unset($options['headers']); + } + + if (isset($options['form_params'])) { + if (isset($options['multipart'])) { + throw new \InvalidArgumentException('You cannot use ' + . 'form_params and multipart at the same time. Use the ' + . 'form_params option if you want to send application/' + . 'x-www-form-urlencoded requests, and the multipart ' + . 'option to send multipart/form-data requests.'); + } + $options['body'] = http_build_query($options['form_params'], '', '&'); + unset($options['form_params']); + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); + $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded'; + } + + if (isset($options['multipart'])) { + $options['body'] = new Psr7\MultipartStream($options['multipart']); + unset($options['multipart']); + } + + if (isset($options['json'])) { + $options['body'] = \GuzzleHttp\json_encode($options['json']); + unset($options['json']); + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); + $options['_conditional']['Content-Type'] = 'application/json'; + } + + if (!empty($options['decode_content']) + && $options['decode_content'] !== true + ) { + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $options['_conditional']); + $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; + } + + if (isset($options['body'])) { + if (is_array($options['body'])) { + $this->invalidBody(); + } + $modify['body'] = Psr7\stream_for($options['body']); + unset($options['body']); + } + + if (!empty($options['auth']) && is_array($options['auth'])) { + $value = $options['auth']; + $type = isset($value[2]) ? strtolower($value[2]) : 'basic'; + switch ($type) { + case 'basic': + // Ensure that we don't have the header in different case and set the new value. + $modify['set_headers'] = Psr7\_caseless_remove(['Authorization'], $modify['set_headers']); + $modify['set_headers']['Authorization'] = 'Basic ' + . base64_encode("$value[0]:$value[1]"); + break; + case 'digest': + // @todo: Do not rely on curl + $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_DIGEST; + $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]"; + break; + case 'ntlm': + $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_NTLM; + $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]"; + break; + } + } + + if (isset($options['query'])) { + $value = $options['query']; + if (is_array($value)) { + $value = http_build_query($value, null, '&', PHP_QUERY_RFC3986); + } + if (!is_string($value)) { + throw new \InvalidArgumentException('query must be a string or array'); + } + $modify['query'] = $value; + unset($options['query']); + } + + // Ensure that sink is not an invalid value. + if (isset($options['sink'])) { + // TODO: Add more sink validation? + if (is_bool($options['sink'])) { + throw new \InvalidArgumentException('sink must not be a boolean'); + } + } + + $request = Psr7\modify_request($request, $modify); + if ($request->getBody() instanceof Psr7\MultipartStream) { + // Use a multipart/form-data POST if a Content-Type is not set. + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); + $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' + . $request->getBody()->getBoundary(); + } + + // Merge in conditional headers if they are not present. + if (isset($options['_conditional'])) { + // Build up the changes so it's in a single clone of the message. + $modify = []; + foreach ($options['_conditional'] as $k => $v) { + if (!$request->hasHeader($k)) { + $modify['set_headers'][$k] = $v; + } + } + $request = Psr7\modify_request($request, $modify); + // Don't pass this internal value along to middleware/handlers. + unset($options['_conditional']); + } + + return $request; + } + + private function invalidBody() + { + throw new \InvalidArgumentException('Passing in the "body" request ' + . 'option as an array to send a POST request has been deprecated. ' + . 'Please use the "form_params" request option to send a ' + . 'application/x-www-form-urlencoded request, or the "multipart" ' + . 'request option to send a multipart/form-data request.'); + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/ClientInterface.php b/instafeed/vendor/guzzlehttp/guzzle/src/ClientInterface.php new file mode 100755 index 0000000..5b37085 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/ClientInterface.php @@ -0,0 +1,84 @@ +strictMode = $strictMode; + + foreach ($cookieArray as $cookie) { + if (!($cookie instanceof SetCookie)) { + $cookie = new SetCookie($cookie); + } + $this->setCookie($cookie); + } + } + + /** + * Create a new Cookie jar from an associative array and domain. + * + * @param array $cookies Cookies to create the jar from + * @param string $domain Domain to set the cookies to + * + * @return self + */ + public static function fromArray(array $cookies, $domain) + { + $cookieJar = new self(); + foreach ($cookies as $name => $value) { + $cookieJar->setCookie(new SetCookie([ + 'Domain' => $domain, + 'Name' => $name, + 'Value' => $value, + 'Discard' => true + ])); + } + + return $cookieJar; + } + + /** + * @deprecated + */ + public static function getCookieValue($value) + { + return $value; + } + + /** + * Evaluate if this cookie should be persisted to storage + * that survives between requests. + * + * @param SetCookie $cookie Being evaluated. + * @param bool $allowSessionCookies If we should persist session cookies + * @return bool + */ + public static function shouldPersist( + SetCookie $cookie, + $allowSessionCookies = false + ) { + if ($cookie->getExpires() || $allowSessionCookies) { + if (!$cookie->getDiscard()) { + return true; + } + } + + return false; + } + + /** + * Finds and returns the cookie based on the name + * + * @param string $name cookie name to search for + * @return SetCookie|null cookie that was found or null if not found + */ + public function getCookieByName($name) + { + // don't allow a null name + if ($name === null) { + return null; + } + foreach ($this->cookies as $cookie) { + if ($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) { + return $cookie; + } + } + } + + public function toArray() + { + return array_map(function (SetCookie $cookie) { + return $cookie->toArray(); + }, $this->getIterator()->getArrayCopy()); + } + + public function clear($domain = null, $path = null, $name = null) + { + if (!$domain) { + $this->cookies = []; + return; + } elseif (!$path) { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) use ($domain) { + return !$cookie->matchesDomain($domain); + } + ); + } elseif (!$name) { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) use ($path, $domain) { + return !($cookie->matchesPath($path) && + $cookie->matchesDomain($domain)); + } + ); + } else { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) use ($path, $domain, $name) { + return !($cookie->getName() == $name && + $cookie->matchesPath($path) && + $cookie->matchesDomain($domain)); + } + ); + } + } + + public function clearSessionCookies() + { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) { + return !$cookie->getDiscard() && $cookie->getExpires(); + } + ); + } + + public function setCookie(SetCookie $cookie) + { + // If the name string is empty (but not 0), ignore the set-cookie + // string entirely. + $name = $cookie->getName(); + if (!$name && $name !== '0') { + return false; + } + + // Only allow cookies with set and valid domain, name, value + $result = $cookie->validate(); + if ($result !== true) { + if ($this->strictMode) { + throw new \RuntimeException('Invalid cookie: ' . $result); + } else { + $this->removeCookieIfEmpty($cookie); + return false; + } + } + + // Resolve conflicts with previously set cookies + foreach ($this->cookies as $i => $c) { + + // Two cookies are identical, when their path, and domain are + // identical. + if ($c->getPath() != $cookie->getPath() || + $c->getDomain() != $cookie->getDomain() || + $c->getName() != $cookie->getName() + ) { + continue; + } + + // The previously set cookie is a discard cookie and this one is + // not so allow the new cookie to be set + if (!$cookie->getDiscard() && $c->getDiscard()) { + unset($this->cookies[$i]); + continue; + } + + // If the new cookie's expiration is further into the future, then + // replace the old cookie + if ($cookie->getExpires() > $c->getExpires()) { + unset($this->cookies[$i]); + continue; + } + + // If the value has changed, we better change it + if ($cookie->getValue() !== $c->getValue()) { + unset($this->cookies[$i]); + continue; + } + + // The cookie exists, so no need to continue + return false; + } + + $this->cookies[] = $cookie; + + return true; + } + + public function count() + { + return count($this->cookies); + } + + public function getIterator() + { + return new \ArrayIterator(array_values($this->cookies)); + } + + public function extractCookies( + RequestInterface $request, + ResponseInterface $response + ) { + if ($cookieHeader = $response->getHeader('Set-Cookie')) { + foreach ($cookieHeader as $cookie) { + $sc = SetCookie::fromString($cookie); + if (!$sc->getDomain()) { + $sc->setDomain($request->getUri()->getHost()); + } + if (0 !== strpos($sc->getPath(), '/')) { + $sc->setPath($this->getCookiePathFromRequest($request)); + } + $this->setCookie($sc); + } + } + } + + /** + * Computes cookie path following RFC 6265 section 5.1.4 + * + * @link https://tools.ietf.org/html/rfc6265#section-5.1.4 + * + * @param RequestInterface $request + * @return string + */ + private function getCookiePathFromRequest(RequestInterface $request) + { + $uriPath = $request->getUri()->getPath(); + if ('' === $uriPath) { + return '/'; + } + if (0 !== strpos($uriPath, '/')) { + return '/'; + } + if ('/' === $uriPath) { + return '/'; + } + if (0 === $lastSlashPos = strrpos($uriPath, '/')) { + return '/'; + } + + return substr($uriPath, 0, $lastSlashPos); + } + + public function withCookieHeader(RequestInterface $request) + { + $values = []; + $uri = $request->getUri(); + $scheme = $uri->getScheme(); + $host = $uri->getHost(); + $path = $uri->getPath() ?: '/'; + + foreach ($this->cookies as $cookie) { + if ($cookie->matchesPath($path) && + $cookie->matchesDomain($host) && + !$cookie->isExpired() && + (!$cookie->getSecure() || $scheme === 'https') + ) { + $values[] = $cookie->getName() . '=' + . $cookie->getValue(); + } + } + + return $values + ? $request->withHeader('Cookie', implode('; ', $values)) + : $request; + } + + /** + * If a cookie already exists and the server asks to set it again with a + * null value, the cookie must be deleted. + * + * @param SetCookie $cookie + */ + private function removeCookieIfEmpty(SetCookie $cookie) + { + $cookieValue = $cookie->getValue(); + if ($cookieValue === null || $cookieValue === '') { + $this->clear( + $cookie->getDomain(), + $cookie->getPath(), + $cookie->getName() + ); + } + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php b/instafeed/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php new file mode 100755 index 0000000..2cf298a --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php @@ -0,0 +1,84 @@ +filename = $cookieFile; + $this->storeSessionCookies = $storeSessionCookies; + + if (file_exists($cookieFile)) { + $this->load($cookieFile); + } + } + + /** + * Saves the file when shutting down + */ + public function __destruct() + { + $this->save($this->filename); + } + + /** + * Saves the cookies to a file. + * + * @param string $filename File to save + * @throws \RuntimeException if the file cannot be found or created + */ + public function save($filename) + { + $json = []; + foreach ($this as $cookie) { + /** @var SetCookie $cookie */ + if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { + $json[] = $cookie->toArray(); + } + } + + $jsonStr = \GuzzleHttp\json_encode($json); + if (false === file_put_contents($filename, $jsonStr, LOCK_EX)) { + throw new \RuntimeException("Unable to save file {$filename}"); + } + } + + /** + * Load cookies from a JSON formatted file. + * + * Old cookies are kept unless overwritten by newly loaded ones. + * + * @param string $filename Cookie file to load. + * @throws \RuntimeException if the file cannot be loaded. + */ + public function load($filename) + { + $json = file_get_contents($filename); + if (false === $json) { + throw new \RuntimeException("Unable to load file {$filename}"); + } elseif ($json === '') { + return; + } + + $data = \GuzzleHttp\json_decode($json, true); + if (is_array($data)) { + foreach (json_decode($json, true) as $cookie) { + $this->setCookie(new SetCookie($cookie)); + } + } elseif (strlen($data)) { + throw new \RuntimeException("Invalid cookie file: {$filename}"); + } + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php b/instafeed/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php new file mode 100755 index 0000000..0224a24 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php @@ -0,0 +1,72 @@ +sessionKey = $sessionKey; + $this->storeSessionCookies = $storeSessionCookies; + $this->load(); + } + + /** + * Saves cookies to session when shutting down + */ + public function __destruct() + { + $this->save(); + } + + /** + * Save cookies to the client session + */ + public function save() + { + $json = []; + foreach ($this as $cookie) { + /** @var SetCookie $cookie */ + if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { + $json[] = $cookie->toArray(); + } + } + + $_SESSION[$this->sessionKey] = json_encode($json); + } + + /** + * Load the contents of the client session into the data array + */ + protected function load() + { + if (!isset($_SESSION[$this->sessionKey])) { + return; + } + $data = json_decode($_SESSION[$this->sessionKey], true); + if (is_array($data)) { + foreach ($data as $cookie) { + $this->setCookie(new SetCookie($cookie)); + } + } elseif (strlen($data)) { + throw new \RuntimeException("Invalid cookie data"); + } + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/instafeed/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php new file mode 100755 index 0000000..3d776a7 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php @@ -0,0 +1,403 @@ + null, + 'Value' => null, + 'Domain' => null, + 'Path' => '/', + 'Max-Age' => null, + 'Expires' => null, + 'Secure' => false, + 'Discard' => false, + 'HttpOnly' => false + ]; + + /** @var array Cookie data */ + private $data; + + /** + * Create a new SetCookie object from a string + * + * @param string $cookie Set-Cookie header string + * + * @return self + */ + public static function fromString($cookie) + { + // Create the default return array + $data = self::$defaults; + // Explode the cookie string using a series of semicolons + $pieces = array_filter(array_map('trim', explode(';', $cookie))); + // The name of the cookie (first kvp) must exist and include an equal sign. + if (empty($pieces[0]) || !strpos($pieces[0], '=')) { + return new self($data); + } + + // Add the cookie pieces into the parsed data array + foreach ($pieces as $part) { + $cookieParts = explode('=', $part, 2); + $key = trim($cookieParts[0]); + $value = isset($cookieParts[1]) + ? trim($cookieParts[1], " \n\r\t\0\x0B") + : true; + + // Only check for non-cookies when cookies have been found + if (empty($data['Name'])) { + $data['Name'] = $key; + $data['Value'] = $value; + } else { + foreach (array_keys(self::$defaults) as $search) { + if (!strcasecmp($search, $key)) { + $data[$search] = $value; + continue 2; + } + } + $data[$key] = $value; + } + } + + return new self($data); + } + + /** + * @param array $data Array of cookie data provided by a Cookie parser + */ + public function __construct(array $data = []) + { + $this->data = array_replace(self::$defaults, $data); + // Extract the Expires value and turn it into a UNIX timestamp if needed + if (!$this->getExpires() && $this->getMaxAge()) { + // Calculate the Expires date + $this->setExpires(time() + $this->getMaxAge()); + } elseif ($this->getExpires() && !is_numeric($this->getExpires())) { + $this->setExpires($this->getExpires()); + } + } + + public function __toString() + { + $str = $this->data['Name'] . '=' . $this->data['Value'] . '; '; + foreach ($this->data as $k => $v) { + if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) { + if ($k === 'Expires') { + $str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; '; + } else { + $str .= ($v === true ? $k : "{$k}={$v}") . '; '; + } + } + } + + return rtrim($str, '; '); + } + + public function toArray() + { + return $this->data; + } + + /** + * Get the cookie name + * + * @return string + */ + public function getName() + { + return $this->data['Name']; + } + + /** + * Set the cookie name + * + * @param string $name Cookie name + */ + public function setName($name) + { + $this->data['Name'] = $name; + } + + /** + * Get the cookie value + * + * @return string + */ + public function getValue() + { + return $this->data['Value']; + } + + /** + * Set the cookie value + * + * @param string $value Cookie value + */ + public function setValue($value) + { + $this->data['Value'] = $value; + } + + /** + * Get the domain + * + * @return string|null + */ + public function getDomain() + { + return $this->data['Domain']; + } + + /** + * Set the domain of the cookie + * + * @param string $domain + */ + public function setDomain($domain) + { + $this->data['Domain'] = $domain; + } + + /** + * Get the path + * + * @return string + */ + public function getPath() + { + return $this->data['Path']; + } + + /** + * Set the path of the cookie + * + * @param string $path Path of the cookie + */ + public function setPath($path) + { + $this->data['Path'] = $path; + } + + /** + * Maximum lifetime of the cookie in seconds + * + * @return int|null + */ + public function getMaxAge() + { + return $this->data['Max-Age']; + } + + /** + * Set the max-age of the cookie + * + * @param int $maxAge Max age of the cookie in seconds + */ + public function setMaxAge($maxAge) + { + $this->data['Max-Age'] = $maxAge; + } + + /** + * The UNIX timestamp when the cookie Expires + * + * @return mixed + */ + public function getExpires() + { + return $this->data['Expires']; + } + + /** + * Set the unix timestamp for which the cookie will expire + * + * @param int $timestamp Unix timestamp + */ + public function setExpires($timestamp) + { + $this->data['Expires'] = is_numeric($timestamp) + ? (int) $timestamp + : strtotime($timestamp); + } + + /** + * Get whether or not this is a secure cookie + * + * @return bool|null + */ + public function getSecure() + { + return $this->data['Secure']; + } + + /** + * Set whether or not the cookie is secure + * + * @param bool $secure Set to true or false if secure + */ + public function setSecure($secure) + { + $this->data['Secure'] = $secure; + } + + /** + * Get whether or not this is a session cookie + * + * @return bool|null + */ + public function getDiscard() + { + return $this->data['Discard']; + } + + /** + * Set whether or not this is a session cookie + * + * @param bool $discard Set to true or false if this is a session cookie + */ + public function setDiscard($discard) + { + $this->data['Discard'] = $discard; + } + + /** + * Get whether or not this is an HTTP only cookie + * + * @return bool + */ + public function getHttpOnly() + { + return $this->data['HttpOnly']; + } + + /** + * Set whether or not this is an HTTP only cookie + * + * @param bool $httpOnly Set to true or false if this is HTTP only + */ + public function setHttpOnly($httpOnly) + { + $this->data['HttpOnly'] = $httpOnly; + } + + /** + * Check if the cookie matches a path value. + * + * A request-path path-matches a given cookie-path if at least one of + * the following conditions holds: + * + * - The cookie-path and the request-path are identical. + * - The cookie-path is a prefix of the request-path, and the last + * character of the cookie-path is %x2F ("/"). + * - The cookie-path is a prefix of the request-path, and the first + * character of the request-path that is not included in the cookie- + * path is a %x2F ("/") character. + * + * @param string $requestPath Path to check against + * + * @return bool + */ + public function matchesPath($requestPath) + { + $cookiePath = $this->getPath(); + + // Match on exact matches or when path is the default empty "/" + if ($cookiePath === '/' || $cookiePath == $requestPath) { + return true; + } + + // Ensure that the cookie-path is a prefix of the request path. + if (0 !== strpos($requestPath, $cookiePath)) { + return false; + } + + // Match if the last character of the cookie-path is "/" + if (substr($cookiePath, -1, 1) === '/') { + return true; + } + + // Match if the first character not included in cookie path is "/" + return substr($requestPath, strlen($cookiePath), 1) === '/'; + } + + /** + * Check if the cookie matches a domain value + * + * @param string $domain Domain to check against + * + * @return bool + */ + public function matchesDomain($domain) + { + // Remove the leading '.' as per spec in RFC 6265. + // http://tools.ietf.org/html/rfc6265#section-5.2.3 + $cookieDomain = ltrim($this->getDomain(), '.'); + + // Domain not set or exact match. + if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) { + return true; + } + + // Matching the subdomain according to RFC 6265. + // http://tools.ietf.org/html/rfc6265#section-5.1.3 + if (filter_var($domain, FILTER_VALIDATE_IP)) { + return false; + } + + return (bool) preg_match('/\.' . preg_quote($cookieDomain, '/') . '$/', $domain); + } + + /** + * Check if the cookie is expired + * + * @return bool + */ + public function isExpired() + { + return $this->getExpires() !== null && time() > $this->getExpires(); + } + + /** + * Check if the cookie is valid according to RFC 6265 + * + * @return bool|string Returns true if valid or an error message if invalid + */ + public function validate() + { + // Names must not be empty, but can be 0 + $name = $this->getName(); + if (empty($name) && !is_numeric($name)) { + return 'The cookie name must not be empty'; + } + + // Check if any of the invalid characters are present in the cookie name + if (preg_match( + '/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/', + $name + )) { + return 'Cookie name must not contain invalid characters: ASCII ' + . 'Control characters (0-31;127), space, tab and the ' + . 'following characters: ()<>@,;:\"/?={}'; + } + + // Value must not be empty, but can be 0 + $value = $this->getValue(); + if (empty($value) && !is_numeric($value)) { + return 'The cookie value must not be empty'; + } + + // Domains must not be empty, but can be 0 + // A "0" is not a valid internet domain, but may be used as server name + // in a private network. + $domain = $this->getDomain(); + if (empty($domain) && !is_numeric($domain)) { + return 'The cookie domain must not be empty'; + } + + return true; + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php b/instafeed/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php new file mode 100755 index 0000000..427d896 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php @@ -0,0 +1,27 @@ +getStatusCode() + : 0; + parent::__construct($message, $code, $previous); + $this->request = $request; + $this->response = $response; + $this->handlerContext = $handlerContext; + } + + /** + * Wrap non-RequestExceptions with a RequestException + * + * @param RequestInterface $request + * @param \Exception $e + * + * @return RequestException + */ + public static function wrapException(RequestInterface $request, \Exception $e) + { + return $e instanceof RequestException + ? $e + : new RequestException($e->getMessage(), $request, null, $e); + } + + /** + * Factory method to create a new exception with a normalized error message + * + * @param RequestInterface $request Request + * @param ResponseInterface $response Response received + * @param \Exception $previous Previous exception + * @param array $ctx Optional handler context. + * + * @return self + */ + public static function create( + RequestInterface $request, + ResponseInterface $response = null, + \Exception $previous = null, + array $ctx = [] + ) { + if (!$response) { + return new self( + 'Error completing request', + $request, + null, + $previous, + $ctx + ); + } + + $level = (int) floor($response->getStatusCode() / 100); + if ($level === 4) { + $label = 'Client error'; + $className = ClientException::class; + } elseif ($level === 5) { + $label = 'Server error'; + $className = ServerException::class; + } else { + $label = 'Unsuccessful request'; + $className = __CLASS__; + } + + $uri = $request->getUri(); + $uri = static::obfuscateUri($uri); + + // Client Error: `GET /` resulted in a `404 Not Found` response: + // ... (truncated) + $message = sprintf( + '%s: `%s %s` resulted in a `%s %s` response', + $label, + $request->getMethod(), + $uri, + $response->getStatusCode(), + $response->getReasonPhrase() + ); + + $summary = static::getResponseBodySummary($response); + + if ($summary !== null) { + $message .= ":\n{$summary}\n"; + } + + return new $className($message, $request, $response, $previous, $ctx); + } + + /** + * Get a short summary of the response + * + * Will return `null` if the response is not printable. + * + * @param ResponseInterface $response + * + * @return string|null + */ + public static function getResponseBodySummary(ResponseInterface $response) + { + $body = $response->getBody(); + + if (!$body->isSeekable() || !$body->isReadable()) { + return null; + } + + $size = $body->getSize(); + + if ($size === 0) { + return null; + } + + $summary = $body->read(120); + $body->rewind(); + + if ($size > 120) { + $summary .= ' (truncated...)'; + } + + // Matches any printable character, including unicode characters: + // letters, marks, numbers, punctuation, spacing, and separators. + if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) { + return null; + } + + return $summary; + } + + /** + * Obfuscates URI if there is an username and a password present + * + * @param UriInterface $uri + * + * @return UriInterface + */ + private static function obfuscateUri($uri) + { + $userInfo = $uri->getUserInfo(); + + if (false !== ($pos = strpos($userInfo, ':'))) { + return $uri->withUserInfo(substr($userInfo, 0, $pos), '***'); + } + + return $uri; + } + + /** + * Get the request that caused the exception + * + * @return RequestInterface + */ + public function getRequest() + { + return $this->request; + } + + /** + * Get the associated response + * + * @return ResponseInterface|null + */ + public function getResponse() + { + return $this->response; + } + + /** + * Check if a response was received + * + * @return bool + */ + public function hasResponse() + { + return $this->response !== null; + } + + /** + * Get contextual information about the error from the underlying handler. + * + * The contents of this array will vary depending on which handler you are + * using. It may also be just an empty array. Relying on this data will + * couple you to a specific handler, but can give more debug information + * when needed. + * + * @return array + */ + public function getHandlerContext() + { + return $this->handlerContext; + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php b/instafeed/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php new file mode 100755 index 0000000..a77c289 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php @@ -0,0 +1,27 @@ +stream = $stream; + $msg = $msg ?: 'Could not seek the stream to position ' . $pos; + parent::__construct($msg); + } + + /** + * @return StreamInterface + */ + public function getStream() + { + return $this->stream; + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php b/instafeed/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php new file mode 100755 index 0000000..127094c --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php @@ -0,0 +1,9 @@ +maxHandles = $maxHandles; + } + + public function create(RequestInterface $request, array $options) + { + if (isset($options['curl']['body_as_string'])) { + $options['_body_as_string'] = $options['curl']['body_as_string']; + unset($options['curl']['body_as_string']); + } + + $easy = new EasyHandle; + $easy->request = $request; + $easy->options = $options; + $conf = $this->getDefaultConf($easy); + $this->applyMethod($easy, $conf); + $this->applyHandlerOptions($easy, $conf); + $this->applyHeaders($easy, $conf); + unset($conf['_headers']); + + // Add handler options from the request configuration options + if (isset($options['curl'])) { + $conf = array_replace($conf, $options['curl']); + } + + $conf[CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); + $easy->handle = $this->handles + ? array_pop($this->handles) + : curl_init(); + curl_setopt_array($easy->handle, $conf); + + return $easy; + } + + public function release(EasyHandle $easy) + { + $resource = $easy->handle; + unset($easy->handle); + + if (count($this->handles) >= $this->maxHandles) { + curl_close($resource); + } else { + // Remove all callback functions as they can hold onto references + // and are not cleaned up by curl_reset. Using curl_setopt_array + // does not work for some reason, so removing each one + // individually. + curl_setopt($resource, CURLOPT_HEADERFUNCTION, null); + curl_setopt($resource, CURLOPT_READFUNCTION, null); + curl_setopt($resource, CURLOPT_WRITEFUNCTION, null); + curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, null); + curl_reset($resource); + $this->handles[] = $resource; + } + } + + /** + * Completes a cURL transaction, either returning a response promise or a + * rejected promise. + * + * @param callable $handler + * @param EasyHandle $easy + * @param CurlFactoryInterface $factory Dictates how the handle is released + * + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public static function finish( + callable $handler, + EasyHandle $easy, + CurlFactoryInterface $factory + ) { + if (isset($easy->options['on_stats'])) { + self::invokeStats($easy); + } + + if (!$easy->response || $easy->errno) { + return self::finishError($handler, $easy, $factory); + } + + // Return the response if it is present and there is no error. + $factory->release($easy); + + // Rewind the body of the response if possible. + $body = $easy->response->getBody(); + if ($body->isSeekable()) { + $body->rewind(); + } + + return new FulfilledPromise($easy->response); + } + + private static function invokeStats(EasyHandle $easy) + { + $curlStats = curl_getinfo($easy->handle); + $curlStats['appconnect_time'] = curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME); + $stats = new TransferStats( + $easy->request, + $easy->response, + $curlStats['total_time'], + $easy->errno, + $curlStats + ); + call_user_func($easy->options['on_stats'], $stats); + } + + private static function finishError( + callable $handler, + EasyHandle $easy, + CurlFactoryInterface $factory + ) { + // Get error information and release the handle to the factory. + $ctx = [ + 'errno' => $easy->errno, + 'error' => curl_error($easy->handle), + 'appconnect_time' => curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME), + ] + curl_getinfo($easy->handle); + $ctx[self::CURL_VERSION_STR] = curl_version()['version']; + $factory->release($easy); + + // Retry when nothing is present or when curl failed to rewind. + if (empty($easy->options['_err_message']) + && (!$easy->errno || $easy->errno == 65) + ) { + return self::retryFailedRewind($handler, $easy, $ctx); + } + + return self::createRejection($easy, $ctx); + } + + private static function createRejection(EasyHandle $easy, array $ctx) + { + static $connectionErrors = [ + CURLE_OPERATION_TIMEOUTED => true, + CURLE_COULDNT_RESOLVE_HOST => true, + CURLE_COULDNT_CONNECT => true, + CURLE_SSL_CONNECT_ERROR => true, + CURLE_GOT_NOTHING => true, + ]; + + // If an exception was encountered during the onHeaders event, then + // return a rejected promise that wraps that exception. + if ($easy->onHeadersException) { + return \GuzzleHttp\Promise\rejection_for( + new RequestException( + 'An error was encountered during the on_headers event', + $easy->request, + $easy->response, + $easy->onHeadersException, + $ctx + ) + ); + } + if (version_compare($ctx[self::CURL_VERSION_STR], self::LOW_CURL_VERSION_NUMBER)) { + $message = sprintf( + 'cURL error %s: %s (%s)', + $ctx['errno'], + $ctx['error'], + 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html' + ); + } else { + $message = sprintf( + 'cURL error %s: %s (%s) for %s', + $ctx['errno'], + $ctx['error'], + 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html', + $easy->request->getUri() + ); + } + + // Create a connection exception if it was a specific error code. + $error = isset($connectionErrors[$easy->errno]) + ? new ConnectException($message, $easy->request, null, $ctx) + : new RequestException($message, $easy->request, $easy->response, null, $ctx); + + return \GuzzleHttp\Promise\rejection_for($error); + } + + private function getDefaultConf(EasyHandle $easy) + { + $conf = [ + '_headers' => $easy->request->getHeaders(), + CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), + CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), + CURLOPT_RETURNTRANSFER => false, + CURLOPT_HEADER => false, + CURLOPT_CONNECTTIMEOUT => 150, + ]; + + if (defined('CURLOPT_PROTOCOLS')) { + $conf[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS; + } + + $version = $easy->request->getProtocolVersion(); + if ($version == 1.1) { + $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1; + } elseif ($version == 2.0) { + $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2_0; + } else { + $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0; + } + + return $conf; + } + + private function applyMethod(EasyHandle $easy, array &$conf) + { + $body = $easy->request->getBody(); + $size = $body->getSize(); + + if ($size === null || $size > 0) { + $this->applyBody($easy->request, $easy->options, $conf); + return; + } + + $method = $easy->request->getMethod(); + if ($method === 'PUT' || $method === 'POST') { + // See http://tools.ietf.org/html/rfc7230#section-3.3.2 + if (!$easy->request->hasHeader('Content-Length')) { + $conf[CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; + } + } elseif ($method === 'HEAD') { + $conf[CURLOPT_NOBODY] = true; + unset( + $conf[CURLOPT_WRITEFUNCTION], + $conf[CURLOPT_READFUNCTION], + $conf[CURLOPT_FILE], + $conf[CURLOPT_INFILE] + ); + } + } + + private function applyBody(RequestInterface $request, array $options, array &$conf) + { + $size = $request->hasHeader('Content-Length') + ? (int) $request->getHeaderLine('Content-Length') + : null; + + // Send the body as a string if the size is less than 1MB OR if the + // [curl][body_as_string] request value is set. + if (($size !== null && $size < 1000000) || + !empty($options['_body_as_string']) + ) { + $conf[CURLOPT_POSTFIELDS] = (string) $request->getBody(); + // Don't duplicate the Content-Length header + $this->removeHeader('Content-Length', $conf); + $this->removeHeader('Transfer-Encoding', $conf); + } else { + $conf[CURLOPT_UPLOAD] = true; + if ($size !== null) { + $conf[CURLOPT_INFILESIZE] = $size; + $this->removeHeader('Content-Length', $conf); + } + $body = $request->getBody(); + if ($body->isSeekable()) { + $body->rewind(); + } + $conf[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) { + return $body->read($length); + }; + } + + // If the Expect header is not present, prevent curl from adding it + if (!$request->hasHeader('Expect')) { + $conf[CURLOPT_HTTPHEADER][] = 'Expect:'; + } + + // cURL sometimes adds a content-type by default. Prevent this. + if (!$request->hasHeader('Content-Type')) { + $conf[CURLOPT_HTTPHEADER][] = 'Content-Type:'; + } + } + + private function applyHeaders(EasyHandle $easy, array &$conf) + { + foreach ($conf['_headers'] as $name => $values) { + foreach ($values as $value) { + $value = (string) $value; + if ($value === '') { + // cURL requires a special format for empty headers. + // See https://github.com/guzzle/guzzle/issues/1882 for more details. + $conf[CURLOPT_HTTPHEADER][] = "$name;"; + } else { + $conf[CURLOPT_HTTPHEADER][] = "$name: $value"; + } + } + } + + // Remove the Accept header if one was not set + if (!$easy->request->hasHeader('Accept')) { + $conf[CURLOPT_HTTPHEADER][] = 'Accept:'; + } + } + + /** + * Remove a header from the options array. + * + * @param string $name Case-insensitive header to remove + * @param array $options Array of options to modify + */ + private function removeHeader($name, array &$options) + { + foreach (array_keys($options['_headers']) as $key) { + if (!strcasecmp($key, $name)) { + unset($options['_headers'][$key]); + return; + } + } + } + + private function applyHandlerOptions(EasyHandle $easy, array &$conf) + { + $options = $easy->options; + if (isset($options['verify'])) { + if ($options['verify'] === false) { + unset($conf[CURLOPT_CAINFO]); + $conf[CURLOPT_SSL_VERIFYHOST] = 0; + $conf[CURLOPT_SSL_VERIFYPEER] = false; + } else { + $conf[CURLOPT_SSL_VERIFYHOST] = 2; + $conf[CURLOPT_SSL_VERIFYPEER] = true; + if (is_string($options['verify'])) { + // Throw an error if the file/folder/link path is not valid or doesn't exist. + if (!file_exists($options['verify'])) { + throw new \InvalidArgumentException( + "SSL CA bundle not found: {$options['verify']}" + ); + } + // If it's a directory or a link to a directory use CURLOPT_CAPATH. + // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO. + if (is_dir($options['verify']) || + (is_link($options['verify']) && is_dir(readlink($options['verify'])))) { + $conf[CURLOPT_CAPATH] = $options['verify']; + } else { + $conf[CURLOPT_CAINFO] = $options['verify']; + } + } + } + } + + if (!empty($options['decode_content'])) { + $accept = $easy->request->getHeaderLine('Accept-Encoding'); + if ($accept) { + $conf[CURLOPT_ENCODING] = $accept; + } else { + $conf[CURLOPT_ENCODING] = ''; + // Don't let curl send the header over the wire + $conf[CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; + } + } + + if (isset($options['sink'])) { + $sink = $options['sink']; + if (!is_string($sink)) { + $sink = \GuzzleHttp\Psr7\stream_for($sink); + } elseif (!is_dir(dirname($sink))) { + // Ensure that the directory exists before failing in curl. + throw new \RuntimeException(sprintf( + 'Directory %s does not exist for sink value of %s', + dirname($sink), + $sink + )); + } else { + $sink = new LazyOpenStream($sink, 'w+'); + } + $easy->sink = $sink; + $conf[CURLOPT_WRITEFUNCTION] = function ($ch, $write) use ($sink) { + return $sink->write($write); + }; + } else { + // Use a default temp stream if no sink was set. + $conf[CURLOPT_FILE] = fopen('php://temp', 'w+'); + $easy->sink = Psr7\stream_for($conf[CURLOPT_FILE]); + } + $timeoutRequiresNoSignal = false; + if (isset($options['timeout'])) { + $timeoutRequiresNoSignal |= $options['timeout'] < 1; + $conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000; + } + + // CURL default value is CURL_IPRESOLVE_WHATEVER + if (isset($options['force_ip_resolve'])) { + if ('v4' === $options['force_ip_resolve']) { + $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4; + } elseif ('v6' === $options['force_ip_resolve']) { + $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6; + } + } + + if (isset($options['connect_timeout'])) { + $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1; + $conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000; + } + + if ($timeoutRequiresNoSignal && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { + $conf[CURLOPT_NOSIGNAL] = true; + } + + if (isset($options['proxy'])) { + if (!is_array($options['proxy'])) { + $conf[CURLOPT_PROXY] = $options['proxy']; + } else { + $scheme = $easy->request->getUri()->getScheme(); + if (isset($options['proxy'][$scheme])) { + $host = $easy->request->getUri()->getHost(); + if (!isset($options['proxy']['no']) || + !\GuzzleHttp\is_host_in_noproxy($host, $options['proxy']['no']) + ) { + $conf[CURLOPT_PROXY] = $options['proxy'][$scheme]; + } + } + } + } + + if (isset($options['cert'])) { + $cert = $options['cert']; + if (is_array($cert)) { + $conf[CURLOPT_SSLCERTPASSWD] = $cert[1]; + $cert = $cert[0]; + } + if (!file_exists($cert)) { + throw new \InvalidArgumentException( + "SSL certificate not found: {$cert}" + ); + } + $conf[CURLOPT_SSLCERT] = $cert; + } + + if (isset($options['ssl_key'])) { + $sslKey = $options['ssl_key']; + if (is_array($sslKey)) { + $conf[CURLOPT_SSLKEYPASSWD] = $sslKey[1]; + $sslKey = $sslKey[0]; + } + if (!file_exists($sslKey)) { + throw new \InvalidArgumentException( + "SSL private key not found: {$sslKey}" + ); + } + $conf[CURLOPT_SSLKEY] = $sslKey; + } + + if (isset($options['progress'])) { + $progress = $options['progress']; + if (!is_callable($progress)) { + throw new \InvalidArgumentException( + 'progress client option must be callable' + ); + } + $conf[CURLOPT_NOPROGRESS] = false; + $conf[CURLOPT_PROGRESSFUNCTION] = function () use ($progress) { + $args = func_get_args(); + // PHP 5.5 pushed the handle onto the start of the args + if (is_resource($args[0])) { + array_shift($args); + } + call_user_func_array($progress, $args); + }; + } + + if (!empty($options['debug'])) { + $conf[CURLOPT_STDERR] = \GuzzleHttp\debug_resource($options['debug']); + $conf[CURLOPT_VERBOSE] = true; + } + } + + /** + * This function ensures that a response was set on a transaction. If one + * was not set, then the request is retried if possible. This error + * typically means you are sending a payload, curl encountered a + * "Connection died, retrying a fresh connect" error, tried to rewind the + * stream, and then encountered a "necessary data rewind wasn't possible" + * error, causing the request to be sent through curl_multi_info_read() + * without an error status. + */ + private static function retryFailedRewind( + callable $handler, + EasyHandle $easy, + array $ctx + ) { + try { + // Only rewind if the body has been read from. + $body = $easy->request->getBody(); + if ($body->tell() > 0) { + $body->rewind(); + } + } catch (\RuntimeException $e) { + $ctx['error'] = 'The connection unexpectedly failed without ' + . 'providing an error. The request would have been retried, ' + . 'but attempting to rewind the request body failed. ' + . 'Exception: ' . $e; + return self::createRejection($easy, $ctx); + } + + // Retry no more than 3 times before giving up. + if (!isset($easy->options['_curl_retries'])) { + $easy->options['_curl_retries'] = 1; + } elseif ($easy->options['_curl_retries'] == 2) { + $ctx['error'] = 'The cURL request was retried 3 times ' + . 'and did not succeed. The most likely reason for the failure ' + . 'is that cURL was unable to rewind the body of the request ' + . 'and subsequent retries resulted in the same error. Turn on ' + . 'the debug option to see what went wrong. See ' + . 'https://bugs.php.net/bug.php?id=47204 for more information.'; + return self::createRejection($easy, $ctx); + } else { + $easy->options['_curl_retries']++; + } + + return $handler($easy->request, $easy->options); + } + + private function createHeaderFn(EasyHandle $easy) + { + if (isset($easy->options['on_headers'])) { + $onHeaders = $easy->options['on_headers']; + + if (!is_callable($onHeaders)) { + throw new \InvalidArgumentException('on_headers must be callable'); + } + } else { + $onHeaders = null; + } + + return function ($ch, $h) use ( + $onHeaders, + $easy, + &$startingResponse + ) { + $value = trim($h); + if ($value === '') { + $startingResponse = true; + $easy->createResponse(); + if ($onHeaders !== null) { + try { + $onHeaders($easy->response); + } catch (\Exception $e) { + // Associate the exception with the handle and trigger + // a curl header write error by returning 0. + $easy->onHeadersException = $e; + return -1; + } + } + } elseif ($startingResponse) { + $startingResponse = false; + $easy->headers = [$value]; + } else { + $easy->headers[] = $value; + } + return strlen($h); + }; + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php b/instafeed/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php new file mode 100755 index 0000000..b0fc236 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php @@ -0,0 +1,27 @@ +factory = isset($options['handle_factory']) + ? $options['handle_factory'] + : new CurlFactory(3); + } + + public function __invoke(RequestInterface $request, array $options) + { + if (isset($options['delay'])) { + usleep($options['delay'] * 1000); + } + + $easy = $this->factory->create($request, $options); + curl_exec($easy->handle); + $easy->errno = curl_errno($easy->handle); + + return CurlFactory::finish($this, $easy, $this->factory); + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/instafeed/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php new file mode 100755 index 0000000..d829762 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php @@ -0,0 +1,205 @@ +factory = isset($options['handle_factory']) + ? $options['handle_factory'] : new CurlFactory(50); + + if (isset($options['select_timeout'])) { + $this->selectTimeout = $options['select_timeout']; + } elseif ($selectTimeout = getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { + $this->selectTimeout = $selectTimeout; + } else { + $this->selectTimeout = 1; + } + } + + public function __get($name) + { + if ($name === '_mh') { + return $this->_mh = curl_multi_init(); + } + + throw new \BadMethodCallException(); + } + + public function __destruct() + { + if (isset($this->_mh)) { + curl_multi_close($this->_mh); + unset($this->_mh); + } + } + + public function __invoke(RequestInterface $request, array $options) + { + $easy = $this->factory->create($request, $options); + $id = (int) $easy->handle; + + $promise = new Promise( + [$this, 'execute'], + function () use ($id) { + return $this->cancel($id); + } + ); + + $this->addRequest(['easy' => $easy, 'deferred' => $promise]); + + return $promise; + } + + /** + * Ticks the curl event loop. + */ + public function tick() + { + // Add any delayed handles if needed. + if ($this->delays) { + $currentTime = \GuzzleHttp\_current_time(); + foreach ($this->delays as $id => $delay) { + if ($currentTime >= $delay) { + unset($this->delays[$id]); + curl_multi_add_handle( + $this->_mh, + $this->handles[$id]['easy']->handle + ); + } + } + } + + // Step through the task queue which may add additional requests. + P\queue()->run(); + + if ($this->active && + curl_multi_select($this->_mh, $this->selectTimeout) === -1 + ) { + // Perform a usleep if a select returns -1. + // See: https://bugs.php.net/bug.php?id=61141 + usleep(250); + } + + while (curl_multi_exec($this->_mh, $this->active) === CURLM_CALL_MULTI_PERFORM); + + $this->processMessages(); + } + + /** + * Runs until all outstanding connections have completed. + */ + public function execute() + { + $queue = P\queue(); + + while ($this->handles || !$queue->isEmpty()) { + // If there are no transfers, then sleep for the next delay + if (!$this->active && $this->delays) { + usleep($this->timeToNext()); + } + $this->tick(); + } + } + + private function addRequest(array $entry) + { + $easy = $entry['easy']; + $id = (int) $easy->handle; + $this->handles[$id] = $entry; + if (empty($easy->options['delay'])) { + curl_multi_add_handle($this->_mh, $easy->handle); + } else { + $this->delays[$id] = \GuzzleHttp\_current_time() + ($easy->options['delay'] / 1000); + } + } + + /** + * Cancels a handle from sending and removes references to it. + * + * @param int $id Handle ID to cancel and remove. + * + * @return bool True on success, false on failure. + */ + private function cancel($id) + { + // Cannot cancel if it has been processed. + if (!isset($this->handles[$id])) { + return false; + } + + $handle = $this->handles[$id]['easy']->handle; + unset($this->delays[$id], $this->handles[$id]); + curl_multi_remove_handle($this->_mh, $handle); + curl_close($handle); + + return true; + } + + private function processMessages() + { + while ($done = curl_multi_info_read($this->_mh)) { + $id = (int) $done['handle']; + curl_multi_remove_handle($this->_mh, $done['handle']); + + if (!isset($this->handles[$id])) { + // Probably was cancelled. + continue; + } + + $entry = $this->handles[$id]; + unset($this->handles[$id], $this->delays[$id]); + $entry['easy']->errno = $done['result']; + $entry['deferred']->resolve( + CurlFactory::finish( + $this, + $entry['easy'], + $this->factory + ) + ); + } + } + + private function timeToNext() + { + $currentTime = \GuzzleHttp\_current_time(); + $nextTime = PHP_INT_MAX; + foreach ($this->delays as $time) { + if ($time < $nextTime) { + $nextTime = $time; + } + } + + return max(0, $nextTime - $currentTime) * 1000000; + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php b/instafeed/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php new file mode 100755 index 0000000..7754e91 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php @@ -0,0 +1,92 @@ +headers)) { + throw new \RuntimeException('No headers have been received'); + } + + // HTTP-version SP status-code SP reason-phrase + $startLine = explode(' ', array_shift($this->headers), 3); + $headers = \GuzzleHttp\headers_from_lines($this->headers); + $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers); + + if (!empty($this->options['decode_content']) + && isset($normalizedKeys['content-encoding']) + ) { + $headers['x-encoded-content-encoding'] + = $headers[$normalizedKeys['content-encoding']]; + unset($headers[$normalizedKeys['content-encoding']]); + if (isset($normalizedKeys['content-length'])) { + $headers['x-encoded-content-length'] + = $headers[$normalizedKeys['content-length']]; + + $bodyLength = (int) $this->sink->getSize(); + if ($bodyLength) { + $headers[$normalizedKeys['content-length']] = $bodyLength; + } else { + unset($headers[$normalizedKeys['content-length']]); + } + } + } + + // Attach a response to the easy handle with the parsed headers. + $this->response = new Response( + $startLine[1], + $headers, + $this->sink, + substr($startLine[0], 5), + isset($startLine[2]) ? (string) $startLine[2] : null + ); + } + + public function __get($name) + { + $msg = $name === 'handle' + ? 'The EasyHandle has been released' + : 'Invalid property: ' . $name; + throw new \BadMethodCallException($msg); + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php b/instafeed/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php new file mode 100755 index 0000000..d5c449c --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php @@ -0,0 +1,190 @@ +onFulfilled = $onFulfilled; + $this->onRejected = $onRejected; + + if ($queue) { + call_user_func_array([$this, 'append'], $queue); + } + } + + public function __invoke(RequestInterface $request, array $options) + { + if (!$this->queue) { + throw new \OutOfBoundsException('Mock queue is empty'); + } + + if (isset($options['delay'])) { + usleep($options['delay'] * 1000); + } + + $this->lastRequest = $request; + $this->lastOptions = $options; + $response = array_shift($this->queue); + + if (isset($options['on_headers'])) { + if (!is_callable($options['on_headers'])) { + throw new \InvalidArgumentException('on_headers must be callable'); + } + try { + $options['on_headers']($response); + } catch (\Exception $e) { + $msg = 'An error was encountered during the on_headers event'; + $response = new RequestException($msg, $request, $response, $e); + } + } + + if (is_callable($response)) { + $response = call_user_func($response, $request, $options); + } + + $response = $response instanceof \Exception + ? \GuzzleHttp\Promise\rejection_for($response) + : \GuzzleHttp\Promise\promise_for($response); + + return $response->then( + function ($value) use ($request, $options) { + $this->invokeStats($request, $options, $value); + if ($this->onFulfilled) { + call_user_func($this->onFulfilled, $value); + } + if (isset($options['sink'])) { + $contents = (string) $value->getBody(); + $sink = $options['sink']; + + if (is_resource($sink)) { + fwrite($sink, $contents); + } elseif (is_string($sink)) { + file_put_contents($sink, $contents); + } elseif ($sink instanceof \Psr\Http\Message\StreamInterface) { + $sink->write($contents); + } + } + + return $value; + }, + function ($reason) use ($request, $options) { + $this->invokeStats($request, $options, null, $reason); + if ($this->onRejected) { + call_user_func($this->onRejected, $reason); + } + return \GuzzleHttp\Promise\rejection_for($reason); + } + ); + } + + /** + * Adds one or more variadic requests, exceptions, callables, or promises + * to the queue. + */ + public function append() + { + foreach (func_get_args() as $value) { + if ($value instanceof ResponseInterface + || $value instanceof \Exception + || $value instanceof PromiseInterface + || is_callable($value) + ) { + $this->queue[] = $value; + } else { + throw new \InvalidArgumentException('Expected a response or ' + . 'exception. Found ' . \GuzzleHttp\describe_type($value)); + } + } + } + + /** + * Get the last received request. + * + * @return RequestInterface + */ + public function getLastRequest() + { + return $this->lastRequest; + } + + /** + * Get the last received request options. + * + * @return array + */ + public function getLastOptions() + { + return $this->lastOptions; + } + + /** + * Returns the number of remaining items in the queue. + * + * @return int + */ + public function count() + { + return count($this->queue); + } + + private function invokeStats( + RequestInterface $request, + array $options, + ResponseInterface $response = null, + $reason = null + ) { + if (isset($options['on_stats'])) { + $transferTime = isset($options['transfer_time']) ? $options['transfer_time'] : 0; + $stats = new TransferStats($request, $response, $transferTime, $reason); + call_user_func($options['on_stats'], $stats); + } + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php b/instafeed/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php new file mode 100755 index 0000000..f8b00be --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php @@ -0,0 +1,55 @@ +withoutHeader('Expect'); + + // Append a content-length header if body size is zero to match + // cURL's behavior. + if (0 === $request->getBody()->getSize()) { + $request = $request->withHeader('Content-Length', '0'); + } + + return $this->createResponse( + $request, + $options, + $this->createStream($request, $options), + $startTime + ); + } catch (\InvalidArgumentException $e) { + throw $e; + } catch (\Exception $e) { + // Determine if the error was a networking error. + $message = $e->getMessage(); + // This list can probably get more comprehensive. + if (strpos($message, 'getaddrinfo') // DNS lookup failed + || strpos($message, 'Connection refused') + || strpos($message, "couldn't connect to host") // error on HHVM + || strpos($message, "connection attempt failed") + ) { + $e = new ConnectException($e->getMessage(), $request, $e); + } + $e = RequestException::wrapException($request, $e); + $this->invokeStats($options, $request, $startTime, null, $e); + + return \GuzzleHttp\Promise\rejection_for($e); + } + } + + private function invokeStats( + array $options, + RequestInterface $request, + $startTime, + ResponseInterface $response = null, + $error = null + ) { + if (isset($options['on_stats'])) { + $stats = new TransferStats( + $request, + $response, + \GuzzleHttp\_current_time() - $startTime, + $error, + [] + ); + call_user_func($options['on_stats'], $stats); + } + } + + private function createResponse( + RequestInterface $request, + array $options, + $stream, + $startTime + ) { + $hdrs = $this->lastHeaders; + $this->lastHeaders = []; + $parts = explode(' ', array_shift($hdrs), 3); + $ver = explode('/', $parts[0])[1]; + $status = $parts[1]; + $reason = isset($parts[2]) ? $parts[2] : null; + $headers = \GuzzleHttp\headers_from_lines($hdrs); + list($stream, $headers) = $this->checkDecode($options, $headers, $stream); + $stream = Psr7\stream_for($stream); + $sink = $stream; + + if (strcasecmp('HEAD', $request->getMethod())) { + $sink = $this->createSink($stream, $options); + } + + $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); + + if (isset($options['on_headers'])) { + try { + $options['on_headers']($response); + } catch (\Exception $e) { + $msg = 'An error was encountered during the on_headers event'; + $ex = new RequestException($msg, $request, $response, $e); + return \GuzzleHttp\Promise\rejection_for($ex); + } + } + + // Do not drain when the request is a HEAD request because they have + // no body. + if ($sink !== $stream) { + $this->drain( + $stream, + $sink, + $response->getHeaderLine('Content-Length') + ); + } + + $this->invokeStats($options, $request, $startTime, $response, null); + + return new FulfilledPromise($response); + } + + private function createSink(StreamInterface $stream, array $options) + { + if (!empty($options['stream'])) { + return $stream; + } + + $sink = isset($options['sink']) + ? $options['sink'] + : fopen('php://temp', 'r+'); + + return is_string($sink) + ? new Psr7\LazyOpenStream($sink, 'w+') + : Psr7\stream_for($sink); + } + + private function checkDecode(array $options, array $headers, $stream) + { + // Automatically decode responses when instructed. + if (!empty($options['decode_content'])) { + $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers); + if (isset($normalizedKeys['content-encoding'])) { + $encoding = $headers[$normalizedKeys['content-encoding']]; + if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') { + $stream = new Psr7\InflateStream( + Psr7\stream_for($stream) + ); + $headers['x-encoded-content-encoding'] + = $headers[$normalizedKeys['content-encoding']]; + // Remove content-encoding header + unset($headers[$normalizedKeys['content-encoding']]); + // Fix content-length header + if (isset($normalizedKeys['content-length'])) { + $headers['x-encoded-content-length'] + = $headers[$normalizedKeys['content-length']]; + + $length = (int) $stream->getSize(); + if ($length === 0) { + unset($headers[$normalizedKeys['content-length']]); + } else { + $headers[$normalizedKeys['content-length']] = [$length]; + } + } + } + } + } + + return [$stream, $headers]; + } + + /** + * Drains the source stream into the "sink" client option. + * + * @param StreamInterface $source + * @param StreamInterface $sink + * @param string $contentLength Header specifying the amount of + * data to read. + * + * @return StreamInterface + * @throws \RuntimeException when the sink option is invalid. + */ + private function drain( + StreamInterface $source, + StreamInterface $sink, + $contentLength + ) { + // If a content-length header is provided, then stop reading once + // that number of bytes has been read. This can prevent infinitely + // reading from a stream when dealing with servers that do not honor + // Connection: Close headers. + Psr7\copy_to_stream( + $source, + $sink, + (strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1 + ); + + $sink->seek(0); + $source->close(); + + return $sink; + } + + /** + * Create a resource and check to ensure it was created successfully + * + * @param callable $callback Callable that returns stream resource + * + * @return resource + * @throws \RuntimeException on error + */ + private function createResource(callable $callback) + { + $errors = null; + set_error_handler(function ($_, $msg, $file, $line) use (&$errors) { + $errors[] = [ + 'message' => $msg, + 'file' => $file, + 'line' => $line + ]; + return true; + }); + + $resource = $callback(); + restore_error_handler(); + + if (!$resource) { + $message = 'Error creating resource: '; + foreach ($errors as $err) { + foreach ($err as $key => $value) { + $message .= "[$key] $value" . PHP_EOL; + } + } + throw new \RuntimeException(trim($message)); + } + + return $resource; + } + + private function createStream(RequestInterface $request, array $options) + { + static $methods; + if (!$methods) { + $methods = array_flip(get_class_methods(__CLASS__)); + } + + // HTTP/1.1 streams using the PHP stream wrapper require a + // Connection: close header + if ($request->getProtocolVersion() == '1.1' + && !$request->hasHeader('Connection') + ) { + $request = $request->withHeader('Connection', 'close'); + } + + // Ensure SSL is verified by default + if (!isset($options['verify'])) { + $options['verify'] = true; + } + + $params = []; + $context = $this->getDefaultContext($request); + + if (isset($options['on_headers']) && !is_callable($options['on_headers'])) { + throw new \InvalidArgumentException('on_headers must be callable'); + } + + if (!empty($options)) { + foreach ($options as $key => $value) { + $method = "add_{$key}"; + if (isset($methods[$method])) { + $this->{$method}($request, $context, $value, $params); + } + } + } + + if (isset($options['stream_context'])) { + if (!is_array($options['stream_context'])) { + throw new \InvalidArgumentException('stream_context must be an array'); + } + $context = array_replace_recursive( + $context, + $options['stream_context'] + ); + } + + // Microsoft NTLM authentication only supported with curl handler + if (isset($options['auth']) + && is_array($options['auth']) + && isset($options['auth'][2]) + && 'ntlm' == $options['auth'][2] + ) { + throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler'); + } + + $uri = $this->resolveHost($request, $options); + + $context = $this->createResource( + function () use ($context, $params) { + return stream_context_create($context, $params); + } + ); + + return $this->createResource( + function () use ($uri, &$http_response_header, $context, $options) { + $resource = fopen((string) $uri, 'r', null, $context); + $this->lastHeaders = $http_response_header; + + if (isset($options['read_timeout'])) { + $readTimeout = $options['read_timeout']; + $sec = (int) $readTimeout; + $usec = ($readTimeout - $sec) * 100000; + stream_set_timeout($resource, $sec, $usec); + } + + return $resource; + } + ); + } + + private function resolveHost(RequestInterface $request, array $options) + { + $uri = $request->getUri(); + + if (isset($options['force_ip_resolve']) && !filter_var($uri->getHost(), FILTER_VALIDATE_IP)) { + if ('v4' === $options['force_ip_resolve']) { + $records = dns_get_record($uri->getHost(), DNS_A); + if (!isset($records[0]['ip'])) { + throw new ConnectException( + sprintf( + "Could not resolve IPv4 address for host '%s'", + $uri->getHost() + ), + $request + ); + } + $uri = $uri->withHost($records[0]['ip']); + } elseif ('v6' === $options['force_ip_resolve']) { + $records = dns_get_record($uri->getHost(), DNS_AAAA); + if (!isset($records[0]['ipv6'])) { + throw new ConnectException( + sprintf( + "Could not resolve IPv6 address for host '%s'", + $uri->getHost() + ), + $request + ); + } + $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']'); + } + } + + return $uri; + } + + private function getDefaultContext(RequestInterface $request) + { + $headers = ''; + foreach ($request->getHeaders() as $name => $value) { + foreach ($value as $val) { + $headers .= "$name: $val\r\n"; + } + } + + $context = [ + 'http' => [ + 'method' => $request->getMethod(), + 'header' => $headers, + 'protocol_version' => $request->getProtocolVersion(), + 'ignore_errors' => true, + 'follow_location' => 0, + ], + ]; + + $body = (string) $request->getBody(); + + if (!empty($body)) { + $context['http']['content'] = $body; + // Prevent the HTTP handler from adding a Content-Type header. + if (!$request->hasHeader('Content-Type')) { + $context['http']['header'] .= "Content-Type:\r\n"; + } + } + + $context['http']['header'] = rtrim($context['http']['header']); + + return $context; + } + + private function add_proxy(RequestInterface $request, &$options, $value, &$params) + { + if (!is_array($value)) { + $options['http']['proxy'] = $value; + } else { + $scheme = $request->getUri()->getScheme(); + if (isset($value[$scheme])) { + if (!isset($value['no']) + || !\GuzzleHttp\is_host_in_noproxy( + $request->getUri()->getHost(), + $value['no'] + ) + ) { + $options['http']['proxy'] = $value[$scheme]; + } + } + } + } + + private function add_timeout(RequestInterface $request, &$options, $value, &$params) + { + if ($value > 0) { + $options['http']['timeout'] = $value; + } + } + + private function add_verify(RequestInterface $request, &$options, $value, &$params) + { + if ($value === true) { + // PHP 5.6 or greater will find the system cert by default. When + // < 5.6, use the Guzzle bundled cacert. + if (PHP_VERSION_ID < 50600) { + $options['ssl']['cafile'] = \GuzzleHttp\default_ca_bundle(); + } + } elseif (is_string($value)) { + $options['ssl']['cafile'] = $value; + if (!file_exists($value)) { + throw new \RuntimeException("SSL CA bundle not found: $value"); + } + } elseif ($value === false) { + $options['ssl']['verify_peer'] = false; + $options['ssl']['verify_peer_name'] = false; + return; + } else { + throw new \InvalidArgumentException('Invalid verify request option'); + } + + $options['ssl']['verify_peer'] = true; + $options['ssl']['verify_peer_name'] = true; + $options['ssl']['allow_self_signed'] = false; + } + + private function add_cert(RequestInterface $request, &$options, $value, &$params) + { + if (is_array($value)) { + $options['ssl']['passphrase'] = $value[1]; + $value = $value[0]; + } + + if (!file_exists($value)) { + throw new \RuntimeException("SSL certificate not found: {$value}"); + } + + $options['ssl']['local_cert'] = $value; + } + + private function add_progress(RequestInterface $request, &$options, $value, &$params) + { + $this->addNotification( + $params, + function ($code, $a, $b, $c, $transferred, $total) use ($value) { + if ($code == STREAM_NOTIFY_PROGRESS) { + $value($total, $transferred, null, null); + } + } + ); + } + + private function add_debug(RequestInterface $request, &$options, $value, &$params) + { + if ($value === false) { + return; + } + + static $map = [ + STREAM_NOTIFY_CONNECT => 'CONNECT', + STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', + STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', + STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', + STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', + STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', + STREAM_NOTIFY_PROGRESS => 'PROGRESS', + STREAM_NOTIFY_FAILURE => 'FAILURE', + STREAM_NOTIFY_COMPLETED => 'COMPLETED', + STREAM_NOTIFY_RESOLVE => 'RESOLVE', + ]; + static $args = ['severity', 'message', 'message_code', + 'bytes_transferred', 'bytes_max']; + + $value = \GuzzleHttp\debug_resource($value); + $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment(''); + $this->addNotification( + $params, + function () use ($ident, $value, $map, $args) { + $passed = func_get_args(); + $code = array_shift($passed); + fprintf($value, '<%s> [%s] ', $ident, $map[$code]); + foreach (array_filter($passed) as $i => $v) { + fwrite($value, $args[$i] . ': "' . $v . '" '); + } + fwrite($value, "\n"); + } + ); + } + + private function addNotification(array &$params, callable $notify) + { + // Wrap the existing function if needed. + if (!isset($params['notification'])) { + $params['notification'] = $notify; + } else { + $params['notification'] = $this->callArray([ + $params['notification'], + $notify + ]); + } + } + + private function callArray(array $functions) + { + return function () use ($functions) { + $args = func_get_args(); + foreach ($functions as $fn) { + call_user_func_array($fn, $args); + } + }; + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/HandlerStack.php b/instafeed/vendor/guzzlehttp/guzzle/src/HandlerStack.php new file mode 100755 index 0000000..f001686 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/HandlerStack.php @@ -0,0 +1,273 @@ +push(Middleware::httpErrors(), 'http_errors'); + $stack->push(Middleware::redirect(), 'allow_redirects'); + $stack->push(Middleware::cookies(), 'cookies'); + $stack->push(Middleware::prepareBody(), 'prepare_body'); + + return $stack; + } + + /** + * @param callable $handler Underlying HTTP handler. + */ + public function __construct(callable $handler = null) + { + $this->handler = $handler; + } + + /** + * Invokes the handler stack as a composed handler + * + * @param RequestInterface $request + * @param array $options + */ + public function __invoke(RequestInterface $request, array $options) + { + $handler = $this->resolve(); + + return $handler($request, $options); + } + + /** + * Dumps a string representation of the stack. + * + * @return string + */ + public function __toString() + { + $depth = 0; + $stack = []; + if ($this->handler) { + $stack[] = "0) Handler: " . $this->debugCallable($this->handler); + } + + $result = ''; + foreach (array_reverse($this->stack) as $tuple) { + $depth++; + $str = "{$depth}) Name: '{$tuple[1]}', "; + $str .= "Function: " . $this->debugCallable($tuple[0]); + $result = "> {$str}\n{$result}"; + $stack[] = $str; + } + + foreach (array_keys($stack) as $k) { + $result .= "< {$stack[$k]}\n"; + } + + return $result; + } + + /** + * Set the HTTP handler that actually returns a promise. + * + * @param callable $handler Accepts a request and array of options and + * returns a Promise. + */ + public function setHandler(callable $handler) + { + $this->handler = $handler; + $this->cached = null; + } + + /** + * Returns true if the builder has a handler. + * + * @return bool + */ + public function hasHandler() + { + return (bool) $this->handler; + } + + /** + * Unshift a middleware to the bottom of the stack. + * + * @param callable $middleware Middleware function + * @param string $name Name to register for this middleware. + */ + public function unshift(callable $middleware, $name = null) + { + array_unshift($this->stack, [$middleware, $name]); + $this->cached = null; + } + + /** + * Push a middleware to the top of the stack. + * + * @param callable $middleware Middleware function + * @param string $name Name to register for this middleware. + */ + public function push(callable $middleware, $name = '') + { + $this->stack[] = [$middleware, $name]; + $this->cached = null; + } + + /** + * Add a middleware before another middleware by name. + * + * @param string $findName Middleware to find + * @param callable $middleware Middleware function + * @param string $withName Name to register for this middleware. + */ + public function before($findName, callable $middleware, $withName = '') + { + $this->splice($findName, $withName, $middleware, true); + } + + /** + * Add a middleware after another middleware by name. + * + * @param string $findName Middleware to find + * @param callable $middleware Middleware function + * @param string $withName Name to register for this middleware. + */ + public function after($findName, callable $middleware, $withName = '') + { + $this->splice($findName, $withName, $middleware, false); + } + + /** + * Remove a middleware by instance or name from the stack. + * + * @param callable|string $remove Middleware to remove by instance or name. + */ + public function remove($remove) + { + $this->cached = null; + $idx = is_callable($remove) ? 0 : 1; + $this->stack = array_values(array_filter( + $this->stack, + function ($tuple) use ($idx, $remove) { + return $tuple[$idx] !== $remove; + } + )); + } + + /** + * Compose the middleware and handler into a single callable function. + * + * @return callable + */ + public function resolve() + { + if (!$this->cached) { + if (!($prev = $this->handler)) { + throw new \LogicException('No handler has been specified'); + } + + foreach (array_reverse($this->stack) as $fn) { + $prev = $fn[0]($prev); + } + + $this->cached = $prev; + } + + return $this->cached; + } + + /** + * @param string $name + * @return int + */ + private function findByName($name) + { + foreach ($this->stack as $k => $v) { + if ($v[1] === $name) { + return $k; + } + } + + throw new \InvalidArgumentException("Middleware not found: $name"); + } + + /** + * Splices a function into the middleware list at a specific position. + * + * @param string $findName + * @param string $withName + * @param callable $middleware + * @param bool $before + */ + private function splice($findName, $withName, callable $middleware, $before) + { + $this->cached = null; + $idx = $this->findByName($findName); + $tuple = [$middleware, $withName]; + + if ($before) { + if ($idx === 0) { + array_unshift($this->stack, $tuple); + } else { + $replacement = [$tuple, $this->stack[$idx]]; + array_splice($this->stack, $idx, 1, $replacement); + } + } elseif ($idx === count($this->stack) - 1) { + $this->stack[] = $tuple; + } else { + $replacement = [$this->stack[$idx], $tuple]; + array_splice($this->stack, $idx, 1, $replacement); + } + } + + /** + * Provides a debug string for a given callable. + * + * @param array|callable $fn Function to write as a string. + * + * @return string + */ + private function debugCallable($fn) + { + if (is_string($fn)) { + return "callable({$fn})"; + } + + if (is_array($fn)) { + return is_string($fn[0]) + ? "callable({$fn[0]}::{$fn[1]})" + : "callable(['" . get_class($fn[0]) . "', '{$fn[1]}'])"; + } + + return 'callable(' . spl_object_hash($fn) . ')'; + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/MessageFormatter.php b/instafeed/vendor/guzzlehttp/guzzle/src/MessageFormatter.php new file mode 100755 index 0000000..663ac73 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/MessageFormatter.php @@ -0,0 +1,180 @@ +>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; + const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; + + /** @var string Template used to format log messages */ + private $template; + + /** + * @param string $template Log message template + */ + public function __construct($template = self::CLF) + { + $this->template = $template ?: self::CLF; + } + + /** + * Returns a formatted message string. + * + * @param RequestInterface $request Request that was sent + * @param ResponseInterface $response Response that was received + * @param \Exception $error Exception that was received + * + * @return string + */ + public function format( + RequestInterface $request, + ResponseInterface $response = null, + \Exception $error = null + ) { + $cache = []; + + return preg_replace_callback( + '/{\s*([A-Za-z_\-\.0-9]+)\s*}/', + function (array $matches) use ($request, $response, $error, &$cache) { + if (isset($cache[$matches[1]])) { + return $cache[$matches[1]]; + } + + $result = ''; + switch ($matches[1]) { + case 'request': + $result = Psr7\str($request); + break; + case 'response': + $result = $response ? Psr7\str($response) : ''; + break; + case 'req_headers': + $result = trim($request->getMethod() + . ' ' . $request->getRequestTarget()) + . ' HTTP/' . $request->getProtocolVersion() . "\r\n" + . $this->headers($request); + break; + case 'res_headers': + $result = $response ? + sprintf( + 'HTTP/%s %d %s', + $response->getProtocolVersion(), + $response->getStatusCode(), + $response->getReasonPhrase() + ) . "\r\n" . $this->headers($response) + : 'NULL'; + break; + case 'req_body': + $result = $request->getBody(); + break; + case 'res_body': + $result = $response ? $response->getBody() : 'NULL'; + break; + case 'ts': + case 'date_iso_8601': + $result = gmdate('c'); + break; + case 'date_common_log': + $result = date('d/M/Y:H:i:s O'); + break; + case 'method': + $result = $request->getMethod(); + break; + case 'version': + $result = $request->getProtocolVersion(); + break; + case 'uri': + case 'url': + $result = $request->getUri(); + break; + case 'target': + $result = $request->getRequestTarget(); + break; + case 'req_version': + $result = $request->getProtocolVersion(); + break; + case 'res_version': + $result = $response + ? $response->getProtocolVersion() + : 'NULL'; + break; + case 'host': + $result = $request->getHeaderLine('Host'); + break; + case 'hostname': + $result = gethostname(); + break; + case 'code': + $result = $response ? $response->getStatusCode() : 'NULL'; + break; + case 'phrase': + $result = $response ? $response->getReasonPhrase() : 'NULL'; + break; + case 'error': + $result = $error ? $error->getMessage() : 'NULL'; + break; + default: + // handle prefixed dynamic headers + if (strpos($matches[1], 'req_header_') === 0) { + $result = $request->getHeaderLine(substr($matches[1], 11)); + } elseif (strpos($matches[1], 'res_header_') === 0) { + $result = $response + ? $response->getHeaderLine(substr($matches[1], 11)) + : 'NULL'; + } + } + + $cache[$matches[1]] = $result; + return $result; + }, + $this->template + ); + } + + private function headers(MessageInterface $message) + { + $result = ''; + foreach ($message->getHeaders() as $name => $values) { + $result .= $name . ': ' . implode(', ', $values) . "\r\n"; + } + + return trim($result); + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Middleware.php b/instafeed/vendor/guzzlehttp/guzzle/src/Middleware.php new file mode 100755 index 0000000..bffc197 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Middleware.php @@ -0,0 +1,254 @@ +withCookieHeader($request); + return $handler($request, $options) + ->then( + function ($response) use ($cookieJar, $request) { + $cookieJar->extractCookies($request, $response); + return $response; + } + ); + }; + }; + } + + /** + * Middleware that throws exceptions for 4xx or 5xx responses when the + * "http_error" request option is set to true. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function httpErrors() + { + return function (callable $handler) { + return function ($request, array $options) use ($handler) { + if (empty($options['http_errors'])) { + return $handler($request, $options); + } + return $handler($request, $options)->then( + function (ResponseInterface $response) use ($request) { + $code = $response->getStatusCode(); + if ($code < 400) { + return $response; + } + throw RequestException::create($request, $response); + } + ); + }; + }; + } + + /** + * Middleware that pushes history data to an ArrayAccess container. + * + * @param array|\ArrayAccess $container Container to hold the history (by reference). + * + * @return callable Returns a function that accepts the next handler. + * @throws \InvalidArgumentException if container is not an array or ArrayAccess. + */ + public static function history(&$container) + { + if (!is_array($container) && !$container instanceof \ArrayAccess) { + throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess'); + } + + return function (callable $handler) use (&$container) { + return function ($request, array $options) use ($handler, &$container) { + return $handler($request, $options)->then( + function ($value) use ($request, &$container, $options) { + $container[] = [ + 'request' => $request, + 'response' => $value, + 'error' => null, + 'options' => $options + ]; + return $value; + }, + function ($reason) use ($request, &$container, $options) { + $container[] = [ + 'request' => $request, + 'response' => null, + 'error' => $reason, + 'options' => $options + ]; + return \GuzzleHttp\Promise\rejection_for($reason); + } + ); + }; + }; + } + + /** + * Middleware that invokes a callback before and after sending a request. + * + * The provided listener cannot modify or alter the response. It simply + * "taps" into the chain to be notified before returning the promise. The + * before listener accepts a request and options array, and the after + * listener accepts a request, options array, and response promise. + * + * @param callable $before Function to invoke before forwarding the request. + * @param callable $after Function invoked after forwarding. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function tap(callable $before = null, callable $after = null) + { + return function (callable $handler) use ($before, $after) { + return function ($request, array $options) use ($handler, $before, $after) { + if ($before) { + $before($request, $options); + } + $response = $handler($request, $options); + if ($after) { + $after($request, $options, $response); + } + return $response; + }; + }; + } + + /** + * Middleware that handles request redirects. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function redirect() + { + return function (callable $handler) { + return new RedirectMiddleware($handler); + }; + } + + /** + * Middleware that retries requests based on the boolean result of + * invoking the provided "decider" function. + * + * If no delay function is provided, a simple implementation of exponential + * backoff will be utilized. + * + * @param callable $decider Function that accepts the number of retries, + * a request, [response], and [exception] and + * returns true if the request is to be retried. + * @param callable $delay Function that accepts the number of retries and + * returns the number of milliseconds to delay. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function retry(callable $decider, callable $delay = null) + { + return function (callable $handler) use ($decider, $delay) { + return new RetryMiddleware($decider, $handler, $delay); + }; + } + + /** + * Middleware that logs requests, responses, and errors using a message + * formatter. + * + * @param LoggerInterface $logger Logs messages. + * @param MessageFormatter $formatter Formatter used to create message strings. + * @param string $logLevel Level at which to log requests. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = 'info' /* \Psr\Log\LogLevel::INFO */) + { + return function (callable $handler) use ($logger, $formatter, $logLevel) { + return function ($request, array $options) use ($handler, $logger, $formatter, $logLevel) { + return $handler($request, $options)->then( + function ($response) use ($logger, $request, $formatter, $logLevel) { + $message = $formatter->format($request, $response); + $logger->log($logLevel, $message); + return $response; + }, + function ($reason) use ($logger, $request, $formatter) { + $response = $reason instanceof RequestException + ? $reason->getResponse() + : null; + $message = $formatter->format($request, $response, $reason); + $logger->notice($message); + return \GuzzleHttp\Promise\rejection_for($reason); + } + ); + }; + }; + } + + /** + * This middleware adds a default content-type if possible, a default + * content-length or transfer-encoding header, and the expect header. + * + * @return callable + */ + public static function prepareBody() + { + return function (callable $handler) { + return new PrepareBodyMiddleware($handler); + }; + } + + /** + * Middleware that applies a map function to the request before passing to + * the next handler. + * + * @param callable $fn Function that accepts a RequestInterface and returns + * a RequestInterface. + * @return callable + */ + public static function mapRequest(callable $fn) + { + return function (callable $handler) use ($fn) { + return function ($request, array $options) use ($handler, $fn) { + return $handler($fn($request), $options); + }; + }; + } + + /** + * Middleware that applies a map function to the resolved promise's + * response. + * + * @param callable $fn Function that accepts a ResponseInterface and + * returns a ResponseInterface. + * @return callable + */ + public static function mapResponse(callable $fn) + { + return function (callable $handler) use ($fn) { + return function ($request, array $options) use ($handler, $fn) { + return $handler($request, $options)->then($fn); + }; + }; + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/Pool.php b/instafeed/vendor/guzzlehttp/guzzle/src/Pool.php new file mode 100755 index 0000000..05c854a --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/Pool.php @@ -0,0 +1,123 @@ + $rfn) { + if ($rfn instanceof RequestInterface) { + yield $key => $client->sendAsync($rfn, $opts); + } elseif (is_callable($rfn)) { + yield $key => $rfn($opts); + } else { + throw new \InvalidArgumentException('Each value yielded by ' + . 'the iterator must be a Psr7\Http\Message\RequestInterface ' + . 'or a callable that returns a promise that fulfills ' + . 'with a Psr7\Message\Http\ResponseInterface object.'); + } + } + }; + + $this->each = new EachPromise($requests(), $config); + } + + public function promise() + { + return $this->each->promise(); + } + + /** + * Sends multiple requests concurrently and returns an array of responses + * and exceptions that uses the same ordering as the provided requests. + * + * IMPORTANT: This method keeps every request and response in memory, and + * as such, is NOT recommended when sending a large number or an + * indeterminate number of requests concurrently. + * + * @param ClientInterface $client Client used to send the requests + * @param array|\Iterator $requests Requests to send concurrently. + * @param array $options Passes through the options available in + * {@see GuzzleHttp\Pool::__construct} + * + * @return array Returns an array containing the response or an exception + * in the same order that the requests were sent. + * @throws \InvalidArgumentException if the event format is incorrect. + */ + public static function batch( + ClientInterface $client, + $requests, + array $options = [] + ) { + $res = []; + self::cmpCallback($options, 'fulfilled', $res); + self::cmpCallback($options, 'rejected', $res); + $pool = new static($client, $requests, $options); + $pool->promise()->wait(); + ksort($res); + + return $res; + } + + private static function cmpCallback(array &$options, $name, array &$results) + { + if (!isset($options[$name])) { + $options[$name] = function ($v, $k) use (&$results) { + $results[$k] = $v; + }; + } else { + $currentFn = $options[$name]; + $options[$name] = function ($v, $k) use (&$results, $currentFn) { + $currentFn($v, $k); + $results[$k] = $v; + }; + } + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php b/instafeed/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php new file mode 100755 index 0000000..2eb95f9 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php @@ -0,0 +1,106 @@ +nextHandler = $nextHandler; + } + + /** + * @param RequestInterface $request + * @param array $options + * + * @return PromiseInterface + */ + public function __invoke(RequestInterface $request, array $options) + { + $fn = $this->nextHandler; + + // Don't do anything if the request has no body. + if ($request->getBody()->getSize() === 0) { + return $fn($request, $options); + } + + $modify = []; + + // Add a default content-type if possible. + if (!$request->hasHeader('Content-Type')) { + if ($uri = $request->getBody()->getMetadata('uri')) { + if ($type = Psr7\mimetype_from_filename($uri)) { + $modify['set_headers']['Content-Type'] = $type; + } + } + } + + // Add a default content-length or transfer-encoding header. + if (!$request->hasHeader('Content-Length') + && !$request->hasHeader('Transfer-Encoding') + ) { + $size = $request->getBody()->getSize(); + if ($size !== null) { + $modify['set_headers']['Content-Length'] = $size; + } else { + $modify['set_headers']['Transfer-Encoding'] = 'chunked'; + } + } + + // Add the expect header if needed. + $this->addExpectHeader($request, $options, $modify); + + return $fn(Psr7\modify_request($request, $modify), $options); + } + + private function addExpectHeader( + RequestInterface $request, + array $options, + array &$modify + ) { + // Determine if the Expect header should be used + if ($request->hasHeader('Expect')) { + return; + } + + $expect = isset($options['expect']) ? $options['expect'] : null; + + // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0 + if ($expect === false || $request->getProtocolVersion() < 1.1) { + return; + } + + // The expect header is unconditionally enabled + if ($expect === true) { + $modify['set_headers']['Expect'] = '100-Continue'; + return; + } + + // By default, send the expect header when the payload is > 1mb + if ($expect === null) { + $expect = 1048576; + } + + // Always add if the body cannot be rewound, the size cannot be + // determined, or the size is greater than the cutoff threshold + $body = $request->getBody(); + $size = $body->getSize(); + + if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { + $modify['set_headers']['Expect'] = '100-Continue'; + } + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php b/instafeed/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php new file mode 100755 index 0000000..bff4e4e --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php @@ -0,0 +1,237 @@ + 5, + 'protocols' => ['http', 'https'], + 'strict' => false, + 'referer' => false, + 'track_redirects' => false, + ]; + + /** @var callable */ + private $nextHandler; + + /** + * @param callable $nextHandler Next handler to invoke. + */ + public function __construct(callable $nextHandler) + { + $this->nextHandler = $nextHandler; + } + + /** + * @param RequestInterface $request + * @param array $options + * + * @return PromiseInterface + */ + public function __invoke(RequestInterface $request, array $options) + { + $fn = $this->nextHandler; + + if (empty($options['allow_redirects'])) { + return $fn($request, $options); + } + + if ($options['allow_redirects'] === true) { + $options['allow_redirects'] = self::$defaultSettings; + } elseif (!is_array($options['allow_redirects'])) { + throw new \InvalidArgumentException('allow_redirects must be true, false, or array'); + } else { + // Merge the default settings with the provided settings + $options['allow_redirects'] += self::$defaultSettings; + } + + if (empty($options['allow_redirects']['max'])) { + return $fn($request, $options); + } + + return $fn($request, $options) + ->then(function (ResponseInterface $response) use ($request, $options) { + return $this->checkRedirect($request, $options, $response); + }); + } + + /** + * @param RequestInterface $request + * @param array $options + * @param ResponseInterface|PromiseInterface $response + * + * @return ResponseInterface|PromiseInterface + */ + public function checkRedirect( + RequestInterface $request, + array $options, + ResponseInterface $response + ) { + if (substr($response->getStatusCode(), 0, 1) != '3' + || !$response->hasHeader('Location') + ) { + return $response; + } + + $this->guardMax($request, $options); + $nextRequest = $this->modifyRequest($request, $options, $response); + + if (isset($options['allow_redirects']['on_redirect'])) { + call_user_func( + $options['allow_redirects']['on_redirect'], + $request, + $response, + $nextRequest->getUri() + ); + } + + /** @var PromiseInterface|ResponseInterface $promise */ + $promise = $this($nextRequest, $options); + + // Add headers to be able to track history of redirects. + if (!empty($options['allow_redirects']['track_redirects'])) { + return $this->withTracking( + $promise, + (string) $nextRequest->getUri(), + $response->getStatusCode() + ); + } + + return $promise; + } + + private function withTracking(PromiseInterface $promise, $uri, $statusCode) + { + return $promise->then( + function (ResponseInterface $response) use ($uri, $statusCode) { + // Note that we are pushing to the front of the list as this + // would be an earlier response than what is currently present + // in the history header. + $historyHeader = $response->getHeader(self::HISTORY_HEADER); + $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER); + array_unshift($historyHeader, $uri); + array_unshift($statusHeader, $statusCode); + return $response->withHeader(self::HISTORY_HEADER, $historyHeader) + ->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader); + } + ); + } + + private function guardMax(RequestInterface $request, array &$options) + { + $current = isset($options['__redirect_count']) + ? $options['__redirect_count'] + : 0; + $options['__redirect_count'] = $current + 1; + $max = $options['allow_redirects']['max']; + + if ($options['__redirect_count'] > $max) { + throw new TooManyRedirectsException( + "Will not follow more than {$max} redirects", + $request + ); + } + } + + /** + * @param RequestInterface $request + * @param array $options + * @param ResponseInterface $response + * + * @return RequestInterface + */ + public function modifyRequest( + RequestInterface $request, + array $options, + ResponseInterface $response + ) { + // Request modifications to apply. + $modify = []; + $protocols = $options['allow_redirects']['protocols']; + + // Use a GET request if this is an entity enclosing request and we are + // not forcing RFC compliance, but rather emulating what all browsers + // would do. + $statusCode = $response->getStatusCode(); + if ($statusCode == 303 || + ($statusCode <= 302 && $request->getBody() && !$options['allow_redirects']['strict']) + ) { + $modify['method'] = 'GET'; + $modify['body'] = ''; + } + + $modify['uri'] = $this->redirectUri($request, $response, $protocols); + Psr7\rewind_body($request); + + // Add the Referer header if it is told to do so and only + // add the header if we are not redirecting from https to http. + if ($options['allow_redirects']['referer'] + && $modify['uri']->getScheme() === $request->getUri()->getScheme() + ) { + $uri = $request->getUri()->withUserInfo(''); + $modify['set_headers']['Referer'] = (string) $uri; + } else { + $modify['remove_headers'][] = 'Referer'; + } + + // Remove Authorization header if host is different. + if ($request->getUri()->getHost() !== $modify['uri']->getHost()) { + $modify['remove_headers'][] = 'Authorization'; + } + + return Psr7\modify_request($request, $modify); + } + + /** + * Set the appropriate URL on the request based on the location header + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @param array $protocols + * + * @return UriInterface + */ + private function redirectUri( + RequestInterface $request, + ResponseInterface $response, + array $protocols + ) { + $location = Psr7\UriResolver::resolve( + $request->getUri(), + new Psr7\Uri($response->getHeaderLine('Location')) + ); + + // Ensure that the redirect URI is allowed based on the protocols. + if (!in_array($location->getScheme(), $protocols)) { + throw new BadResponseException( + sprintf( + 'Redirect URI, %s, does not use one of the allowed redirect protocols: %s', + $location, + implode(', ', $protocols) + ), + $request, + $response + ); + } + + return $location; + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/RequestOptions.php b/instafeed/vendor/guzzlehttp/guzzle/src/RequestOptions.php new file mode 100755 index 0000000..5c0fd19 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/RequestOptions.php @@ -0,0 +1,255 @@ +decider = $decider; + $this->nextHandler = $nextHandler; + $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; + } + + /** + * Default exponential backoff delay function. + * + * @param int $retries + * + * @return int + */ + public static function exponentialDelay($retries) + { + return (int) pow(2, $retries - 1); + } + + /** + * @param RequestInterface $request + * @param array $options + * + * @return PromiseInterface + */ + public function __invoke(RequestInterface $request, array $options) + { + if (!isset($options['retries'])) { + $options['retries'] = 0; + } + + $fn = $this->nextHandler; + return $fn($request, $options) + ->then( + $this->onFulfilled($request, $options), + $this->onRejected($request, $options) + ); + } + + private function onFulfilled(RequestInterface $req, array $options) + { + return function ($value) use ($req, $options) { + if (!call_user_func( + $this->decider, + $options['retries'], + $req, + $value, + null + )) { + return $value; + } + return $this->doRetry($req, $options, $value); + }; + } + + private function onRejected(RequestInterface $req, array $options) + { + return function ($reason) use ($req, $options) { + if (!call_user_func( + $this->decider, + $options['retries'], + $req, + null, + $reason + )) { + return \GuzzleHttp\Promise\rejection_for($reason); + } + return $this->doRetry($req, $options); + }; + } + + private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null) + { + $options['delay'] = call_user_func($this->delay, ++$options['retries'], $response); + + return $this($request, $options); + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/TransferStats.php b/instafeed/vendor/guzzlehttp/guzzle/src/TransferStats.php new file mode 100755 index 0000000..23a22a3 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/TransferStats.php @@ -0,0 +1,126 @@ +request = $request; + $this->response = $response; + $this->transferTime = $transferTime; + $this->handlerErrorData = $handlerErrorData; + $this->handlerStats = $handlerStats; + } + + /** + * @return RequestInterface + */ + public function getRequest() + { + return $this->request; + } + + /** + * Returns the response that was received (if any). + * + * @return ResponseInterface|null + */ + public function getResponse() + { + return $this->response; + } + + /** + * Returns true if a response was received. + * + * @return bool + */ + public function hasResponse() + { + return $this->response !== null; + } + + /** + * Gets handler specific error data. + * + * This might be an exception, a integer representing an error code, or + * anything else. Relying on this value assumes that you know what handler + * you are using. + * + * @return mixed + */ + public function getHandlerErrorData() + { + return $this->handlerErrorData; + } + + /** + * Get the effective URI the request was sent to. + * + * @return UriInterface + */ + public function getEffectiveUri() + { + return $this->request->getUri(); + } + + /** + * Get the estimated time the request was being transferred by the handler. + * + * @return float Time in seconds. + */ + public function getTransferTime() + { + return $this->transferTime; + } + + /** + * Gets an array of all of the handler specific transfer data. + * + * @return array + */ + public function getHandlerStats() + { + return $this->handlerStats; + } + + /** + * Get a specific handler statistic from the handler by name. + * + * @param string $stat Handler specific transfer stat to retrieve. + * + * @return mixed|null + */ + public function getHandlerStat($stat) + { + return isset($this->handlerStats[$stat]) + ? $this->handlerStats[$stat] + : null; + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/UriTemplate.php b/instafeed/vendor/guzzlehttp/guzzle/src/UriTemplate.php new file mode 100755 index 0000000..96dcfd0 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/UriTemplate.php @@ -0,0 +1,237 @@ + ['prefix' => '', 'joiner' => ',', 'query' => false], + '+' => ['prefix' => '', 'joiner' => ',', 'query' => false], + '#' => ['prefix' => '#', 'joiner' => ',', 'query' => false], + '.' => ['prefix' => '.', 'joiner' => '.', 'query' => false], + '/' => ['prefix' => '/', 'joiner' => '/', 'query' => false], + ';' => ['prefix' => ';', 'joiner' => ';', 'query' => true], + '?' => ['prefix' => '?', 'joiner' => '&', 'query' => true], + '&' => ['prefix' => '&', 'joiner' => '&', 'query' => true] + ]; + + /** @var array Delimiters */ + private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$', + '&', '\'', '(', ')', '*', '+', ',', ';', '=']; + + /** @var array Percent encoded delimiters */ + private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D', + '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', + '%3B', '%3D']; + + public function expand($template, array $variables) + { + if (false === strpos($template, '{')) { + return $template; + } + + $this->template = $template; + $this->variables = $variables; + + return preg_replace_callback( + '/\{([^\}]+)\}/', + [$this, 'expandMatch'], + $this->template + ); + } + + /** + * Parse an expression into parts + * + * @param string $expression Expression to parse + * + * @return array Returns an associative array of parts + */ + private function parseExpression($expression) + { + $result = []; + + if (isset(self::$operatorHash[$expression[0]])) { + $result['operator'] = $expression[0]; + $expression = substr($expression, 1); + } else { + $result['operator'] = ''; + } + + foreach (explode(',', $expression) as $value) { + $value = trim($value); + $varspec = []; + if ($colonPos = strpos($value, ':')) { + $varspec['value'] = substr($value, 0, $colonPos); + $varspec['modifier'] = ':'; + $varspec['position'] = (int) substr($value, $colonPos + 1); + } elseif (substr($value, -1) === '*') { + $varspec['modifier'] = '*'; + $varspec['value'] = substr($value, 0, -1); + } else { + $varspec['value'] = (string) $value; + $varspec['modifier'] = ''; + } + $result['values'][] = $varspec; + } + + return $result; + } + + /** + * Process an expansion + * + * @param array $matches Matches met in the preg_replace_callback + * + * @return string Returns the replacement string + */ + private function expandMatch(array $matches) + { + static $rfc1738to3986 = ['+' => '%20', '%7e' => '~']; + + $replacements = []; + $parsed = self::parseExpression($matches[1]); + $prefix = self::$operatorHash[$parsed['operator']]['prefix']; + $joiner = self::$operatorHash[$parsed['operator']]['joiner']; + $useQuery = self::$operatorHash[$parsed['operator']]['query']; + + foreach ($parsed['values'] as $value) { + if (!isset($this->variables[$value['value']])) { + continue; + } + + $variable = $this->variables[$value['value']]; + $actuallyUseQuery = $useQuery; + $expanded = ''; + + if (is_array($variable)) { + $isAssoc = $this->isAssoc($variable); + $kvp = []; + foreach ($variable as $key => $var) { + if ($isAssoc) { + $key = rawurlencode($key); + $isNestedArray = is_array($var); + } else { + $isNestedArray = false; + } + + if (!$isNestedArray) { + $var = rawurlencode($var); + if ($parsed['operator'] === '+' || + $parsed['operator'] === '#' + ) { + $var = $this->decodeReserved($var); + } + } + + if ($value['modifier'] === '*') { + if ($isAssoc) { + if ($isNestedArray) { + // Nested arrays must allow for deeply nested + // structures. + $var = strtr( + http_build_query([$key => $var]), + $rfc1738to3986 + ); + } else { + $var = $key . '=' . $var; + } + } elseif ($key > 0 && $actuallyUseQuery) { + $var = $value['value'] . '=' . $var; + } + } + + $kvp[$key] = $var; + } + + if (empty($variable)) { + $actuallyUseQuery = false; + } elseif ($value['modifier'] === '*') { + $expanded = implode($joiner, $kvp); + if ($isAssoc) { + // Don't prepend the value name when using the explode + // modifier with an associative array. + $actuallyUseQuery = false; + } + } else { + if ($isAssoc) { + // When an associative array is encountered and the + // explode modifier is not set, then the result must be + // a comma separated list of keys followed by their + // respective values. + foreach ($kvp as $k => &$v) { + $v = $k . ',' . $v; + } + } + $expanded = implode(',', $kvp); + } + } else { + if ($value['modifier'] === ':') { + $variable = substr($variable, 0, $value['position']); + } + $expanded = rawurlencode($variable); + if ($parsed['operator'] === '+' || $parsed['operator'] === '#') { + $expanded = $this->decodeReserved($expanded); + } + } + + if ($actuallyUseQuery) { + if (!$expanded && $joiner !== '&') { + $expanded = $value['value']; + } else { + $expanded = $value['value'] . '=' . $expanded; + } + } + + $replacements[] = $expanded; + } + + $ret = implode($joiner, $replacements); + if ($ret && $prefix) { + return $prefix . $ret; + } + + return $ret; + } + + /** + * Determines if an array is associative. + * + * This makes the assumption that input arrays are sequences or hashes. + * This assumption is a tradeoff for accuracy in favor of speed, but it + * should work in almost every case where input is supplied for a URI + * template. + * + * @param array $array Array to check + * + * @return bool + */ + private function isAssoc(array $array) + { + return $array && array_keys($array)[0] !== 0; + } + + /** + * Removes percent encoding on reserved characters (used with + and # + * modifiers). + * + * @param string $string String to fix + * + * @return string + */ + private function decodeReserved($string) + { + return str_replace(self::$delimsPct, self::$delims, $string); + } +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/functions.php b/instafeed/vendor/guzzlehttp/guzzle/src/functions.php new file mode 100755 index 0000000..51d736d --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/functions.php @@ -0,0 +1,346 @@ +expand($template, $variables); +} + +/** + * Debug function used to describe the provided value type and class. + * + * @param mixed $input + * + * @return string Returns a string containing the type of the variable and + * if a class is provided, the class name. + */ +function describe_type($input) +{ + switch (gettype($input)) { + case 'object': + return 'object(' . get_class($input) . ')'; + case 'array': + return 'array(' . count($input) . ')'; + default: + ob_start(); + var_dump($input); + // normalize float vs double + return str_replace('double(', 'float(', rtrim(ob_get_clean())); + } +} + +/** + * Parses an array of header lines into an associative array of headers. + * + * @param array $lines Header lines array of strings in the following + * format: "Name: Value" + * @return array + */ +function headers_from_lines($lines) +{ + $headers = []; + + foreach ($lines as $line) { + $parts = explode(':', $line, 2); + $headers[trim($parts[0])][] = isset($parts[1]) + ? trim($parts[1]) + : null; + } + + return $headers; +} + +/** + * Returns a debug stream based on the provided variable. + * + * @param mixed $value Optional value + * + * @return resource + */ +function debug_resource($value = null) +{ + if (is_resource($value)) { + return $value; + } elseif (defined('STDOUT')) { + return STDOUT; + } + + return fopen('php://output', 'w'); +} + +/** + * Chooses and creates a default handler to use based on the environment. + * + * The returned handler is not wrapped by any default middlewares. + * + * @throws \RuntimeException if no viable Handler is available. + * @return callable Returns the best handler for the given system. + */ +function choose_handler() +{ + $handler = null; + if (function_exists('curl_multi_exec') && function_exists('curl_exec')) { + $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler()); + } elseif (function_exists('curl_exec')) { + $handler = new CurlHandler(); + } elseif (function_exists('curl_multi_exec')) { + $handler = new CurlMultiHandler(); + } + + if (ini_get('allow_url_fopen')) { + $handler = $handler + ? Proxy::wrapStreaming($handler, new StreamHandler()) + : new StreamHandler(); + } elseif (!$handler) { + throw new \RuntimeException('GuzzleHttp requires cURL, the ' + . 'allow_url_fopen ini setting, or a custom HTTP handler.'); + } + + return $handler; +} + +/** + * Get the default User-Agent string to use with Guzzle + * + * @return string + */ +function default_user_agent() +{ + static $defaultAgent = ''; + + if (!$defaultAgent) { + $defaultAgent = 'GuzzleHttp/' . Client::VERSION; + if (extension_loaded('curl') && function_exists('curl_version')) { + $defaultAgent .= ' curl/' . \curl_version()['version']; + } + $defaultAgent .= ' PHP/' . PHP_VERSION; + } + + return $defaultAgent; +} + +/** + * Returns the default cacert bundle for the current system. + * + * First, the openssl.cafile and curl.cainfo php.ini settings are checked. + * If those settings are not configured, then the common locations for + * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X + * and Windows are checked. If any of these file locations are found on + * disk, they will be utilized. + * + * Note: the result of this function is cached for subsequent calls. + * + * @return string + * @throws \RuntimeException if no bundle can be found. + */ +function default_ca_bundle() +{ + static $cached = null; + static $cafiles = [ + // Red Hat, CentOS, Fedora (provided by the ca-certificates package) + '/etc/pki/tls/certs/ca-bundle.crt', + // Ubuntu, Debian (provided by the ca-certificates package) + '/etc/ssl/certs/ca-certificates.crt', + // FreeBSD (provided by the ca_root_nss package) + '/usr/local/share/certs/ca-root-nss.crt', + // SLES 12 (provided by the ca-certificates package) + '/var/lib/ca-certificates/ca-bundle.pem', + // OS X provided by homebrew (using the default path) + '/usr/local/etc/openssl/cert.pem', + // Google app engine + '/etc/ca-certificates.crt', + // Windows? + 'C:\\windows\\system32\\curl-ca-bundle.crt', + 'C:\\windows\\curl-ca-bundle.crt', + ]; + + if ($cached) { + return $cached; + } + + if ($ca = ini_get('openssl.cafile')) { + return $cached = $ca; + } + + if ($ca = ini_get('curl.cainfo')) { + return $cached = $ca; + } + + foreach ($cafiles as $filename) { + if (file_exists($filename)) { + return $cached = $filename; + } + } + + throw new \RuntimeException( + <<< EOT +No system CA bundle could be found in any of the the common system locations. +PHP versions earlier than 5.6 are not properly configured to use the system's +CA bundle by default. In order to verify peer certificates, you will need to +supply the path on disk to a certificate bundle to the 'verify' request +option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not +need a specific certificate bundle, then Mozilla provides a commonly used CA +bundle which can be downloaded here (provided by the maintainer of cURL): +https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once +you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP +ini setting to point to the path to the file, allowing you to omit the 'verify' +request option. See http://curl.haxx.se/docs/sslcerts.html for more +information. +EOT + ); +} + +/** + * Creates an associative array of lowercase header names to the actual + * header casing. + * + * @param array $headers + * + * @return array + */ +function normalize_header_keys(array $headers) +{ + $result = []; + foreach (array_keys($headers) as $key) { + $result[strtolower($key)] = $key; + } + + return $result; +} + +/** + * Returns true if the provided host matches any of the no proxy areas. + * + * This method will strip a port from the host if it is present. Each pattern + * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a + * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" == + * "baz.foo.com", but ".foo.com" != "foo.com"). + * + * Areas are matched in the following cases: + * 1. "*" (without quotes) always matches any hosts. + * 2. An exact match. + * 3. The area starts with "." and the area is the last part of the host. e.g. + * '.mit.edu' will match any host that ends with '.mit.edu'. + * + * @param string $host Host to check against the patterns. + * @param array $noProxyArray An array of host patterns. + * + * @return bool + */ +function is_host_in_noproxy($host, array $noProxyArray) +{ + if (strlen($host) === 0) { + throw new \InvalidArgumentException('Empty host provided'); + } + + // Strip port if present. + if (strpos($host, ':')) { + $host = explode($host, ':', 2)[0]; + } + + foreach ($noProxyArray as $area) { + // Always match on wildcards. + if ($area === '*') { + return true; + } elseif (empty($area)) { + // Don't match on empty values. + continue; + } elseif ($area === $host) { + // Exact matches. + return true; + } else { + // Special match if the area when prefixed with ".". Remove any + // existing leading "." and add a new leading ".". + $area = '.' . ltrim($area, '.'); + if (substr($host, -(strlen($area))) === $area) { + return true; + } + } + } + + return false; +} + +/** + * Wrapper for json_decode that throws when an error occurs. + * + * @param string $json JSON data to parse + * @param bool $assoc When true, returned objects will be converted + * into associative arrays. + * @param int $depth User specified recursion depth. + * @param int $options Bitmask of JSON decode options. + * + * @return mixed + * @throws Exception\InvalidArgumentException if the JSON cannot be decoded. + * @link http://www.php.net/manual/en/function.json-decode.php + */ +function json_decode($json, $assoc = false, $depth = 512, $options = 0) +{ + $data = \json_decode($json, $assoc, $depth, $options); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new Exception\InvalidArgumentException( + 'json_decode error: ' . json_last_error_msg() + ); + } + + return $data; +} + +/** + * Wrapper for JSON encoding that throws when an error occurs. + * + * @param mixed $value The value being encoded + * @param int $options JSON encode option bitmask + * @param int $depth Set the maximum depth. Must be greater than zero. + * + * @return string + * @throws Exception\InvalidArgumentException if the JSON cannot be encoded. + * @link http://www.php.net/manual/en/function.json-encode.php + */ +function json_encode($value, $options = 0, $depth = 512) +{ + $json = \json_encode($value, $options, $depth); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new Exception\InvalidArgumentException( + 'json_encode error: ' . json_last_error_msg() + ); + } + + return $json; +} + +/** + * Wrapper for the hrtime() or microtime() functions + * (depending on the PHP version, one of the two is used) + * + * @return float|mixed UNIX timestamp + * @internal + */ +function _current_time() +{ + return function_exists('hrtime') ? hrtime(true) / 1e9 : microtime(true); +} diff --git a/instafeed/vendor/guzzlehttp/guzzle/src/functions_include.php b/instafeed/vendor/guzzlehttp/guzzle/src/functions_include.php new file mode 100755 index 0000000..a93393a --- /dev/null +++ b/instafeed/vendor/guzzlehttp/guzzle/src/functions_include.php @@ -0,0 +1,6 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/instafeed/vendor/guzzlehttp/promises/Makefile b/instafeed/vendor/guzzlehttp/promises/Makefile new file mode 100755 index 0000000..8d5b3ef --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/Makefile @@ -0,0 +1,13 @@ +all: clean test + +test: + vendor/bin/phpunit + +coverage: + vendor/bin/phpunit --coverage-html=artifacts/coverage + +view-coverage: + open artifacts/coverage/index.html + +clean: + rm -rf artifacts/* diff --git a/instafeed/vendor/guzzlehttp/promises/README.md b/instafeed/vendor/guzzlehttp/promises/README.md new file mode 100755 index 0000000..7b607e2 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/README.md @@ -0,0 +1,504 @@ +# Guzzle Promises + +[Promises/A+](https://promisesaplus.com/) implementation that handles promise +chaining and resolution iteratively, allowing for "infinite" promise chaining +while keeping the stack size constant. Read [this blog post](https://blog.domenic.me/youre-missing-the-point-of-promises/) +for a general introduction to promises. + +- [Features](#features) +- [Quick start](#quick-start) +- [Synchronous wait](#synchronous-wait) +- [Cancellation](#cancellation) +- [API](#api) + - [Promise](#promise) + - [FulfilledPromise](#fulfilledpromise) + - [RejectedPromise](#rejectedpromise) +- [Promise interop](#promise-interop) +- [Implementation notes](#implementation-notes) + + +# Features + +- [Promises/A+](https://promisesaplus.com/) implementation. +- Promise resolution and chaining is handled iteratively, allowing for + "infinite" promise chaining. +- Promises have a synchronous `wait` method. +- Promises can be cancelled. +- Works with any object that has a `then` function. +- C# style async/await coroutine promises using + `GuzzleHttp\Promise\coroutine()`. + + +# Quick start + +A *promise* represents the eventual result of an asynchronous operation. The +primary way of interacting with a promise is through its `then` method, which +registers callbacks to receive either a promise's eventual value or the reason +why the promise cannot be fulfilled. + + +## Callbacks + +Callbacks are registered with the `then` method by providing an optional +`$onFulfilled` followed by an optional `$onRejected` function. + + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise->then( + // $onFulfilled + function ($value) { + echo 'The promise was fulfilled.'; + }, + // $onRejected + function ($reason) { + echo 'The promise was rejected.'; + } +); +``` + +*Resolving* a promise means that you either fulfill a promise with a *value* or +reject a promise with a *reason*. Resolving a promises triggers callbacks +registered with the promises's `then` method. These callbacks are triggered +only once and in the order in which they were added. + + +## Resolving a promise + +Promises are fulfilled using the `resolve($value)` method. Resolving a promise +with any value other than a `GuzzleHttp\Promise\RejectedPromise` will trigger +all of the onFulfilled callbacks (resolving a promise with a rejected promise +will reject the promise and trigger the `$onRejected` callbacks). + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise + ->then(function ($value) { + // Return a value and don't break the chain + return "Hello, " . $value; + }) + // This then is executed after the first then and receives the value + // returned from the first then. + ->then(function ($value) { + echo $value; + }); + +// Resolving the promise triggers the $onFulfilled callbacks and outputs +// "Hello, reader". +$promise->resolve('reader.'); +``` + + +## Promise forwarding + +Promises can be chained one after the other. Each then in the chain is a new +promise. The return value of a promise is what's forwarded to the next +promise in the chain. Returning a promise in a `then` callback will cause the +subsequent promises in the chain to only be fulfilled when the returned promise +has been fulfilled. The next promise in the chain will be invoked with the +resolved value of the promise. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$nextPromise = new Promise(); + +$promise + ->then(function ($value) use ($nextPromise) { + echo $value; + return $nextPromise; + }) + ->then(function ($value) { + echo $value; + }); + +// Triggers the first callback and outputs "A" +$promise->resolve('A'); +// Triggers the second callback and outputs "B" +$nextPromise->resolve('B'); +``` + +## Promise rejection + +When a promise is rejected, the `$onRejected` callbacks are invoked with the +rejection reason. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise->then(null, function ($reason) { + echo $reason; +}); + +$promise->reject('Error!'); +// Outputs "Error!" +``` + +## Rejection forwarding + +If an exception is thrown in an `$onRejected` callback, subsequent +`$onRejected` callbacks are invoked with the thrown exception as the reason. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise->then(null, function ($reason) { + throw new \Exception($reason); +})->then(null, function ($reason) { + assert($reason->getMessage() === 'Error!'); +}); + +$promise->reject('Error!'); +``` + +You can also forward a rejection down the promise chain by returning a +`GuzzleHttp\Promise\RejectedPromise` in either an `$onFulfilled` or +`$onRejected` callback. + +```php +use GuzzleHttp\Promise\Promise; +use GuzzleHttp\Promise\RejectedPromise; + +$promise = new Promise(); +$promise->then(null, function ($reason) { + return new RejectedPromise($reason); +})->then(null, function ($reason) { + assert($reason === 'Error!'); +}); + +$promise->reject('Error!'); +``` + +If an exception is not thrown in a `$onRejected` callback and the callback +does not return a rejected promise, downstream `$onFulfilled` callbacks are +invoked using the value returned from the `$onRejected` callback. + +```php +use GuzzleHttp\Promise\Promise; +use GuzzleHttp\Promise\RejectedPromise; + +$promise = new Promise(); +$promise + ->then(null, function ($reason) { + return "It's ok"; + }) + ->then(function ($value) { + assert($value === "It's ok"); + }); + +$promise->reject('Error!'); +``` + +# Synchronous wait + +You can synchronously force promises to complete using a promise's `wait` +method. When creating a promise, you can provide a wait function that is used +to synchronously force a promise to complete. When a wait function is invoked +it is expected to deliver a value to the promise or reject the promise. If the +wait function does not deliver a value, then an exception is thrown. The wait +function provided to a promise constructor is invoked when the `wait` function +of the promise is called. + +```php +$promise = new Promise(function () use (&$promise) { + $promise->resolve('foo'); +}); + +// Calling wait will return the value of the promise. +echo $promise->wait(); // outputs "foo" +``` + +If an exception is encountered while invoking the wait function of a promise, +the promise is rejected with the exception and the exception is thrown. + +```php +$promise = new Promise(function () use (&$promise) { + throw new \Exception('foo'); +}); + +$promise->wait(); // throws the exception. +``` + +Calling `wait` on a promise that has been fulfilled will not trigger the wait +function. It will simply return the previously resolved value. + +```php +$promise = new Promise(function () { die('this is not called!'); }); +$promise->resolve('foo'); +echo $promise->wait(); // outputs "foo" +``` + +Calling `wait` on a promise that has been rejected will throw an exception. If +the rejection reason is an instance of `\Exception` the reason is thrown. +Otherwise, a `GuzzleHttp\Promise\RejectionException` is thrown and the reason +can be obtained by calling the `getReason` method of the exception. + +```php +$promise = new Promise(); +$promise->reject('foo'); +$promise->wait(); +``` + +> PHP Fatal error: Uncaught exception 'GuzzleHttp\Promise\RejectionException' with message 'The promise was rejected with value: foo' + + +## Unwrapping a promise + +When synchronously waiting on a promise, you are joining the state of the +promise into the current state of execution (i.e., return the value of the +promise if it was fulfilled or throw an exception if it was rejected). This is +called "unwrapping" the promise. Waiting on a promise will by default unwrap +the promise state. + +You can force a promise to resolve and *not* unwrap the state of the promise +by passing `false` to the first argument of the `wait` function: + +```php +$promise = new Promise(); +$promise->reject('foo'); +// This will not throw an exception. It simply ensures the promise has +// been resolved. +$promise->wait(false); +``` + +When unwrapping a promise, the resolved value of the promise will be waited +upon until the unwrapped value is not a promise. This means that if you resolve +promise A with a promise B and unwrap promise A, the value returned by the +wait function will be the value delivered to promise B. + +**Note**: when you do not unwrap the promise, no value is returned. + + +# Cancellation + +You can cancel a promise that has not yet been fulfilled using the `cancel()` +method of a promise. When creating a promise you can provide an optional +cancel function that when invoked cancels the action of computing a resolution +of the promise. + + +# API + + +## Promise + +When creating a promise object, you can provide an optional `$waitFn` and +`$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is +expected to resolve the promise. `$cancelFn` is a function with no arguments +that is expected to cancel the computation of a promise. It is invoked when the +`cancel()` method of a promise is called. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise( + function () use (&$promise) { + $promise->resolve('waited'); + }, + function () { + // do something that will cancel the promise computation (e.g., close + // a socket, cancel a database query, etc...) + } +); + +assert('waited' === $promise->wait()); +``` + +A promise has the following methods: + +- `then(callable $onFulfilled, callable $onRejected) : PromiseInterface` + + Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler. + +- `otherwise(callable $onRejected) : PromiseInterface` + + Appends a rejection handler callback to the promise, and returns a new promise resolving to the return value of the callback if it is called, or to its original fulfillment value if the promise is instead fulfilled. + +- `wait($unwrap = true) : mixed` + + Synchronously waits on the promise to complete. + + `$unwrap` controls whether or not the value of the promise is returned for a + fulfilled promise or if an exception is thrown if the promise is rejected. + This is set to `true` by default. + +- `cancel()` + + Attempts to cancel the promise if possible. The promise being cancelled and + the parent most ancestor that has not yet been resolved will also be + cancelled. Any promises waiting on the cancelled promise to resolve will also + be cancelled. + +- `getState() : string` + + Returns the state of the promise. One of `pending`, `fulfilled`, or + `rejected`. + +- `resolve($value)` + + Fulfills the promise with the given `$value`. + +- `reject($reason)` + + Rejects the promise with the given `$reason`. + + +## FulfilledPromise + +A fulfilled promise can be created to represent a promise that has been +fulfilled. + +```php +use GuzzleHttp\Promise\FulfilledPromise; + +$promise = new FulfilledPromise('value'); + +// Fulfilled callbacks are immediately invoked. +$promise->then(function ($value) { + echo $value; +}); +``` + + +## RejectedPromise + +A rejected promise can be created to represent a promise that has been +rejected. + +```php +use GuzzleHttp\Promise\RejectedPromise; + +$promise = new RejectedPromise('Error'); + +// Rejected callbacks are immediately invoked. +$promise->then(null, function ($reason) { + echo $reason; +}); +``` + + +# Promise interop + +This library works with foreign promises that have a `then` method. This means +you can use Guzzle promises with [React promises](https://github.com/reactphp/promise) +for example. When a foreign promise is returned inside of a then method +callback, promise resolution will occur recursively. + +```php +// Create a React promise +$deferred = new React\Promise\Deferred(); +$reactPromise = $deferred->promise(); + +// Create a Guzzle promise that is fulfilled with a React promise. +$guzzlePromise = new \GuzzleHttp\Promise\Promise(); +$guzzlePromise->then(function ($value) use ($reactPromise) { + // Do something something with the value... + // Return the React promise + return $reactPromise; +}); +``` + +Please note that wait and cancel chaining is no longer possible when forwarding +a foreign promise. You will need to wrap a third-party promise with a Guzzle +promise in order to utilize wait and cancel functions with foreign promises. + + +## Event Loop Integration + +In order to keep the stack size constant, Guzzle promises are resolved +asynchronously using a task queue. When waiting on promises synchronously, the +task queue will be automatically run to ensure that the blocking promise and +any forwarded promises are resolved. When using promises asynchronously in an +event loop, you will need to run the task queue on each tick of the loop. If +you do not run the task queue, then promises will not be resolved. + +You can run the task queue using the `run()` method of the global task queue +instance. + +```php +// Get the global task queue +$queue = \GuzzleHttp\Promise\queue(); +$queue->run(); +``` + +For example, you could use Guzzle promises with React using a periodic timer: + +```php +$loop = React\EventLoop\Factory::create(); +$loop->addPeriodicTimer(0, [$queue, 'run']); +``` + +*TODO*: Perhaps adding a `futureTick()` on each tick would be faster? + + +# Implementation notes + + +## Promise resolution and chaining is handled iteratively + +By shuffling pending handlers from one owner to another, promises are +resolved iteratively, allowing for "infinite" then chaining. + +```php +then(function ($v) { + // The stack size remains constant (a good thing) + echo xdebug_get_stack_depth() . ', '; + return $v + 1; + }); +} + +$parent->resolve(0); +var_dump($p->wait()); // int(1000) + +``` + +When a promise is fulfilled or rejected with a non-promise value, the promise +then takes ownership of the handlers of each child promise and delivers values +down the chain without using recursion. + +When a promise is resolved with another promise, the original promise transfers +all of its pending handlers to the new promise. When the new promise is +eventually resolved, all of the pending handlers are delivered the forwarded +value. + + +## A promise is the deferred. + +Some promise libraries implement promises using a deferred object to represent +a computation and a promise object to represent the delivery of the result of +the computation. This is a nice separation of computation and delivery because +consumers of the promise cannot modify the value that will be eventually +delivered. + +One side effect of being able to implement promise resolution and chaining +iteratively is that you need to be able for one promise to reach into the state +of another promise to shuffle around ownership of handlers. In order to achieve +this without making the handlers of a promise publicly mutable, a promise is +also the deferred value, allowing promises of the same parent class to reach +into and modify the private properties of promises of the same type. While this +does allow consumers of the value to modify the resolution or rejection of the +deferred, it is a small price to pay for keeping the stack size constant. + +```php +$promise = new Promise(); +$promise->then(function ($value) { echo $value; }); +// The promise is the deferred value, so you can deliver a value to it. +$promise->resolve('foo'); +// prints "foo" +``` diff --git a/instafeed/vendor/guzzlehttp/promises/composer.json b/instafeed/vendor/guzzlehttp/promises/composer.json new file mode 100755 index 0000000..ec41a61 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/composer.json @@ -0,0 +1,34 @@ +{ + "name": "guzzlehttp/promises", + "description": "Guzzle promises library", + "keywords": ["promise"], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": ["src/functions_include.php"] + }, + "scripts": { + "test": "vendor/bin/phpunit", + "test-ci": "vendor/bin/phpunit --coverage-text" + }, + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + } +} diff --git a/instafeed/vendor/guzzlehttp/promises/src/AggregateException.php b/instafeed/vendor/guzzlehttp/promises/src/AggregateException.php new file mode 100755 index 0000000..6a5690c --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/src/AggregateException.php @@ -0,0 +1,16 @@ +then(function ($v) { echo $v; }); + * + * @param callable $generatorFn Generator function to wrap into a promise. + * + * @return Promise + * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration + */ +final class Coroutine implements PromiseInterface +{ + /** + * @var PromiseInterface|null + */ + private $currentPromise; + + /** + * @var Generator + */ + private $generator; + + /** + * @var Promise + */ + private $result; + + public function __construct(callable $generatorFn) + { + $this->generator = $generatorFn(); + $this->result = new Promise(function () { + while (isset($this->currentPromise)) { + $this->currentPromise->wait(); + } + }); + $this->nextCoroutine($this->generator->current()); + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + return $this->result->then($onFulfilled, $onRejected); + } + + public function otherwise(callable $onRejected) + { + return $this->result->otherwise($onRejected); + } + + public function wait($unwrap = true) + { + return $this->result->wait($unwrap); + } + + public function getState() + { + return $this->result->getState(); + } + + public function resolve($value) + { + $this->result->resolve($value); + } + + public function reject($reason) + { + $this->result->reject($reason); + } + + public function cancel() + { + $this->currentPromise->cancel(); + $this->result->cancel(); + } + + private function nextCoroutine($yielded) + { + $this->currentPromise = promise_for($yielded) + ->then([$this, '_handleSuccess'], [$this, '_handleFailure']); + } + + /** + * @internal + */ + public function _handleSuccess($value) + { + unset($this->currentPromise); + try { + $next = $this->generator->send($value); + if ($this->generator->valid()) { + $this->nextCoroutine($next); + } else { + $this->result->resolve($value); + } + } catch (Exception $exception) { + $this->result->reject($exception); + } catch (Throwable $throwable) { + $this->result->reject($throwable); + } + } + + /** + * @internal + */ + public function _handleFailure($reason) + { + unset($this->currentPromise); + try { + $nextYield = $this->generator->throw(exception_for($reason)); + // The throw was caught, so keep iterating on the coroutine + $this->nextCoroutine($nextYield); + } catch (Exception $exception) { + $this->result->reject($exception); + } catch (Throwable $throwable) { + $this->result->reject($throwable); + } + } +} diff --git a/instafeed/vendor/guzzlehttp/promises/src/EachPromise.php b/instafeed/vendor/guzzlehttp/promises/src/EachPromise.php new file mode 100755 index 0000000..d0ddf60 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/src/EachPromise.php @@ -0,0 +1,229 @@ +iterable = iter_for($iterable); + + if (isset($config['concurrency'])) { + $this->concurrency = $config['concurrency']; + } + + if (isset($config['fulfilled'])) { + $this->onFulfilled = $config['fulfilled']; + } + + if (isset($config['rejected'])) { + $this->onRejected = $config['rejected']; + } + } + + public function promise() + { + if ($this->aggregate) { + return $this->aggregate; + } + + try { + $this->createPromise(); + $this->iterable->rewind(); + $this->refillPending(); + } catch (\Throwable $e) { + $this->aggregate->reject($e); + } catch (\Exception $e) { + $this->aggregate->reject($e); + } + + return $this->aggregate; + } + + private function createPromise() + { + $this->mutex = false; + $this->aggregate = new Promise(function () { + reset($this->pending); + if (empty($this->pending) && !$this->iterable->valid()) { + $this->aggregate->resolve(null); + return; + } + + // Consume a potentially fluctuating list of promises while + // ensuring that indexes are maintained (precluding array_shift). + while ($promise = current($this->pending)) { + next($this->pending); + $promise->wait(); + if ($this->aggregate->getState() !== PromiseInterface::PENDING) { + return; + } + } + }); + + // Clear the references when the promise is resolved. + $clearFn = function () { + $this->iterable = $this->concurrency = $this->pending = null; + $this->onFulfilled = $this->onRejected = null; + }; + + $this->aggregate->then($clearFn, $clearFn); + } + + private function refillPending() + { + if (!$this->concurrency) { + // Add all pending promises. + while ($this->addPending() && $this->advanceIterator()); + return; + } + + // Add only up to N pending promises. + $concurrency = is_callable($this->concurrency) + ? call_user_func($this->concurrency, count($this->pending)) + : $this->concurrency; + $concurrency = max($concurrency - count($this->pending), 0); + // Concurrency may be set to 0 to disallow new promises. + if (!$concurrency) { + return; + } + // Add the first pending promise. + $this->addPending(); + // Note this is special handling for concurrency=1 so that we do + // not advance the iterator after adding the first promise. This + // helps work around issues with generators that might not have the + // next value to yield until promise callbacks are called. + while (--$concurrency + && $this->advanceIterator() + && $this->addPending()); + } + + private function addPending() + { + if (!$this->iterable || !$this->iterable->valid()) { + return false; + } + + $promise = promise_for($this->iterable->current()); + $idx = $this->iterable->key(); + + $this->pending[$idx] = $promise->then( + function ($value) use ($idx) { + if ($this->onFulfilled) { + call_user_func( + $this->onFulfilled, $value, $idx, $this->aggregate + ); + } + $this->step($idx); + }, + function ($reason) use ($idx) { + if ($this->onRejected) { + call_user_func( + $this->onRejected, $reason, $idx, $this->aggregate + ); + } + $this->step($idx); + } + ); + + return true; + } + + private function advanceIterator() + { + // Place a lock on the iterator so that we ensure to not recurse, + // preventing fatal generator errors. + if ($this->mutex) { + return false; + } + + $this->mutex = true; + + try { + $this->iterable->next(); + $this->mutex = false; + return true; + } catch (\Throwable $e) { + $this->aggregate->reject($e); + $this->mutex = false; + return false; + } catch (\Exception $e) { + $this->aggregate->reject($e); + $this->mutex = false; + return false; + } + } + + private function step($idx) + { + // If the promise was already resolved, then ignore this step. + if ($this->aggregate->getState() !== PromiseInterface::PENDING) { + return; + } + + unset($this->pending[$idx]); + + // Only refill pending promises if we are not locked, preventing the + // EachPromise to recursively invoke the provided iterator, which + // cause a fatal error: "Cannot resume an already running generator" + if ($this->advanceIterator() && !$this->checkIfFinished()) { + // Add more pending promises if possible. + $this->refillPending(); + } + } + + private function checkIfFinished() + { + if (!$this->pending && !$this->iterable->valid()) { + // Resolve the promise if there's nothing left to do. + $this->aggregate->resolve(null); + return true; + } + + return false; + } +} diff --git a/instafeed/vendor/guzzlehttp/promises/src/FulfilledPromise.php b/instafeed/vendor/guzzlehttp/promises/src/FulfilledPromise.php new file mode 100755 index 0000000..dbbeeb9 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/src/FulfilledPromise.php @@ -0,0 +1,82 @@ +value = $value; + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + // Return itself if there is no onFulfilled function. + if (!$onFulfilled) { + return $this; + } + + $queue = queue(); + $p = new Promise([$queue, 'run']); + $value = $this->value; + $queue->add(static function () use ($p, $value, $onFulfilled) { + if ($p->getState() === self::PENDING) { + try { + $p->resolve($onFulfilled($value)); + } catch (\Throwable $e) { + $p->reject($e); + } catch (\Exception $e) { + $p->reject($e); + } + } + }); + + return $p; + } + + public function otherwise(callable $onRejected) + { + return $this->then(null, $onRejected); + } + + public function wait($unwrap = true, $defaultDelivery = null) + { + return $unwrap ? $this->value : null; + } + + public function getState() + { + return self::FULFILLED; + } + + public function resolve($value) + { + if ($value !== $this->value) { + throw new \LogicException("Cannot resolve a fulfilled promise"); + } + } + + public function reject($reason) + { + throw new \LogicException("Cannot reject a fulfilled promise"); + } + + public function cancel() + { + // pass + } +} diff --git a/instafeed/vendor/guzzlehttp/promises/src/Promise.php b/instafeed/vendor/guzzlehttp/promises/src/Promise.php new file mode 100755 index 0000000..844ada0 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/src/Promise.php @@ -0,0 +1,280 @@ +waitFn = $waitFn; + $this->cancelFn = $cancelFn; + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + if ($this->state === self::PENDING) { + $p = new Promise(null, [$this, 'cancel']); + $this->handlers[] = [$p, $onFulfilled, $onRejected]; + $p->waitList = $this->waitList; + $p->waitList[] = $this; + return $p; + } + + // Return a fulfilled promise and immediately invoke any callbacks. + if ($this->state === self::FULFILLED) { + return $onFulfilled + ? promise_for($this->result)->then($onFulfilled) + : promise_for($this->result); + } + + // It's either cancelled or rejected, so return a rejected promise + // and immediately invoke any callbacks. + $rejection = rejection_for($this->result); + return $onRejected ? $rejection->then(null, $onRejected) : $rejection; + } + + public function otherwise(callable $onRejected) + { + return $this->then(null, $onRejected); + } + + public function wait($unwrap = true) + { + $this->waitIfPending(); + + $inner = $this->result instanceof PromiseInterface + ? $this->result->wait($unwrap) + : $this->result; + + if ($unwrap) { + if ($this->result instanceof PromiseInterface + || $this->state === self::FULFILLED + ) { + return $inner; + } else { + // It's rejected so "unwrap" and throw an exception. + throw exception_for($inner); + } + } + } + + public function getState() + { + return $this->state; + } + + public function cancel() + { + if ($this->state !== self::PENDING) { + return; + } + + $this->waitFn = $this->waitList = null; + + if ($this->cancelFn) { + $fn = $this->cancelFn; + $this->cancelFn = null; + try { + $fn(); + } catch (\Throwable $e) { + $this->reject($e); + } catch (\Exception $e) { + $this->reject($e); + } + } + + // Reject the promise only if it wasn't rejected in a then callback. + if ($this->state === self::PENDING) { + $this->reject(new CancellationException('Promise has been cancelled')); + } + } + + public function resolve($value) + { + $this->settle(self::FULFILLED, $value); + } + + public function reject($reason) + { + $this->settle(self::REJECTED, $reason); + } + + private function settle($state, $value) + { + if ($this->state !== self::PENDING) { + // Ignore calls with the same resolution. + if ($state === $this->state && $value === $this->result) { + return; + } + throw $this->state === $state + ? new \LogicException("The promise is already {$state}.") + : new \LogicException("Cannot change a {$this->state} promise to {$state}"); + } + + if ($value === $this) { + throw new \LogicException('Cannot fulfill or reject a promise with itself'); + } + + // Clear out the state of the promise but stash the handlers. + $this->state = $state; + $this->result = $value; + $handlers = $this->handlers; + $this->handlers = null; + $this->waitList = $this->waitFn = null; + $this->cancelFn = null; + + if (!$handlers) { + return; + } + + // If the value was not a settled promise or a thenable, then resolve + // it in the task queue using the correct ID. + if (!method_exists($value, 'then')) { + $id = $state === self::FULFILLED ? 1 : 2; + // It's a success, so resolve the handlers in the queue. + queue()->add(static function () use ($id, $value, $handlers) { + foreach ($handlers as $handler) { + self::callHandler($id, $value, $handler); + } + }); + } elseif ($value instanceof Promise + && $value->getState() === self::PENDING + ) { + // We can just merge our handlers onto the next promise. + $value->handlers = array_merge($value->handlers, $handlers); + } else { + // Resolve the handlers when the forwarded promise is resolved. + $value->then( + static function ($value) use ($handlers) { + foreach ($handlers as $handler) { + self::callHandler(1, $value, $handler); + } + }, + static function ($reason) use ($handlers) { + foreach ($handlers as $handler) { + self::callHandler(2, $reason, $handler); + } + } + ); + } + } + + /** + * Call a stack of handlers using a specific callback index and value. + * + * @param int $index 1 (resolve) or 2 (reject). + * @param mixed $value Value to pass to the callback. + * @param array $handler Array of handler data (promise and callbacks). + * + * @return array Returns the next group to resolve. + */ + private static function callHandler($index, $value, array $handler) + { + /** @var PromiseInterface $promise */ + $promise = $handler[0]; + + // The promise may have been cancelled or resolved before placing + // this thunk in the queue. + if ($promise->getState() !== self::PENDING) { + return; + } + + try { + if (isset($handler[$index])) { + $promise->resolve($handler[$index]($value)); + } elseif ($index === 1) { + // Forward resolution values as-is. + $promise->resolve($value); + } else { + // Forward rejections down the chain. + $promise->reject($value); + } + } catch (\Throwable $reason) { + $promise->reject($reason); + } catch (\Exception $reason) { + $promise->reject($reason); + } + } + + private function waitIfPending() + { + if ($this->state !== self::PENDING) { + return; + } elseif ($this->waitFn) { + $this->invokeWaitFn(); + } elseif ($this->waitList) { + $this->invokeWaitList(); + } else { + // If there's not wait function, then reject the promise. + $this->reject('Cannot wait on a promise that has ' + . 'no internal wait function. You must provide a wait ' + . 'function when constructing the promise to be able to ' + . 'wait on a promise.'); + } + + queue()->run(); + + if ($this->state === self::PENDING) { + $this->reject('Invoking the wait callback did not resolve the promise'); + } + } + + private function invokeWaitFn() + { + try { + $wfn = $this->waitFn; + $this->waitFn = null; + $wfn(true); + } catch (\Exception $reason) { + if ($this->state === self::PENDING) { + // The promise has not been resolved yet, so reject the promise + // with the exception. + $this->reject($reason); + } else { + // The promise was already resolved, so there's a problem in + // the application. + throw $reason; + } + } + } + + private function invokeWaitList() + { + $waitList = $this->waitList; + $this->waitList = null; + + foreach ($waitList as $result) { + while (true) { + $result->waitIfPending(); + + if ($result->result instanceof Promise) { + $result = $result->result; + } else { + if ($result->result instanceof PromiseInterface) { + $result->result->wait(false); + } + break; + } + } + } + } +} diff --git a/instafeed/vendor/guzzlehttp/promises/src/PromiseInterface.php b/instafeed/vendor/guzzlehttp/promises/src/PromiseInterface.php new file mode 100755 index 0000000..8f5f4b9 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/src/PromiseInterface.php @@ -0,0 +1,93 @@ +reason = $reason; + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + // If there's no onRejected callback then just return self. + if (!$onRejected) { + return $this; + } + + $queue = queue(); + $reason = $this->reason; + $p = new Promise([$queue, 'run']); + $queue->add(static function () use ($p, $reason, $onRejected) { + if ($p->getState() === self::PENDING) { + try { + // Return a resolved promise if onRejected does not throw. + $p->resolve($onRejected($reason)); + } catch (\Throwable $e) { + // onRejected threw, so return a rejected promise. + $p->reject($e); + } catch (\Exception $e) { + // onRejected threw, so return a rejected promise. + $p->reject($e); + } + } + }); + + return $p; + } + + public function otherwise(callable $onRejected) + { + return $this->then(null, $onRejected); + } + + public function wait($unwrap = true, $defaultDelivery = null) + { + if ($unwrap) { + throw exception_for($this->reason); + } + } + + public function getState() + { + return self::REJECTED; + } + + public function resolve($value) + { + throw new \LogicException("Cannot resolve a rejected promise"); + } + + public function reject($reason) + { + if ($reason !== $this->reason) { + throw new \LogicException("Cannot reject a rejected promise"); + } + } + + public function cancel() + { + // pass + } +} diff --git a/instafeed/vendor/guzzlehttp/promises/src/RejectionException.php b/instafeed/vendor/guzzlehttp/promises/src/RejectionException.php new file mode 100755 index 0000000..07c1136 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/src/RejectionException.php @@ -0,0 +1,47 @@ +reason = $reason; + + $message = 'The promise was rejected'; + + if ($description) { + $message .= ' with reason: ' . $description; + } elseif (is_string($reason) + || (is_object($reason) && method_exists($reason, '__toString')) + ) { + $message .= ' with reason: ' . $this->reason; + } elseif ($reason instanceof \JsonSerializable) { + $message .= ' with reason: ' + . json_encode($this->reason, JSON_PRETTY_PRINT); + } + + parent::__construct($message); + } + + /** + * Returns the rejection reason. + * + * @return mixed + */ + public function getReason() + { + return $this->reason; + } +} diff --git a/instafeed/vendor/guzzlehttp/promises/src/TaskQueue.php b/instafeed/vendor/guzzlehttp/promises/src/TaskQueue.php new file mode 100755 index 0000000..6e8a2a0 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/src/TaskQueue.php @@ -0,0 +1,66 @@ +run(); + */ +class TaskQueue implements TaskQueueInterface +{ + private $enableShutdown = true; + private $queue = []; + + public function __construct($withShutdown = true) + { + if ($withShutdown) { + register_shutdown_function(function () { + if ($this->enableShutdown) { + // Only run the tasks if an E_ERROR didn't occur. + $err = error_get_last(); + if (!$err || ($err['type'] ^ E_ERROR)) { + $this->run(); + } + } + }); + } + } + + public function isEmpty() + { + return !$this->queue; + } + + public function add(callable $task) + { + $this->queue[] = $task; + } + + public function run() + { + /** @var callable $task */ + while ($task = array_shift($this->queue)) { + $task(); + } + } + + /** + * The task queue will be run and exhausted by default when the process + * exits IFF the exit is not the result of a PHP E_ERROR error. + * + * You can disable running the automatic shutdown of the queue by calling + * this function. If you disable the task queue shutdown process, then you + * MUST either run the task queue (as a result of running your event loop + * or manually using the run() method) or wait on each outstanding promise. + * + * Note: This shutdown will occur before any destructors are triggered. + */ + public function disableShutdown() + { + $this->enableShutdown = false; + } +} diff --git a/instafeed/vendor/guzzlehttp/promises/src/TaskQueueInterface.php b/instafeed/vendor/guzzlehttp/promises/src/TaskQueueInterface.php new file mode 100755 index 0000000..ac8306e --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/src/TaskQueueInterface.php @@ -0,0 +1,25 @@ + + * while ($eventLoop->isRunning()) { + * GuzzleHttp\Promise\queue()->run(); + * } + * + * + * @param TaskQueueInterface $assign Optionally specify a new queue instance. + * + * @return TaskQueueInterface + */ +function queue(TaskQueueInterface $assign = null) +{ + static $queue; + + if ($assign) { + $queue = $assign; + } elseif (!$queue) { + $queue = new TaskQueue(); + } + + return $queue; +} + +/** + * Adds a function to run in the task queue when it is next `run()` and returns + * a promise that is fulfilled or rejected with the result. + * + * @param callable $task Task function to run. + * + * @return PromiseInterface + */ +function task(callable $task) +{ + $queue = queue(); + $promise = new Promise([$queue, 'run']); + $queue->add(function () use ($task, $promise) { + try { + $promise->resolve($task()); + } catch (\Throwable $e) { + $promise->reject($e); + } catch (\Exception $e) { + $promise->reject($e); + } + }); + + return $promise; +} + +/** + * Creates a promise for a value if the value is not a promise. + * + * @param mixed $value Promise or value. + * + * @return PromiseInterface + */ +function promise_for($value) +{ + if ($value instanceof PromiseInterface) { + return $value; + } + + // Return a Guzzle promise that shadows the given promise. + if (method_exists($value, 'then')) { + $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null; + $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null; + $promise = new Promise($wfn, $cfn); + $value->then([$promise, 'resolve'], [$promise, 'reject']); + return $promise; + } + + return new FulfilledPromise($value); +} + +/** + * Creates a rejected promise for a reason if the reason is not a promise. If + * the provided reason is a promise, then it is returned as-is. + * + * @param mixed $reason Promise or reason. + * + * @return PromiseInterface + */ +function rejection_for($reason) +{ + if ($reason instanceof PromiseInterface) { + return $reason; + } + + return new RejectedPromise($reason); +} + +/** + * Create an exception for a rejected promise value. + * + * @param mixed $reason + * + * @return \Exception|\Throwable + */ +function exception_for($reason) +{ + return $reason instanceof \Exception || $reason instanceof \Throwable + ? $reason + : new RejectionException($reason); +} + +/** + * Returns an iterator for the given value. + * + * @param mixed $value + * + * @return \Iterator + */ +function iter_for($value) +{ + if ($value instanceof \Iterator) { + return $value; + } elseif (is_array($value)) { + return new \ArrayIterator($value); + } else { + return new \ArrayIterator([$value]); + } +} + +/** + * Synchronously waits on a promise to resolve and returns an inspection state + * array. + * + * Returns a state associative array containing a "state" key mapping to a + * valid promise state. If the state of the promise is "fulfilled", the array + * will contain a "value" key mapping to the fulfilled value of the promise. If + * the promise is rejected, the array will contain a "reason" key mapping to + * the rejection reason of the promise. + * + * @param PromiseInterface $promise Promise or value. + * + * @return array + */ +function inspect(PromiseInterface $promise) +{ + try { + return [ + 'state' => PromiseInterface::FULFILLED, + 'value' => $promise->wait() + ]; + } catch (RejectionException $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()]; + } catch (\Throwable $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; + } catch (\Exception $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; + } +} + +/** + * Waits on all of the provided promises, but does not unwrap rejected promises + * as thrown exception. + * + * Returns an array of inspection state arrays. + * + * @param PromiseInterface[] $promises Traversable of promises to wait upon. + * + * @return array + * @see GuzzleHttp\Promise\inspect for the inspection state array format. + */ +function inspect_all($promises) +{ + $results = []; + foreach ($promises as $key => $promise) { + $results[$key] = inspect($promise); + } + + return $results; +} + +/** + * Waits on all of the provided promises and returns the fulfilled values. + * + * Returns an array that contains the value of each promise (in the same order + * the promises were provided). An exception is thrown if any of the promises + * are rejected. + * + * @param mixed $promises Iterable of PromiseInterface objects to wait on. + * + * @return array + * @throws \Exception on error + * @throws \Throwable on error in PHP >=7 + */ +function unwrap($promises) +{ + $results = []; + foreach ($promises as $key => $promise) { + $results[$key] = $promise->wait(); + } + + return $results; +} + +/** + * Given an array of promises, return a promise that is fulfilled when all the + * items in the array are fulfilled. + * + * The promise's fulfillment value is an array with fulfillment values at + * respective positions to the original array. If any promise in the array + * rejects, the returned promise is rejected with the rejection reason. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ +function all($promises) +{ + $results = []; + return each( + $promises, + function ($value, $idx) use (&$results) { + $results[$idx] = $value; + }, + function ($reason, $idx, Promise $aggregate) { + $aggregate->reject($reason); + } + )->then(function () use (&$results) { + ksort($results); + return $results; + }); +} + +/** + * Initiate a competitive race between multiple promises or values (values will + * become immediately fulfilled promises). + * + * When count amount of promises have been fulfilled, the returned promise is + * fulfilled with an array that contains the fulfillment values of the winners + * in order of resolution. + * + * This prommise is rejected with a {@see GuzzleHttp\Promise\AggregateException} + * if the number of fulfilled promises is less than the desired $count. + * + * @param int $count Total number of promises. + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ +function some($count, $promises) +{ + $results = []; + $rejections = []; + + return each( + $promises, + function ($value, $idx, PromiseInterface $p) use (&$results, $count) { + if ($p->getState() !== PromiseInterface::PENDING) { + return; + } + $results[$idx] = $value; + if (count($results) >= $count) { + $p->resolve(null); + } + }, + function ($reason) use (&$rejections) { + $rejections[] = $reason; + } + )->then( + function () use (&$results, &$rejections, $count) { + if (count($results) !== $count) { + throw new AggregateException( + 'Not enough promises to fulfill count', + $rejections + ); + } + ksort($results); + return array_values($results); + } + ); +} + +/** + * Like some(), with 1 as count. However, if the promise fulfills, the + * fulfillment value is not an array of 1 but the value directly. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ +function any($promises) +{ + return some(1, $promises)->then(function ($values) { return $values[0]; }); +} + +/** + * Returns a promise that is fulfilled when all of the provided promises have + * been fulfilled or rejected. + * + * The returned promise is fulfilled with an array of inspection state arrays. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + * @see GuzzleHttp\Promise\inspect for the inspection state array format. + */ +function settle($promises) +{ + $results = []; + + return each( + $promises, + function ($value, $idx) use (&$results) { + $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value]; + }, + function ($reason, $idx) use (&$results) { + $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason]; + } + )->then(function () use (&$results) { + ksort($results); + return $results; + }); +} + +/** + * Given an iterator that yields promises or values, returns a promise that is + * fulfilled with a null value when the iterator has been consumed or the + * aggregate promise has been fulfilled or rejected. + * + * $onFulfilled is a function that accepts the fulfilled value, iterator + * index, and the aggregate promise. The callback can invoke any necessary side + * effects and choose to resolve or reject the aggregate promise if needed. + * + * $onRejected is a function that accepts the rejection reason, iterator + * index, and the aggregate promise. The callback can invoke any necessary side + * effects and choose to resolve or reject the aggregate promise if needed. + * + * @param mixed $iterable Iterator or array to iterate over. + * @param callable $onFulfilled + * @param callable $onRejected + * + * @return PromiseInterface + */ +function each( + $iterable, + callable $onFulfilled = null, + callable $onRejected = null +) { + return (new EachPromise($iterable, [ + 'fulfilled' => $onFulfilled, + 'rejected' => $onRejected + ]))->promise(); +} + +/** + * Like each, but only allows a certain number of outstanding promises at any + * given time. + * + * $concurrency may be an integer or a function that accepts the number of + * pending promises and returns a numeric concurrency limit value to allow for + * dynamic a concurrency size. + * + * @param mixed $iterable + * @param int|callable $concurrency + * @param callable $onFulfilled + * @param callable $onRejected + * + * @return PromiseInterface + */ +function each_limit( + $iterable, + $concurrency, + callable $onFulfilled = null, + callable $onRejected = null +) { + return (new EachPromise($iterable, [ + 'fulfilled' => $onFulfilled, + 'rejected' => $onRejected, + 'concurrency' => $concurrency + ]))->promise(); +} + +/** + * Like each_limit, but ensures that no promise in the given $iterable argument + * is rejected. If any promise is rejected, then the aggregate promise is + * rejected with the encountered rejection. + * + * @param mixed $iterable + * @param int|callable $concurrency + * @param callable $onFulfilled + * + * @return PromiseInterface + */ +function each_limit_all( + $iterable, + $concurrency, + callable $onFulfilled = null +) { + return each_limit( + $iterable, + $concurrency, + $onFulfilled, + function ($reason, $idx, PromiseInterface $aggregate) { + $aggregate->reject($reason); + } + ); +} + +/** + * Returns true if a promise is fulfilled. + * + * @param PromiseInterface $promise + * + * @return bool + */ +function is_fulfilled(PromiseInterface $promise) +{ + return $promise->getState() === PromiseInterface::FULFILLED; +} + +/** + * Returns true if a promise is rejected. + * + * @param PromiseInterface $promise + * + * @return bool + */ +function is_rejected(PromiseInterface $promise) +{ + return $promise->getState() === PromiseInterface::REJECTED; +} + +/** + * Returns true if a promise is fulfilled or rejected. + * + * @param PromiseInterface $promise + * + * @return bool + */ +function is_settled(PromiseInterface $promise) +{ + return $promise->getState() !== PromiseInterface::PENDING; +} + +/** + * @see Coroutine + * + * @param callable $generatorFn + * + * @return PromiseInterface + */ +function coroutine(callable $generatorFn) +{ + return new Coroutine($generatorFn); +} diff --git a/instafeed/vendor/guzzlehttp/promises/src/functions_include.php b/instafeed/vendor/guzzlehttp/promises/src/functions_include.php new file mode 100755 index 0000000..34cd171 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/promises/src/functions_include.php @@ -0,0 +1,6 @@ +withPath('foo')->withHost('example.com')` will throw an exception + because the path of a URI with an authority must start with a slash "/" or be empty + - `(new Uri())->withScheme('http')` will return `'http://localhost'` + +### Deprecated + +- `Uri::resolve` in favor of `UriResolver::resolve` +- `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments` + +### Fixed + +- `Stream::read` when length parameter <= 0. +- `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory. +- `ServerRequest::getUriFromGlobals` when `Host` header contains port. +- Compatibility of URIs with `file` scheme and empty host. + + +## [1.3.1] - 2016-06-25 + +### Fixed + +- `Uri::__toString` for network path references, e.g. `//example.org`. +- Missing lowercase normalization for host. +- Handling of URI components in case they are `'0'` in a lot of places, + e.g. as a user info password. +- `Uri::withAddedHeader` to correctly merge headers with different case. +- Trimming of header values in `Uri::withAddedHeader`. Header values may + be surrounded by whitespace which should be ignored according to RFC 7230 + Section 3.2.4. This does not apply to header names. +- `Uri::withAddedHeader` with an array of header values. +- `Uri::resolve` when base path has no slash and handling of fragment. +- Handling of encoding in `Uri::with(out)QueryValue` so one can pass the + key/value both in encoded as well as decoded form to those methods. This is + consistent with withPath, withQuery etc. +- `ServerRequest::withoutAttribute` when attribute value is null. + + +## [1.3.0] - 2016-04-13 + +### Added + +- Remaining interfaces needed for full PSR7 compatibility + (ServerRequestInterface, UploadedFileInterface, etc.). +- Support for stream_for from scalars. + +### Changed + +- Can now extend Uri. + +### Fixed +- A bug in validating request methods by making it more permissive. + + +## [1.2.3] - 2016-02-18 + +### Fixed + +- Support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote + streams, which can sometimes return fewer bytes than requested with `fread`. +- Handling of gzipped responses with FNAME headers. + + +## [1.2.2] - 2016-01-22 + +### Added + +- Support for URIs without any authority. +- Support for HTTP 451 'Unavailable For Legal Reasons.' +- Support for using '0' as a filename. +- Support for including non-standard ports in Host headers. + + +## [1.2.1] - 2015-11-02 + +### Changes + +- Now supporting negative offsets when seeking to SEEK_END. + + +## [1.2.0] - 2015-08-15 + +### Changed + +- Body as `"0"` is now properly added to a response. +- Now allowing forward seeking in CachingStream. +- Now properly parsing HTTP requests that contain proxy targets in + `parse_request`. +- functions.php is now conditionally required. +- user-info is no longer dropped when resolving URIs. + + +## [1.1.0] - 2015-06-24 + +### Changed + +- URIs can now be relative. +- `multipart/form-data` headers are now overridden case-insensitively. +- URI paths no longer encode the following characters because they are allowed + in URIs: "(", ")", "*", "!", "'" +- A port is no longer added to a URI when the scheme is missing and no port is + present. + + +## 1.0.0 - 2015-05-19 + +Initial release. + +Currently unsupported: + +- `Psr\Http\Message\ServerRequestInterface` +- `Psr\Http\Message\UploadedFileInterface` + + + +[Unreleased]: https://github.com/guzzle/psr7/compare/1.6.0...HEAD +[1.6.0]: https://github.com/guzzle/psr7/compare/1.5.2...1.6.0 +[1.5.2]: https://github.com/guzzle/psr7/compare/1.5.1...1.5.2 +[1.5.1]: https://github.com/guzzle/psr7/compare/1.5.0...1.5.1 +[1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0 +[1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2 +[1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1 +[1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0 +[1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1 +[1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0 +[1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3 +[1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2 +[1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1 +[1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0 diff --git a/instafeed/vendor/guzzlehttp/psr7/LICENSE b/instafeed/vendor/guzzlehttp/psr7/LICENSE new file mode 100755 index 0000000..581d95f --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015 Michael Dowling, https://github.com/mtdowling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/instafeed/vendor/guzzlehttp/psr7/README.md b/instafeed/vendor/guzzlehttp/psr7/README.md new file mode 100755 index 0000000..c60a6a3 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/README.md @@ -0,0 +1,745 @@ +# PSR-7 Message Implementation + +This repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/) +message implementation, several stream decorators, and some helpful +functionality like query string parsing. + + +[![Build Status](https://travis-ci.org/guzzle/psr7.svg?branch=master)](https://travis-ci.org/guzzle/psr7) + + +# Stream implementation + +This package comes with a number of stream implementations and stream +decorators. + + +## AppendStream + +`GuzzleHttp\Psr7\AppendStream` + +Reads from multiple streams, one after the other. + +```php +use GuzzleHttp\Psr7; + +$a = Psr7\stream_for('abc, '); +$b = Psr7\stream_for('123.'); +$composed = new Psr7\AppendStream([$a, $b]); + +$composed->addStream(Psr7\stream_for(' Above all listen to me')); + +echo $composed; // abc, 123. Above all listen to me. +``` + + +## BufferStream + +`GuzzleHttp\Psr7\BufferStream` + +Provides a buffer stream that can be written to fill a buffer, and read +from to remove bytes from the buffer. + +This stream returns a "hwm" metadata value that tells upstream consumers +what the configured high water mark of the stream is, or the maximum +preferred size of the buffer. + +```php +use GuzzleHttp\Psr7; + +// When more than 1024 bytes are in the buffer, it will begin returning +// false to writes. This is an indication that writers should slow down. +$buffer = new Psr7\BufferStream(1024); +``` + + +## CachingStream + +The CachingStream is used to allow seeking over previously read bytes on +non-seekable streams. This can be useful when transferring a non-seekable +entity body fails due to needing to rewind the stream (for example, resulting +from a redirect). Data that is read from the remote stream will be buffered in +a PHP temp stream so that previously read bytes are cached first in memory, +then on disk. + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\stream_for(fopen('http://www.google.com', 'r')); +$stream = new Psr7\CachingStream($original); + +$stream->read(1024); +echo $stream->tell(); +// 1024 + +$stream->seek(0); +echo $stream->tell(); +// 0 +``` + + +## DroppingStream + +`GuzzleHttp\Psr7\DroppingStream` + +Stream decorator that begins dropping data once the size of the underlying +stream becomes too full. + +```php +use GuzzleHttp\Psr7; + +// Create an empty stream +$stream = Psr7\stream_for(); + +// Start dropping data when the stream has more than 10 bytes +$dropping = new Psr7\DroppingStream($stream, 10); + +$dropping->write('01234567890123456789'); +echo $stream; // 0123456789 +``` + + +## FnStream + +`GuzzleHttp\Psr7\FnStream` + +Compose stream implementations based on a hash of functions. + +Allows for easy testing and extension of a provided stream without needing +to create a concrete class for a simple extension point. + +```php + +use GuzzleHttp\Psr7; + +$stream = Psr7\stream_for('hi'); +$fnStream = Psr7\FnStream::decorate($stream, [ + 'rewind' => function () use ($stream) { + echo 'About to rewind - '; + $stream->rewind(); + echo 'rewound!'; + } +]); + +$fnStream->rewind(); +// Outputs: About to rewind - rewound! +``` + + +## InflateStream + +`GuzzleHttp\Psr7\InflateStream` + +Uses PHP's zlib.inflate filter to inflate deflate or gzipped content. + +This stream decorator skips the first 10 bytes of the given stream to remove +the gzip header, converts the provided stream to a PHP stream resource, +then appends the zlib.inflate filter. The stream is then converted back +to a Guzzle stream resource to be used as a Guzzle stream. + + +## LazyOpenStream + +`GuzzleHttp\Psr7\LazyOpenStream` + +Lazily reads or writes to a file that is opened only after an IO operation +take place on the stream. + +```php +use GuzzleHttp\Psr7; + +$stream = new Psr7\LazyOpenStream('/path/to/file', 'r'); +// The file has not yet been opened... + +echo $stream->read(10); +// The file is opened and read from only when needed. +``` + + +## LimitStream + +`GuzzleHttp\Psr7\LimitStream` + +LimitStream can be used to read a subset or slice of an existing stream object. +This can be useful for breaking a large file into smaller pieces to be sent in +chunks (e.g. Amazon S3's multipart upload API). + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\stream_for(fopen('/tmp/test.txt', 'r+')); +echo $original->getSize(); +// >>> 1048576 + +// Limit the size of the body to 1024 bytes and start reading from byte 2048 +$stream = new Psr7\LimitStream($original, 1024, 2048); +echo $stream->getSize(); +// >>> 1024 +echo $stream->tell(); +// >>> 0 +``` + + +## MultipartStream + +`GuzzleHttp\Psr7\MultipartStream` + +Stream that when read returns bytes for a streaming multipart or +multipart/form-data stream. + + +## NoSeekStream + +`GuzzleHttp\Psr7\NoSeekStream` + +NoSeekStream wraps a stream and does not allow seeking. + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\stream_for('foo'); +$noSeek = new Psr7\NoSeekStream($original); + +echo $noSeek->read(3); +// foo +var_export($noSeek->isSeekable()); +// false +$noSeek->seek(0); +var_export($noSeek->read(3)); +// NULL +``` + + +## PumpStream + +`GuzzleHttp\Psr7\PumpStream` + +Provides a read only stream that pumps data from a PHP callable. + +When invoking the provided callable, the PumpStream will pass the amount of +data requested to read to the callable. The callable can choose to ignore +this value and return fewer or more bytes than requested. Any extra data +returned by the provided callable is buffered internally until drained using +the read() function of the PumpStream. The provided callable MUST return +false when there is no more data to read. + + +## Implementing stream decorators + +Creating a stream decorator is very easy thanks to the +`GuzzleHttp\Psr7\StreamDecoratorTrait`. This trait provides methods that +implement `Psr\Http\Message\StreamInterface` by proxying to an underlying +stream. Just `use` the `StreamDecoratorTrait` and implement your custom +methods. + +For example, let's say we wanted to call a specific function each time the last +byte is read from a stream. This could be implemented by overriding the +`read()` method. + +```php +use Psr\Http\Message\StreamInterface; +use GuzzleHttp\Psr7\StreamDecoratorTrait; + +class EofCallbackStream implements StreamInterface +{ + use StreamDecoratorTrait; + + private $callback; + + public function __construct(StreamInterface $stream, callable $cb) + { + $this->stream = $stream; + $this->callback = $cb; + } + + public function read($length) + { + $result = $this->stream->read($length); + + // Invoke the callback when EOF is hit. + if ($this->eof()) { + call_user_func($this->callback); + } + + return $result; + } +} +``` + +This decorator could be added to any existing stream and used like so: + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\stream_for('foo'); + +$eofStream = new EofCallbackStream($original, function () { + echo 'EOF!'; +}); + +$eofStream->read(2); +$eofStream->read(1); +// echoes "EOF!" +$eofStream->seek(0); +$eofStream->read(3); +// echoes "EOF!" +``` + + +## PHP StreamWrapper + +You can use the `GuzzleHttp\Psr7\StreamWrapper` class if you need to use a +PSR-7 stream as a PHP stream resource. + +Use the `GuzzleHttp\Psr7\StreamWrapper::getResource()` method to create a PHP +stream from a PSR-7 stream. + +```php +use GuzzleHttp\Psr7\StreamWrapper; + +$stream = GuzzleHttp\Psr7\stream_for('hello!'); +$resource = StreamWrapper::getResource($stream); +echo fread($resource, 6); // outputs hello! +``` + + +# Function API + +There are various functions available under the `GuzzleHttp\Psr7` namespace. + + +## `function str` + +`function str(MessageInterface $message)` + +Returns the string representation of an HTTP message. + +```php +$request = new GuzzleHttp\Psr7\Request('GET', 'http://example.com'); +echo GuzzleHttp\Psr7\str($request); +``` + + +## `function uri_for` + +`function uri_for($uri)` + +This function accepts a string or `Psr\Http\Message\UriInterface` and returns a +UriInterface for the given value. If the value is already a `UriInterface`, it +is returned as-is. + +```php +$uri = GuzzleHttp\Psr7\uri_for('http://example.com'); +assert($uri === GuzzleHttp\Psr7\uri_for($uri)); +``` + + +## `function stream_for` + +`function stream_for($resource = '', array $options = [])` + +Create a new stream based on the input type. + +Options is an associative array that can contain the following keys: + +* - metadata: Array of custom metadata. +* - size: Size of the stream. + +This method accepts the following `$resource` types: + +- `Psr\Http\Message\StreamInterface`: Returns the value as-is. +- `string`: Creates a stream object that uses the given string as the contents. +- `resource`: Creates a stream object that wraps the given PHP stream resource. +- `Iterator`: If the provided value implements `Iterator`, then a read-only + stream object will be created that wraps the given iterable. Each time the + stream is read from, data from the iterator will fill a buffer and will be + continuously called until the buffer is equal to the requested read size. + Subsequent read calls will first read from the buffer and then call `next` + on the underlying iterator until it is exhausted. +- `object` with `__toString()`: If the object has the `__toString()` method, + the object will be cast to a string and then a stream will be returned that + uses the string value. +- `NULL`: When `null` is passed, an empty stream object is returned. +- `callable` When a callable is passed, a read-only stream object will be + created that invokes the given callable. The callable is invoked with the + number of suggested bytes to read. The callable can return any number of + bytes, but MUST return `false` when there is no more data to return. The + stream object that wraps the callable will invoke the callable until the + number of requested bytes are available. Any additional bytes will be + buffered and used in subsequent reads. + +```php +$stream = GuzzleHttp\Psr7\stream_for('foo'); +$stream = GuzzleHttp\Psr7\stream_for(fopen('/path/to/file', 'r')); + +$generator = function ($bytes) { + for ($i = 0; $i < $bytes; $i++) { + yield ' '; + } +} + +$stream = GuzzleHttp\Psr7\stream_for($generator(100)); +``` + + +## `function parse_header` + +`function parse_header($header)` + +Parse an array of header values containing ";" separated data into an array of +associative arrays representing the header key value pair data of the header. +When a parameter does not contain a value, but just contains a key, this +function will inject a key with a '' string value. + + +## `function normalize_header` + +`function normalize_header($header)` + +Converts an array of header values that may contain comma separated headers +into an array of headers with no comma separated values. + + +## `function modify_request` + +`function modify_request(RequestInterface $request, array $changes)` + +Clone and modify a request with the given changes. This method is useful for +reducing the number of clones needed to mutate a message. + +The changes can be one of: + +- method: (string) Changes the HTTP method. +- set_headers: (array) Sets the given headers. +- remove_headers: (array) Remove the given headers. +- body: (mixed) Sets the given body. +- uri: (UriInterface) Set the URI. +- query: (string) Set the query string value of the URI. +- version: (string) Set the protocol version. + + +## `function rewind_body` + +`function rewind_body(MessageInterface $message)` + +Attempts to rewind a message body and throws an exception on failure. The body +of the message will only be rewound if a call to `tell()` returns a value other +than `0`. + + +## `function try_fopen` + +`function try_fopen($filename, $mode)` + +Safely opens a PHP stream resource using a filename. + +When fopen fails, PHP normally raises a warning. This function adds an error +handler that checks for errors and throws an exception instead. + + +## `function copy_to_string` + +`function copy_to_string(StreamInterface $stream, $maxLen = -1)` + +Copy the contents of a stream into a string until the given number of bytes +have been read. + + +## `function copy_to_stream` + +`function copy_to_stream(StreamInterface $source, StreamInterface $dest, $maxLen = -1)` + +Copy the contents of a stream into another stream until the given number of +bytes have been read. + + +## `function hash` + +`function hash(StreamInterface $stream, $algo, $rawOutput = false)` + +Calculate a hash of a Stream. This method reads the entire stream to calculate +a rolling hash (based on PHP's hash_init functions). + + +## `function readline` + +`function readline(StreamInterface $stream, $maxLength = null)` + +Read a line from the stream up to the maximum allowed buffer length. + + +## `function parse_request` + +`function parse_request($message)` + +Parses a request message string into a request object. + + +## `function parse_response` + +`function parse_response($message)` + +Parses a response message string into a response object. + + +## `function parse_query` + +`function parse_query($str, $urlEncoding = true)` + +Parse a query string into an associative array. + +If multiple values are found for the same key, the value of that key value pair +will become an array. This function does not parse nested PHP style arrays into +an associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed into +`['foo[a]' => '1', 'foo[b]' => '2']`). + + +## `function build_query` + +`function build_query(array $params, $encoding = PHP_QUERY_RFC3986)` + +Build a query string from an array of key value pairs. + +This function can use the return value of parse_query() to build a query string. +This function does not modify the provided keys when an array is encountered +(like http_build_query would). + + +## `function mimetype_from_filename` + +`function mimetype_from_filename($filename)` + +Determines the mimetype of a file by looking at its extension. + + +## `function mimetype_from_extension` + +`function mimetype_from_extension($extension)` + +Maps a file extensions to a mimetype. + + +# Additional URI Methods + +Aside from the standard `Psr\Http\Message\UriInterface` implementation in form of the `GuzzleHttp\Psr7\Uri` class, +this library also provides additional functionality when working with URIs as static methods. + +## URI Types + +An instance of `Psr\Http\Message\UriInterface` can either be an absolute URI or a relative reference. +An absolute URI has a scheme. A relative reference is used to express a URI relative to another URI, +the base URI. Relative references can be divided into several forms according to +[RFC 3986 Section 4.2](https://tools.ietf.org/html/rfc3986#section-4.2): + +- network-path references, e.g. `//example.com/path` +- absolute-path references, e.g. `/path` +- relative-path references, e.g. `subpath` + +The following methods can be used to identify the type of the URI. + +### `GuzzleHttp\Psr7\Uri::isAbsolute` + +`public static function isAbsolute(UriInterface $uri): bool` + +Whether the URI is absolute, i.e. it has a scheme. + +### `GuzzleHttp\Psr7\Uri::isNetworkPathReference` + +`public static function isNetworkPathReference(UriInterface $uri): bool` + +Whether the URI is a network-path reference. A relative reference that begins with two slash characters is +termed an network-path reference. + +### `GuzzleHttp\Psr7\Uri::isAbsolutePathReference` + +`public static function isAbsolutePathReference(UriInterface $uri): bool` + +Whether the URI is a absolute-path reference. A relative reference that begins with a single slash character is +termed an absolute-path reference. + +### `GuzzleHttp\Psr7\Uri::isRelativePathReference` + +`public static function isRelativePathReference(UriInterface $uri): bool` + +Whether the URI is a relative-path reference. A relative reference that does not begin with a slash character is +termed a relative-path reference. + +### `GuzzleHttp\Psr7\Uri::isSameDocumentReference` + +`public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool` + +Whether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its +fragment component, identical to the base URI. When no base URI is given, only an empty URI reference +(apart from its fragment) is considered a same-document reference. + +## URI Components + +Additional methods to work with URI components. + +### `GuzzleHttp\Psr7\Uri::isDefaultPort` + +`public static function isDefaultPort(UriInterface $uri): bool` + +Whether the URI has the default port of the current scheme. `Psr\Http\Message\UriInterface::getPort` may return null +or the standard port. This method can be used independently of the implementation. + +### `GuzzleHttp\Psr7\Uri::composeComponents` + +`public static function composeComponents($scheme, $authority, $path, $query, $fragment): string` + +Composes a URI reference string from its various components according to +[RFC 3986 Section 5.3](https://tools.ietf.org/html/rfc3986#section-5.3). Usually this method does not need to be called +manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__toString`. + +### `GuzzleHttp\Psr7\Uri::fromParts` + +`public static function fromParts(array $parts): UriInterface` + +Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components. + + +### `GuzzleHttp\Psr7\Uri::withQueryValue` + +`public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface` + +Creates a new URI with a specific query string value. Any existing query string values that exactly match the +provided key are removed and replaced with the given key value pair. A value of null will set the query string +key without a value, e.g. "key" instead of "key=value". + +### `GuzzleHttp\Psr7\Uri::withQueryValues` + +`public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface` + +Creates a new URI with multiple query string values. It has the same behavior as `withQueryValue()` but for an +associative array of key => value. + +### `GuzzleHttp\Psr7\Uri::withoutQueryValue` + +`public static function withoutQueryValue(UriInterface $uri, $key): UriInterface` + +Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the +provided key are removed. + +## Reference Resolution + +`GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according +to [RFC 3986 Section 5](https://tools.ietf.org/html/rfc3986#section-5). This is for example also what web browsers +do when resolving a link in a website based on the current request URI. + +### `GuzzleHttp\Psr7\UriResolver::resolve` + +`public static function resolve(UriInterface $base, UriInterface $rel): UriInterface` + +Converts the relative URI into a new URI that is resolved against the base URI. + +### `GuzzleHttp\Psr7\UriResolver::removeDotSegments` + +`public static function removeDotSegments(string $path): string` + +Removes dot segments from a path and returns the new path according to +[RFC 3986 Section 5.2.4](https://tools.ietf.org/html/rfc3986#section-5.2.4). + +### `GuzzleHttp\Psr7\UriResolver::relativize` + +`public static function relativize(UriInterface $base, UriInterface $target): UriInterface` + +Returns the target URI as a relative reference from the base URI. This method is the counterpart to resolve(): + +```php +(string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) +``` + +One use-case is to use the current request URI as base URI and then generate relative links in your documents +to reduce the document size or offer self-contained downloadable document archives. + +```php +$base = new Uri('http://example.com/a/b/'); +echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. +echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. +echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. +echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. +``` + +## Normalization and Comparison + +`GuzzleHttp\Psr7\UriNormalizer` provides methods to normalize and compare URIs according to +[RFC 3986 Section 6](https://tools.ietf.org/html/rfc3986#section-6). + +### `GuzzleHttp\Psr7\UriNormalizer::normalize` + +`public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface` + +Returns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface. +This methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask +of normalizations to apply. The following normalizations are available: + +- `UriNormalizer::PRESERVING_NORMALIZATIONS` + + Default normalizations which only include the ones that preserve semantics. + +- `UriNormalizer::CAPITALIZE_PERCENT_ENCODING` + + All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized. + + Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b` + +- `UriNormalizer::DECODE_UNRESERVED_CHARACTERS` + + Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of + ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should + not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved + characters by URI normalizers. + + Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/` + +- `UriNormalizer::CONVERT_EMPTY_PATH` + + Converts the empty path to "/" for http and https URIs. + + Example: `http://example.org` → `http://example.org/` + +- `UriNormalizer::REMOVE_DEFAULT_HOST` + + Removes the default host of the given URI scheme from the URI. Only the "file" scheme defines the default host + "localhost". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to + RFC 3986. + + Example: `file://localhost/myfile` → `file:///myfile` + +- `UriNormalizer::REMOVE_DEFAULT_PORT` + + Removes the default port of the given URI scheme from the URI. + + Example: `http://example.org:80/` → `http://example.org/` + +- `UriNormalizer::REMOVE_DOT_SEGMENTS` + + Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would + change the semantics of the URI reference. + + Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html` + +- `UriNormalizer::REMOVE_DUPLICATE_SLASHES` + + Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes + and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization + may change the semantics. Encoded slashes (%2F) are not removed. + + Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html` + +- `UriNormalizer::SORT_QUERY_PARAMETERS` + + Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be + significant (this is not defined by the standard). So this normalization is not safe and may change the semantics + of the URI. + + Example: `?lang=en&article=fred` → `?article=fred&lang=en` + +### `GuzzleHttp\Psr7\UriNormalizer::isEquivalent` + +`public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool` + +Whether two URIs can be considered equivalent. Both URIs are normalized automatically before comparison with the given +`$normalizations` bitmask. The method also accepts relative URI references and returns true when they are equivalent. +This of course assumes they will be resolved against the same base URI. If this is not the case, determination of +equivalence or difference of relative references does not mean anything. diff --git a/instafeed/vendor/guzzlehttp/psr7/composer.json b/instafeed/vendor/guzzlehttp/psr7/composer.json new file mode 100755 index 0000000..168a055 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/composer.json @@ -0,0 +1,49 @@ +{ + "name": "guzzlehttp/psr7", + "type": "library", + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": ["request", "response", "message", "stream", "http", "uri", "url", "psr-7"], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8", + "ext-zlib": "*" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": ["src/functions_include.php"] + }, + "autoload-dev": { + "psr-4": { + "GuzzleHttp\\Tests\\Psr7\\": "tests/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/AppendStream.php b/instafeed/vendor/guzzlehttp/psr7/src/AppendStream.php new file mode 100755 index 0000000..472a0d6 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/AppendStream.php @@ -0,0 +1,241 @@ +addStream($stream); + } + } + + public function __toString() + { + try { + $this->rewind(); + return $this->getContents(); + } catch (\Exception $e) { + return ''; + } + } + + /** + * Add a stream to the AppendStream + * + * @param StreamInterface $stream Stream to append. Must be readable. + * + * @throws \InvalidArgumentException if the stream is not readable + */ + public function addStream(StreamInterface $stream) + { + if (!$stream->isReadable()) { + throw new \InvalidArgumentException('Each stream must be readable'); + } + + // The stream is only seekable if all streams are seekable + if (!$stream->isSeekable()) { + $this->seekable = false; + } + + $this->streams[] = $stream; + } + + public function getContents() + { + return copy_to_string($this); + } + + /** + * Closes each attached stream. + * + * {@inheritdoc} + */ + public function close() + { + $this->pos = $this->current = 0; + $this->seekable = true; + + foreach ($this->streams as $stream) { + $stream->close(); + } + + $this->streams = []; + } + + /** + * Detaches each attached stream. + * + * Returns null as it's not clear which underlying stream resource to return. + * + * {@inheritdoc} + */ + public function detach() + { + $this->pos = $this->current = 0; + $this->seekable = true; + + foreach ($this->streams as $stream) { + $stream->detach(); + } + + $this->streams = []; + } + + public function tell() + { + return $this->pos; + } + + /** + * Tries to calculate the size by adding the size of each stream. + * + * If any of the streams do not return a valid number, then the size of the + * append stream cannot be determined and null is returned. + * + * {@inheritdoc} + */ + public function getSize() + { + $size = 0; + + foreach ($this->streams as $stream) { + $s = $stream->getSize(); + if ($s === null) { + return null; + } + $size += $s; + } + + return $size; + } + + public function eof() + { + return !$this->streams || + ($this->current >= count($this->streams) - 1 && + $this->streams[$this->current]->eof()); + } + + public function rewind() + { + $this->seek(0); + } + + /** + * Attempts to seek to the given position. Only supports SEEK_SET. + * + * {@inheritdoc} + */ + public function seek($offset, $whence = SEEK_SET) + { + if (!$this->seekable) { + throw new \RuntimeException('This AppendStream is not seekable'); + } elseif ($whence !== SEEK_SET) { + throw new \RuntimeException('The AppendStream can only seek with SEEK_SET'); + } + + $this->pos = $this->current = 0; + + // Rewind each stream + foreach ($this->streams as $i => $stream) { + try { + $stream->rewind(); + } catch (\Exception $e) { + throw new \RuntimeException('Unable to seek stream ' + . $i . ' of the AppendStream', 0, $e); + } + } + + // Seek to the actual position by reading from each stream + while ($this->pos < $offset && !$this->eof()) { + $result = $this->read(min(8096, $offset - $this->pos)); + if ($result === '') { + break; + } + } + } + + /** + * Reads from all of the appended streams until the length is met or EOF. + * + * {@inheritdoc} + */ + public function read($length) + { + $buffer = ''; + $total = count($this->streams) - 1; + $remaining = $length; + $progressToNext = false; + + while ($remaining > 0) { + + // Progress to the next stream if needed. + if ($progressToNext || $this->streams[$this->current]->eof()) { + $progressToNext = false; + if ($this->current === $total) { + break; + } + $this->current++; + } + + $result = $this->streams[$this->current]->read($remaining); + + // Using a loose comparison here to match on '', false, and null + if ($result == null) { + $progressToNext = true; + continue; + } + + $buffer .= $result; + $remaining = $length - strlen($buffer); + } + + $this->pos += strlen($buffer); + + return $buffer; + } + + public function isReadable() + { + return true; + } + + public function isWritable() + { + return false; + } + + public function isSeekable() + { + return $this->seekable; + } + + public function write($string) + { + throw new \RuntimeException('Cannot write to an AppendStream'); + } + + public function getMetadata($key = null) + { + return $key ? null : []; + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/BufferStream.php b/instafeed/vendor/guzzlehttp/psr7/src/BufferStream.php new file mode 100755 index 0000000..af4d4c2 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/BufferStream.php @@ -0,0 +1,137 @@ +hwm = $hwm; + } + + public function __toString() + { + return $this->getContents(); + } + + public function getContents() + { + $buffer = $this->buffer; + $this->buffer = ''; + + return $buffer; + } + + public function close() + { + $this->buffer = ''; + } + + public function detach() + { + $this->close(); + } + + public function getSize() + { + return strlen($this->buffer); + } + + public function isReadable() + { + return true; + } + + public function isWritable() + { + return true; + } + + public function isSeekable() + { + return false; + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + throw new \RuntimeException('Cannot seek a BufferStream'); + } + + public function eof() + { + return strlen($this->buffer) === 0; + } + + public function tell() + { + throw new \RuntimeException('Cannot determine the position of a BufferStream'); + } + + /** + * Reads data from the buffer. + */ + public function read($length) + { + $currentLength = strlen($this->buffer); + + if ($length >= $currentLength) { + // No need to slice the buffer because we don't have enough data. + $result = $this->buffer; + $this->buffer = ''; + } else { + // Slice up the result to provide a subset of the buffer. + $result = substr($this->buffer, 0, $length); + $this->buffer = substr($this->buffer, $length); + } + + return $result; + } + + /** + * Writes data to the buffer. + */ + public function write($string) + { + $this->buffer .= $string; + + // TODO: What should happen here? + if (strlen($this->buffer) >= $this->hwm) { + return false; + } + + return strlen($string); + } + + public function getMetadata($key = null) + { + if ($key == 'hwm') { + return $this->hwm; + } + + return $key ? null : []; + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/CachingStream.php b/instafeed/vendor/guzzlehttp/psr7/src/CachingStream.php new file mode 100755 index 0000000..ed68f08 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/CachingStream.php @@ -0,0 +1,138 @@ +remoteStream = $stream; + $this->stream = $target ?: new Stream(fopen('php://temp', 'r+')); + } + + public function getSize() + { + return max($this->stream->getSize(), $this->remoteStream->getSize()); + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + if ($whence == SEEK_SET) { + $byte = $offset; + } elseif ($whence == SEEK_CUR) { + $byte = $offset + $this->tell(); + } elseif ($whence == SEEK_END) { + $size = $this->remoteStream->getSize(); + if ($size === null) { + $size = $this->cacheEntireStream(); + } + $byte = $size + $offset; + } else { + throw new \InvalidArgumentException('Invalid whence'); + } + + $diff = $byte - $this->stream->getSize(); + + if ($diff > 0) { + // Read the remoteStream until we have read in at least the amount + // of bytes requested, or we reach the end of the file. + while ($diff > 0 && !$this->remoteStream->eof()) { + $this->read($diff); + $diff = $byte - $this->stream->getSize(); + } + } else { + // We can just do a normal seek since we've already seen this byte. + $this->stream->seek($byte); + } + } + + public function read($length) + { + // Perform a regular read on any previously read data from the buffer + $data = $this->stream->read($length); + $remaining = $length - strlen($data); + + // More data was requested so read from the remote stream + if ($remaining) { + // If data was written to the buffer in a position that would have + // been filled from the remote stream, then we must skip bytes on + // the remote stream to emulate overwriting bytes from that + // position. This mimics the behavior of other PHP stream wrappers. + $remoteData = $this->remoteStream->read( + $remaining + $this->skipReadBytes + ); + + if ($this->skipReadBytes) { + $len = strlen($remoteData); + $remoteData = substr($remoteData, $this->skipReadBytes); + $this->skipReadBytes = max(0, $this->skipReadBytes - $len); + } + + $data .= $remoteData; + $this->stream->write($remoteData); + } + + return $data; + } + + public function write($string) + { + // When appending to the end of the currently read stream, you'll want + // to skip bytes from being read from the remote stream to emulate + // other stream wrappers. Basically replacing bytes of data of a fixed + // length. + $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell(); + if ($overflow > 0) { + $this->skipReadBytes += $overflow; + } + + return $this->stream->write($string); + } + + public function eof() + { + return $this->stream->eof() && $this->remoteStream->eof(); + } + + /** + * Close both the remote stream and buffer stream + */ + public function close() + { + $this->remoteStream->close() && $this->stream->close(); + } + + private function cacheEntireStream() + { + $target = new FnStream(['write' => 'strlen']); + copy_to_stream($this, $target); + + return $this->tell(); + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/DroppingStream.php b/instafeed/vendor/guzzlehttp/psr7/src/DroppingStream.php new file mode 100755 index 0000000..8935c80 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/DroppingStream.php @@ -0,0 +1,42 @@ +stream = $stream; + $this->maxLength = $maxLength; + } + + public function write($string) + { + $diff = $this->maxLength - $this->stream->getSize(); + + // Begin returning 0 when the underlying stream is too large. + if ($diff <= 0) { + return 0; + } + + // Write the stream or a subset of the stream if needed. + if (strlen($string) < $diff) { + return $this->stream->write($string); + } + + return $this->stream->write(substr($string, 0, $diff)); + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/FnStream.php b/instafeed/vendor/guzzlehttp/psr7/src/FnStream.php new file mode 100755 index 0000000..73daea6 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/FnStream.php @@ -0,0 +1,158 @@ +methods = $methods; + + // Create the functions on the class + foreach ($methods as $name => $fn) { + $this->{'_fn_' . $name} = $fn; + } + } + + /** + * Lazily determine which methods are not implemented. + * @throws \BadMethodCallException + */ + public function __get($name) + { + throw new \BadMethodCallException(str_replace('_fn_', '', $name) + . '() is not implemented in the FnStream'); + } + + /** + * The close method is called on the underlying stream only if possible. + */ + public function __destruct() + { + if (isset($this->_fn_close)) { + call_user_func($this->_fn_close); + } + } + + /** + * An unserialize would allow the __destruct to run when the unserialized value goes out of scope. + * @throws \LogicException + */ + public function __wakeup() + { + throw new \LogicException('FnStream should never be unserialized'); + } + + /** + * Adds custom functionality to an underlying stream by intercepting + * specific method calls. + * + * @param StreamInterface $stream Stream to decorate + * @param array $methods Hash of method name to a closure + * + * @return FnStream + */ + public static function decorate(StreamInterface $stream, array $methods) + { + // If any of the required methods were not provided, then simply + // proxy to the decorated stream. + foreach (array_diff(self::$slots, array_keys($methods)) as $diff) { + $methods[$diff] = [$stream, $diff]; + } + + return new self($methods); + } + + public function __toString() + { + return call_user_func($this->_fn___toString); + } + + public function close() + { + return call_user_func($this->_fn_close); + } + + public function detach() + { + return call_user_func($this->_fn_detach); + } + + public function getSize() + { + return call_user_func($this->_fn_getSize); + } + + public function tell() + { + return call_user_func($this->_fn_tell); + } + + public function eof() + { + return call_user_func($this->_fn_eof); + } + + public function isSeekable() + { + return call_user_func($this->_fn_isSeekable); + } + + public function rewind() + { + call_user_func($this->_fn_rewind); + } + + public function seek($offset, $whence = SEEK_SET) + { + call_user_func($this->_fn_seek, $offset, $whence); + } + + public function isWritable() + { + return call_user_func($this->_fn_isWritable); + } + + public function write($string) + { + return call_user_func($this->_fn_write, $string); + } + + public function isReadable() + { + return call_user_func($this->_fn_isReadable); + } + + public function read($length) + { + return call_user_func($this->_fn_read, $length); + } + + public function getContents() + { + return call_user_func($this->_fn_getContents); + } + + public function getMetadata($key = null) + { + return call_user_func($this->_fn_getMetadata, $key); + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/InflateStream.php b/instafeed/vendor/guzzlehttp/psr7/src/InflateStream.php new file mode 100755 index 0000000..5e4f602 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/InflateStream.php @@ -0,0 +1,52 @@ +read(10); + $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header); + // Skip the header, that is 10 + length of filename + 1 (nil) bytes + $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength); + $resource = StreamWrapper::getResource($stream); + stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ); + $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); + } + + /** + * @param StreamInterface $stream + * @param $header + * @return int + */ + private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header) + { + $filename_header_length = 0; + + if (substr(bin2hex($header), 6, 2) === '08') { + // we have a filename, read until nil + $filename_header_length = 1; + while ($stream->read(1) !== chr(0)) { + $filename_header_length++; + } + } + + return $filename_header_length; + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/LazyOpenStream.php b/instafeed/vendor/guzzlehttp/psr7/src/LazyOpenStream.php new file mode 100755 index 0000000..02cec3a --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/LazyOpenStream.php @@ -0,0 +1,39 @@ +filename = $filename; + $this->mode = $mode; + } + + /** + * Creates the underlying stream lazily when required. + * + * @return StreamInterface + */ + protected function createStream() + { + return stream_for(try_fopen($this->filename, $this->mode)); + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/LimitStream.php b/instafeed/vendor/guzzlehttp/psr7/src/LimitStream.php new file mode 100755 index 0000000..e4f239e --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/LimitStream.php @@ -0,0 +1,155 @@ +stream = $stream; + $this->setLimit($limit); + $this->setOffset($offset); + } + + public function eof() + { + // Always return true if the underlying stream is EOF + if ($this->stream->eof()) { + return true; + } + + // No limit and the underlying stream is not at EOF + if ($this->limit == -1) { + return false; + } + + return $this->stream->tell() >= $this->offset + $this->limit; + } + + /** + * Returns the size of the limited subset of data + * {@inheritdoc} + */ + public function getSize() + { + if (null === ($length = $this->stream->getSize())) { + return null; + } elseif ($this->limit == -1) { + return $length - $this->offset; + } else { + return min($this->limit, $length - $this->offset); + } + } + + /** + * Allow for a bounded seek on the read limited stream + * {@inheritdoc} + */ + public function seek($offset, $whence = SEEK_SET) + { + if ($whence !== SEEK_SET || $offset < 0) { + throw new \RuntimeException(sprintf( + 'Cannot seek to offset %s with whence %s', + $offset, + $whence + )); + } + + $offset += $this->offset; + + if ($this->limit !== -1) { + if ($offset > $this->offset + $this->limit) { + $offset = $this->offset + $this->limit; + } + } + + $this->stream->seek($offset); + } + + /** + * Give a relative tell() + * {@inheritdoc} + */ + public function tell() + { + return $this->stream->tell() - $this->offset; + } + + /** + * Set the offset to start limiting from + * + * @param int $offset Offset to seek to and begin byte limiting from + * + * @throws \RuntimeException if the stream cannot be seeked. + */ + public function setOffset($offset) + { + $current = $this->stream->tell(); + + if ($current !== $offset) { + // If the stream cannot seek to the offset position, then read to it + if ($this->stream->isSeekable()) { + $this->stream->seek($offset); + } elseif ($current > $offset) { + throw new \RuntimeException("Could not seek to stream offset $offset"); + } else { + $this->stream->read($offset - $current); + } + } + + $this->offset = $offset; + } + + /** + * Set the limit of bytes that the decorator allows to be read from the + * stream. + * + * @param int $limit Number of bytes to allow to be read from the stream. + * Use -1 for no limit. + */ + public function setLimit($limit) + { + $this->limit = $limit; + } + + public function read($length) + { + if ($this->limit == -1) { + return $this->stream->read($length); + } + + // Check if the current position is less than the total allowed + // bytes + original offset + $remaining = ($this->offset + $this->limit) - $this->stream->tell(); + if ($remaining > 0) { + // Only return the amount of requested data, ensuring that the byte + // limit is not exceeded + return $this->stream->read(min($remaining, $length)); + } + + return ''; + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/MessageTrait.php b/instafeed/vendor/guzzlehttp/psr7/src/MessageTrait.php new file mode 100755 index 0000000..a7966d1 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/MessageTrait.php @@ -0,0 +1,213 @@ + array of values */ + private $headers = []; + + /** @var array Map of lowercase header name => original name at registration */ + private $headerNames = []; + + /** @var string */ + private $protocol = '1.1'; + + /** @var StreamInterface */ + private $stream; + + public function getProtocolVersion() + { + return $this->protocol; + } + + public function withProtocolVersion($version) + { + if ($this->protocol === $version) { + return $this; + } + + $new = clone $this; + $new->protocol = $version; + return $new; + } + + public function getHeaders() + { + return $this->headers; + } + + public function hasHeader($header) + { + return isset($this->headerNames[strtolower($header)]); + } + + public function getHeader($header) + { + $header = strtolower($header); + + if (!isset($this->headerNames[$header])) { + return []; + } + + $header = $this->headerNames[$header]; + + return $this->headers[$header]; + } + + public function getHeaderLine($header) + { + return implode(', ', $this->getHeader($header)); + } + + public function withHeader($header, $value) + { + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); + $normalized = strtolower($header); + + $new = clone $this; + if (isset($new->headerNames[$normalized])) { + unset($new->headers[$new->headerNames[$normalized]]); + } + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + + return $new; + } + + public function withAddedHeader($header, $value) + { + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); + $normalized = strtolower($header); + + $new = clone $this; + if (isset($new->headerNames[$normalized])) { + $header = $this->headerNames[$normalized]; + $new->headers[$header] = array_merge($this->headers[$header], $value); + } else { + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + } + + return $new; + } + + public function withoutHeader($header) + { + $normalized = strtolower($header); + + if (!isset($this->headerNames[$normalized])) { + return $this; + } + + $header = $this->headerNames[$normalized]; + + $new = clone $this; + unset($new->headers[$header], $new->headerNames[$normalized]); + + return $new; + } + + public function getBody() + { + if (!$this->stream) { + $this->stream = stream_for(''); + } + + return $this->stream; + } + + public function withBody(StreamInterface $body) + { + if ($body === $this->stream) { + return $this; + } + + $new = clone $this; + $new->stream = $body; + return $new; + } + + private function setHeaders(array $headers) + { + $this->headerNames = $this->headers = []; + foreach ($headers as $header => $value) { + if (is_int($header)) { + // Numeric array keys are converted to int by PHP but having a header name '123' is not forbidden by the spec + // and also allowed in withHeader(). So we need to cast it to string again for the following assertion to pass. + $header = (string) $header; + } + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); + $normalized = strtolower($header); + if (isset($this->headerNames[$normalized])) { + $header = $this->headerNames[$normalized]; + $this->headers[$header] = array_merge($this->headers[$header], $value); + } else { + $this->headerNames[$normalized] = $header; + $this->headers[$header] = $value; + } + } + } + + private function normalizeHeaderValue($value) + { + if (!is_array($value)) { + return $this->trimHeaderValues([$value]); + } + + if (count($value) === 0) { + throw new \InvalidArgumentException('Header value can not be an empty array.'); + } + + return $this->trimHeaderValues($value); + } + + /** + * Trims whitespace from the header values. + * + * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. + * + * header-field = field-name ":" OWS field-value OWS + * OWS = *( SP / HTAB ) + * + * @param string[] $values Header values + * + * @return string[] Trimmed header values + * + * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 + */ + private function trimHeaderValues(array $values) + { + return array_map(function ($value) { + if (!is_scalar($value) && null !== $value) { + throw new \InvalidArgumentException(sprintf( + 'Header value must be scalar or null but %s provided.', + is_object($value) ? get_class($value) : gettype($value) + )); + } + + return trim((string) $value, " \t"); + }, $values); + } + + private function assertHeader($header) + { + if (!is_string($header)) { + throw new \InvalidArgumentException(sprintf( + 'Header name must be a string but %s provided.', + is_object($header) ? get_class($header) : gettype($header) + )); + } + + if ($header === '') { + throw new \InvalidArgumentException('Header name can not be empty.'); + } + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/MultipartStream.php b/instafeed/vendor/guzzlehttp/psr7/src/MultipartStream.php new file mode 100755 index 0000000..c0fd584 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/MultipartStream.php @@ -0,0 +1,153 @@ +boundary = $boundary ?: sha1(uniqid('', true)); + $this->stream = $this->createStream($elements); + } + + /** + * Get the boundary + * + * @return string + */ + public function getBoundary() + { + return $this->boundary; + } + + public function isWritable() + { + return false; + } + + /** + * Get the headers needed before transferring the content of a POST file + */ + private function getHeaders(array $headers) + { + $str = ''; + foreach ($headers as $key => $value) { + $str .= "{$key}: {$value}\r\n"; + } + + return "--{$this->boundary}\r\n" . trim($str) . "\r\n\r\n"; + } + + /** + * Create the aggregate stream that will be used to upload the POST data + */ + protected function createStream(array $elements) + { + $stream = new AppendStream(); + + foreach ($elements as $element) { + $this->addElement($stream, $element); + } + + // Add the trailing boundary with CRLF + $stream->addStream(stream_for("--{$this->boundary}--\r\n")); + + return $stream; + } + + private function addElement(AppendStream $stream, array $element) + { + foreach (['contents', 'name'] as $key) { + if (!array_key_exists($key, $element)) { + throw new \InvalidArgumentException("A '{$key}' key is required"); + } + } + + $element['contents'] = stream_for($element['contents']); + + if (empty($element['filename'])) { + $uri = $element['contents']->getMetadata('uri'); + if (substr($uri, 0, 6) !== 'php://') { + $element['filename'] = $uri; + } + } + + list($body, $headers) = $this->createElement( + $element['name'], + $element['contents'], + isset($element['filename']) ? $element['filename'] : null, + isset($element['headers']) ? $element['headers'] : [] + ); + + $stream->addStream(stream_for($this->getHeaders($headers))); + $stream->addStream($body); + $stream->addStream(stream_for("\r\n")); + } + + /** + * @return array + */ + private function createElement($name, StreamInterface $stream, $filename, array $headers) + { + // Set a default content-disposition header if one was no provided + $disposition = $this->getHeader($headers, 'content-disposition'); + if (!$disposition) { + $headers['Content-Disposition'] = ($filename === '0' || $filename) + ? sprintf('form-data; name="%s"; filename="%s"', + $name, + basename($filename)) + : "form-data; name=\"{$name}\""; + } + + // Set a default content-length header if one was no provided + $length = $this->getHeader($headers, 'content-length'); + if (!$length) { + if ($length = $stream->getSize()) { + $headers['Content-Length'] = (string) $length; + } + } + + // Set a default Content-Type if one was not supplied + $type = $this->getHeader($headers, 'content-type'); + if (!$type && ($filename === '0' || $filename)) { + if ($type = mimetype_from_filename($filename)) { + $headers['Content-Type'] = $type; + } + } + + return [$stream, $headers]; + } + + private function getHeader(array $headers, $key) + { + $lowercaseHeader = strtolower($key); + foreach ($headers as $k => $v) { + if (strtolower($k) === $lowercaseHeader) { + return $v; + } + } + + return null; + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/NoSeekStream.php b/instafeed/vendor/guzzlehttp/psr7/src/NoSeekStream.php new file mode 100755 index 0000000..2332218 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/NoSeekStream.php @@ -0,0 +1,22 @@ +source = $source; + $this->size = isset($options['size']) ? $options['size'] : null; + $this->metadata = isset($options['metadata']) ? $options['metadata'] : []; + $this->buffer = new BufferStream(); + } + + public function __toString() + { + try { + return copy_to_string($this); + } catch (\Exception $e) { + return ''; + } + } + + public function close() + { + $this->detach(); + } + + public function detach() + { + $this->tellPos = false; + $this->source = null; + } + + public function getSize() + { + return $this->size; + } + + public function tell() + { + return $this->tellPos; + } + + public function eof() + { + return !$this->source; + } + + public function isSeekable() + { + return false; + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + throw new \RuntimeException('Cannot seek a PumpStream'); + } + + public function isWritable() + { + return false; + } + + public function write($string) + { + throw new \RuntimeException('Cannot write to a PumpStream'); + } + + public function isReadable() + { + return true; + } + + public function read($length) + { + $data = $this->buffer->read($length); + $readLen = strlen($data); + $this->tellPos += $readLen; + $remaining = $length - $readLen; + + if ($remaining) { + $this->pump($remaining); + $data .= $this->buffer->read($remaining); + $this->tellPos += strlen($data) - $readLen; + } + + return $data; + } + + public function getContents() + { + $result = ''; + while (!$this->eof()) { + $result .= $this->read(1000000); + } + + return $result; + } + + public function getMetadata($key = null) + { + if (!$key) { + return $this->metadata; + } + + return isset($this->metadata[$key]) ? $this->metadata[$key] : null; + } + + private function pump($length) + { + if ($this->source) { + do { + $data = call_user_func($this->source, $length); + if ($data === false || $data === null) { + $this->source = null; + return; + } + $this->buffer->write($data); + $length -= strlen($data); + } while ($length > 0); + } + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/Request.php b/instafeed/vendor/guzzlehttp/psr7/src/Request.php new file mode 100755 index 0000000..59f337d --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/Request.php @@ -0,0 +1,151 @@ +assertMethod($method); + if (!($uri instanceof UriInterface)) { + $uri = new Uri($uri); + } + + $this->method = strtoupper($method); + $this->uri = $uri; + $this->setHeaders($headers); + $this->protocol = $version; + + if (!isset($this->headerNames['host'])) { + $this->updateHostFromUri(); + } + + if ($body !== '' && $body !== null) { + $this->stream = stream_for($body); + } + } + + public function getRequestTarget() + { + if ($this->requestTarget !== null) { + return $this->requestTarget; + } + + $target = $this->uri->getPath(); + if ($target == '') { + $target = '/'; + } + if ($this->uri->getQuery() != '') { + $target .= '?' . $this->uri->getQuery(); + } + + return $target; + } + + public function withRequestTarget($requestTarget) + { + if (preg_match('#\s#', $requestTarget)) { + throw new InvalidArgumentException( + 'Invalid request target provided; cannot contain whitespace' + ); + } + + $new = clone $this; + $new->requestTarget = $requestTarget; + return $new; + } + + public function getMethod() + { + return $this->method; + } + + public function withMethod($method) + { + $this->assertMethod($method); + $new = clone $this; + $new->method = strtoupper($method); + return $new; + } + + public function getUri() + { + return $this->uri; + } + + public function withUri(UriInterface $uri, $preserveHost = false) + { + if ($uri === $this->uri) { + return $this; + } + + $new = clone $this; + $new->uri = $uri; + + if (!$preserveHost || !isset($this->headerNames['host'])) { + $new->updateHostFromUri(); + } + + return $new; + } + + private function updateHostFromUri() + { + $host = $this->uri->getHost(); + + if ($host == '') { + return; + } + + if (($port = $this->uri->getPort()) !== null) { + $host .= ':' . $port; + } + + if (isset($this->headerNames['host'])) { + $header = $this->headerNames['host']; + } else { + $header = 'Host'; + $this->headerNames['host'] = 'Host'; + } + // Ensure Host is the first header. + // See: http://tools.ietf.org/html/rfc7230#section-5.4 + $this->headers = [$header => [$host]] + $this->headers; + } + + private function assertMethod($method) + { + if (!is_string($method) || $method === '') { + throw new \InvalidArgumentException('Method must be a non-empty string.'); + } + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/Response.php b/instafeed/vendor/guzzlehttp/psr7/src/Response.php new file mode 100755 index 0000000..e7e04d8 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/Response.php @@ -0,0 +1,154 @@ + 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-status', + 208 => 'Already Reported', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 306 => 'Switch Proxy', + 307 => 'Temporary Redirect', + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Time-out', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Large', + 415 => 'Unsupported Media Type', + 416 => 'Requested range not satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Unordered Collection', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 451 => 'Unavailable For Legal Reasons', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Time-out', + 505 => 'HTTP Version not supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 511 => 'Network Authentication Required', + ]; + + /** @var string */ + private $reasonPhrase = ''; + + /** @var int */ + private $statusCode = 200; + + /** + * @param int $status Status code + * @param array $headers Response headers + * @param string|null|resource|StreamInterface $body Response body + * @param string $version Protocol version + * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) + */ + public function __construct( + $status = 200, + array $headers = [], + $body = null, + $version = '1.1', + $reason = null + ) { + $this->assertStatusCodeIsInteger($status); + $status = (int) $status; + $this->assertStatusCodeRange($status); + + $this->statusCode = $status; + + if ($body !== '' && $body !== null) { + $this->stream = stream_for($body); + } + + $this->setHeaders($headers); + if ($reason == '' && isset(self::$phrases[$this->statusCode])) { + $this->reasonPhrase = self::$phrases[$this->statusCode]; + } else { + $this->reasonPhrase = (string) $reason; + } + + $this->protocol = $version; + } + + public function getStatusCode() + { + return $this->statusCode; + } + + public function getReasonPhrase() + { + return $this->reasonPhrase; + } + + public function withStatus($code, $reasonPhrase = '') + { + $this->assertStatusCodeIsInteger($code); + $code = (int) $code; + $this->assertStatusCodeRange($code); + + $new = clone $this; + $new->statusCode = $code; + if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) { + $reasonPhrase = self::$phrases[$new->statusCode]; + } + $new->reasonPhrase = $reasonPhrase; + return $new; + } + + private function assertStatusCodeIsInteger($statusCode) + { + if (filter_var($statusCode, FILTER_VALIDATE_INT) === false) { + throw new \InvalidArgumentException('Status code must be an integer value.'); + } + } + + private function assertStatusCodeRange($statusCode) + { + if ($statusCode < 100 || $statusCode >= 600) { + throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.'); + } + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/Rfc7230.php b/instafeed/vendor/guzzlehttp/psr7/src/Rfc7230.php new file mode 100755 index 0000000..505e474 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/Rfc7230.php @@ -0,0 +1,18 @@ +@,;:\\\"/[\]?={}\x01-\x20\x7F]++):[ \t]*+((?:[ \t]*+[\x21-\x7E\x80-\xFF]++)*+)[ \t]*+\r?\n)m"; + const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/ServerRequest.php b/instafeed/vendor/guzzlehttp/psr7/src/ServerRequest.php new file mode 100755 index 0000000..1a09a6c --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/ServerRequest.php @@ -0,0 +1,376 @@ +serverParams = $serverParams; + + parent::__construct($method, $uri, $headers, $body, $version); + } + + /** + * Return an UploadedFile instance array. + * + * @param array $files A array which respect $_FILES structure + * @throws InvalidArgumentException for unrecognized values + * @return array + */ + public static function normalizeFiles(array $files) + { + $normalized = []; + + foreach ($files as $key => $value) { + if ($value instanceof UploadedFileInterface) { + $normalized[$key] = $value; + } elseif (is_array($value) && isset($value['tmp_name'])) { + $normalized[$key] = self::createUploadedFileFromSpec($value); + } elseif (is_array($value)) { + $normalized[$key] = self::normalizeFiles($value); + continue; + } else { + throw new InvalidArgumentException('Invalid value in files specification'); + } + } + + return $normalized; + } + + /** + * Create and return an UploadedFile instance from a $_FILES specification. + * + * If the specification represents an array of values, this method will + * delegate to normalizeNestedFileSpec() and return that return value. + * + * @param array $value $_FILES struct + * @return array|UploadedFileInterface + */ + private static function createUploadedFileFromSpec(array $value) + { + if (is_array($value['tmp_name'])) { + return self::normalizeNestedFileSpec($value); + } + + return new UploadedFile( + $value['tmp_name'], + (int) $value['size'], + (int) $value['error'], + $value['name'], + $value['type'] + ); + } + + /** + * Normalize an array of file specifications. + * + * Loops through all nested files and returns a normalized array of + * UploadedFileInterface instances. + * + * @param array $files + * @return UploadedFileInterface[] + */ + private static function normalizeNestedFileSpec(array $files = []) + { + $normalizedFiles = []; + + foreach (array_keys($files['tmp_name']) as $key) { + $spec = [ + 'tmp_name' => $files['tmp_name'][$key], + 'size' => $files['size'][$key], + 'error' => $files['error'][$key], + 'name' => $files['name'][$key], + 'type' => $files['type'][$key], + ]; + $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); + } + + return $normalizedFiles; + } + + /** + * Return a ServerRequest populated with superglobals: + * $_GET + * $_POST + * $_COOKIE + * $_FILES + * $_SERVER + * + * @return ServerRequestInterface + */ + public static function fromGlobals() + { + $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET'; + $headers = getallheaders(); + $uri = self::getUriFromGlobals(); + $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); + $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; + + $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); + + return $serverRequest + ->withCookieParams($_COOKIE) + ->withQueryParams($_GET) + ->withParsedBody($_POST) + ->withUploadedFiles(self::normalizeFiles($_FILES)); + } + + private static function extractHostAndPortFromAuthority($authority) + { + $uri = 'http://'.$authority; + $parts = parse_url($uri); + if (false === $parts) { + return [null, null]; + } + + $host = isset($parts['host']) ? $parts['host'] : null; + $port = isset($parts['port']) ? $parts['port'] : null; + + return [$host, $port]; + } + + /** + * Get a Uri populated with values from $_SERVER. + * + * @return UriInterface + */ + public static function getUriFromGlobals() + { + $uri = new Uri(''); + + $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); + + $hasPort = false; + if (isset($_SERVER['HTTP_HOST'])) { + list($host, $port) = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); + if ($host !== null) { + $uri = $uri->withHost($host); + } + + if ($port !== null) { + $hasPort = true; + $uri = $uri->withPort($port); + } + } elseif (isset($_SERVER['SERVER_NAME'])) { + $uri = $uri->withHost($_SERVER['SERVER_NAME']); + } elseif (isset($_SERVER['SERVER_ADDR'])) { + $uri = $uri->withHost($_SERVER['SERVER_ADDR']); + } + + if (!$hasPort && isset($_SERVER['SERVER_PORT'])) { + $uri = $uri->withPort($_SERVER['SERVER_PORT']); + } + + $hasQuery = false; + if (isset($_SERVER['REQUEST_URI'])) { + $requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2); + $uri = $uri->withPath($requestUriParts[0]); + if (isset($requestUriParts[1])) { + $hasQuery = true; + $uri = $uri->withQuery($requestUriParts[1]); + } + } + + if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) { + $uri = $uri->withQuery($_SERVER['QUERY_STRING']); + } + + return $uri; + } + + + /** + * {@inheritdoc} + */ + public function getServerParams() + { + return $this->serverParams; + } + + /** + * {@inheritdoc} + */ + public function getUploadedFiles() + { + return $this->uploadedFiles; + } + + /** + * {@inheritdoc} + */ + public function withUploadedFiles(array $uploadedFiles) + { + $new = clone $this; + $new->uploadedFiles = $uploadedFiles; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function getCookieParams() + { + return $this->cookieParams; + } + + /** + * {@inheritdoc} + */ + public function withCookieParams(array $cookies) + { + $new = clone $this; + $new->cookieParams = $cookies; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function getQueryParams() + { + return $this->queryParams; + } + + /** + * {@inheritdoc} + */ + public function withQueryParams(array $query) + { + $new = clone $this; + $new->queryParams = $query; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function getParsedBody() + { + return $this->parsedBody; + } + + /** + * {@inheritdoc} + */ + public function withParsedBody($data) + { + $new = clone $this; + $new->parsedBody = $data; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function getAttributes() + { + return $this->attributes; + } + + /** + * {@inheritdoc} + */ + public function getAttribute($attribute, $default = null) + { + if (false === array_key_exists($attribute, $this->attributes)) { + return $default; + } + + return $this->attributes[$attribute]; + } + + /** + * {@inheritdoc} + */ + public function withAttribute($attribute, $value) + { + $new = clone $this; + $new->attributes[$attribute] = $value; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function withoutAttribute($attribute) + { + if (false === array_key_exists($attribute, $this->attributes)) { + return $this; + } + + $new = clone $this; + unset($new->attributes[$attribute]); + + return $new; + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/Stream.php b/instafeed/vendor/guzzlehttp/psr7/src/Stream.php new file mode 100755 index 0000000..d9e7409 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/Stream.php @@ -0,0 +1,267 @@ +size = $options['size']; + } + + $this->customMetadata = isset($options['metadata']) + ? $options['metadata'] + : []; + + $this->stream = $stream; + $meta = stream_get_meta_data($this->stream); + $this->seekable = $meta['seekable']; + $this->readable = (bool)preg_match(self::READABLE_MODES, $meta['mode']); + $this->writable = (bool)preg_match(self::WRITABLE_MODES, $meta['mode']); + $this->uri = $this->getMetadata('uri'); + } + + /** + * Closes the stream when the destructed + */ + public function __destruct() + { + $this->close(); + } + + public function __toString() + { + try { + $this->seek(0); + return (string) stream_get_contents($this->stream); + } catch (\Exception $e) { + return ''; + } + } + + public function getContents() + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + $contents = stream_get_contents($this->stream); + + if ($contents === false) { + throw new \RuntimeException('Unable to read stream contents'); + } + + return $contents; + } + + public function close() + { + if (isset($this->stream)) { + if (is_resource($this->stream)) { + fclose($this->stream); + } + $this->detach(); + } + } + + public function detach() + { + if (!isset($this->stream)) { + return null; + } + + $result = $this->stream; + unset($this->stream); + $this->size = $this->uri = null; + $this->readable = $this->writable = $this->seekable = false; + + return $result; + } + + public function getSize() + { + if ($this->size !== null) { + return $this->size; + } + + if (!isset($this->stream)) { + return null; + } + + // Clear the stat cache if the stream has a URI + if ($this->uri) { + clearstatcache(true, $this->uri); + } + + $stats = fstat($this->stream); + if (isset($stats['size'])) { + $this->size = $stats['size']; + return $this->size; + } + + return null; + } + + public function isReadable() + { + return $this->readable; + } + + public function isWritable() + { + return $this->writable; + } + + public function isSeekable() + { + return $this->seekable; + } + + public function eof() + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + return feof($this->stream); + } + + public function tell() + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + $result = ftell($this->stream); + + if ($result === false) { + throw new \RuntimeException('Unable to determine stream position'); + } + + return $result; + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + $whence = (int) $whence; + + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->seekable) { + throw new \RuntimeException('Stream is not seekable'); + } + if (fseek($this->stream, $offset, $whence) === -1) { + throw new \RuntimeException('Unable to seek to stream position ' + . $offset . ' with whence ' . var_export($whence, true)); + } + } + + public function read($length) + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->readable) { + throw new \RuntimeException('Cannot read from non-readable stream'); + } + if ($length < 0) { + throw new \RuntimeException('Length parameter cannot be negative'); + } + + if (0 === $length) { + return ''; + } + + $string = fread($this->stream, $length); + if (false === $string) { + throw new \RuntimeException('Unable to read from stream'); + } + + return $string; + } + + public function write($string) + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->writable) { + throw new \RuntimeException('Cannot write to a non-writable stream'); + } + + // We can't know the size after writing anything + $this->size = null; + $result = fwrite($this->stream, $string); + + if ($result === false) { + throw new \RuntimeException('Unable to write to stream'); + } + + return $result; + } + + public function getMetadata($key = null) + { + if (!isset($this->stream)) { + return $key ? null : []; + } elseif (!$key) { + return $this->customMetadata + stream_get_meta_data($this->stream); + } elseif (isset($this->customMetadata[$key])) { + return $this->customMetadata[$key]; + } + + $meta = stream_get_meta_data($this->stream); + + return isset($meta[$key]) ? $meta[$key] : null; + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php b/instafeed/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php new file mode 100755 index 0000000..daec6f5 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php @@ -0,0 +1,149 @@ +stream = $stream; + } + + /** + * Magic method used to create a new stream if streams are not added in + * the constructor of a decorator (e.g., LazyOpenStream). + * + * @param string $name Name of the property (allows "stream" only). + * + * @return StreamInterface + */ + public function __get($name) + { + if ($name == 'stream') { + $this->stream = $this->createStream(); + return $this->stream; + } + + throw new \UnexpectedValueException("$name not found on class"); + } + + public function __toString() + { + try { + if ($this->isSeekable()) { + $this->seek(0); + } + return $this->getContents(); + } catch (\Exception $e) { + // Really, PHP? https://bugs.php.net/bug.php?id=53648 + trigger_error('StreamDecorator::__toString exception: ' + . (string) $e, E_USER_ERROR); + return ''; + } + } + + public function getContents() + { + return copy_to_string($this); + } + + /** + * Allow decorators to implement custom methods + * + * @param string $method Missing method name + * @param array $args Method arguments + * + * @return mixed + */ + public function __call($method, array $args) + { + $result = call_user_func_array([$this->stream, $method], $args); + + // Always return the wrapped object if the result is a return $this + return $result === $this->stream ? $this : $result; + } + + public function close() + { + $this->stream->close(); + } + + public function getMetadata($key = null) + { + return $this->stream->getMetadata($key); + } + + public function detach() + { + return $this->stream->detach(); + } + + public function getSize() + { + return $this->stream->getSize(); + } + + public function eof() + { + return $this->stream->eof(); + } + + public function tell() + { + return $this->stream->tell(); + } + + public function isReadable() + { + return $this->stream->isReadable(); + } + + public function isWritable() + { + return $this->stream->isWritable(); + } + + public function isSeekable() + { + return $this->stream->isSeekable(); + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + $this->stream->seek($offset, $whence); + } + + public function read($length) + { + return $this->stream->read($length); + } + + public function write($string) + { + return $this->stream->write($string); + } + + /** + * Implement in subclasses to dynamically create streams when requested. + * + * @return StreamInterface + * @throws \BadMethodCallException + */ + protected function createStream() + { + throw new \BadMethodCallException('Not implemented'); + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/StreamWrapper.php b/instafeed/vendor/guzzlehttp/psr7/src/StreamWrapper.php new file mode 100755 index 0000000..0f3a285 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/StreamWrapper.php @@ -0,0 +1,161 @@ +isReadable()) { + $mode = $stream->isWritable() ? 'r+' : 'r'; + } elseif ($stream->isWritable()) { + $mode = 'w'; + } else { + throw new \InvalidArgumentException('The stream must be readable, ' + . 'writable, or both.'); + } + + return fopen('guzzle://stream', $mode, null, self::createStreamContext($stream)); + } + + /** + * Creates a stream context that can be used to open a stream as a php stream resource. + * + * @param StreamInterface $stream + * + * @return resource + */ + public static function createStreamContext(StreamInterface $stream) + { + return stream_context_create([ + 'guzzle' => ['stream' => $stream] + ]); + } + + /** + * Registers the stream wrapper if needed + */ + public static function register() + { + if (!in_array('guzzle', stream_get_wrappers())) { + stream_wrapper_register('guzzle', __CLASS__); + } + } + + public function stream_open($path, $mode, $options, &$opened_path) + { + $options = stream_context_get_options($this->context); + + if (!isset($options['guzzle']['stream'])) { + return false; + } + + $this->mode = $mode; + $this->stream = $options['guzzle']['stream']; + + return true; + } + + public function stream_read($count) + { + return $this->stream->read($count); + } + + public function stream_write($data) + { + return (int) $this->stream->write($data); + } + + public function stream_tell() + { + return $this->stream->tell(); + } + + public function stream_eof() + { + return $this->stream->eof(); + } + + public function stream_seek($offset, $whence) + { + $this->stream->seek($offset, $whence); + + return true; + } + + public function stream_cast($cast_as) + { + $stream = clone($this->stream); + + return $stream->detach(); + } + + public function stream_stat() + { + static $modeMap = [ + 'r' => 33060, + 'rb' => 33060, + 'r+' => 33206, + 'w' => 33188, + 'wb' => 33188 + ]; + + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => $modeMap[$this->mode], + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => $this->stream->getSize() ?: 0, + 'atime' => 0, + 'mtime' => 0, + 'ctime' => 0, + 'blksize' => 0, + 'blocks' => 0 + ]; + } + + public function url_stat($path, $flags) + { + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => 0, + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => 0, + 'atime' => 0, + 'mtime' => 0, + 'ctime' => 0, + 'blksize' => 0, + 'blocks' => 0 + ]; + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/UploadedFile.php b/instafeed/vendor/guzzlehttp/psr7/src/UploadedFile.php new file mode 100755 index 0000000..e62bd5c --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/UploadedFile.php @@ -0,0 +1,316 @@ +setError($errorStatus); + $this->setSize($size); + $this->setClientFilename($clientFilename); + $this->setClientMediaType($clientMediaType); + + if ($this->isOk()) { + $this->setStreamOrFile($streamOrFile); + } + } + + /** + * Depending on the value set file or stream variable + * + * @param mixed $streamOrFile + * @throws InvalidArgumentException + */ + private function setStreamOrFile($streamOrFile) + { + if (is_string($streamOrFile)) { + $this->file = $streamOrFile; + } elseif (is_resource($streamOrFile)) { + $this->stream = new Stream($streamOrFile); + } elseif ($streamOrFile instanceof StreamInterface) { + $this->stream = $streamOrFile; + } else { + throw new InvalidArgumentException( + 'Invalid stream or file provided for UploadedFile' + ); + } + } + + /** + * @param int $error + * @throws InvalidArgumentException + */ + private function setError($error) + { + if (false === is_int($error)) { + throw new InvalidArgumentException( + 'Upload file error status must be an integer' + ); + } + + if (false === in_array($error, UploadedFile::$errors)) { + throw new InvalidArgumentException( + 'Invalid error status for UploadedFile' + ); + } + + $this->error = $error; + } + + /** + * @param int $size + * @throws InvalidArgumentException + */ + private function setSize($size) + { + if (false === is_int($size)) { + throw new InvalidArgumentException( + 'Upload file size must be an integer' + ); + } + + $this->size = $size; + } + + /** + * @param mixed $param + * @return boolean + */ + private function isStringOrNull($param) + { + return in_array(gettype($param), ['string', 'NULL']); + } + + /** + * @param mixed $param + * @return boolean + */ + private function isStringNotEmpty($param) + { + return is_string($param) && false === empty($param); + } + + /** + * @param string|null $clientFilename + * @throws InvalidArgumentException + */ + private function setClientFilename($clientFilename) + { + if (false === $this->isStringOrNull($clientFilename)) { + throw new InvalidArgumentException( + 'Upload file client filename must be a string or null' + ); + } + + $this->clientFilename = $clientFilename; + } + + /** + * @param string|null $clientMediaType + * @throws InvalidArgumentException + */ + private function setClientMediaType($clientMediaType) + { + if (false === $this->isStringOrNull($clientMediaType)) { + throw new InvalidArgumentException( + 'Upload file client media type must be a string or null' + ); + } + + $this->clientMediaType = $clientMediaType; + } + + /** + * Return true if there is no upload error + * + * @return boolean + */ + private function isOk() + { + return $this->error === UPLOAD_ERR_OK; + } + + /** + * @return boolean + */ + public function isMoved() + { + return $this->moved; + } + + /** + * @throws RuntimeException if is moved or not ok + */ + private function validateActive() + { + if (false === $this->isOk()) { + throw new RuntimeException('Cannot retrieve stream due to upload error'); + } + + if ($this->isMoved()) { + throw new RuntimeException('Cannot retrieve stream after it has already been moved'); + } + } + + /** + * {@inheritdoc} + * @throws RuntimeException if the upload was not successful. + */ + public function getStream() + { + $this->validateActive(); + + if ($this->stream instanceof StreamInterface) { + return $this->stream; + } + + return new LazyOpenStream($this->file, 'r+'); + } + + /** + * {@inheritdoc} + * + * @see http://php.net/is_uploaded_file + * @see http://php.net/move_uploaded_file + * @param string $targetPath Path to which to move the uploaded file. + * @throws RuntimeException if the upload was not successful. + * @throws InvalidArgumentException if the $path specified is invalid. + * @throws RuntimeException on any error during the move operation, or on + * the second or subsequent call to the method. + */ + public function moveTo($targetPath) + { + $this->validateActive(); + + if (false === $this->isStringNotEmpty($targetPath)) { + throw new InvalidArgumentException( + 'Invalid path provided for move operation; must be a non-empty string' + ); + } + + if ($this->file) { + $this->moved = php_sapi_name() == 'cli' + ? rename($this->file, $targetPath) + : move_uploaded_file($this->file, $targetPath); + } else { + copy_to_stream( + $this->getStream(), + new LazyOpenStream($targetPath, 'w') + ); + + $this->moved = true; + } + + if (false === $this->moved) { + throw new RuntimeException( + sprintf('Uploaded file could not be moved to %s', $targetPath) + ); + } + } + + /** + * {@inheritdoc} + * + * @return int|null The file size in bytes or null if unknown. + */ + public function getSize() + { + return $this->size; + } + + /** + * {@inheritdoc} + * + * @see http://php.net/manual/en/features.file-upload.errors.php + * @return int One of PHP's UPLOAD_ERR_XXX constants. + */ + public function getError() + { + return $this->error; + } + + /** + * {@inheritdoc} + * + * @return string|null The filename sent by the client or null if none + * was provided. + */ + public function getClientFilename() + { + return $this->clientFilename; + } + + /** + * {@inheritdoc} + */ + public function getClientMediaType() + { + return $this->clientMediaType; + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/Uri.php b/instafeed/vendor/guzzlehttp/psr7/src/Uri.php new file mode 100755 index 0000000..825a25e --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/Uri.php @@ -0,0 +1,760 @@ + 80, + 'https' => 443, + 'ftp' => 21, + 'gopher' => 70, + 'nntp' => 119, + 'news' => 119, + 'telnet' => 23, + 'tn3270' => 23, + 'imap' => 143, + 'pop' => 110, + 'ldap' => 389, + ]; + + private static $charUnreserved = 'a-zA-Z0-9_\-\.~'; + private static $charSubDelims = '!\$&\'\(\)\*\+,;='; + private static $replaceQuery = ['=' => '%3D', '&' => '%26']; + + /** @var string Uri scheme. */ + private $scheme = ''; + + /** @var string Uri user info. */ + private $userInfo = ''; + + /** @var string Uri host. */ + private $host = ''; + + /** @var int|null Uri port. */ + private $port; + + /** @var string Uri path. */ + private $path = ''; + + /** @var string Uri query string. */ + private $query = ''; + + /** @var string Uri fragment. */ + private $fragment = ''; + + /** + * @param string $uri URI to parse + */ + public function __construct($uri = '') + { + // weak type check to also accept null until we can add scalar type hints + if ($uri != '') { + $parts = parse_url($uri); + if ($parts === false) { + throw new \InvalidArgumentException("Unable to parse URI: $uri"); + } + $this->applyParts($parts); + } + } + + public function __toString() + { + return self::composeComponents( + $this->scheme, + $this->getAuthority(), + $this->path, + $this->query, + $this->fragment + ); + } + + /** + * Composes a URI reference string from its various components. + * + * Usually this method does not need to be called manually but instead is used indirectly via + * `Psr\Http\Message\UriInterface::__toString`. + * + * PSR-7 UriInterface treats an empty component the same as a missing component as + * getQuery(), getFragment() etc. always return a string. This explains the slight + * difference to RFC 3986 Section 5.3. + * + * Another adjustment is that the authority separator is added even when the authority is missing/empty + * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with + * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But + * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to + * that format). + * + * @param string $scheme + * @param string $authority + * @param string $path + * @param string $query + * @param string $fragment + * + * @return string + * + * @link https://tools.ietf.org/html/rfc3986#section-5.3 + */ + public static function composeComponents($scheme, $authority, $path, $query, $fragment) + { + $uri = ''; + + // weak type checks to also accept null until we can add scalar type hints + if ($scheme != '') { + $uri .= $scheme . ':'; + } + + if ($authority != ''|| $scheme === 'file') { + $uri .= '//' . $authority; + } + + $uri .= $path; + + if ($query != '') { + $uri .= '?' . $query; + } + + if ($fragment != '') { + $uri .= '#' . $fragment; + } + + return $uri; + } + + /** + * Whether the URI has the default port of the current scheme. + * + * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used + * independently of the implementation. + * + * @param UriInterface $uri + * + * @return bool + */ + public static function isDefaultPort(UriInterface $uri) + { + return $uri->getPort() === null + || (isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]); + } + + /** + * Whether the URI is absolute, i.e. it has a scheme. + * + * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true + * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative + * to another URI, the base URI. Relative references can be divided into several forms: + * - network-path references, e.g. '//example.com/path' + * - absolute-path references, e.g. '/path' + * - relative-path references, e.g. 'subpath' + * + * @param UriInterface $uri + * + * @return bool + * @see Uri::isNetworkPathReference + * @see Uri::isAbsolutePathReference + * @see Uri::isRelativePathReference + * @link https://tools.ietf.org/html/rfc3986#section-4 + */ + public static function isAbsolute(UriInterface $uri) + { + return $uri->getScheme() !== ''; + } + + /** + * Whether the URI is a network-path reference. + * + * A relative reference that begins with two slash characters is termed an network-path reference. + * + * @param UriInterface $uri + * + * @return bool + * @link https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isNetworkPathReference(UriInterface $uri) + { + return $uri->getScheme() === '' && $uri->getAuthority() !== ''; + } + + /** + * Whether the URI is a absolute-path reference. + * + * A relative reference that begins with a single slash character is termed an absolute-path reference. + * + * @param UriInterface $uri + * + * @return bool + * @link https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isAbsolutePathReference(UriInterface $uri) + { + return $uri->getScheme() === '' + && $uri->getAuthority() === '' + && isset($uri->getPath()[0]) + && $uri->getPath()[0] === '/'; + } + + /** + * Whether the URI is a relative-path reference. + * + * A relative reference that does not begin with a slash character is termed a relative-path reference. + * + * @param UriInterface $uri + * + * @return bool + * @link https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isRelativePathReference(UriInterface $uri) + { + return $uri->getScheme() === '' + && $uri->getAuthority() === '' + && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/'); + } + + /** + * Whether the URI is a same-document reference. + * + * A same-document reference refers to a URI that is, aside from its fragment + * component, identical to the base URI. When no base URI is given, only an empty + * URI reference (apart from its fragment) is considered a same-document reference. + * + * @param UriInterface $uri The URI to check + * @param UriInterface|null $base An optional base URI to compare against + * + * @return bool + * @link https://tools.ietf.org/html/rfc3986#section-4.4 + */ + public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null) + { + if ($base !== null) { + $uri = UriResolver::resolve($base, $uri); + + return ($uri->getScheme() === $base->getScheme()) + && ($uri->getAuthority() === $base->getAuthority()) + && ($uri->getPath() === $base->getPath()) + && ($uri->getQuery() === $base->getQuery()); + } + + return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === ''; + } + + /** + * Removes dot segments from a path and returns the new path. + * + * @param string $path + * + * @return string + * + * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead. + * @see UriResolver::removeDotSegments + */ + public static function removeDotSegments($path) + { + return UriResolver::removeDotSegments($path); + } + + /** + * Converts the relative URI into a new URI that is resolved against the base URI. + * + * @param UriInterface $base Base URI + * @param string|UriInterface $rel Relative URI + * + * @return UriInterface + * + * @deprecated since version 1.4. Use UriResolver::resolve instead. + * @see UriResolver::resolve + */ + public static function resolve(UriInterface $base, $rel) + { + if (!($rel instanceof UriInterface)) { + $rel = new self($rel); + } + + return UriResolver::resolve($base, $rel); + } + + /** + * Creates a new URI with a specific query string value removed. + * + * Any existing query string values that exactly match the provided key are + * removed. + * + * @param UriInterface $uri URI to use as a base. + * @param string $key Query string key to remove. + * + * @return UriInterface + */ + public static function withoutQueryValue(UriInterface $uri, $key) + { + $result = self::getFilteredQueryString($uri, [$key]); + + return $uri->withQuery(implode('&', $result)); + } + + /** + * Creates a new URI with a specific query string value. + * + * Any existing query string values that exactly match the provided key are + * removed and replaced with the given key value pair. + * + * A value of null will set the query string key without a value, e.g. "key" + * instead of "key=value". + * + * @param UriInterface $uri URI to use as a base. + * @param string $key Key to set. + * @param string|null $value Value to set + * + * @return UriInterface + */ + public static function withQueryValue(UriInterface $uri, $key, $value) + { + $result = self::getFilteredQueryString($uri, [$key]); + + $result[] = self::generateQueryString($key, $value); + + return $uri->withQuery(implode('&', $result)); + } + + /** + * Creates a new URI with multiple specific query string values. + * + * It has the same behavior as withQueryValue() but for an associative array of key => value. + * + * @param UriInterface $uri URI to use as a base. + * @param array $keyValueArray Associative array of key and values + * + * @return UriInterface + */ + public static function withQueryValues(UriInterface $uri, array $keyValueArray) + { + $result = self::getFilteredQueryString($uri, array_keys($keyValueArray)); + + foreach ($keyValueArray as $key => $value) { + $result[] = self::generateQueryString($key, $value); + } + + return $uri->withQuery(implode('&', $result)); + } + + /** + * Creates a URI from a hash of `parse_url` components. + * + * @param array $parts + * + * @return UriInterface + * @link http://php.net/manual/en/function.parse-url.php + * + * @throws \InvalidArgumentException If the components do not form a valid URI. + */ + public static function fromParts(array $parts) + { + $uri = new self(); + $uri->applyParts($parts); + $uri->validateState(); + + return $uri; + } + + public function getScheme() + { + return $this->scheme; + } + + public function getAuthority() + { + $authority = $this->host; + if ($this->userInfo !== '') { + $authority = $this->userInfo . '@' . $authority; + } + + if ($this->port !== null) { + $authority .= ':' . $this->port; + } + + return $authority; + } + + public function getUserInfo() + { + return $this->userInfo; + } + + public function getHost() + { + return $this->host; + } + + public function getPort() + { + return $this->port; + } + + public function getPath() + { + return $this->path; + } + + public function getQuery() + { + return $this->query; + } + + public function getFragment() + { + return $this->fragment; + } + + public function withScheme($scheme) + { + $scheme = $this->filterScheme($scheme); + + if ($this->scheme === $scheme) { + return $this; + } + + $new = clone $this; + $new->scheme = $scheme; + $new->removeDefaultPort(); + $new->validateState(); + + return $new; + } + + public function withUserInfo($user, $password = null) + { + $info = $this->filterUserInfoComponent($user); + if ($password !== null) { + $info .= ':' . $this->filterUserInfoComponent($password); + } + + if ($this->userInfo === $info) { + return $this; + } + + $new = clone $this; + $new->userInfo = $info; + $new->validateState(); + + return $new; + } + + public function withHost($host) + { + $host = $this->filterHost($host); + + if ($this->host === $host) { + return $this; + } + + $new = clone $this; + $new->host = $host; + $new->validateState(); + + return $new; + } + + public function withPort($port) + { + $port = $this->filterPort($port); + + if ($this->port === $port) { + return $this; + } + + $new = clone $this; + $new->port = $port; + $new->removeDefaultPort(); + $new->validateState(); + + return $new; + } + + public function withPath($path) + { + $path = $this->filterPath($path); + + if ($this->path === $path) { + return $this; + } + + $new = clone $this; + $new->path = $path; + $new->validateState(); + + return $new; + } + + public function withQuery($query) + { + $query = $this->filterQueryAndFragment($query); + + if ($this->query === $query) { + return $this; + } + + $new = clone $this; + $new->query = $query; + + return $new; + } + + public function withFragment($fragment) + { + $fragment = $this->filterQueryAndFragment($fragment); + + if ($this->fragment === $fragment) { + return $this; + } + + $new = clone $this; + $new->fragment = $fragment; + + return $new; + } + + /** + * Apply parse_url parts to a URI. + * + * @param array $parts Array of parse_url parts to apply. + */ + private function applyParts(array $parts) + { + $this->scheme = isset($parts['scheme']) + ? $this->filterScheme($parts['scheme']) + : ''; + $this->userInfo = isset($parts['user']) + ? $this->filterUserInfoComponent($parts['user']) + : ''; + $this->host = isset($parts['host']) + ? $this->filterHost($parts['host']) + : ''; + $this->port = isset($parts['port']) + ? $this->filterPort($parts['port']) + : null; + $this->path = isset($parts['path']) + ? $this->filterPath($parts['path']) + : ''; + $this->query = isset($parts['query']) + ? $this->filterQueryAndFragment($parts['query']) + : ''; + $this->fragment = isset($parts['fragment']) + ? $this->filterQueryAndFragment($parts['fragment']) + : ''; + if (isset($parts['pass'])) { + $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']); + } + + $this->removeDefaultPort(); + } + + /** + * @param string $scheme + * + * @return string + * + * @throws \InvalidArgumentException If the scheme is invalid. + */ + private function filterScheme($scheme) + { + if (!is_string($scheme)) { + throw new \InvalidArgumentException('Scheme must be a string'); + } + + return strtolower($scheme); + } + + /** + * @param string $component + * + * @return string + * + * @throws \InvalidArgumentException If the user info is invalid. + */ + private function filterUserInfoComponent($component) + { + if (!is_string($component)) { + throw new \InvalidArgumentException('User info must be a string'); + } + + return preg_replace_callback( + '/(?:[^%' . self::$charUnreserved . self::$charSubDelims . ']+|%(?![A-Fa-f0-9]{2}))/', + [$this, 'rawurlencodeMatchZero'], + $component + ); + } + + /** + * @param string $host + * + * @return string + * + * @throws \InvalidArgumentException If the host is invalid. + */ + private function filterHost($host) + { + if (!is_string($host)) { + throw new \InvalidArgumentException('Host must be a string'); + } + + return strtolower($host); + } + + /** + * @param int|null $port + * + * @return int|null + * + * @throws \InvalidArgumentException If the port is invalid. + */ + private function filterPort($port) + { + if ($port === null) { + return null; + } + + $port = (int) $port; + if (0 > $port || 0xffff < $port) { + throw new \InvalidArgumentException( + sprintf('Invalid port: %d. Must be between 0 and 65535', $port) + ); + } + + return $port; + } + + /** + * @param UriInterface $uri + * @param array $keys + * + * @return array + */ + private static function getFilteredQueryString(UriInterface $uri, array $keys) + { + $current = $uri->getQuery(); + + if ($current === '') { + return []; + } + + $decodedKeys = array_map('rawurldecode', $keys); + + return array_filter(explode('&', $current), function ($part) use ($decodedKeys) { + return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true); + }); + } + + /** + * @param string $key + * @param string|null $value + * + * @return string + */ + private static function generateQueryString($key, $value) + { + // Query string separators ("=", "&") within the key or value need to be encoded + // (while preventing double-encoding) before setting the query string. All other + // chars that need percent-encoding will be encoded by withQuery(). + $queryString = strtr($key, self::$replaceQuery); + + if ($value !== null) { + $queryString .= '=' . strtr($value, self::$replaceQuery); + } + + return $queryString; + } + + private function removeDefaultPort() + { + if ($this->port !== null && self::isDefaultPort($this)) { + $this->port = null; + } + } + + /** + * Filters the path of a URI + * + * @param string $path + * + * @return string + * + * @throws \InvalidArgumentException If the path is invalid. + */ + private function filterPath($path) + { + if (!is_string($path)) { + throw new \InvalidArgumentException('Path must be a string'); + } + + return preg_replace_callback( + '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/]++|%(?![A-Fa-f0-9]{2}))/', + [$this, 'rawurlencodeMatchZero'], + $path + ); + } + + /** + * Filters the query string or fragment of a URI. + * + * @param string $str + * + * @return string + * + * @throws \InvalidArgumentException If the query or fragment is invalid. + */ + private function filterQueryAndFragment($str) + { + if (!is_string($str)) { + throw new \InvalidArgumentException('Query and fragment must be a string'); + } + + return preg_replace_callback( + '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/', + [$this, 'rawurlencodeMatchZero'], + $str + ); + } + + private function rawurlencodeMatchZero(array $match) + { + return rawurlencode($match[0]); + } + + private function validateState() + { + if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) { + $this->host = self::HTTP_DEFAULT_HOST; + } + + if ($this->getAuthority() === '') { + if (0 === strpos($this->path, '//')) { + throw new \InvalidArgumentException('The path of a URI without an authority must not start with two slashes "//"'); + } + if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) { + throw new \InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon'); + } + } elseif (isset($this->path[0]) && $this->path[0] !== '/') { + @trigger_error( + 'The path of a URI with an authority must start with a slash "/" or be empty. Automagically fixing the URI ' . + 'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.', + E_USER_DEPRECATED + ); + $this->path = '/'. $this->path; + //throw new \InvalidArgumentException('The path of a URI with an authority must start with a slash "/" or be empty'); + } + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/UriNormalizer.php b/instafeed/vendor/guzzlehttp/psr7/src/UriNormalizer.php new file mode 100755 index 0000000..384c29e --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/UriNormalizer.php @@ -0,0 +1,216 @@ +getPath() === '' && + ($uri->getScheme() === 'http' || $uri->getScheme() === 'https') + ) { + $uri = $uri->withPath('/'); + } + + if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') { + $uri = $uri->withHost(''); + } + + if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) { + $uri = $uri->withPort(null); + } + + if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) { + $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath())); + } + + if ($flags & self::REMOVE_DUPLICATE_SLASHES) { + $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath())); + } + + if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { + $queryKeyValues = explode('&', $uri->getQuery()); + sort($queryKeyValues); + $uri = $uri->withQuery(implode('&', $queryKeyValues)); + } + + return $uri; + } + + /** + * Whether two URIs can be considered equivalent. + * + * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also + * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be + * resolved against the same base URI. If this is not the case, determination of equivalence or difference of + * relative references does not mean anything. + * + * @param UriInterface $uri1 An URI to compare + * @param UriInterface $uri2 An URI to compare + * @param int $normalizations A bitmask of normalizations to apply, see constants + * + * @return bool + * @link https://tools.ietf.org/html/rfc3986#section-6.1 + */ + public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS) + { + return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); + } + + private static function capitalizePercentEncoding(UriInterface $uri) + { + $regex = '/(?:%[A-Fa-f0-9]{2})++/'; + + $callback = function (array $match) { + return strtoupper($match[0]); + }; + + return + $uri->withPath( + preg_replace_callback($regex, $callback, $uri->getPath()) + )->withQuery( + preg_replace_callback($regex, $callback, $uri->getQuery()) + ); + } + + private static function decodeUnreservedCharacters(UriInterface $uri) + { + $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; + + $callback = function (array $match) { + return rawurldecode($match[0]); + }; + + return + $uri->withPath( + preg_replace_callback($regex, $callback, $uri->getPath()) + )->withQuery( + preg_replace_callback($regex, $callback, $uri->getQuery()) + ); + } + + private function __construct() + { + // cannot be instantiated + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/UriResolver.php b/instafeed/vendor/guzzlehttp/psr7/src/UriResolver.php new file mode 100755 index 0000000..c1cb8a2 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/UriResolver.php @@ -0,0 +1,219 @@ +getScheme() != '') { + return $rel->withPath(self::removeDotSegments($rel->getPath())); + } + + if ($rel->getAuthority() != '') { + $targetAuthority = $rel->getAuthority(); + $targetPath = self::removeDotSegments($rel->getPath()); + $targetQuery = $rel->getQuery(); + } else { + $targetAuthority = $base->getAuthority(); + if ($rel->getPath() === '') { + $targetPath = $base->getPath(); + $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery(); + } else { + if ($rel->getPath()[0] === '/') { + $targetPath = $rel->getPath(); + } else { + if ($targetAuthority != '' && $base->getPath() === '') { + $targetPath = '/' . $rel->getPath(); + } else { + $lastSlashPos = strrpos($base->getPath(), '/'); + if ($lastSlashPos === false) { + $targetPath = $rel->getPath(); + } else { + $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath(); + } + } + } + $targetPath = self::removeDotSegments($targetPath); + $targetQuery = $rel->getQuery(); + } + } + + return new Uri(Uri::composeComponents( + $base->getScheme(), + $targetAuthority, + $targetPath, + $targetQuery, + $rel->getFragment() + )); + } + + /** + * Returns the target URI as a relative reference from the base URI. + * + * This method is the counterpart to resolve(): + * + * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) + * + * One use-case is to use the current request URI as base URI and then generate relative links in your documents + * to reduce the document size or offer self-contained downloadable document archives. + * + * $base = new Uri('http://example.com/a/b/'); + * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. + * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. + * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. + * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. + * + * This method also accepts a target that is already relative and will try to relativize it further. Only a + * relative-path reference will be returned as-is. + * + * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well + * + * @param UriInterface $base Base URI + * @param UriInterface $target Target URI + * + * @return UriInterface The relative URI reference + */ + public static function relativize(UriInterface $base, UriInterface $target) + { + if ($target->getScheme() !== '' && + ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '') + ) { + return $target; + } + + if (Uri::isRelativePathReference($target)) { + // As the target is already highly relative we return it as-is. It would be possible to resolve + // the target with `$target = self::resolve($base, $target);` and then try make it more relative + // by removing a duplicate query. But let's not do that automatically. + return $target; + } + + if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) { + return $target->withScheme(''); + } + + // We must remove the path before removing the authority because if the path starts with two slashes, the URI + // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also + // invalid. + $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); + + if ($base->getPath() !== $target->getPath()) { + return $emptyPathUri->withPath(self::getRelativePath($base, $target)); + } + + if ($base->getQuery() === $target->getQuery()) { + // Only the target fragment is left. And it must be returned even if base and target fragment are the same. + return $emptyPathUri->withQuery(''); + } + + // If the base URI has a query but the target has none, we cannot return an empty path reference as it would + // inherit the base query component when resolving. + if ($target->getQuery() === '') { + $segments = explode('/', $target->getPath()); + $lastSegment = end($segments); + + return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment); + } + + return $emptyPathUri; + } + + private static function getRelativePath(UriInterface $base, UriInterface $target) + { + $sourceSegments = explode('/', $base->getPath()); + $targetSegments = explode('/', $target->getPath()); + array_pop($sourceSegments); + $targetLastSegment = array_pop($targetSegments); + foreach ($sourceSegments as $i => $segment) { + if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { + unset($sourceSegments[$i], $targetSegments[$i]); + } else { + break; + } + } + $targetSegments[] = $targetLastSegment; + $relativePath = str_repeat('../', count($sourceSegments)) . implode('/', $targetSegments); + + // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". + // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used + // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. + if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) { + $relativePath = "./$relativePath"; + } elseif ('/' === $relativePath[0]) { + if ($base->getAuthority() != '' && $base->getPath() === '') { + // In this case an extra slash is added by resolve() automatically. So we must not add one here. + $relativePath = ".$relativePath"; + } else { + $relativePath = "./$relativePath"; + } + } + + return $relativePath; + } + + private function __construct() + { + // cannot be instantiated + } +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/functions.php b/instafeed/vendor/guzzlehttp/psr7/src/functions.php new file mode 100755 index 0000000..8e6dafe --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/functions.php @@ -0,0 +1,899 @@ +getMethod() . ' ' + . $message->getRequestTarget()) + . ' HTTP/' . $message->getProtocolVersion(); + if (!$message->hasHeader('host')) { + $msg .= "\r\nHost: " . $message->getUri()->getHost(); + } + } elseif ($message instanceof ResponseInterface) { + $msg = 'HTTP/' . $message->getProtocolVersion() . ' ' + . $message->getStatusCode() . ' ' + . $message->getReasonPhrase(); + } else { + throw new \InvalidArgumentException('Unknown message type'); + } + + foreach ($message->getHeaders() as $name => $values) { + $msg .= "\r\n{$name}: " . implode(', ', $values); + } + + return "{$msg}\r\n\r\n" . $message->getBody(); +} + +/** + * Returns a UriInterface for the given value. + * + * This function accepts a string or {@see Psr\Http\Message\UriInterface} and + * returns a UriInterface for the given value. If the value is already a + * `UriInterface`, it is returned as-is. + * + * @param string|UriInterface $uri + * + * @return UriInterface + * @throws \InvalidArgumentException + */ +function uri_for($uri) +{ + if ($uri instanceof UriInterface) { + return $uri; + } elseif (is_string($uri)) { + return new Uri($uri); + } + + throw new \InvalidArgumentException('URI must be a string or UriInterface'); +} + +/** + * Create a new stream based on the input type. + * + * Options is an associative array that can contain the following keys: + * - metadata: Array of custom metadata. + * - size: Size of the stream. + * + * @param resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource Entity body data + * @param array $options Additional options + * + * @return StreamInterface + * @throws \InvalidArgumentException if the $resource arg is not valid. + */ +function stream_for($resource = '', array $options = []) +{ + if (is_scalar($resource)) { + $stream = fopen('php://temp', 'r+'); + if ($resource !== '') { + fwrite($stream, $resource); + fseek($stream, 0); + } + return new Stream($stream, $options); + } + + switch (gettype($resource)) { + case 'resource': + return new Stream($resource, $options); + case 'object': + if ($resource instanceof StreamInterface) { + return $resource; + } elseif ($resource instanceof \Iterator) { + return new PumpStream(function () use ($resource) { + if (!$resource->valid()) { + return false; + } + $result = $resource->current(); + $resource->next(); + return $result; + }, $options); + } elseif (method_exists($resource, '__toString')) { + return stream_for((string) $resource, $options); + } + break; + case 'NULL': + return new Stream(fopen('php://temp', 'r+'), $options); + } + + if (is_callable($resource)) { + return new PumpStream($resource, $options); + } + + throw new \InvalidArgumentException('Invalid resource type: ' . gettype($resource)); +} + +/** + * Parse an array of header values containing ";" separated data into an + * array of associative arrays representing the header key value pair + * data of the header. When a parameter does not contain a value, but just + * contains a key, this function will inject a key with a '' string value. + * + * @param string|array $header Header to parse into components. + * + * @return array Returns the parsed header values. + */ +function parse_header($header) +{ + static $trimmed = "\"' \n\t\r"; + $params = $matches = []; + + foreach (normalize_header($header) as $val) { + $part = []; + foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { + if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { + $m = $matches[0]; + if (isset($m[1])) { + $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); + } else { + $part[] = trim($m[0], $trimmed); + } + } + } + if ($part) { + $params[] = $part; + } + } + + return $params; +} + +/** + * Converts an array of header values that may contain comma separated + * headers into an array of headers with no comma separated values. + * + * @param string|array $header Header to normalize. + * + * @return array Returns the normalized header field values. + */ +function normalize_header($header) +{ + if (!is_array($header)) { + return array_map('trim', explode(',', $header)); + } + + $result = []; + foreach ($header as $value) { + foreach ((array) $value as $v) { + if (strpos($v, ',') === false) { + $result[] = $v; + continue; + } + foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) { + $result[] = trim($vv); + } + } + } + + return $result; +} + +/** + * Clone and modify a request with the given changes. + * + * The changes can be one of: + * - method: (string) Changes the HTTP method. + * - set_headers: (array) Sets the given headers. + * - remove_headers: (array) Remove the given headers. + * - body: (mixed) Sets the given body. + * - uri: (UriInterface) Set the URI. + * - query: (string) Set the query string value of the URI. + * - version: (string) Set the protocol version. + * + * @param RequestInterface $request Request to clone and modify. + * @param array $changes Changes to apply. + * + * @return RequestInterface + */ +function modify_request(RequestInterface $request, array $changes) +{ + if (!$changes) { + return $request; + } + + $headers = $request->getHeaders(); + + if (!isset($changes['uri'])) { + $uri = $request->getUri(); + } else { + // Remove the host header if one is on the URI + if ($host = $changes['uri']->getHost()) { + $changes['set_headers']['Host'] = $host; + + if ($port = $changes['uri']->getPort()) { + $standardPorts = ['http' => 80, 'https' => 443]; + $scheme = $changes['uri']->getScheme(); + if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) { + $changes['set_headers']['Host'] .= ':'.$port; + } + } + } + $uri = $changes['uri']; + } + + if (!empty($changes['remove_headers'])) { + $headers = _caseless_remove($changes['remove_headers'], $headers); + } + + if (!empty($changes['set_headers'])) { + $headers = _caseless_remove(array_keys($changes['set_headers']), $headers); + $headers = $changes['set_headers'] + $headers; + } + + if (isset($changes['query'])) { + $uri = $uri->withQuery($changes['query']); + } + + if ($request instanceof ServerRequestInterface) { + return (new ServerRequest( + isset($changes['method']) ? $changes['method'] : $request->getMethod(), + $uri, + $headers, + isset($changes['body']) ? $changes['body'] : $request->getBody(), + isset($changes['version']) + ? $changes['version'] + : $request->getProtocolVersion(), + $request->getServerParams() + )) + ->withParsedBody($request->getParsedBody()) + ->withQueryParams($request->getQueryParams()) + ->withCookieParams($request->getCookieParams()) + ->withUploadedFiles($request->getUploadedFiles()); + } + + return new Request( + isset($changes['method']) ? $changes['method'] : $request->getMethod(), + $uri, + $headers, + isset($changes['body']) ? $changes['body'] : $request->getBody(), + isset($changes['version']) + ? $changes['version'] + : $request->getProtocolVersion() + ); +} + +/** + * Attempts to rewind a message body and throws an exception on failure. + * + * The body of the message will only be rewound if a call to `tell()` returns a + * value other than `0`. + * + * @param MessageInterface $message Message to rewind + * + * @throws \RuntimeException + */ +function rewind_body(MessageInterface $message) +{ + $body = $message->getBody(); + + if ($body->tell()) { + $body->rewind(); + } +} + +/** + * Safely opens a PHP stream resource using a filename. + * + * When fopen fails, PHP normally raises a warning. This function adds an + * error handler that checks for errors and throws an exception instead. + * + * @param string $filename File to open + * @param string $mode Mode used to open the file + * + * @return resource + * @throws \RuntimeException if the file cannot be opened + */ +function try_fopen($filename, $mode) +{ + $ex = null; + set_error_handler(function () use ($filename, $mode, &$ex) { + $ex = new \RuntimeException(sprintf( + 'Unable to open %s using mode %s: %s', + $filename, + $mode, + func_get_args()[1] + )); + }); + + $handle = fopen($filename, $mode); + restore_error_handler(); + + if ($ex) { + /** @var $ex \RuntimeException */ + throw $ex; + } + + return $handle; +} + +/** + * Copy the contents of a stream into a string until the given number of + * bytes have been read. + * + * @param StreamInterface $stream Stream to read + * @param int $maxLen Maximum number of bytes to read. Pass -1 + * to read the entire stream. + * @return string + * @throws \RuntimeException on error. + */ +function copy_to_string(StreamInterface $stream, $maxLen = -1) +{ + $buffer = ''; + + if ($maxLen === -1) { + while (!$stream->eof()) { + $buf = $stream->read(1048576); + // Using a loose equality here to match on '' and false. + if ($buf == null) { + break; + } + $buffer .= $buf; + } + return $buffer; + } + + $len = 0; + while (!$stream->eof() && $len < $maxLen) { + $buf = $stream->read($maxLen - $len); + // Using a loose equality here to match on '' and false. + if ($buf == null) { + break; + } + $buffer .= $buf; + $len = strlen($buffer); + } + + return $buffer; +} + +/** + * Copy the contents of a stream into another stream until the given number + * of bytes have been read. + * + * @param StreamInterface $source Stream to read from + * @param StreamInterface $dest Stream to write to + * @param int $maxLen Maximum number of bytes to read. Pass -1 + * to read the entire stream. + * + * @throws \RuntimeException on error. + */ +function copy_to_stream( + StreamInterface $source, + StreamInterface $dest, + $maxLen = -1 +) { + $bufferSize = 8192; + + if ($maxLen === -1) { + while (!$source->eof()) { + if (!$dest->write($source->read($bufferSize))) { + break; + } + } + } else { + $remaining = $maxLen; + while ($remaining > 0 && !$source->eof()) { + $buf = $source->read(min($bufferSize, $remaining)); + $len = strlen($buf); + if (!$len) { + break; + } + $remaining -= $len; + $dest->write($buf); + } + } +} + +/** + * Calculate a hash of a Stream + * + * @param StreamInterface $stream Stream to calculate the hash for + * @param string $algo Hash algorithm (e.g. md5, crc32, etc) + * @param bool $rawOutput Whether or not to use raw output + * + * @return string Returns the hash of the stream + * @throws \RuntimeException on error. + */ +function hash( + StreamInterface $stream, + $algo, + $rawOutput = false +) { + $pos = $stream->tell(); + + if ($pos > 0) { + $stream->rewind(); + } + + $ctx = hash_init($algo); + while (!$stream->eof()) { + hash_update($ctx, $stream->read(1048576)); + } + + $out = hash_final($ctx, (bool) $rawOutput); + $stream->seek($pos); + + return $out; +} + +/** + * Read a line from the stream up to the maximum allowed buffer length + * + * @param StreamInterface $stream Stream to read from + * @param int $maxLength Maximum buffer length + * + * @return string + */ +function readline(StreamInterface $stream, $maxLength = null) +{ + $buffer = ''; + $size = 0; + + while (!$stream->eof()) { + // Using a loose equality here to match on '' and false. + if (null == ($byte = $stream->read(1))) { + return $buffer; + } + $buffer .= $byte; + // Break when a new line is found or the max length - 1 is reached + if ($byte === "\n" || ++$size === $maxLength - 1) { + break; + } + } + + return $buffer; +} + +/** + * Parses a request message string into a request object. + * + * @param string $message Request message string. + * + * @return Request + */ +function parse_request($message) +{ + $data = _parse_message($message); + $matches = []; + if (!preg_match('/^[\S]+\s+([a-zA-Z]+:\/\/|\/).*/', $data['start-line'], $matches)) { + throw new \InvalidArgumentException('Invalid request string'); + } + $parts = explode(' ', $data['start-line'], 3); + $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1'; + + $request = new Request( + $parts[0], + $matches[1] === '/' ? _parse_request_uri($parts[1], $data['headers']) : $parts[1], + $data['headers'], + $data['body'], + $version + ); + + return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]); +} + +/** + * Parses a response message string into a response object. + * + * @param string $message Response message string. + * + * @return Response + */ +function parse_response($message) +{ + $data = _parse_message($message); + // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space + // between status-code and reason-phrase is required. But browsers accept + // responses without space and reason as well. + if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { + throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']); + } + $parts = explode(' ', $data['start-line'], 3); + + return new Response( + $parts[1], + $data['headers'], + $data['body'], + explode('/', $parts[0])[1], + isset($parts[2]) ? $parts[2] : null + ); +} + +/** + * Parse a query string into an associative array. + * + * If multiple values are found for the same key, the value of that key + * value pair will become an array. This function does not parse nested + * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will + * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']). + * + * @param string $str Query string to parse + * @param int|bool $urlEncoding How the query string is encoded + * + * @return array + */ +function parse_query($str, $urlEncoding = true) +{ + $result = []; + + if ($str === '') { + return $result; + } + + if ($urlEncoding === true) { + $decoder = function ($value) { + return rawurldecode(str_replace('+', ' ', $value)); + }; + } elseif ($urlEncoding === PHP_QUERY_RFC3986) { + $decoder = 'rawurldecode'; + } elseif ($urlEncoding === PHP_QUERY_RFC1738) { + $decoder = 'urldecode'; + } else { + $decoder = function ($str) { return $str; }; + } + + foreach (explode('&', $str) as $kvp) { + $parts = explode('=', $kvp, 2); + $key = $decoder($parts[0]); + $value = isset($parts[1]) ? $decoder($parts[1]) : null; + if (!isset($result[$key])) { + $result[$key] = $value; + } else { + if (!is_array($result[$key])) { + $result[$key] = [$result[$key]]; + } + $result[$key][] = $value; + } + } + + return $result; +} + +/** + * Build a query string from an array of key value pairs. + * + * This function can use the return value of parse_query() to build a query + * string. This function does not modify the provided keys when an array is + * encountered (like http_build_query would). + * + * @param array $params Query string parameters. + * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 + * to encode using RFC3986, or PHP_QUERY_RFC1738 + * to encode using RFC1738. + * @return string + */ +function build_query(array $params, $encoding = PHP_QUERY_RFC3986) +{ + if (!$params) { + return ''; + } + + if ($encoding === false) { + $encoder = function ($str) { return $str; }; + } elseif ($encoding === PHP_QUERY_RFC3986) { + $encoder = 'rawurlencode'; + } elseif ($encoding === PHP_QUERY_RFC1738) { + $encoder = 'urlencode'; + } else { + throw new \InvalidArgumentException('Invalid type'); + } + + $qs = ''; + foreach ($params as $k => $v) { + $k = $encoder($k); + if (!is_array($v)) { + $qs .= $k; + if ($v !== null) { + $qs .= '=' . $encoder($v); + } + $qs .= '&'; + } else { + foreach ($v as $vv) { + $qs .= $k; + if ($vv !== null) { + $qs .= '=' . $encoder($vv); + } + $qs .= '&'; + } + } + } + + return $qs ? (string) substr($qs, 0, -1) : ''; +} + +/** + * Determines the mimetype of a file by looking at its extension. + * + * @param $filename + * + * @return null|string + */ +function mimetype_from_filename($filename) +{ + return mimetype_from_extension(pathinfo($filename, PATHINFO_EXTENSION)); +} + +/** + * Maps a file extensions to a mimetype. + * + * @param $extension string The file extension. + * + * @return string|null + * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types + */ +function mimetype_from_extension($extension) +{ + static $mimetypes = [ + '3gp' => 'video/3gpp', + '7z' => 'application/x-7z-compressed', + 'aac' => 'audio/x-aac', + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'asc' => 'text/plain', + 'asf' => 'video/x-ms-asf', + 'atom' => 'application/atom+xml', + 'avi' => 'video/x-msvideo', + 'bmp' => 'image/bmp', + 'bz2' => 'application/x-bzip2', + 'cer' => 'application/pkix-cert', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'css' => 'text/css', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'deb' => 'application/x-debian-package', + 'doc' => 'application/msword', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dvi' => 'application/x-dvi', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'etx' => 'text/x-setext', + 'flac' => 'audio/flac', + 'flv' => 'video/x-flv', + 'gif' => 'image/gif', + 'gz' => 'application/gzip', + 'htm' => 'text/html', + 'html' => 'text/html', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ini' => 'text/plain', + 'iso' => 'application/x-iso9660-image', + 'jar' => 'application/java-archive', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'js' => 'text/javascript', + 'json' => 'application/json', + 'latex' => 'application/x-latex', + 'log' => 'text/plain', + 'm4a' => 'audio/mp4', + 'm4v' => 'video/mp4', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mov' => 'video/quicktime', + 'mkv' => 'video/x-matroska', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4v' => 'video/mp4', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'oga' => 'audio/ogg', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'pbm' => 'image/x-portable-bitmap', + 'pdf' => 'application/pdf', + 'pgm' => 'image/x-portable-graymap', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'ppm' => 'image/x-portable-pixmap', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'ps' => 'application/postscript', + 'qt' => 'video/quicktime', + 'rar' => 'application/x-rar-compressed', + 'ras' => 'image/x-cmu-raster', + 'rss' => 'application/rss+xml', + 'rtf' => 'application/rtf', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'svg' => 'image/svg+xml', + 'swf' => 'application/x-shockwave-flash', + 'tar' => 'application/x-tar', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'torrent' => 'application/x-bittorrent', + 'ttf' => 'application/x-font-ttf', + 'txt' => 'text/plain', + 'wav' => 'audio/x-wav', + 'webm' => 'video/webm', + 'webp' => 'image/webp', + 'wma' => 'audio/x-ms-wma', + 'wmv' => 'video/x-ms-wmv', + 'woff' => 'application/x-font-woff', + 'wsdl' => 'application/wsdl+xml', + 'xbm' => 'image/x-xbitmap', + 'xls' => 'application/vnd.ms-excel', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xml' => 'application/xml', + 'xpm' => 'image/x-xpixmap', + 'xwd' => 'image/x-xwindowdump', + 'yaml' => 'text/yaml', + 'yml' => 'text/yaml', + 'zip' => 'application/zip', + ]; + + $extension = strtolower($extension); + + return isset($mimetypes[$extension]) + ? $mimetypes[$extension] + : null; +} + +/** + * Parses an HTTP message into an associative array. + * + * The array contains the "start-line" key containing the start line of + * the message, "headers" key containing an associative array of header + * array values, and a "body" key containing the body of the message. + * + * @param string $message HTTP request or response to parse. + * + * @return array + * @internal + */ +function _parse_message($message) +{ + if (!$message) { + throw new \InvalidArgumentException('Invalid message'); + } + + $message = ltrim($message, "\r\n"); + + $messageParts = preg_split("/\r?\n\r?\n/", $message, 2); + + if ($messageParts === false || count($messageParts) !== 2) { + throw new \InvalidArgumentException('Invalid message: Missing header delimiter'); + } + + list($rawHeaders, $body) = $messageParts; + $rawHeaders .= "\r\n"; // Put back the delimiter we split previously + $headerParts = preg_split("/\r?\n/", $rawHeaders, 2); + + if ($headerParts === false || count($headerParts) !== 2) { + throw new \InvalidArgumentException('Invalid message: Missing status line'); + } + + list($startLine, $rawHeaders) = $headerParts; + + if (preg_match("/(?:^HTTP\/|^[A-Z]+ \S+ HTTP\/)(\d+(?:\.\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') { + // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0 + $rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders); + } + + /** @var array[] $headerLines */ + $count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER); + + // If these aren't the same, then one line didn't match and there's an invalid header. + if ($count !== substr_count($rawHeaders, "\n")) { + // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4 + if (preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) { + throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding'); + } + + throw new \InvalidArgumentException('Invalid header syntax'); + } + + $headers = []; + + foreach ($headerLines as $headerLine) { + $headers[$headerLine[1]][] = $headerLine[2]; + } + + return [ + 'start-line' => $startLine, + 'headers' => $headers, + 'body' => $body, + ]; +} + +/** + * Constructs a URI for an HTTP request message. + * + * @param string $path Path from the start-line + * @param array $headers Array of headers (each value an array). + * + * @return string + * @internal + */ +function _parse_request_uri($path, array $headers) +{ + $hostKey = array_filter(array_keys($headers), function ($k) { + return strtolower($k) === 'host'; + }); + + // If no host is found, then a full URI cannot be constructed. + if (!$hostKey) { + return $path; + } + + $host = $headers[reset($hostKey)][0]; + $scheme = substr($host, -4) === ':443' ? 'https' : 'http'; + + return $scheme . '://' . $host . '/' . ltrim($path, '/'); +} + +/** + * Get a short summary of the message body + * + * Will return `null` if the response is not printable. + * + * @param MessageInterface $message The message to get the body summary + * @param int $truncateAt The maximum allowed size of the summary + * + * @return null|string + */ +function get_message_body_summary(MessageInterface $message, $truncateAt = 120) +{ + $body = $message->getBody(); + + if (!$body->isSeekable() || !$body->isReadable()) { + return null; + } + + $size = $body->getSize(); + + if ($size === 0) { + return null; + } + + $summary = $body->read($truncateAt); + $body->rewind(); + + if ($size > $truncateAt) { + $summary .= ' (truncated...)'; + } + + // Matches any printable character, including unicode characters: + // letters, marks, numbers, punctuation, spacing, and separators. + if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) { + return null; + } + + return $summary; +} + +/** @internal */ +function _caseless_remove($keys, array $data) +{ + $result = []; + + foreach ($keys as &$key) { + $key = strtolower($key); + } + + foreach ($data as $k => $v) { + if (!in_array(strtolower($k), $keys)) { + $result[$k] = $v; + } + } + + return $result; +} diff --git a/instafeed/vendor/guzzlehttp/psr7/src/functions_include.php b/instafeed/vendor/guzzlehttp/psr7/src/functions_include.php new file mode 100755 index 0000000..96a4a83 --- /dev/null +++ b/instafeed/vendor/guzzlehttp/psr7/src/functions_include.php @@ -0,0 +1,6 @@ +setFinder( + PhpCsFixer\Finder::create() + ->in(__DIR__) + ->name('/(?:^lazydoctor$|\.php$)/') + ) + ->setIndent(' ') + ->setLineEnding("\n") + ->setRules([ + '@Symfony' => true, + // Override @Symfony rules + 'pre_increment' => false, + 'blank_line_before_statement' => ['statements' => ['return', 'try', 'throw']], + 'phpdoc_align' => ['tags' => ['param', 'throws']], + 'method_argument_space' => ['ensure_fully_multiline' => false], + 'binary_operator_spaces' => [ + 'align_double_arrow' => true, + 'align_equals' => false, + ], + 'phpdoc_annotation_without_dot' => false, + 'yoda_style' => [ + // Symfony writes their conditions backwards; we use normal order. + 'equal' => false, + 'identical' => false, + 'less_and_greater' => false, + ], + 'is_null' => [ + // Replaces all is_null() with === null. + 'use_yoda_style' => false, + ], + // Custom rules + 'align_multiline_comment' => true, + 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], + 'ordered_imports' => true, + 'phpdoc_order' => true, + 'array_syntax' => ['syntax' => 'short'], + ]); diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/.pre-commit.hook b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/.pre-commit.hook new file mode 100755 index 0000000..4a87bd2 --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/.pre-commit.hook @@ -0,0 +1,67 @@ +#!/bin/sh +# +# Copyright 2017 The LazyJsonMapper Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ---------------------------------------------------------------------------- +# +# Verifies that all files in the worktree follow our codestyle standards. +# +# Note that this script can't check that they're actually committing the nicely +# formatted code. It just checks that the worktree is clean. So if they've fixed +# all files but haven't added the codestyle fixes to their commit, they'll still +# pass this check. But it's still a great protection against most mistakes. +# +# To install this hook, just run the following in the project's root folder: +# ln -fs "../../.pre-commit.hook" .git/hooks/pre-commit +# + +# Redirect output to stderr. +exec 1>&2 + +# Git ensures that CWD is always the root of the project folder, so we can just +# run all tests without verifying what folder we are in... + +failed="no" +echo "[pre-commit] Checking work-tree codestyle..." + +# Check the general codestyle format. +echo "> Verifying php-cs-fixer..." +vendor/bin/php-cs-fixer fix --config=.php_cs.dist --allow-risky yes --dry-run +if [ $? -ne 0 ]; then + failed="yes" +fi + +# Look for specific problems with the style, related to our project. +echo "> Verifying checkStyle..." +/usr/bin/env php devtools/checkStyle.php x +if [ $? -ne 0 ]; then + failed="yes" +fi + +# Refuse to commit if there were problems. Instruct the user about solving it. +if [ "${failed}" = "yes" ]; then + # Yes there are lots of "echo" commands, because "\n" is not cross-platform. + echo "[commit failed] There are problems with your code..." + echo "" + echo "Run 'composer codestyle' to fix the code in your worktree." + echo "" + echo "But beware that the process is automatic, and that the result" + echo "isn't always perfect and won't be automatically staged." + echo "" + echo "So remember to manually read through the changes, then further" + echo "fix them if necessary, and finally stage the updated code" + echo "afterwards so that the fixed code gets committed." + exit 1 +fi diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/LICENSE b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/LICENSE new file mode 100755 index 0000000..8dada3e --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/NOTICE b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/NOTICE new file mode 100755 index 0000000..27c6183 --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/NOTICE @@ -0,0 +1,5 @@ +LazyJsonMapper +Copyright 2017 The LazyJsonMapper Project + +This product includes software developed at +The LazyJsonMapper Project (https://github.com/SteveJobzniak/LazyJsonMapper). \ No newline at end of file diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/README.md b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/README.md new file mode 100755 index 0000000..7d3a997 --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/README.md @@ -0,0 +1,211 @@ +# LazyJsonMapper + +## Advanced, intelligent & automatic object-oriented JSON containers for PHP. + +Implements a highly efficient, automatic, object-oriented and lightweight +(memory-wise) JSON data container. It provides intelligent data conversion +and parsing, to give you a nice, reliable interface to your JSON data, +without having to worry about doing any of the tedious parsing yourself. + +### Features: + +- Provides a completely object-oriented interface to all of your JSON data. + +- Automatically maps complex, nested JSON data structures onto real PHP + objects, with total support for nested objects and multi-level arrays. + +- Extremely optimized for very high performance and very low memory usage. + Much lower than other PHP JSON mappers that people have used in the past. + + For example, normal PHP objects with manually defined `$properties`, which + is what's used by _other_ JSON mappers, will consume memory for every + property even if that property wasn't in the JSON data (is a `NULL`). Our + system on the other hand takes up ZERO bytes of RAM for any properties + that don't exist in the current object's JSON data! + +- Automatically provides "direct virtual properties", which lets you + interact with the JSON data as if it were regular object properties, + such as `echo $item->some_value` and `$item->some_value = 'foo'`. + + The virtual properties can be disabled via an option. + +- Automatically provides object-oriented "virtual functions", which let you + interact with the data in a fully object-oriented way via functions such + as `$item->getSomeValue()` and `$item->setSomeValue('foo')`. We support a + large range of different functions for manipulating the JSON data, and you + can see a list of all available function names for all of your properties + by simply running `$item->printPropertyDescriptions()`. + + The virtual functions can be disabled via an option. + +- Includes the `LazyDoctor` tool, which _automatically_ documents all of + your `LazyJsonMapper`-based classes so that their virtual properties and + functions become _fully_ visible to your IDE and to various intelligent + code analysis tools. It also performs class diagnostics by compiling all + of your class property maps, which means that you can be 100% sure that + all of your maps are valid (compilable) if this tool runs successfully. + +- We provide a complete, internal API which your subclasses can use to + interact with the data inside of the JSON container. This allows you to + easily override the automatic functions or create additional functions + for your objects. To override core functions, just define a function with + the exact same name on your object and make it do whatever you want to. + + Here are some examples of function overriding: + + ```php + public function getFoo() + { + // try to read property, and handle a special "current_time" value. + $value = $this->_getProperty('foo'); + if ($value === 'current_time') { return time(); } + return $value; + } + public function setFoo( + $value) + { + // if they try to set value to "md5", we use a special value instead + if ($value === 'md5') { $value = md5(time()); } + return $this->_setProperty('foo', $value); + } + ``` + +- All mapping/data conversion is done "lazily", on a per-property basis. + When you access a property, that specific property is mapped/converted to + the proper type as defined by your class property map. No time or memory + is wasted converting properties that you never touch. + +- Strong type-system. The class property map controls the exact types and + array depths. You can fully trust that the data you get/set will match + your specifications. Invalid data that mismatches the spec is impossible. + +- Advanced settings system. Everything is easily configured via PHP class + constants, which means that your class-settings are stateless (there's no + need for any special "settings/mapper object" to keep track of settings), + and that all settings are immutable constants (which means that they are + reliable and can never mutate at runtime, so that you can fully trust that + classes will always behave as-defined in their code). + + If you want to override multiple core settings identically for all of your + classes, then simply create a subclass of `LazyJsonMapper` and configure + all of your settings on that, and then derive all of your other classes + from your re-configured subclass! + +- The world's most advanced mapper definition system. Your class property + maps are defined in an easy PHPdoc-style format, and support multilevel + arrays (such as `int[][]` for "an array of arrays of ints"), relative + types (so you can map properties to classes/objects that are relative to + the namespace of the class property map), parent inheritance (all of your + parent `extends`-hierarchy's maps will be included in your final property + map) and even multiple inheritance (you can literally "import" an infinite + number of other maps into your class, which don't come from your own + parent `extends`-hierarchy). + +- Inheriting properties from parent classes or importing properties from + other classes is a zero-cost operation thanks to how efficient our + property map compiler is. So feel free to import everything you need. + You can even use this system to create importable classes that just hold + "collections" of shared properties, which you import into other classes. + +- The class property maps are compiled a single time per-class at runtime, + the first time a class is used. The compilation process fully verifies + and compiles all property definitions, all parent maps, all inherited + maps, and all maps of all classes you link properties to. + + If there are any compilation problems due to a badly written map anywhere + in your hierarchy, you will be shown the exact problem in great detail. + + In case of success, the compiled and verified maps are all stored in an + incredibly memory-efficient format in a global cache which is shared by + your whole PHP runtime, which means that anything in your code or in any + other libraries which accesses the same classes will all share the cached + compilations of those classes, for maximum memory efficiency. + +- You are also able to access JSON properties that haven't been defined in + the class property map. In that case, they are treated as undefined and + untyped (`mixed`) and there won't be any automatic type-conversion of such + properties, but it can still be handy in a pinch. + +- There are lots of data export/output options for your object's JSON data, + to get it back out of the object again: As a multi-level array, as nested + stdClass objects, or as a JSON string representation of your object. + +- We include a whole assortment of incredibly advanced debugging features: + + You can run the constructor with `$requireAnalysis` to ensure that all + of your JSON data is successfully mapped according to your class property + map, and that you haven't missed defining any properties that exist in the + data. In case of any problems, the analysis message will give you a full + list of all problems encountered in your entire JSON data hierarchy. + + For your class property maps themselves, you can run functions such as + `printPropertyDescriptions()` to see a complete list of all properties and + how they are defined. This helps debug your class inheritance and imports + to visually see what your final class map looks like, and it also helps + users see all available properties and all of their virtual functions. + + And for the JSON data, you can use functions such as `printJson()` to get + a beautiful view of all internal JSON data, which is incredibly helpful + when you (or your users) need to figure out what's available inside the + current object instance's data storage. + +- A fine-grained and logical exception-system which ensures that you can + always trust the behavior of your objects and can catch problems easily. + And everything we throw is _always_ based on `LazyJsonMapperException`, + which means that you can simply catch that single "root" exception + whenever you don't care about fine-grained differentiation. + +- Clean and modular code ensures stability and future extensibility. + +- Deep code documentation explains everything you could ever wonder about. + +- Lastly, we implement super-efficient object serialization. Everything is + stored in a tightly packed format which minimizes data size when you need + to transfer your objects between runtimes. + +### Installation + +You need at least PHP 5.6 or higher. PHP 7+ is also fully supported and is recommended. + +Run the following [Composer](https://getcomposer.org/download/) installation command: + +``` +composer require lazyjsonmapper/lazyjsonmapper +``` + +### Examples + +View the contents of the [`examples/`](https://github.com/SteveJobzniak/LazyJsonMapper/tree/master/examples) folder. + +### Documentation + +Everything is fully documented directly within the source code of this library. + +You can also [read the same documentation online](https://mgp25.github.io/lazyjsonmapper-docs/namespaces/LazyJsonMapper.html) as nicely formatted HTML pages. + +### LazyDoctor + +Our automatic class-documentation and diagnostic utility will be placed within +your project's `./vendor/bin/` folder. Simply run it without any parameters to +see a list of all available options. You can also open that file in a regular +text editor to read some general usage tips and tricks at the top of the +utility's source code. + +### Copyright + +Copyright 2017 The LazyJsonMapper Project + +### License + +[Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) + +### Author + +SteveJobzniak + +### Contributing + +If you would like to contribute to this project, please feel free to submit a +pull request, or perhaps even sending a donation to a team member as a token of +your appreciation. + diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/bin/lazydoctor b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/bin/lazydoctor new file mode 100755 index 0000000..c142b53 --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/bin/lazydoctor @@ -0,0 +1,738 @@ +#!/usr/bin/env php +/dev/null" to send STDOUT to the void... + * That way you'll ONLY see critical status messages during the processing. + */ + +set_time_limit(0); +date_default_timezone_set('UTC'); + +// Verify minimum PHP version. +if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50600) { + fwrite(STDERR, 'LazyDoctor requires PHP 5.6 or higher.'.PHP_EOL); + exit(1); +} + +// Register a simple GetOptionKit autoloader. This is fine because +// GetOptionKit has no 3rd party library dependencies. +spl_autoload_register(function ($class) { + // Check if this is a "GetOptionKit" load-request. + static $prefix = 'GetOptionKit\\'; + static $len = 13; // strlen($prefix) + if (strncmp($prefix, $class, $len) !== 0) { + return; + } + + // Find the "GetOptionKit" source folder. + static $dirs = [ + __DIR__.'/../../../corneltek/getoptionkit/src', + __DIR__.'/../vendor/corneltek/getoptionkit/src', + ]; + $baseDir = null; + foreach ($dirs as $dir) { + if (is_dir($dir) && ($dir = realpath($dir)) !== false) { + $baseDir = $dir; + break; + } + } + if ($baseDir === null) { + return; + } + + // Get the relative class name. + $relativeClass = substr($class, $len); + + // Generate PSR-4 file path to the class. + $file = sprintf('%s/%s.php', $baseDir, str_replace('\\', '/', $relativeClass)); + if (is_file($file)) { + require $file; + } +}); + +// Parse command line options... +use GetOptionKit\OptionCollection; +use GetOptionKit\OptionParser; +use GetOptionKit\OptionPrinter\ConsoleOptionPrinter; + +$specs = new OptionCollection(); +$specs->add('c|composer:=file', 'Path to your project\'s composer.json file.'); +$specs->add('p|properties?=boolean', 'Document virtual properties (if enabled for the classes).'); +$specs->add('f|functions?=boolean', 'Document virtual functions (if enabled for the classes).'); +$specs->add('o|document-overridden?=boolean', 'Always document virtual functions/properties even when they have been manually overridden by the class (or its parents).'); +$specs->add('w|windows?=boolean', 'Generate Windows-style ("\r\n") documentation line endings instead of the default Unix-style ("\n").'); +$specs->add('validate-only?=boolean', 'Validate current docs for all classes but don\'t write anything to disk.'); +$specs->add('h|help?=boolean', 'Show all available options.'); + +try { + $parser = new OptionParser($specs); + $result = $parser->parse($argv); + $options = [ + 'composer' => isset($result->keys['composer']) ? $result->keys['composer']->value : null, + 'properties' => isset($result->keys['properties']) && $result->keys['properties']->value !== false, + 'functions' => isset($result->keys['functions']) && $result->keys['functions']->value !== false, + 'document-overridden' => isset($result->keys['document-overridden']) && $result->keys['document-overridden']->value !== false, + 'windows' => isset($result->keys['windows']) && $result->keys['windows']->value !== false, + 'validate-only' => isset($result->keys['validate-only']) && $result->keys['validate-only']->value !== false, + 'help' => isset($result->keys['help']) && $result->keys['help']->value !== false, + ]; +} catch (Exception $e) { + // Warns in case of invalid option values. + fwrite(STDERR, $e->getMessage().PHP_EOL); + exit(1); +} + +// Verify options... +echo '[ LazyDoctor ]'.PHP_EOL.PHP_EOL; +if ($options['composer'] === null || $options['help']) { + if ($options['composer'] === null) { + fwrite(STDERR, 'You must provide the --composer option.'.PHP_EOL.PHP_EOL); + } + $printer = new ConsoleOptionPrinter(); + echo 'Available options:'.PHP_EOL.PHP_EOL; + echo $printer->render($specs); + exit($options['composer'] === null && !$options['help'] ? 1 : 0); +} + +if ($options['composer']->getBasename() !== 'composer.json') { + fwrite(STDERR, 'You must point to your project\'s composer.json file.'.PHP_EOL.'You used: "'.$options['composer']->getRealPath().'".'.PHP_EOL); + exit(1); +} + +// Decode the composer.json file... +$json = @json_decode(file_get_contents($options['composer']->getRealPath()), true); +if ($json === null) { + fwrite(STDERR, 'Unable to decode composer.json.'.PHP_EOL); + exit(1); +} + +// Determine the project folder's real root path... +$projectRoot = $options['composer']->getPathInfo()->getRealPath(); + +// Determine their namespace PSR-4 paths via their project's composer.json... +$namespaces = []; +foreach (['autoload', 'autoload-dev'] as $type) { + if (!isset($json[$type]['psr-4']) || !is_array($json[$type]['psr-4'])) { + continue; + } + + foreach ($json[$type]['psr-4'] as $namespace => $dir) { + // We don't support composer's empty "fallback" namespaces. + if ($namespace === '') { + fwrite(STDERR, 'Encountered illegal unnamed PSR-4 autoload namespace in composer.json.'.PHP_EOL); + exit(1); + } + + // Ensure that the namespace ends in backslash. + if (substr_compare($namespace, '\\', strlen($namespace) - 1, 1) !== 0) { + fwrite(STDERR, 'Encountered illegal namespace "'.$namespace.'" (does not end in backslash) in composer.json.'.PHP_EOL); + exit(1); + } + + // Ensure that the value is a string. + // NOTE: We allow empty strings, which corresponds to root folder. + if (!is_string($dir)) { + fwrite(STDERR, 'Encountered illegal non-string value for namespace "'.$namespace.'".'.PHP_EOL); + exit(1); + } + + // Now resolve the path name... + $path = sprintf('%s/%s', $projectRoot, $dir); + $realpath = realpath($path); + if ($realpath === false) { + fwrite(STDERR, 'Unable to resolve real path for "'.$path.'".'.PHP_EOL); + exit(1); + } + + // We don't allow the same directory to be defined multiple times. + if (isset($namespaces[$realpath])) { + fwrite(STDERR, 'Encountered duplicate namespace directory "'.$realpath.'" in composer.json.'.PHP_EOL); + exit(1); + } + + // And we're done! The namespace and its path have been resolved. + $namespaces[$realpath] = $namespace; + } +} + +// Verify that we found some namespaces... +if (empty($namespaces)) { + fwrite(STDERR, 'There are no PSR-4 autoload namespaces in your composer.json.'.PHP_EOL); + exit(1); +} + +// Now load the project's autoload.php file. +// NOTE: This is necessary so that we can autoload their classes... +$autoload = sprintf('%s/vendor/autoload.php', $projectRoot); +$realautoload = realpath($autoload); +if ($realautoload === false) { + fwrite(STDERR, 'Unable to find the project\'s Composer autoloader ("'.$autoload.'").'.PHP_EOL); + exit(1); +} +require $realautoload; + +// Verify that their project's autoloader contains LazyJsonMapper... +if (!class_exists('\LazyJsonMapper\LazyJsonMapper', true)) { // TRUE = Autoload. + fwrite(STDERR, 'Target project doesn\'t contain the LazyJsonMapper library.'.PHP_EOL); + exit(1); +} + +// Alright, display the current options... +echo 'Project: "'.$projectRoot.'".'.PHP_EOL + .'- Documentation Line Endings: '.($options['windows'] ? 'Windows ("\r\n")' : 'Unix ("\n")').'.'.PHP_EOL + .'- ['.($options['properties'] ? 'X' : ' ').'] Document Virtual Properties ("@property").'.PHP_EOL + .'- ['.($options['functions'] ? 'X' : ' ').'] Document Virtual Functions ("@method").'.PHP_EOL + .'- ['.($options['document-overridden'] ? 'X' : ' ').'] Document Overridden Properties/Functions.'.PHP_EOL; +if ($options['validate-only']) { + echo '- This is a validation run. Nothing will be written to disk.'.PHP_EOL; +} + +// We can now use our custom classes, since the autoloader has been imported... +use LazyJsonMapper\Exception\LazyJsonMapperException; +use LazyJsonMapper\Export\PropertyDescription; +use LazyJsonMapper\Property\PropertyMapCache; +use LazyJsonMapper\Property\PropertyMapCompiler; +use LazyJsonMapper\Utilities; + +/** + * Automatic LazyJsonMapper-class documentation generator. + * + * @copyright 2017 The LazyJsonMapper Project + * @license http://www.apache.org/licenses/LICENSE-2.0 + * @author SteveJobzniak (https://github.com/SteveJobzniak) + */ +class LazyClassDocumentor +{ + /** @var PropertyMapCache */ + private static $_propertyMapCache; + + /** @var array */ + private $_compiledPropertyMapLink; + + /** @var ReflectionClass */ + private $_reflector; + + /** @var array */ + private $_options; + + /** @var string Newline sequence. */ + private $_nl; + + /** + * Constructor. + * + * @param string $class + * @param array $options + * + * @throws ReflectionException + */ + public function __construct( + $class, + array $options) + { + if (self::$_propertyMapCache === null) { + self::$_propertyMapCache = new PropertyMapCache(); + } + $this->_reflector = new ReflectionClass($class); + $this->_options = $options; + $this->_nl = $options['windows'] ? "\r\n" : "\n"; + } + + /** + * Process the current class. + * + * @throws ReflectionException + * @throws LazyJsonMapperException + * + * @return bool `TRUE` if on-disk file has correct docs, otherwise `FALSE`. + */ + public function process() + { + // Only process user-defined classes (never any built-in PHP classes). + if (!$this->_reflector->isUserDefined()) { + return true; + } + + // There's nothing to do if this isn't a LazyJsonMapper subclass. + // NOTE: This properly skips "\LazyJsonMapper\LazyJsonMapper" itself. + if (!$this->_reflector->isSubclassOf('\LazyJsonMapper\LazyJsonMapper')) { + return true; + } + + // Compile this class property map if not yet built and cached. + $thisClassName = $this->_reflector->getName(); + if (!isset(self::$_propertyMapCache->classMaps[$thisClassName])) { + try { + PropertyMapCompiler::compileClassPropertyMap( // Throws. + self::$_propertyMapCache, + $thisClassName + ); + } catch (Exception $e) { + fwrite(STDERR, '> Unable to compile the class property map for "'.$thisClassName.'". Reason: '.$e->getMessage().PHP_EOL); + + return false; + } + } + + // Now link to the property map cache for our current class. + $this->_compiledPropertyMapLink = &self::$_propertyMapCache->classMaps[$thisClassName]; + + // Get the current class comment (string if ok, FALSE if none exists). + $currentDocComment = $this->_reflector->getDocComment(); + if (is_string($currentDocComment)) { + $currentDocComment = trim($currentDocComment); + } + + // Extract all relevant lines from the current comment. + $finalDocLines = $this->_extractRelevantLines($currentDocComment); + + // Generate the automatic summary line (classname followed by period). + $autoSummaryLine = $this->_reflector->getShortName().'.'; + + // If the 1st line is a classname followed by a period, update the name. + // NOTE: This ensures that we update all outdated auto-added classnames, + // and the risk of false positives is very low since we only document + // `LazyJsonMapper`-based classes with a `OneWord.`-style summary line. + // NOTE: Regex is from http://php.net/manual/en/language.oop5.basic.php, + // and yes we must run it in NON-UNICODE MODE, so that it parses on a + // byte by byte basis exactly like the real PHP classname interpreter. + if ( + isset($finalDocLines[0]) // The 1st line MUST exist to proceed. + && preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\.$/', $finalDocLines[0]) + ) { + $finalDocLines[0] = $autoSummaryLine; + } + + // Generate the magic documentation lines for the current class. + $magicDocLines = $this->_generateMagicDocs(); + if (!empty($magicDocLines)) { + // If there are no lines already... add the automatic summary line. + if (empty($finalDocLines)) { + $finalDocLines[] = $autoSummaryLine; + } + + // Check the 1st char of the 1st line. If it's an @tag of any kind, + // insert automatic summary line at top and empty line after that. + elseif ($finalDocLines[0][0] === '@') { + array_unshift( + $finalDocLines, + $autoSummaryLine, + '' + ); + } + + $finalDocLines[] = ''; // Add empty line before our magic docs. + $finalDocLines = array_merge($finalDocLines, array_values($magicDocLines)); + } + unset($magicDocLines); + + // Generate the final doc-comment that this class is supposed to have. + if (!empty($finalDocLines)) { + // This will generate even if the class only contained an existing + // summary/tags and nothing was added by our magic handler. + foreach ($finalDocLines as &$line) { + $line = ($line === '' ? ' *' : " * {$line}"); + } + unset($line); + $finalDocComment = sprintf( + '/**%s%s%s */', + $this->_nl, + implode($this->_nl, $finalDocLines), + $this->_nl + ); + } else { + // The FALSE signifies that we want no class doc-block at all... + $finalDocComment = false; + } + unset($finalDocLines); + + // There's nothing to do if the doc-comment is already correct. + // NOTE: Both values are FALSE if no doc-comment exists and none wanted. + if ($currentDocComment === $finalDocComment) { + return true; + } + + // The docs mismatch. If this is a validate-run, just return false now. + if ($this->_options['validate-only']) { + fwrite(STDERR, '> Outdated class docs encountered in "'.$thisClassName.'". Aborting scan...'.PHP_EOL); + + return false; + } + + // Load the contents of the file... + $classFileName = $this->_reflector->getFileName(); + $fileLines = @file($classFileName); + if ($fileLines === false) { + fwrite(STDERR, '> Unable to read class file from disk: "'.$classFileName.'".'.PHP_EOL); + + return false; + } + + // Split the file into lines BEFORE the class and lines AFTER the class. + $classLine = $this->_reflector->getStartLine(); + $startLines = array_slice($fileLines, 0, $classLine - 1); + $endLines = array_slice($fileLines, $classLine - 1); + unset($fileLines); + + // Insert the new class documentation using a very careful algorithm. + if ($currentDocComment !== false) { + // Since the class already had PHPdoc, remove it and insert new doc. + // NOTE: A valid PHPdoc (getDocComment()) always starts with + // "/**[whitespace]". If it's just a "/*" or something like + // "/**Foo", then it's not detected by getDocComment(). However, the + // comment may be several lines above the class. So we'll have to do + // an intelligent search to find the old class-comment. As for the + // ending tag "*/", PHP doesn't care about whitespace around that. + // And it also doesn't let the user escape the "*/", which means + // that if we see that sequence we KNOW it's the end of a comment! + // NOTE: We'll search for the latest "/**[whitespace]" block and + // remove all lines from that until its closest "*/". + $deleteFrom = null; + $deleteTo = null; + for ($i = count($startLines) - 1; $i >= 0; --$i) { + if (strpos($startLines[$i], '*/') !== false) { + $deleteTo = $i; + } + if (preg_match('/^\s*\/\*\*\s/u', $startLines[$i])) { + $deleteFrom = $i; + break; + } + } + + // Ensure that we have found valid comment-offsets. + if ($deleteFrom === null || $deleteTo === null || $deleteTo < $deleteFrom) { + fwrite(STDERR, '> Unable to parse current class comment on disk: "'.$classFileName.'".'.PHP_EOL); + + return false; + } + + // Now update the startLines array to replace the doc-comment... + foreach ($startLines as $k => $v) { + if ($k === $deleteFrom && $finalDocComment !== false) { + // We've found the first line of the old comment, and we + // have a new comment. So replace that array entry. + $startLines[$k] = $finalDocComment.$this->_nl; + } elseif ($k >= $deleteFrom && $k <= $deleteTo) { + // Delete all other comment lines, including the first line + // if we had no new doc-comment. + unset($startLines[$k]); + } + + // Break if we've reached the final line to delete. + if ($k >= $deleteTo) { + break; + } + } + } elseif ($finalDocComment !== false) { + // There's no existing doc-comment. Just add ours above the class. + // NOTE: This only does something if we had a new comment to insert, + // which we SHOULD have since we came this far in this scenario... + $startLines[] = $finalDocComment.$this->_nl; + } + + // Generate the new file contents. + $newFileContent = implode($startLines).implode($endLines); + unset($startLines); + unset($endLines); + + // Perform an atomic file-write to disk, which ensures that we will + // never be able to corrupt the class-files on disk via partial writes. + $written = Utilities::atomicWrite($classFileName, $newFileContent); + if ($written !== false) { + echo '> Wrote updated class documentation to disk: "'.$classFileName.'".'.PHP_EOL; + + return true; + } else { + fwrite(STDERR, '> Unable to write new class documentation to disk: "'.$classFileName.'".'.PHP_EOL); + + return false; + } + } + + /** + * Extracts all relevant lines from a doc-comment. + * + * @param string $currentDocComment + * + * @return array + */ + private function _extractRelevantLines( + $currentDocComment) + { + if (!is_string($currentDocComment)) { + return []; + } + + // Remove the leading and trailing doc-comment tags (/** and */). + $currentDocComment = preg_replace('/(^\s*\/\*\*\s*|\s*\*\/$)/u', '', $currentDocComment); + + // Process all lines. Skip all @method and @property lines. + $relevantLines = []; + $lines = preg_split('/\r?\n|\r/u', $currentDocComment); + foreach ($lines as $line) { + // Remove leading and trailing whitespace, and leading asterisks. + $line = trim(preg_replace('/^\s*\*+/u', '', $line)); + + // Skip this line if it's a @method or @property line. + // NOTE: Removing them is totally safe, because the LazyJsonMapper + // class has marked all of its magic property/function handlers as + // final, which means that people's subclasses CANNOT override them + // to add their own magic methods/properties. So therefore we KNOW + // that ALL existing @method/@property class doc lines belong to us! + if (preg_match('/^@(?:method|property)/u', $line)) { + continue; + } + + $relevantLines[] = $line; + } + + // Remove trailing empty lines from the relevant lines. + for ($i = count($relevantLines) - 1; $i >= 0; --$i) { + if ($relevantLines[$i] === '') { + unset($relevantLines[$i]); + } else { + break; + } + } + + // Remove leading empty lines from the relevant lines. + foreach ($relevantLines as $k => $v) { + if ($v !== '') { + break; + } + + unset($relevantLines[$k]); + } + + // Return a re-indexed (properly 0-indexed) array. + return array_values($relevantLines); + } + + /** + * Generate PHPdoc lines for all magic properties and functions. + * + * @throws ReflectionException + * @throws LazyJsonMapperException + * + * @return array + */ + private function _generateMagicDocs() + { + // Check whether we should (and can) document properties and functions. + $documentProperties = $this->_options['properties'] && $this->_reflector->getConstant('ALLOW_VIRTUAL_PROPERTIES'); + $documentFunctions = $this->_options['functions'] && $this->_reflector->getConstant('ALLOW_VIRTUAL_FUNCTIONS'); + if (!$documentProperties && !$documentFunctions) { + return []; + } + + // Export all JSON properties, with RELATIVE class-paths when possible. + // NOTE: We will document ALL properties. Even ones inherited from + // parents/imported maps. This ensures that users who are manually + // reading the source code can see EVERYTHING without needing an IDE. + $properties = []; + $ownerClassName = $this->_reflector->getName(); + foreach ($this->_compiledPropertyMapLink as $propName => $propDef) { + $properties[$propName] = new PropertyDescription( // Throws. + $ownerClassName, + $propName, + $propDef, + true // Use relative class-paths when possible. + ); + } + + // Build the magic documentation... + $magicDocLines = []; + foreach (['functions', 'properties'] as $docType) { + if (($docType === 'functions' && !$documentFunctions) + || ($docType === 'properties' && !$documentProperties)) { + continue; + } + + // Generate all lines for the current magic tag type... + $lineStorage = []; + foreach ($properties as $property) { + if ($docType === 'functions') { + // We will only document useful functions (not the "has", + // since those are useless for properties that are fully + // defined in the class map). + foreach (['get', 'set', 'is', 'unset'] as $funcType) { + // Generate the function name, ie "getSomething", and + // skip this function if it's already defined as a REAL + // (overridden) function in this class or its parents. + $functionName = $funcType.$property->func_case; + if (!$this->_options['document-overridden'] && $this->_reflector->hasMethod($functionName)) { + continue; + } + + // Alright, the function doesn't exist as a real class + // function, or the user wants to document it anyway... + // Document it via its calculated signature. + // NOTE: Classtypes use paths relative to current class! + $functionSignature = $property->{'function_'.$funcType}; + $lineStorage[$functionName] = sprintf('@method %s', $functionSignature); + } + } elseif ($docType === 'properties') { + // Skip this property if it's already defined as a REAL + // (overridden) property in this class or its parents. + if (!$this->_options['document-overridden'] && $this->_reflector->hasProperty($property->name)) { + continue; + } + + // Alright, the property doesn't exist as a real class + // property, or the user wants to document it anyway... + // Document it via its calculated signature. + // NOTE: Classtypes use paths relative to current class! + $lineStorage[$property->name] = sprintf( + '@property %s $%s', + $property->type, + $property->name + ); + } + } + + // Skip this tag type if there was nothing to document... + if (empty($lineStorage)) { + continue; + } + + // Insert empty line separators between different magic tag types. + if (!empty($magicDocLines)) { + $magicDocLines[] = ''; + } + + // Reorder lines by name and add them to the magic doc lines. + // NOTE: We use case sensitivity so that "getComments" and + // "getCommentThreads" etc aren't placed next to each other. + ksort($lineStorage, SORT_NATURAL); // Case-sensitive natural order. + $magicDocLines = array_merge($magicDocLines, array_values($lineStorage)); + } + + return $magicDocLines; + } +} + +// Now process all PHP files under all of the project's namespace folders. +foreach ($namespaces as $realpath => $namespace) { + echo PHP_EOL.'Processing namespace "'.$namespace.'".'.PHP_EOL.'- Path: "'.$realpath.'".'.PHP_EOL; + $realpathlen = strlen($realpath); + + $iterator = new RegexIterator( + new RecursiveIteratorIterator(new RecursiveDirectoryIterator($realpath)), + '/\.php$/i', RecursiveRegexIterator::GET_MATCH + ); + foreach ($iterator as $file => $ext) { + // Determine the real path to the file (compatible with $realpath). + $realfile = realpath($file); + if ($realfile === false) { + fwrite(STDERR, 'Unable to determine real path to file "'.$file.'".'.PHP_EOL); + exit(1); + } + + // Now ensure that the file starts with the expected path... + if (strncmp($realpath, $realfile, $realpathlen) !== 0) { + fwrite(STDERR, 'Unexpected path to file "'.$realfile.'". Does not match project path.'.PHP_EOL); + exit(1); + } + $class = substr($realfile, $realpathlen); + + // Remove the leading slash for the folder... + if ($class[0] !== '/' && $class[0] !== '\\') { + fwrite(STDERR, 'Unexpected path to file "'.$realfile.'". Does not match project path.'.PHP_EOL); + exit(1); + } + $class = substr($class, 1); + + // And now just generate the final class name... + $class = sprintf( + '%s%s', + $namespace, + str_replace('/', '\\', preg_replace('/\.php$/ui', '', $class)) + ); + + // Some files may not contain classes. For example, some people have + // functions.php files with functions, etc. So before we proceed, just + // ensure that the generated class name actually exists. + // NOTE: class_exists() ignores interfaces. Only finds classes. Good. + if (!class_exists($class, true)) { // TRUE = Autoload. + continue; + } + + // Now process the current class. + $documentor = new LazyClassDocumentor($class, $options); + $result = $documentor->process(); + if (!$result) { + if ($options['validate-only']) { + fwrite(STDERR, '> One or more files need updated class documentation or contain other errors.'.PHP_EOL); + } else { + fwrite(STDERR, '> Error while processing class "'.$class.'". Aborting...'.PHP_EOL); + } + exit(1); + } + } +} diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/composer.json b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/composer.json new file mode 100755 index 0000000..3b21d54 --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/composer.json @@ -0,0 +1,48 @@ +{ + "name": "lazyjsonmapper/lazyjsonmapper", + "type": "library", + "description": "Advanced, intelligent & automatic object-oriented JSON containers for PHP.", + "keywords": ["json", "development"], + "homepage": "https://github.com/SteveJobzniak/LazyJsonMapper", + "license": "Apache-2.0", + "authors": [ + { + "name": "SteveJobzniak", + "homepage": "https://github.com/SteveJobzniak", + "role": "Developer" + } + ], + "require": { + "php": ">=5.6", + "corneltek/getoptionkit": "2.*" + }, + "require-dev": { + "phpunit/phpunit": "6.*", + "friendsofphp/php-cs-fixer": "^2.7.1" + }, + "bin": [ + "bin/lazydoctor" + ], + "autoload": { + "psr-4": { + "LazyJsonMapper\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "LazyJsonMapper\\Tests\\": "tests/" + } + }, + "scripts": { + "codestyle": [ + "php-cs-fixer fix --config=.php_cs.dist --allow-risky yes", + "php devtools/checkStyle.php x" + ], + "generatedocs": [ + "rm -rf docs/output/ && phpdoc" + ], + "generatefreshdocs": [ + "rm -rf docs/ && phpdoc" + ] + } +} diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/checkStyle.php b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/checkStyle.php new file mode 100755 index 0000000..5a0fc6c --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/checkStyle.php @@ -0,0 +1,225 @@ +run(); +if (!empty($badFiles)) { + // Exit with non-zero code to signal that there are problems. + exit(1); +} + +/** + * Code style checker. + * + * @copyright 2017 The LazyJsonMapper Project + * @license http://www.apache.org/licenses/LICENSE-2.0 + * @author SteveJobzniak (https://github.com/SteveJobzniak) + */ +class styleChecker +{ + /** + * @var string + */ + private $_baseDir; + + /** + * @var string[] + */ + private $_inspectFolders; + + /** + * @var bool + */ + private $_onlyShowInvalidFiles; + + /** + * Constructor. + * + * @param string $baseDir + * @param string[] $inspectFolders + * @param bool $onlyShowInvalidFiles + */ + public function __construct( + $baseDir, + array $inspectFolders, + $onlyShowInvalidFiles) + { + $this->_baseDir = realpath($baseDir); + if ($this->_baseDir === false) { + throw new InvalidArgumentException(sprintf('"%s" is not a valid path.', $baseDir)); + } + $this->_inspectFolders = $inspectFolders; + $this->_onlyShowInvalidFiles = $onlyShowInvalidFiles; + } + + /** + * Process single file. + * + * @param string $filePath + * + * @return bool TRUE if the file has codestyle problems, otherwise FALSE. + */ + private function _processFile( + $filePath) + { + $hasProblems = false; + $hasVisibilityProblems = false; + $fileName = basename($filePath); + $inputLines = @file($filePath); + $outputLines = []; + + if ($inputLines === false) { + // We were unable to read the input file. Ignore if broken symlink. + if (is_link($filePath)) { + return false; // File is okay, since the symlink is invalid. + } else { + echo "- {$filePath}: UNABLE TO READ FILE!".PHP_EOL; + + return true; // File has problems... + } + } + + foreach ($inputLines as $line) { + // Function arguments on separate lines. + if (preg_match('/^(.*?(?:(?:final|static)\s+)*(?:public|private|protected)(?:\s+(?:final|static))*\s+function\s+.+?)\((.+)\)(.*)$/', $line, $matches)) { + $hasProblems = true; + + $funcstart = $matches[1]; + $params = $matches[2]; + $trail = $matches[3]; + $params = explode(', ', $params); + + $outputLines[] = $funcstart.'('.PHP_EOL; + for ($i = 0, $len = count($params); $i < $len; ++$i) { + $newline = ' '.$params[$i]; + if ($i == ($len - 1)) { + $newline .= ')'.PHP_EOL; + } else { + $newline .= ','.PHP_EOL; + } + $outputLines[] = $newline; + } + // } else { + // $outputLines[] = $line; + } + + // Appropriate public, private and protected member prefixes. + if (preg_match('/^\s*(?:(?:final|static)\s+)*(public|private|protected)(?:\s+(?:final|static))*\s+(function|\$)\s*&?([^;\(\s]+)/', $line, $matches)) { + $visibility = &$matches[1]; // public, private, protected + $type = &$matches[2]; // $, function + $name = &$matches[3]; // Member name + + if ($visibility == 'public') { + if ($name[0] == '_' && ( + $name != '__construct' + && $name != '__destruct' + && $name != '__call' + && $name != '__get' + && $name != '__set' + && $name != '__isset' + && $name != '__unset' + && $name != '__invoke' + && $name != '__toString' + )) { + $hasProblems = true; + $hasVisibilityProblems = true; + echo "- {$filePath}: BAD PUBLIC NAME:".trim($matches[0]).PHP_EOL; + } + } else { // private, protected + if ($name[0] != '_') { + $hasProblems = true; + $hasVisibilityProblems = true; + echo "- {$filePath}: BAD PRIVATE/PROTECTED NAME:".trim($matches[0]).PHP_EOL; + } + } + } + } + + $newFile = implode('', $outputLines); + if (!$hasProblems) { + if (!$this->_onlyShowInvalidFiles) { + echo " {$filePath}: Already formatted correctly.\n"; + } + } elseif (!$hasVisibilityProblems) { + // Has problems, but no visibility problems. Output fixed file. + echo "- {$filePath}: Has function parameter problems:\n"; + echo $newFile; + } else { + echo "- {$filePath}: Had member visibility problems.\n"; + } + + return $hasProblems; + } + + /** + * Process all *.php files in given path. + * + * @return string[] An array with all files that have codestyle problems. + */ + public function run() + { + $filesWithProblems = []; + foreach ($this->_inspectFolders as $inspectFolder) { + $directoryIterator = new RecursiveDirectoryIterator($this->_baseDir.'/'.$inspectFolder); + $recursiveIterator = new RecursiveIteratorIterator($directoryIterator); + $phpIterator = new RegexIterator($recursiveIterator, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH); + + foreach ($phpIterator as $filePath => $dummy) { + $hasProblems = $this->_processFile($filePath); + if ($hasProblems) { + $filesWithProblems[] = $filePath; + } + } + } + + return $filesWithProblems; + } +} diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/funcListData.serialized b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/funcListData.serialized new file mode 100755 index 0000000..589e5be --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/funcListData.serialized @@ -0,0 +1 @@ +a:10000:{i:0;s:3:"Pol";i:1;s:3:"Unp";i:2;s:8:"DeDiveSt";i:3;s:2:"Un";i:4;s:5:"Oyste";i:5;s:5:"Postm";i:6;s:2:"Sa";i:7;s:10:"SorroWaddl";i:8;s:6:"ApoCys";i:9;s:10:"GenRevisTe";i:10;s:11:"FarcGenoGoy";i:11;s:3:"Cro";i:12;s:12:"BasDefoHorse";i:13;s:6:"PsycSu";i:14;s:8:"DemPresa";i:15;s:4:"PeSc";i:16;s:2:"Va";i:17;s:6:"AnsKaz";i:18;s:3:"Ove";i:19;s:10:"HanovRaoul";i:20;s:3:"Twi";i:21;s:13:"NonsTortWhapu";i:22;s:5:"Areco";i:23;s:13:"BacilMaladUna";i:24;s:5:"Unflu";i:25;s:13:"CheyHarmSands";i:26;s:11:"OtheOvUltra";i:27;s:2:"Lo";i:28;s:4:"Shos";i:29;s:5:"Scler";i:30;s:5:"Predi";i:31;s:4:"Unre";i:32;s:4:"Punj";i:33;s:9:"HosanUnig";i:34;s:7:"BetaWis";i:35;s:13:"ShalVerteWasp";i:36;s:7:"InhSuWi";i:37;s:5:"Pluto";i:38;s:2:"Ph";i:39;s:9:"IrPhResur";i:40;s:10:"UnconVisco";i:41;s:12:"DrMessaSizzl";i:42;s:6:"LaPrea";i:43;s:2:"Zo";i:44;s:4:"Suck";i:45;s:5:"Monop";i:46;s:5:"Pinci";i:47;s:8:"PatroPha";i:48;s:9:"HogPicrTh";i:49;s:4:"Picn";i:50;s:8:"DisasGib";i:51;s:5:"Popul";i:52;s:10:"ExordPseSh";i:53;s:4:"Unpo";i:54;s:8:"HabiTaci";i:55;s:11:"SalsSanStep";i:56;s:11:"ProaeRepUnd";i:57;s:8:"InflLaSu";i:58;s:6:"ReTens";i:59;s:7:"CarnaHy";i:60;s:3:"Tur";i:61;s:6:"NympRe";i:62;s:5:"PacUp";i:63;s:12:"SpangWritZul";i:64;s:5:"LonPa";i:65;s:9:"SanxScrew";i:66;s:4:"KePo";i:67;s:3:"Eno";i:68;s:4:"Rich";i:69;s:9:"PlushThUn";i:70;s:4:"Seid";i:71;s:4:"GaPi";i:72;s:8:"SupeUpwh";i:73;s:4:"Sest";i:74;s:9:"ResoScler";i:75;s:5:"QuRep";i:76;s:8:"SquSuspe";i:77;s:12:"ExtRefunUnwi";i:78;s:4:"FlUn";i:79;s:6:"RenSar";i:80;s:8:"PierrRet";i:81;s:7:"HarNona";i:82;s:8:"PhanPian";i:83;s:11:"MiasPoachPs";i:84;s:5:"Refor";i:85;s:5:"PrUnf";i:86;s:11:"HedeProarRe";i:87;s:13:"SpieTurnUnesc";i:88;s:13:"EmboOgallSpin";i:89;s:11:"MelanUnstWi";i:90;s:10:"FroPutatUn";i:91;s:4:"PaVa";i:92;s:8:"TanisYot";i:93;s:12:"ConDaddFulgu";i:94;s:2:"Pl";i:95;s:11:"HaKerauProt";i:96;s:12:"DecoHinWhigg";i:97;s:4:"OvTh";i:98;s:5:"Gunat";i:99;s:3:"Pot";i:100;s:5:"Virgi";i:101;s:10:"CopoDiGast";i:102;s:10:"DefHexitUn";i:103;s:14:"InertLeckeNaut";i:104;s:13:"IodomUnreeYac";i:105;s:3:"Tul";i:106;s:9:"BailaPrZe";i:107;s:12:"LaminRecoSpi";i:108;s:6:"CoPoly";i:109;s:5:"Irida";i:110;s:3:"Syl";i:111;s:4:"SuVe";i:112;s:13:"GravMiswiTher";i:113;s:4:"Shem";i:114;s:6:"SolToo";i:115;s:5:"Unsta";i:116;s:10:"ForeReTicx";i:117;s:5:"Outra";i:118;s:12:"InteRoripSph";i:119;s:8:"FroTapst";i:120;s:13:"DislMultWhore";i:121;s:9:"CirInPili";i:122;s:3:"Woo";i:123;s:12:"MustePreceRa";i:124;s:12:"PeavPolRootl";i:125;s:6:"KnopSc";i:126;s:10:"TaTormiTub";i:127;s:8:"OvPrefSu";i:128;s:9:"MetTymVen";i:129;s:6:"PreTri";i:130;s:9:"NemSatUni";i:131;s:4:"DiTe";i:132;s:7:"ManSuUn";i:133;s:10:"CoaxFurRes";i:134;s:3:"Yua";i:135;s:4:"Pygo";i:136;s:4:"Indi";i:137;s:4:"Spon";i:138;s:10:"CrumePurch";i:139;s:8:"HemTerri";i:140;s:5:"ProRe";i:141;s:10:"DispuRoyal";i:142;s:6:"SympUn";i:143;s:4:"Nons";i:144;s:5:"Trime";i:145;s:3:"Non";i:146;s:8:"ReproUnd";i:147;s:10:"ExaPhlPrec";i:148;s:4:"Prot";i:149;s:8:"CurasDev";i:150;s:9:"EchiPlica";i:151;s:11:"FairOrbiUna";i:152;s:15:"GriffPutorRepro";i:153;s:11:"CalmOtolSpo";i:154;s:8:"FigPurUn";i:155;s:9:"GlIgInhum";i:156;s:2:"Tr";i:157;s:8:"HauMetaz";i:158;s:2:"On";i:159;s:11:"PluSnapWoor";i:160;s:11:"EuShosUnbre";i:161;s:15:"FilteRocheSemim";i:162;s:9:"ReviRoUns";i:163;s:2:"Ov";i:164;s:10:"HydrJesUnd";i:165;s:10:"SipSortTur";i:166;s:5:"LixSe";i:167;s:5:"NuUra";i:168;s:8:"MelWhisp";i:169;s:9:"DiJumpyTr";i:170;s:10:"LaMurUpyok";i:171;s:3:"Pty";i:172;s:4:"Ithy";i:173;s:4:"Bloo";i:174;s:4:"UnUn";i:175;s:5:"EsSwa";i:176;s:9:"NeobOvPar";i:177;s:5:"DemLa";i:178;s:8:"NonvoUnm";i:179;s:9:"MutiRimux";i:180;s:2:"Pr";i:181;s:11:"UninVillaWh";i:182;s:3:"Unl";i:183;s:10:"ProscSownx";i:184;s:11:"HiRescUnint";i:185;s:3:"Cau";i:186;s:13:"HittoHustlSub";i:187;s:8:"JeremSer";i:188;s:10:"DeMetagPet";i:189;s:8:"MisexRig";i:190;s:10:"ChildCogRe";i:191;s:11:"HyPennoRech";i:192;s:3:"Lig";i:193;s:7:"OuUnmem";i:194;s:2:"Re";i:195;s:4:"VoWa";i:196;s:8:"UnicUnju";i:197;s:5:"SecSn";i:198;s:9:"NumSaiUnc";i:199;s:13:"DoubtHeteUnse";i:200;s:4:"Smee";i:201;s:4:"PrTh";i:202;s:7:"MoVindh";i:203;s:8:"GasZodia";i:204;s:2:"Do";i:205;s:12:"UllUnfatWord";i:206;s:7:"IconNov";i:207;s:4:"Juda";i:208;s:9:"GrReptSei";i:209;s:14:"OutpPenelPolan";i:210;s:4:"Poly";i:211;s:2:"No";i:212;s:11:"SchiUnaVera";i:213;s:4:"Ther";i:214;s:9:"EbFlooPes";i:215;s:6:"MoOchi";i:216;s:5:"Triol";i:217;s:2:"Ra";i:218;s:5:"ProTe";i:219;s:10:"EuryoGrade";i:220;s:12:"EntOligPulpy";i:221;s:8:"RepRepSa";i:222;s:7:"NeskPap";i:223;s:3:"Unf";i:224;s:9:"FreMeUntr";i:225;s:7:"PeriUlt";i:226;s:5:"Varyi";i:227;s:8:"CorrPhTo";i:228;s:8:"ProfeSmo";i:229;s:6:"SuUncr";i:230;s:4:"Rurb";i:231;s:3:"Lan";i:232;s:9:"HearSuper";i:233;s:10:"AngulTsuga";i:234;s:10:"PertUnhYer";i:235;s:11:"GrandNitNoc";i:236;s:2:"Le";i:237;s:11:"HypeOverWei";i:238;s:11:"MentSoSumle";i:239;s:6:"LaShip";i:240;s:9:"PrenUnawa";i:241;s:13:"ExceKotaPonti";i:242;s:7:"HaMelod";i:243;s:6:"PaTyUn";i:244;s:2:"Fo";i:245;s:5:"Verse";i:246;s:10:"OverProTuk";i:247;s:9:"SubvTitan";i:248;s:10:"PondeSight";i:249;s:4:"Thar";i:250;s:7:"InRedho";i:251;s:10:"ReSynuThou";i:252;s:5:"Unpaw";i:253;s:2:"We";i:254;s:4:"Peco";i:255;s:8:"PlacaRoz";i:256;s:9:"RecoUnfre";i:257;s:9:"GyHaloHyp";i:258;s:3:"Lit";i:259;s:12:"NapOverUnfor";i:260;s:13:"CrosIntraNumi";i:261;s:11:"CreHandeSup";i:262;s:2:"Sc";i:263;s:10:"MucOzVerte";i:264;s:4:"Prim";i:265;s:9:"HomMonPhi";i:266;s:5:"Unene";i:267;s:2:"Sl";i:268;s:6:"LimRec";i:269;s:5:"Trebl";i:270;s:13:"ForehNetmResp";i:271;s:9:"NonprUnbe";i:272;s:9:"CarbuRaRe";i:273;s:10:"LihyOverSt";i:274;s:10:"CrotaPurpu";i:275;s:4:"Inel";i:276;s:7:"CenMast";i:277;s:9:"SlaxTaTit";i:278;s:11:"SuTrimUncha";i:279;s:2:"Dw";i:280;s:7:"EcaudSy";i:281;s:11:"FormHeteVog";i:282;s:4:"Stra";i:283;s:13:"IncuLushePelv";i:284;s:13:"LuthUnmaWiste";i:285;s:8:"ApnSivve";i:286;s:7:"CouUnme";i:287;s:7:"PsTrepa";i:288;s:4:"Wiss";i:289;s:10:"BorHomelRi";i:290;s:7:"ThUtrVe";i:291;s:2:"Te";i:292;s:8:"SaTeaUnd";i:293;s:6:"CoHuSo";i:294;s:2:"Th";i:295;s:9:"FlObSubco";i:296;s:4:"FlPa";i:297;s:9:"OverSeagh";i:298;s:7:"LympYaw";i:299;s:7:"IrreJac";i:300;s:10:"TholUnhUnw";i:301;s:4:"DeEl";i:302;s:9:"MervePrTi";i:303;s:8:"NatPrefa";i:304;s:7:"HumInco";i:305;s:7:"RiRibby";i:306;s:8:"BalosPer";i:307;s:8:"BepluDet";i:308;s:8:"EulogRed";i:309;s:8:"HydroVar";i:310;s:6:"OvePse";i:311;s:4:"FuPa";i:312;s:2:"Da";i:313;s:6:"MaSeSh";i:314;s:7:"PanisPr";i:315;s:4:"Pudi";i:316;s:2:"Su";i:317;s:7:"HyMeSqu";i:318;s:7:"MacPlPu";i:319;s:5:"PtiWo";i:320;s:2:"Ja";i:321;s:9:"FoShutTar";i:322;s:15:"HypoiRoughTrilo";i:323;s:10:"MePhylProc";i:324;s:13:"ExpIncreSugge";i:325;s:7:"PhyllTh";i:326;s:4:"Knoc";i:327;s:12:"CrTilloUnder";i:328;s:5:"CaPen";i:329;s:8:"ItaRequi";i:330;s:10:"NitReaTrop";i:331;s:4:"Kelp";i:332;s:7:"TelepVa";i:333;s:10:"MultiTriph";i:334;s:4:"Synu";i:335;s:13:"PremRobenUnre";i:336;s:6:"OveUnp";i:337;s:5:"DraSu";i:338;s:8:"FluProar";i:339;s:5:"UnjWi";i:340;s:4:"Tume";i:341;s:5:"ApEat";i:342;s:12:"BerEsopHippo";i:343;s:4:"Weig";i:344;s:7:"GloSupe";i:345;s:5:"Morib";i:346;s:7:"HaOzoRu";i:347;s:5:"EfMys";i:348;s:7:"BuoSpot";i:349;s:5:"Unhop";i:350;s:8:"IntNaiXa";i:351;s:8:"ReSerpVi";i:352;s:7:"RaUnVer";i:353;s:6:"CuEndl";i:354;s:8:"PopiWood";i:355;s:8:"LionPrSa";i:356;s:10:"SuppUneWre";i:357;s:5:"Vaing";i:358;s:4:"Pale";i:359;s:7:"OveSpha";i:360;s:7:"MiRossx";i:361;s:4:"High";i:362;s:9:"PlaWhZama";i:363;s:11:"GalacMicPan";i:364;s:5:"Tonop";i:365;s:4:"Hera";i:366;s:8:"DermPrUn";i:367;s:5:"Branc";i:368;s:10:"StchUpVulg";i:369;s:12:"OverPecSerol";i:370;s:5:"QuaRe";i:371;s:13:"SubiSyllaUltr";i:372;s:3:"Tar";i:373;s:8:"RigwiSqu";i:374;s:4:"Wabb";i:375;s:12:"LotifSaZooto";i:376;s:5:"Strat";i:377;s:7:"DisDiLa";i:378;s:3:"Una";i:379;s:10:"LandfMesSu";i:380;s:7:"PeavRol";i:381;s:13:"GrudgPerTeuto";i:382;s:12:"ChiCrypUnflo";i:383;s:5:"Front";i:384;s:4:"Erud";i:385;s:7:"PenSqua";i:386;s:11:"BeyonCheMal";i:387;s:3:"Sli";i:388;s:4:"Uter";i:389;s:8:"CloaPenc";i:390;s:8:"PoShiUnp";i:391;s:5:"Deami";i:392;s:9:"LeucMelli";i:393;s:6:"PresQu";i:394;s:6:"HepUnr";i:395;s:9:"VioloVisc";i:396;s:10:"SeTolyWate";i:397;s:5:"Lestr";i:398;s:4:"Wood";i:399;s:10:"IntOddmeTr";i:400;s:10:"PerioRotul";i:401;s:4:"Stol";i:402;s:11:"EntomSouSyn";i:403;s:4:"Semi";i:404;s:6:"DurrUn";i:405;s:7:"DiscoOv";i:406;s:9:"PangiProl";i:407;s:9:"NapRecSqu";i:408;s:3:"Unr";i:409;s:13:"GamesTetanUns";i:410;s:8:"FalMetRa";i:411;s:14:"BataDenouSaxon";i:412;s:5:"Solvo";i:413;s:14:"ScytaTighUnjoy";i:414;s:4:"Glut";i:415;s:4:"EkFi";i:416;s:6:"ErNoPa";i:417;s:6:"LaSpal";i:418;s:11:"JoRackRepat";i:419;s:10:"ReSorreUnd";i:420;s:12:"MisenRiTextu";i:421;s:4:"Wayb";i:422;s:6:"CampQu";i:423;s:11:"BrNapolSulp";i:424;s:4:"Snow";i:425;s:2:"Mo";i:426;s:5:"Tehua";i:427;s:13:"PastPressUnwi";i:428;s:5:"Entom";i:429;s:4:"SoTr";i:430;s:4:"Soft";i:431;s:10:"ChElephUnd";i:432;s:3:"Whi";i:433;s:6:"UpkZoo";i:434;s:5:"PaPre";i:435;s:7:"LobxVal";i:436;s:2:"Di";i:437;s:7:"NarNonp";i:438;s:9:"HorUnexVe";i:439;s:5:"Summe";i:440;s:10:"CouLocoPli";i:441;s:11:"ReSnortUnas";i:442;s:7:"HeKnPre";i:443;s:5:"Shavi";i:444;s:2:"Fi";i:445;s:7:"KiOstra";i:446;s:6:"HeliJu";i:447;s:7:"MasdeNo";i:448;s:5:"Tapst";i:449;s:5:"NazVe";i:450;s:4:"Sque";i:451;s:6:"FrIcht";i:452;s:3:"Hyd";i:453;s:8:"InirLevi";i:454;s:7:"ElasIna";i:455;s:3:"Inc";i:456;s:8:"UnfonUns";i:457;s:10:"PeuceProma";i:458;s:10:"ParomPeSom";i:459;s:7:"ImpOuUn";i:460;s:7:"PeiseUn";i:461;s:3:"Tri";i:462;s:6:"IntrWa";i:463;s:13:"CapryRemigStr";i:464;s:5:"FulPr";i:465;s:9:"MuncRhomb";i:466;s:14:"LiteNaphtSarco";i:467;s:7:"TelecTr";i:468;s:8:"EngaMePr";i:469;s:5:"Minco";i:470;s:4:"HaMa";i:471;s:5:"Skitt";i:472;s:12:"MidWharWonde";i:473;s:5:"ArSto";i:474;s:5:"OrbPi";i:475;s:5:"Sulfo";i:476;s:11:"PeVoluWhalp";i:477;s:7:"MusToas";i:478;s:3:"Spi";i:479;s:6:"PhilSu";i:480;s:3:"Foc";i:481;s:11:"MansNardxPo";i:482;s:11:"RongaTheUnc";i:483;s:12:"ParsSemiSynt";i:484;s:5:"SuToc";i:485;s:7:"OsiSnib";i:486;s:3:"Dee";i:487;s:5:"Throa";i:488;s:12:"HydroReZealo";i:489;s:9:"MetapUnha";i:490;s:10:"HeHoastPen";i:491;s:3:"Het";i:492;s:4:"CaCo";i:493;s:7:"LimitPr";i:494;s:2:"Ho";i:495;s:8:"RodlVive";i:496;s:8:"UpsWatWe";i:497;s:6:"PerSin";i:498;s:4:"Righ";i:499;s:11:"OstraReUnde";i:500;s:5:"ScSko";i:501;s:3:"End";i:502;s:6:"NimPle";i:503;s:12:"QuadrUndoVet";i:504;s:6:"EkMeMu";i:505;s:12:"DefLacquTrad";i:506;s:7:"PrUndWa";i:507;s:12:"ProtoStroUnf";i:508;s:6:"ReTheo";i:509;s:3:"Pre";i:510;s:6:"OvUnfo";i:511;s:3:"Loi";i:512;s:5:"Cultu";i:513;s:5:"Fabul";i:514;s:4:"Succ";i:515;s:8:"MegaRegr";i:516;s:3:"Rur";i:517;s:3:"Ter";i:518;s:10:"ResisUnire";i:519;s:10:"HeloOveSem";i:520;s:12:"NatrSavoScaw";i:521;s:9:"MusoNeuri";i:522;s:6:"ChClia";i:523;s:5:"ParPs";i:524;s:11:"LabxMetaUnd";i:525;s:10:"SilkStuVux";i:526;s:12:"BroaScoSpouc";i:527;s:6:"PaUnde";i:528;s:10:"HovePanoRe";i:529;s:9:"InsulTric";i:530;s:9:"ExtForUnm";i:531;s:6:"FlatUn";i:532;s:3:"Var";i:533;s:11:"HypoeRevSup";i:534;s:14:"StasSubitUncry";i:535;s:13:"BattoStewSupe";i:536;s:6:"SneThe";i:537;s:6:"ConnSi";i:538;s:2:"Po";i:539;s:7:"BraQuid";i:540;s:11:"StomaUnVana";i:541;s:4:"TrUn";i:542;s:15:"SicyoStinkUnspe";i:543;s:10:"InManOcean";i:544;s:8:"IndLymPr";i:545;s:7:"OsseoVa";i:546;s:10:"HeteHyUnsu";i:547;s:6:"TricUn";i:548;s:7:"PlSeTal";i:549;s:7:"DyEpsom";i:550;s:3:"Stu";i:551;s:3:"Nem";i:552;s:5:"Spina";i:553;s:13:"EusFowlfOleag";i:554;s:8:"HeRadiSt";i:555;s:7:"NonjPar";i:556;s:8:"ChelaDai";i:557;s:10:"CommePeSem";i:558;s:9:"EhxMisOve";i:559;s:6:"FoUret";i:560;s:2:"Pi";i:561;s:4:"Inte";i:562;s:4:"GoUn";i:563;s:7:"PhilaSe";i:564;s:10:"ReaUnprVas";i:565;s:14:"ClapHuzzaWalli";i:566;s:7:"LaconTy";i:567;s:8:"EagThioc";i:568;s:3:"Uns";i:569;s:7:"DingaSe";i:570;s:2:"Ve";i:571;s:11:"ParaPyophTu";i:572;s:10:"KasbaOsteo";i:573;s:4:"Tang";i:574;s:8:"StiStrTo";i:575;s:12:"MiSubdrTurbu";i:576;s:11:"PostPrPreal";i:577;s:9:"EquHypoNi";i:578;s:9:"HiIndZeug";i:579;s:4:"Scat";i:580;s:14:"MesoSloomSpasm";i:581;s:10:"ProcoUnyie";i:582;s:4:"Nonr";i:583;s:6:"CompCo";i:584;s:4:"Kymo";i:585;s:12:"NuanPolygSel";i:586;s:11:"LeafaLegZin";i:587;s:8:"RhomVent";i:588;s:9:"PeteRaSul";i:589;s:12:"DesSemblUret";i:590;s:4:"Zoog";i:591;s:8:"ExamiPre";i:592;s:10:"AmpManoRet";i:593;s:4:"Same";i:594;s:2:"Ty";i:595;s:3:"Spr";i:596;s:4:"Eels";i:597;s:5:"Motor";i:598;s:9:"ScyphUnli";i:599;s:12:"DefGanoUnalo";i:600;s:7:"EpEstRo";i:601;s:4:"Pana";i:602;s:10:"CanaEnlSca";i:603;s:9:"HomRoamRo";i:604;s:7:"HanKeWh";i:605;s:5:"DeIch";i:606;s:8:"CapInSto";i:607;s:7:"PenneVo";i:608;s:11:"ElatTardiVi";i:609;s:7:"ManUnvi";i:610;s:10:"OutbPhPrem";i:611;s:11:"AttrBarDros";i:612;s:8:"InofUrod";i:613;s:3:"Oli";i:614;s:11:"EncImpSchai";i:615;s:4:"Palm";i:616;s:3:"Vit";i:617;s:10:"OphthPyret";i:618;s:2:"So";i:619;s:6:"ExacPr";i:620;s:7:"MonPrTr";i:621;s:12:"MaraMystUnam";i:622;s:4:"Vela";i:623;s:6:"PoSupe";i:624;s:10:"CathCoaThu";i:625;s:5:"ToUpc";i:626;s:3:"Toc";i:627;s:9:"GrePraSli";i:628;s:4:"Sams";i:629;s:8:"ChaHoMon";i:630;s:2:"My";i:631;s:7:"HypItin";i:632;s:11:"GloKoxScrib";i:633;s:9:"SalaUnpro";i:634;s:8:"ImpacSan";i:635;s:3:"Rep";i:636;s:9:"ParaPuggi";i:637;s:8:"RebSheUn";i:638;s:9:"MaObRedis";i:639;s:9:"GuStomTir";i:640;s:4:"Isos";i:641;s:9:"SopoUnUnr";i:642;s:8:"PedroUnd";i:643;s:4:"Ward";i:644;s:3:"Val";i:645;s:4:"Plat";i:646;s:6:"RotUns";i:647;s:7:"PermiRe";i:648;s:6:"ConvSc";i:649;s:4:"Knic";i:650;s:7:"HemImme";i:651;s:10:"HandOutSti";i:652;s:12:"DioEpirrNesi";i:653;s:5:"Yodel";i:654;s:11:"BrangOdUnem";i:655;s:4:"Rebr";i:656;s:3:"Sys";i:657;s:10:"PeRegrTong";i:658;s:8:"GlResiUn";i:659;s:10:"NeapxOsteo";i:660;s:9:"LappPsRev";i:661;s:12:"PrePromTrica";i:662;s:5:"Prota";i:663;s:6:"TablUr";i:664;s:9:"CimbMenta";i:665;s:12:"DesHoaxxUnca";i:666;s:10:"LithoSteat";i:667;s:4:"Goyx";i:668;s:13:"PignoPrehSigx";i:669;s:2:"St";i:670;s:13:"BacDigreMontr";i:671;s:7:"TraUnro";i:672;s:7:"HikRiva";i:673;s:7:"CoPeUnp";i:674;s:5:"Thoro";i:675;s:5:"Vibro";i:676;s:7:"HoRudim";i:677;s:5:"Satis";i:678;s:14:"SulkiSyndTugri";i:679;s:8:"AnEpSius";i:680;s:7:"MyPomWe";i:681;s:11:"PathPepsiPl";i:682;s:7:"PerPlut";i:683;s:8:"MorPrete";i:684;s:8:"PiProUnf";i:685;s:7:"SleUnem";i:686;s:10:"BimPolypVa";i:687;s:6:"DzeThi";i:688;s:6:"DolEmp";i:689;s:5:"Skibb";i:690;s:3:"Pen";i:691;s:12:"SpinSymWaysi";i:692;s:9:"CamHomoTe";i:693;s:7:"HemopRa";i:694;s:13:"ConsParsoReri";i:695;s:7:"HumorKh";i:696;s:3:"Meg";i:697;s:9:"HuckInval";i:698;s:5:"CoSto";i:699;s:5:"Wykeh";i:700;s:8:"PeUnscUn";i:701;s:13:"LaminLeisOvov";i:702;s:4:"Unco";i:703;s:5:"HiUnd";i:704;s:9:"ForMeUnri";i:705;s:6:"RhymUn";i:706;s:8:"UnderUrn";i:707;s:13:"QuadrRuntTort";i:708;s:9:"HemiRepur";i:709;s:9:"EuPiSemin";i:710;s:6:"SubcSu";i:711;s:9:"MorNitcSl";i:712;s:10:"PreteVitel";i:713;s:7:"ReducTr";i:714;s:7:"NonSkew";i:715;s:5:"Rejec";i:716;s:6:"ImNuTe";i:717;s:10:"FlaForeHyp";i:718;s:5:"Stech";i:719;s:11:"CypHasteSpo";i:720;s:5:"Ocell";i:721;s:10:"ObtaiThrim";i:722;s:14:"DihyPhenaSmili";i:723;s:14:"ForwaPeripSius";i:724;s:15:"DropcOlivaPippe";i:725;s:10:"SubbeWhite";i:726;s:5:"Pneum";i:727;s:8:"OpprRaga";i:728;s:5:"DesDi";i:729;s:8:"HelioSup";i:730;s:10:"ParaPiSauc";i:731;s:3:"Sor";i:732;s:6:"SeptSu";i:733;s:5:"DrPot";i:734;s:8:"CoOutWau";i:735;s:6:"CeWold";i:736;s:8:"VivenWhi";i:737;s:10:"BandiQuadr";i:738;s:13:"MesiPlanSunni";i:739;s:3:"Urs";i:740;s:10:"KiUnchUnes";i:741;s:12:"MynaxSeTroch";i:742;s:4:"Shut";i:743;s:7:"ObSpurg";i:744;s:3:"Boy";i:745;s:10:"GuitaUnsub";i:746;s:4:"GrPr";i:747;s:11:"MonStrumSus";i:748;s:9:"DiSenTurr";i:749;s:4:"Unop";i:750;s:10:"CansoPrion";i:751;s:12:"HieMesaParoa";i:752;s:3:"Sil";i:753;s:8:"OpPoScio";i:754;s:9:"TrumpTwUn";i:755;s:14:"DoomsEtymoUnch";i:756;s:5:"HypUn";i:757;s:11:"InterMetOoz";i:758;s:9:"NondOcSta";i:759;s:9:"OinOtorRe";i:760;s:11:"IndiJapaUnd";i:761;s:8:"SnufUnsc";i:762;s:2:"Gr";i:763;s:10:"OpePupilUn";i:764;s:12:"IrreLiqueTra";i:765;s:5:"Uncol";i:766;s:4:"MeVe";i:767;s:6:"BlepVa";i:768;s:8:"PreSubva";i:769;s:6:"MaPrep";i:770;s:7:"PuUnnat";i:771;s:6:"JuriKh";i:772;s:9:"CoprGastr";i:773;s:9:"EuergOvSi";i:774;s:5:"Hyper";i:775;s:9:"StoSulpUn";i:776;s:5:"Unfop";i:777;s:4:"Retr";i:778;s:8:"BunchPos";i:779;s:5:"NorSu";i:780;s:12:"HordRunnUnea";i:781;s:7:"InterLi";i:782;s:11:"EnvOdonStew";i:783;s:10:"DiaMesNonc";i:784;s:8:"HematThe";i:785;s:3:"Ski";i:786;s:5:"Kodak";i:787;s:9:"DoRedouRe";i:788;s:2:"Sp";i:789;s:5:"Unfil";i:790;s:9:"RubicWarb";i:791;s:9:"HemiUinta";i:792;s:7:"OulSupr";i:793;s:10:"HieMuPelop";i:794;s:3:"Dis";i:795;s:5:"Telot";i:796;s:3:"Cza";i:797;s:5:"KidLa";i:798;s:4:"Nase";i:799;s:3:"Sul";i:800;s:8:"CubbyRed";i:801;s:8:"OrPectTo";i:802;s:7:"SeSvaUp";i:803;s:6:"SerWit";i:804;s:3:"Spo";i:805;s:10:"MeProbSmyr";i:806;s:5:"Tunab";i:807;s:9:"HolInVene";i:808;s:10:"ClaInlieRe";i:809;s:4:"Carb";i:810;s:13:"ReseSteeUncon";i:811;s:9:"UnbarWhit";i:812;s:11:"OstPhthiStu";i:813;s:5:"Whenn";i:814;s:4:"Ungl";i:815;s:3:"Sch";i:816;s:9:"PictuReco";i:817;s:10:"LyPremoTyp";i:818;s:7:"PagStal";i:819;s:5:"Sogdi";i:820;s:5:"UnUno";i:821;s:5:"Anast";i:822;s:11:"IsocMasOtos";i:823;s:7:"RayReli";i:824;s:4:"Umbe";i:825;s:7:"CortMil";i:826;s:8:"ProSaddl";i:827;s:6:"LigWob";i:828;s:6:"ReSawi";i:829;s:3:"Inw";i:830;s:5:"Recre";i:831;s:7:"PantaPs";i:832;s:7:"LuNoUna";i:833;s:9:"FeliPoTar";i:834;s:13:"RajaxSoweWhor";i:835;s:6:"HeHorn";i:836;s:2:"Vi";i:837;s:5:"Sulph";i:838;s:7:"ScalSco";i:839;s:6:"SuSwin";i:840;s:12:"PleTempUnspl";i:841;s:4:"Disl";i:842;s:6:"PuTach";i:843;s:5:"Methy";i:844;s:9:"StThreeWa";i:845;s:8:"MetaPeri";i:846;s:12:"KoMuttoPseud";i:847;s:3:"Yot";i:848;s:8:"UnleaUnt";i:849;s:12:"NoTammyZoosp";i:850;s:8:"TendUnre";i:851;s:11:"ChunSiSlate";i:852;s:11:"ReverTheUni";i:853;s:14:"SynoWhipsYokel";i:854;s:4:"Undi";i:855;s:10:"HoLodgeTum";i:856;s:10:"GoralLaWul";i:857;s:7:"OnPrede";i:858;s:6:"LieSac";i:859;s:9:"BemuGyrin";i:860;s:3:"Ung";i:861;s:4:"Retu";i:862;s:9:"DesipSavi";i:863;s:8:"RouSandi";i:864;s:4:"Prec";i:865;s:10:"GastPrStra";i:866;s:4:"Muli";i:867;s:6:"DeFebr";i:868;s:11:"IcacPoltrUn";i:869;s:5:"Trach";i:870;s:7:"MisadUn";i:871;s:15:"GaywiOverdScorp";i:872;s:11:"ChiliIsSono";i:873;s:4:"Than";i:874;s:4:"Tube";i:875;s:5:"Mermi";i:876;s:10:"KuskUbUnwo";i:877;s:9:"GeHeMicro";i:878;s:2:"Py";i:879;s:2:"Vo";i:880;s:9:"FrThTrans";i:881;s:13:"RipiSubuWorme";i:882;s:11:"AssigCoenOu";i:883;s:4:"DiUn";i:884;s:12:"NonsRotiWhat";i:885;s:5:"NoUni";i:886;s:6:"OmPhle";i:887;s:4:"Para";i:888;s:3:"Rev";i:889;s:4:"ShSt";i:890;s:8:"MahaPunn";i:891;s:7:"StatoUn";i:892;s:10:"GalliNecta";i:893;s:12:"JuMintmWouch";i:894;s:9:"SempeSpir";i:895;s:13:"OphthSemidSty";i:896;s:8:"CenTripe";i:897;s:8:"SipunUne";i:898;s:5:"Uvulo";i:899;s:4:"Verb";i:900;s:8:"CuprMaPa";i:901;s:4:"PhUn";i:902;s:7:"PulTher";i:903;s:5:"Suppo";i:904;s:8:"BombCeGl";i:905;s:11:"CoccPaSerot";i:906;s:6:"CoExTr";i:907;s:9:"PaPatPedi";i:908;s:5:"Sillo";i:909;s:10:"DrysPyreSy";i:910;s:7:"NoVermi";i:911;s:8:"SaddVuln";i:912;s:10:"NonTessUns";i:913;s:8:"HeSemiUn";i:914;s:5:"ReUns";i:915;s:10:"IntePiSiki";i:916;s:6:"BoleCo";i:917;s:6:"DisgSa";i:918;s:3:"Rem";i:919;s:9:"ChroOverd";i:920;s:3:"Unt";i:921;s:7:"HeSands";i:922;s:6:"PrShTi";i:923;s:10:"NecroPrere";i:924;s:10:"OoeciPhUns";i:925;s:3:"Ham";i:926;s:7:"GaReful";i:927;s:7:"BunyPed";i:928;s:13:"IntoParalZigz";i:929;s:5:"Jacks";i:930;s:2:"Wr";i:931;s:6:"SalUnc";i:932;s:9:"GeSlovTic";i:933;s:9:"NeighPain";i:934;s:3:"Und";i:935;s:6:"OutTri";i:936;s:4:"Teii";i:937;s:5:"Taint";i:938;s:5:"Guill";i:939;s:10:"AzonxFaMoa";i:940;s:10:"InterSeUnc";i:941;s:7:"OveSobr";i:942;s:8:"ReTrihUn";i:943;s:7:"CyWordi";i:944;s:9:"TurnaWash";i:945;s:8:"RevoUngy";i:946;s:6:"PhoRer";i:947;s:5:"Whizz";i:948;s:13:"ProUndesUnsal";i:949;s:11:"StitcUpWitx";i:950;s:4:"Pert";i:951;s:3:"Tac";i:952;s:9:"EmulsProu";i:953;s:6:"UnwaUs";i:954;s:8:"FelTaxia";i:955;s:8:"ReResScl";i:956;s:6:"SemUnp";i:957;s:8:"OvTopWhi";i:958;s:8:"IntReaWo";i:959;s:4:"PlTo";i:960;s:14:"OveraPositUnpl";i:961;s:5:"Trest";i:962;s:10:"BixaChloVi";i:963;s:6:"CharGr";i:964;s:7:"ImSemUn";i:965;s:5:"Leadw";i:966;s:4:"Ples";i:967;s:11:"PsStepVirul";i:968;s:8:"NoOoSpir";i:969;s:10:"HeraImWhee";i:970;s:6:"SaTrag";i:971;s:10:"ForweSubre";i:972;s:11:"BegloEffHyd";i:973;s:8:"ChatTido";i:974;s:5:"RiSup";i:975;s:5:"Nonex";i:976;s:10:"JonMaParap";i:977;s:10:"ChapeDovEn";i:978;s:5:"Twizz";i:979;s:7:"MuckPra";i:980;s:8:"HurklLus";i:981;s:10:"MortProVal";i:982;s:9:"FroLimiRe";i:983;s:9:"HoliMimTr";i:984;s:5:"Besca";i:985;s:7:"MetroRu";i:986;s:13:"SawfSemibUngu";i:987;s:9:"ForePicco";i:988;s:9:"ParSysTee";i:989;s:4:"Pres";i:990;s:7:"HeJaile";i:991;s:3:"Ref";i:992;s:6:"MusgRe";i:993;s:3:"Her";i:994;s:4:"Hyet";i:995;s:7:"HelioPo";i:996;s:6:"BasiYa";i:997;s:8:"ProtVell";i:998;s:7:"NonoWea";i:999;s:7:"SubrUnm";i:1000;s:11:"ConEboniVer";i:1001;s:3:"Uni";i:1002;s:9:"IdePlasUn";i:1003;s:9:"PronStabi";i:1004;s:14:"QuinSquabUnrig";i:1005;s:2:"Ob";i:1006;s:7:"NatchOx";i:1007;s:5:"IsXan";i:1008;s:6:"JaReel";i:1009;s:8:"ProRhota";i:1010;s:4:"Vell";i:1011;s:5:"Hemop";i:1012;s:5:"Searc";i:1013;s:8:"EntaUnst";i:1014;s:12:"MonolNoRajax";i:1015;s:13:"DanPolynStere";i:1016;s:13:"TubUnattZogan";i:1017;s:5:"Raini";i:1018;s:5:"SpiSp";i:1019;s:8:"PosolPro";i:1020;s:6:"AlysEc";i:1021;s:10:"PoRedetThe";i:1022;s:10:"RecoiUglil";i:1023;s:10:"AntifCrIns";i:1024;s:3:"Pse";i:1025;s:12:"NonuSemSeria";i:1026;s:12:"PanSourUncom";i:1027;s:7:"FiMatan";i:1028;s:6:"RattVe";i:1029;s:6:"SpaTom";i:1030;s:12:"GebbiPasTess";i:1031;s:9:"PhotUncUn";i:1032;s:6:"RicTar";i:1033;s:10:"PlagiSeque";i:1034;s:3:"Zer";i:1035;s:5:"Denom";i:1036;s:14:"LentiPrecaUnpr";i:1037;s:6:"PathSu";i:1038;s:4:"PuSh";i:1039;s:10:"LaLinoPrem";i:1040;s:11:"IsPteryViru";i:1041;s:6:"HerbLo";i:1042;s:10:"FebKobusOv";i:1043;s:8:"ChiloWai";i:1044;s:12:"PosTetraTong";i:1045;s:5:"StUni";i:1046;s:11:"SuccTriliUn";i:1047;s:12:"PertSymmUnsu";i:1048;s:8:"UnshrZea";i:1049;s:6:"KonMar";i:1050;s:8:"LimTidbi";i:1051;s:6:"IsMePe";i:1052;s:7:"MarWher";i:1053;s:8:"OssifPen";i:1054;s:3:"Nig";i:1055;s:9:"NoRevuWar";i:1056;s:14:"CatalNympUnfal";i:1057;s:4:"Prep";i:1058;s:2:"Pe";i:1059;s:13:"InsciProSulph";i:1060;s:5:"DysHa";i:1061;s:2:"Wa";i:1062;s:5:"Goldb";i:1063;s:8:"DiHaWhey";i:1064;s:5:"SpThr";i:1065;s:8:"MesoUncu";i:1066;s:8:"SaUncoVi";i:1067;s:5:"SemUn";i:1068;s:13:"EmplHumanPitt";i:1069;s:5:"AmpHa";i:1070;s:6:"LoPrec";i:1071;s:9:"OnRegleSn";i:1072;s:8:"CurDesUn";i:1073;s:7:"NasUnex";i:1074;s:9:"ChulPrudy";i:1075;s:7:"SacUnUp";i:1076;s:10:"InMesMisca";i:1077;s:5:"StrVe";i:1078;s:10:"ForHymeTap";i:1079;s:4:"Ruin";i:1080;s:9:"KurbaOxhe";i:1081;s:9:"DamScyTet";i:1082;s:3:"Int";i:1083;s:9:"ClypeHair";i:1084;s:10:"DoNicolSpe";i:1085;s:6:"PraUne";i:1086;s:2:"He";i:1087;s:9:"SigniUnbr";i:1088;s:10:"IntePlaTor";i:1089;s:3:"Kol";i:1090;s:11:"MesRomUnshu";i:1091;s:5:"Calfl";i:1092;s:5:"Pyrol";i:1093;s:5:"Trous";i:1094;s:7:"LanSpew";i:1095;s:12:"SylTyranUnre";i:1096;s:8:"PodRetra";i:1097;s:2:"Ox";i:1098;s:6:"PosTel";i:1099;s:5:"SynWa";i:1100;s:6:"DauUnb";i:1101;s:13:"PseuThorUropt";i:1102;s:13:"ScleThermVirt";i:1103;s:3:"Imp";i:1104;s:4:"Repr";i:1105;s:8:"SacriSub";i:1106;s:6:"GrSolo";i:1107;s:8:"OvPoShad";i:1108;s:11:"ConfParisRe";i:1109;s:8:"CnidoUna";i:1110;s:2:"Gl";i:1111;s:3:"Inf";i:1112;s:11:"OxyneRehaWi";i:1113;s:3:"Cou";i:1114;s:4:"PhSh";i:1115;s:7:"ExcSubt";i:1116;s:7:"PlProto";i:1117;s:8:"HelleWor";i:1118;s:10:"MyOvertThu";i:1119;s:4:"Unsu";i:1120;s:10:"UnUnindWor";i:1121;s:4:"Tabo";i:1122;s:8:"SoSphTuz";i:1123;s:7:"SeptSpi";i:1124;s:10:"IsoOcRedic";i:1125;s:5:"Shane";i:1126;s:8:"HydroSem";i:1127;s:14:"MattyNeossSemi";i:1128;s:9:"MetaPeSac";i:1129;s:5:"Under";i:1130;s:11:"MonopNodiSk";i:1131;s:5:"RecSu";i:1132;s:10:"PensiSnipt";i:1133;s:7:"EnchoKe";i:1134;s:8:"DisDrTae";i:1135;s:5:"Indem";i:1136;s:5:"DefUp";i:1137;s:5:"EpiIn";i:1138;s:12:"GastrSephSub";i:1139;s:8:"FosUnlie";i:1140;s:5:"Tekya";i:1141;s:8:"NonfeZib";i:1142;s:12:"StyloSubmTha";i:1143;s:7:"UnhUnst";i:1144;s:12:"DispNontPern";i:1145;s:4:"Cary";i:1146;s:2:"Fr";i:1147;s:2:"Cr";i:1148;s:7:"PhlebTs";i:1149;s:8:"FletcUne";i:1150;s:8:"HypeMaUn";i:1151;s:12:"ImprMalSuper";i:1152;s:5:"SacUn";i:1153;s:11:"RubSchatSup";i:1154;s:7:"HeSurfb";i:1155;s:13:"MagTaipoTript";i:1156;s:7:"LesSubs";i:1157;s:7:"PrTreTr";i:1158;s:7:"IvUnUns";i:1159;s:10:"HidagIntRe";i:1160;s:11:"NoSaleSpinu";i:1161;s:5:"Myalg";i:1162;s:10:"DeLenSubla";i:1163;s:7:"SurgyTr";i:1164;s:5:"OuPes";i:1165;s:7:"MarMuWe";i:1166;s:6:"FestFl";i:1167;s:7:"PhQuiUn";i:1168;s:5:"Scabr";i:1169;s:5:"SpTra";i:1170;s:4:"Dact";i:1171;s:5:"Reorg";i:1172;s:8:"LuPapSab";i:1173;s:3:"Epi";i:1174;s:11:"HairSpStrat";i:1175;s:13:"IlleiSemicSha";i:1176;s:14:"DespPropoRepla";i:1177;s:5:"Chymi";i:1178;s:7:"FoUnwre";i:1179;s:5:"Unper";i:1180;s:3:"Jel";i:1181;s:3:"Ego";i:1182;s:6:"CryPre";i:1183;s:5:"PrUnt";i:1184;s:2:"Rh";i:1185;s:6:"FaVamp";i:1186;s:8:"WesteYel";i:1187;s:4:"Limn";i:1188;s:9:"ClamHeUra";i:1189;s:10:"CrooEupShe";i:1190;s:11:"ChDandiMort";i:1191;s:7:"EsEveNe";i:1192;s:14:"LatitToniVoidl";i:1193;s:10:"HadLitNong";i:1194;s:4:"Psyc";i:1195;s:3:"Oct";i:1196;s:3:"Une";i:1197;s:9:"RaScuseSp";i:1198;s:8:"InherRor";i:1199;s:6:"ParStr";i:1200;s:7:"MetaPau";i:1201;s:9:"SeiUnUnva";i:1202;s:9:"TaUntVerj";i:1203;s:8:"CheTelot";i:1204;s:10:"InceKiMurz";i:1205;s:15:"DomicImoliLiter";i:1206;s:5:"CopDe";i:1207;s:3:"Amo";i:1208;s:10:"ParalUnent";i:1209;s:2:"Ea";i:1210;s:4:"Unbi";i:1211;s:13:"PachPlagiTrep";i:1212;s:4:"LyUn";i:1213;s:2:"Wo";i:1214;s:7:"PlatRom";i:1215;s:12:"ChiQuitSulph";i:1216;s:11:"AuPennoRoll";i:1217;s:13:"LarriPallPron";i:1218;s:8:"MailpPyg";i:1219;s:4:"PiTa";i:1220;s:4:"Unam";i:1221;s:9:"HedgeStra";i:1222;s:6:"GynKit";i:1223;s:2:"Sh";i:1224;s:10:"CubInStati";i:1225;s:2:"Mi";i:1226;s:8:"PeRefSou";i:1227;s:5:"InInf";i:1228;s:5:"OveVi";i:1229;s:10:"ReacUnsVal";i:1230;s:5:"Silve";i:1231;s:5:"GooUn";i:1232;s:6:"ThVict";i:1233;s:10:"MalPerShin";i:1234;s:4:"Chuc";i:1235;s:7:"RiaSerr";i:1236;s:11:"OverPhyUlli";i:1237;s:8:"CepEnvie";i:1238;s:8:"ManSubmi";i:1239;s:10:"CarErysPyr";i:1240;s:8:"PlaSpecu";i:1241;s:9:"DraOveOve";i:1242;s:9:"GiddyHyWe";i:1243;s:4:"Cala";i:1244;s:5:"ChHyr";i:1245;s:10:"HeterPoSyn";i:1246;s:7:"FrMaPer";i:1247;s:7:"SeeUnbe";i:1248;s:5:"Redto";i:1249;s:13:"FonsxIllPreli";i:1250;s:7:"InOvers";i:1251;s:5:"Thril";i:1252;s:10:"DisplMicVo";i:1253;s:9:"ImpeInSem";i:1254;s:4:"Osch";i:1255;s:4:"Duog";i:1256;s:9:"NonPuShre";i:1257;s:14:"OstreSergToolm";i:1258;s:9:"HyakMahPa";i:1259;s:7:"PalRefr";i:1260;s:7:"PoTroch";i:1261;s:12:"GiddyInWhipp";i:1262;s:7:"BroDrys";i:1263;s:6:"IllRef";i:1264;s:10:"CommaLabSt";i:1265;s:5:"Apoll";i:1266;s:2:"Ne";i:1267;s:3:"Kat";i:1268;s:7:"PoTinct";i:1269;s:10:"NasSynosUn";i:1270;s:4:"Pant";i:1271;s:5:"Unmis";i:1272;s:5:"UnVin";i:1273;s:4:"Ordi";i:1274;s:10:"MazocPrebe";i:1275;s:3:"Unw";i:1276;s:4:"TyUn";i:1277;s:6:"MetaUn";i:1278;s:4:"Thri";i:1279;s:11:"OokiSilkwSt";i:1280;s:5:"OvPed";i:1281;s:6:"MesoSq";i:1282;s:3:"Per";i:1283;s:9:"ImTraWrit";i:1284;s:2:"In";i:1285;s:9:"NaSliceWh";i:1286;s:8:"PolTherm";i:1287;s:4:"Topm";i:1288;s:9:"CasPnTita";i:1289;s:5:"Unsur";i:1290;s:6:"HeInPr";i:1291;s:8:"AtGiMisp";i:1292;s:14:"BathuEpicyPhor";i:1293;s:5:"Windb";i:1294;s:7:"DoDomUn";i:1295;s:7:"LetPrer";i:1296;s:4:"Subu";i:1297;s:12:"MacroOrtSwee";i:1298;s:11:"DarapEelHoo";i:1299;s:7:"UnaWeWu";i:1300;s:10:"HydrJoiOve";i:1301;s:4:"Rein";i:1302;s:9:"GuarPedia";i:1303;s:5:"Primo";i:1304;s:5:"Pregn";i:1305;s:2:"Tw";i:1306;s:11:"KinMemorTou";i:1307;s:14:"LandbMantSuper";i:1308;s:4:"Pers";i:1309;s:5:"DiRho";i:1310;s:9:"KabaRinne";i:1311;s:2:"To";i:1312;s:4:"Stom";i:1313;s:5:"Movie";i:1314;s:12:"ProtoSpoUnsy";i:1315;s:12:"LiceSharUpso";i:1316;s:9:"SlStereWo";i:1317;s:4:"Tubb";i:1318;s:7:"EradiPe";i:1319;s:10:"OrthoVolum";i:1320;s:10:"LeaMattNon";i:1321;s:11:"PeSemiThrom";i:1322;s:3:"Yar";i:1323;s:12:"DetraGalvSki";i:1324;s:6:"ThyUna";i:1325;s:8:"DiRainRo";i:1326;s:12:"HarakHerVide";i:1327;s:5:"Plata";i:1328;s:4:"Occi";i:1329;s:7:"PaQuadr";i:1330;s:7:"SanToot";i:1331;s:10:"DecExploIn";i:1332;s:2:"Cl";i:1333;s:7:"UnbeUns";i:1334;s:6:"OphRel";i:1335;s:13:"SangSphenUnco";i:1336;s:4:"Unli";i:1337;s:15:"HorneNonopSnake";i:1338;s:11:"PhiSubjUnim";i:1339;s:6:"SaniSu";i:1340;s:3:"Man";i:1341;s:7:"UnUntre";i:1342;s:10:"DihRecapUn";i:1343;s:9:"IntNonrTr";i:1344;s:10:"CoryLerrWh";i:1345;s:10:"GimMonRetr";i:1346;s:4:"Phry";i:1347;s:6:"MyoWea";i:1348;s:3:"Was";i:1349;s:6:"GrHemi";i:1350;s:9:"InInfePre";i:1351;s:4:"NuPn";i:1352;s:14:"ChlorHeteProca";i:1353;s:7:"FroImpu";i:1354;s:6:"DiStee";i:1355;s:7:"CarnUnd";i:1356;s:11:"SentiTimeUn";i:1357;s:11:"ScrawVeYach";i:1358;s:5:"Utero";i:1359;s:8:"InfOfPho";i:1360;s:10:"MolSulphUn";i:1361;s:6:"CaDePr";i:1362;s:5:"InRea";i:1363;s:4:"Scra";i:1364;s:12:"JaPosteUnder";i:1365;s:7:"MuscVer";i:1366;s:12:"DimerEupaMeg";i:1367;s:4:"Grap";i:1368;s:11:"CadeHectoHo";i:1369;s:6:"SulThi";i:1370;s:4:"Hama";i:1371;s:9:"LymOuRemn";i:1372;s:4:"Mart";i:1373;s:6:"KaTrum";i:1374;s:3:"Way";i:1375;s:11:"KitLatPomon";i:1376;s:14:"IsotLeiomTrich";i:1377;s:9:"SteTarrUn";i:1378;s:10:"DeFoxTurnc";i:1379;s:8:"LeucNoPe";i:1380;s:9:"PeriRelSi";i:1381;s:9:"NoParTien";i:1382;s:6:"PupUna";i:1383;s:5:"PanSa";i:1384;s:9:"DeoKerxTu";i:1385;s:5:"Unwor";i:1386;s:2:"Mu";i:1387;s:14:"IodosOverWrith";i:1388;s:4:"HuPa";i:1389;s:7:"JocLame";i:1390;s:4:"Mame";i:1391;s:5:"Unspi";i:1392;s:11:"IthyLeisPos";i:1393;s:7:"ParapWa";i:1394;s:7:"TriliUn";i:1395;s:8:"TarTheer";i:1396;s:5:"Frust";i:1397;s:6:"GuTrun";i:1398;s:9:"MembrReco";i:1399;s:10:"KwartRheUr";i:1400;s:3:"Sem";i:1401;s:4:"Naph";i:1402;s:11:"ParRecUsuar";i:1403;s:12:"LegaMallPowd";i:1404;s:8:"OveProet";i:1405;s:11:"FinesOvXeno";i:1406;s:10:"PresuRattl";i:1407;s:3:"Dem";i:1408;s:13:"FrienRevSeque";i:1409;s:12:"BriHyperKrem";i:1410;s:13:"HomoMoribTouc";i:1411;s:4:"Wauk";i:1412;s:12:"SupeTonsiUns";i:1413;s:8:"KikuScyt";i:1414;s:5:"Scare";i:1415;s:12:"HippoPlPneum";i:1416;s:8:"GraNonfo";i:1417;s:7:"EuphVel";i:1418;s:5:"Undar";i:1419;s:12:"GampShriSurr";i:1420;s:2:"Wi";i:1421;s:7:"OsmPrUn";i:1422;s:10:"TarahUnabi";i:1423;s:7:"CaDawTy";i:1424;s:10:"GeomeLater";i:1425;s:8:"GelPaSup";i:1426;s:8:"RegreVol";i:1427;s:7:"LepMeio";i:1428;s:12:"HeMesolSpeec";i:1429;s:4:"Pred";i:1430;s:12:"EpParagRedex";i:1431;s:10:"MiPhilTyro";i:1432;s:8:"ParaSaga";i:1433;s:6:"EstNih";i:1434;s:11:"OrdiRevolSe";i:1435;s:3:"Pla";i:1436;s:12:"LepiRetSuper";i:1437;s:12:"HoloOperWild";i:1438;s:6:"InteVe";i:1439;s:4:"Whit";i:1440;s:11:"JuMinkoXant";i:1441;s:10:"BowmHelMal";i:1442;s:11:"KetazPrVeld";i:1443;s:4:"Intr";i:1444;s:7:"LeucSub";i:1445;s:7:"OveUnUn";i:1446;s:7:"MyelPos";i:1447;s:6:"PrSche";i:1448;s:2:"Ze";i:1449;s:5:"Pyrrh";i:1450;s:5:"ChaPh";i:1451;s:8:"RelUltra";i:1452;s:5:"Prere";i:1453;s:7:"FoProSe";i:1454;s:11:"MyoUnyiWeir";i:1455;s:8:"InLiTaro";i:1456;s:8:"QuintSty";i:1457;s:4:"Euch";i:1458;s:5:"Consu";i:1459;s:5:"Incon";i:1460;s:11:"HypoMagnPyc";i:1461;s:5:"PeUbi";i:1462;s:13:"HistoIlokaRas";i:1463;s:8:"ManoMiPl";i:1464;s:11:"LeathRedeSu";i:1465;s:11:"PalStucToba";i:1466;s:13:"HabitPriSaber";i:1467;s:5:"Table";i:1468;s:11:"SeneSubcToo";i:1469;s:11:"DiOffeSuper";i:1470;s:4:"Ruff";i:1471;s:12:"HyperPoiStor";i:1472;s:13:"BigwDirtUnasp";i:1473;s:3:"Pro";i:1474;s:6:"EpiExe";i:1475;s:10:"HypMetNahu";i:1476;s:10:"DimiValeWi";i:1477;s:4:"FiRa";i:1478;s:11:"DoSomnaUnta";i:1479;s:8:"BupMazam";i:1480;s:13:"CurtaOntSuppl";i:1481;s:5:"Waben";i:1482;s:10:"EpicrLymph";i:1483;s:7:"CasUnca";i:1484;s:8:"HatchWhe";i:1485;s:8:"HarmMole";i:1486;s:3:"Thi";i:1487;s:3:"Hal";i:1488;s:10:"CisSpuddVe";i:1489;s:11:"LiMismiPsyc";i:1490;s:11:"PolliSiVign";i:1491;s:10:"SeducShSta";i:1492;s:8:"SaugScab";i:1493;s:6:"IslaTr";i:1494;s:10:"ComImParat";i:1495;s:4:"Peri";i:1496;s:11:"GritLaRambe";i:1497;s:7:"EddZygo";i:1498;s:12:"BumInteMidma";i:1499;s:15:"InterOrnitPreme";i:1500;s:9:"PrSugSulf";i:1501;s:8:"IdePsych";i:1502;s:4:"Proc";i:1503;s:7:"CosmTri";i:1504;s:6:"CommUn";i:1505;s:5:"Sawfl";i:1506;s:5:"CusSe";i:1507;s:7:"TrUlste";i:1508;s:4:"Thyr";i:1509;s:5:"Persp";i:1510;s:9:"PedulSiVi";i:1511;s:6:"AmMyrm";i:1512;s:5:"Physi";i:1513;s:8:"SurcTolx";i:1514;s:5:"Cytop";i:1515;s:5:"GaRav";i:1516;s:13:"CarMelanUnuni";i:1517;s:6:"EdSubt";i:1518;s:7:"DotGeph";i:1519;s:7:"InNativ";i:1520;s:5:"Ozoty";i:1521;s:7:"PriScal";i:1522;s:4:"SeUn";i:1523;s:13:"FlexuIntYoudi";i:1524;s:3:"Tra";i:1525;s:8:"SubbiTap";i:1526;s:11:"ChloDrucGra";i:1527;s:8:"MarrMimi";i:1528;s:9:"DooSeSpec";i:1529;s:7:"GauzySe";i:1530;s:4:"Chio";i:1531;s:10:"RatafThVip";i:1532;s:6:"FruiGy";i:1533;s:15:"FoddeSulfoZeuct";i:1534;s:7:"BromiRe";i:1535;s:8:"OvPhrUlt";i:1536;s:3:"Unv";i:1537;s:5:"Lidfl";i:1538;s:5:"Uncon";i:1539;s:12:"SapodUnblUno";i:1540;s:13:"DomiHakimMola";i:1541;s:4:"Unth";i:1542;s:5:"FoOve";i:1543;s:9:"LendePoUn";i:1544;s:14:"ConfScrofTelle";i:1545;s:11:"MonoOutboTe";i:1546;s:11:"FeckTeUnfea";i:1547;s:5:"Wopsx";i:1548;s:8:"StaSulfa";i:1549;s:9:"CoalInapa";i:1550;s:6:"RisSqu";i:1551;s:12:"SubtWacexZyg";i:1552;s:11:"MonoMorSqua";i:1553;s:7:"DisFrTr";i:1554;s:9:"BonaIllit";i:1555;s:4:"Pron";i:1556;s:13:"LuculThaThutt";i:1557;s:3:"Unm";i:1558;s:9:"FelsOpine";i:1559;s:13:"LumpiStaiUnhu";i:1560;s:12:"HoIneliUnlat";i:1561;s:2:"Or";i:1562;s:11:"GoatrNoUnes";i:1563;s:12:"AlBenthPsych";i:1564;s:4:"Insu";i:1565;s:5:"Unver";i:1566;s:4:"Eulo";i:1567;s:7:"OmThroa";i:1568;s:9:"HyUnsUnwo";i:1569;s:5:"PeRes";i:1570;s:5:"DecTe";i:1571;s:6:"SpoZym";i:1572;s:5:"Satyr";i:1573;s:4:"Subc";i:1574;s:2:"As";i:1575;s:3:"Ret";i:1576;s:7:"JarblMy";i:1577;s:4:"Noni";i:1578;s:10:"BalusCacon";i:1579;s:10:"HazReiWard";i:1580;s:7:"QuisThe";i:1581;s:12:"SawflStrumTr";i:1582;s:4:"Witc";i:1583;s:12:"BenzoCheOver";i:1584;s:4:"Preo";i:1585;s:11:"DisseGaName";i:1586;s:8:"EleReadm";i:1587;s:8:"UnaUnZig";i:1588;s:7:"EskNeur";i:1589;s:9:"DisFanSco";i:1590;s:8:"FesJolRe";i:1591;s:10:"ConfuDoPre";i:1592;s:12:"CaptPseuRush";i:1593;s:12:"ScreXenomYar";i:1594;s:9:"RidiTarVa";i:1595;s:10:"HippMbaSaf";i:1596;s:14:"ElateNonreOver";i:1597;s:6:"MiPara";i:1598;s:10:"PterPuSear";i:1599;s:5:"Marsh";i:1600;s:5:"Stram";i:1601;s:8:"SheWippe";i:1602;s:9:"StreWench";i:1603;s:13:"SubauSycopZoo";i:1604;s:14:"LarunNonaPhyto";i:1605;s:8:"OrdeVigi";i:1606;s:11:"KumOphthPar";i:1607;s:4:"Depe";i:1608;s:10:"DecumPerio";i:1609;s:8:"ArchClMe";i:1610;s:7:"TawieWy";i:1611;s:5:"SupWr";i:1612;s:10:"ReshSaTydi";i:1613;s:8:"BeverDis";i:1614;s:11:"HypNeuroTru";i:1615;s:15:"DrinkFulmiSaper";i:1616;s:14:"GlycMachiNonre";i:1617;s:8:"TapiUrbi";i:1618;s:5:"InNun";i:1619;s:11:"ProTalegTot";i:1620;s:5:"GarUn";i:1621;s:5:"Signa";i:1622;s:10:"ProofUltra";i:1623;s:5:"Parti";i:1624;s:10:"HoWanlWitc";i:1625;s:5:"Ossua";i:1626;s:11:"ImpPreSuper";i:1627;s:8:"CurIsoRi";i:1628;s:4:"Play";i:1629;s:4:"Fore";i:1630;s:11:"DecuExtrInd";i:1631;s:12:"DysanHydPost";i:1632;s:7:"ReTelev";i:1633;s:9:"CionxPrSh";i:1634;s:6:"NatiUn";i:1635;s:4:"Grav";i:1636;s:4:"Tran";i:1637;s:3:"Kan";i:1638;s:12:"LichMakiUnne";i:1639;s:9:"LacMesPer";i:1640;s:7:"CoHidJi";i:1641;s:11:"MahSurUnlam";i:1642;s:10:"DeOutsWauk";i:1643;s:13:"MarPylorRoots";i:1644;s:6:"ExPehu";i:1645;s:5:"PaTak";i:1646;s:5:"Rubas";i:1647;s:8:"PhaseWit";i:1648;s:5:"Inhar";i:1649;s:12:"OsteRhyScapu";i:1650;s:13:"MonotRedeSupe";i:1651;s:10:"BlephDaPer";i:1652;s:8:"SylvTrUn";i:1653;s:6:"MePuSa";i:1654;s:4:"DuUn";i:1655;s:7:"DistSem";i:1656;s:5:"HuPer";i:1657;s:11:"PlPolyUnpea";i:1658;s:5:"FeeNe";i:1659;s:12:"ElegGrinZygo";i:1660;s:13:"PanteUnbloUns";i:1661;s:6:"LifTur";i:1662;s:4:"Unsi";i:1663;s:7:"PeoplUr";i:1664;s:5:"CerMa";i:1665;s:8:"TechnUns";i:1666;s:7:"ScleWhe";i:1667;s:11:"MazanNecPro";i:1668;s:10:"RecovSergi";i:1669;s:5:"Unidi";i:1670;s:8:"SunUninf";i:1671;s:9:"MoSciUnfa";i:1672;s:10:"FelsOstTri";i:1673;s:7:"ConSang";i:1674;s:3:"Unh";i:1675;s:7:"CrHyTri";i:1676;s:3:"Kne";i:1677;s:10:"EpiNonPhoe";i:1678;s:7:"HydNeig";i:1679;s:6:"BoOnse";i:1680;s:7:"UnhorVe";i:1681;s:13:"OtherSirTobex";i:1682;s:8:"LaPrebUn";i:1683;s:12:"MyeNitidRace";i:1684;s:11:"DisDorsPseu";i:1685;s:4:"Unne";i:1686;s:10:"ComatTashr";i:1687;s:5:"Chrom";i:1688;s:8:"ScolTene";i:1689;s:6:"PholTi";i:1690;s:5:"EnoUn";i:1691;s:8:"MaxNonsp";i:1692;s:11:"MisStaphTal";i:1693;s:6:"PsSlUn";i:1694;s:7:"SeUlste";i:1695;s:10:"PreThrepUn";i:1696;s:3:"Min";i:1697;s:6:"SplZoo";i:1698;s:4:"Obit";i:1699;s:9:"LiRicoSar";i:1700;s:9:"PsReReind";i:1701;s:2:"Gu";i:1702;s:11:"PioSemUncha";i:1703;s:10:"DebamInsPl";i:1704;s:4:"CoNo";i:1705;s:3:"Pat";i:1706;s:5:"Rhino";i:1707;s:12:"GladdInUnscr";i:1708;s:5:"Gargo";i:1709;s:3:"Hog";i:1710;s:4:"Tany";i:1711;s:9:"FacepUngr";i:1712;s:6:"DesUnd";i:1713;s:3:"Tap";i:1714;s:6:"ReUnde";i:1715;s:2:"Qu";i:1716;s:7:"IntuPar";i:1717;s:5:"LopPr";i:1718;s:4:"Unta";i:1719;s:3:"Tin";i:1720;s:3:"Mot";i:1721;s:10:"MemorRemic";i:1722;s:11:"FistlPanTyi";i:1723;s:12:"GhoGuarRelbu";i:1724;s:3:"Coo";i:1725;s:6:"NotPig";i:1726;s:4:"Orna";i:1727;s:9:"InNonalTh";i:1728;s:7:"AlConen";i:1729;s:8:"QuiSyncx";i:1730;s:12:"HematLarTear";i:1731;s:4:"Link";i:1732;s:7:"PolarVa";i:1733;s:14:"MacroParvRuina";i:1734;s:7:"KeelRep";i:1735;s:4:"UnWo";i:1736;s:13:"PolygRemTucun";i:1737;s:9:"LoxoReSin";i:1738;s:12:"OcPassaSciss";i:1739;s:9:"CopeCorre";i:1740;s:12:"GawLaborTeta";i:1741;s:8:"CoHeSupe";i:1742;s:7:"ProtTel";i:1743;s:7:"RaUnplu";i:1744;s:3:"Try";i:1745;s:4:"Tols";i:1746;s:2:"Sn";i:1747;s:8:"CincUnco";i:1748;s:11:"CondPytUnre";i:1749;s:7:"CeMePro";i:1750;s:5:"Myrme";i:1751;s:4:"Skew";i:1752;s:3:"Usa";i:1753;s:8:"SabbaSla";i:1754;s:9:"GlePrThyr";i:1755;s:7:"FlRhina";i:1756;s:11:"ReaSilicUnb";i:1757;s:9:"InPahTeer";i:1758;s:4:"Gude";i:1759;s:9:"KaxPyosUn";i:1760;s:5:"Bianc";i:1761;s:10:"SelenSquas";i:1762;s:9:"RhinUntuc";i:1763;s:8:"PesSupUn";i:1764;s:7:"SyTeneb";i:1765;s:3:"Gly";i:1766;s:12:"MethaMucPara";i:1767;s:14:"DemaIcelaWhome";i:1768;s:3:"Pri";i:1769;s:10:"ChapaLiMet";i:1770;s:11:"EhaNonseVot";i:1771;s:3:"Xan";i:1772;s:12:"MerocTuppWal";i:1773;s:3:"Dyn";i:1774;s:11:"MystaPseSem";i:1775;s:3:"Org";i:1776;s:13:"MelanParaWear";i:1777;s:9:"ReissUnVi";i:1778;s:2:"Me";i:1779;s:9:"JokisPrTh";i:1780;s:13:"CraEluviFlood";i:1781;s:7:"NavStee";i:1782;s:7:"PasqRep";i:1783;s:7:"FeMildh";i:1784;s:3:"Sub";i:1785;s:12:"IntMeisTetra";i:1786;s:8:"CherPrec";i:1787;s:7:"MegaSex";i:1788;s:4:"GrSp";i:1789;s:8:"PePinfSc";i:1790;s:9:"FluxTripp";i:1791;s:8:"GaliWeak";i:1792;s:3:"Req";i:1793;s:9:"InOvereRo";i:1794;s:8:"NicRamen";i:1795;s:8:"AlfMaUnd";i:1796;s:7:"NonabPi";i:1797;s:8:"ResiTing";i:1798;s:8:"GoParTub";i:1799;s:4:"Sili";i:1800;s:5:"PhPre";i:1801;s:10:"ApartTuske";i:1802;s:6:"HereRe";i:1803;s:4:"ElPr";i:1804;s:13:"HiruMonoTownw";i:1805;s:11:"ChalGuaWord";i:1806;s:11:"ChrNonpuSub";i:1807;s:11:"LazyxQuUndi";i:1808;s:4:"QuRe";i:1809;s:8:"DiGulfWi";i:1810;s:7:"PunUroc";i:1811;s:9:"CulFurHyp";i:1812;s:5:"Salty";i:1813;s:9:"PitcPoStu";i:1814;s:2:"La";i:1815;s:7:"UropZoo";i:1816;s:11:"HermiKaRoup";i:1817;s:4:"Cons";i:1818;s:10:"RapiSprTri";i:1819;s:8:"DenoMiPi";i:1820;s:8:"NairyPhy";i:1821;s:2:"Um";i:1822;s:10:"JuScopUnwi";i:1823;s:4:"Radi";i:1824;s:8:"CribExtr";i:1825;s:6:"SalThr";i:1826;s:3:"Dil";i:1827;s:7:"DefEwde";i:1828;s:9:"PalliUnac";i:1829;s:9:"SafraUnst";i:1830;s:13:"PrefSidaUnder";i:1831;s:11:"SatSporUnin";i:1832;s:5:"MoSch";i:1833;s:8:"CrRepSym";i:1834;s:2:"Pt";i:1835;s:4:"OvPr";i:1836;s:6:"DeUnab";i:1837;s:4:"Unde";i:1838;s:5:"Negro";i:1839;s:5:"MarPu";i:1840;s:5:"Ortho";i:1841;s:12:"MatroThesTra";i:1842;s:2:"Ma";i:1843;s:8:"ActFaKee";i:1844;s:12:"SalacThecUnd";i:1845;s:10:"MuMurPrein";i:1846;s:9:"PtiloTall";i:1847;s:2:"Oc";i:1848;s:10:"ScattSphen";i:1849;s:5:"MotUn";i:1850;s:7:"CuStuUn";i:1851;s:4:"Unqu";i:1852;s:4:"Decr";i:1853;s:5:"TalTr";i:1854;s:4:"Sexd";i:1855;s:7:"ShaUnmo";i:1856;s:6:"EuoNat";i:1857;s:8:"MahiSemi";i:1858;s:9:"GiglTacho";i:1859;s:10:"GneisMaulx";i:1860;s:11:"HemaLaPrors";i:1861;s:10:"FlubPacTyp";i:1862;s:9:"AlNonjTel";i:1863;s:9:"RecSuiUnc";i:1864;s:8:"ConsiSar";i:1865;s:4:"Prei";i:1866;s:4:"Lami";i:1867;s:11:"ManPelecSau";i:1868;s:5:"Ducat";i:1869;s:7:"PsSauci";i:1870;s:7:"HolTerp";i:1871;s:3:"She";i:1872;s:10:"DisDowerSt";i:1873;s:5:"Timan";i:1874;s:3:"Pal";i:1875;s:8:"QuinSuTo";i:1876;s:12:"HeathNonsuSo";i:1877;s:11:"GenMicrTeno";i:1878;s:5:"RecUn";i:1879;s:4:"Unpr";i:1880;s:7:"FlamIrr";i:1881;s:13:"DonarManaPero";i:1882;s:6:"ShTopi";i:1883;s:4:"Scit";i:1884;s:10:"OmmatScour";i:1885;s:5:"Ethen";i:1886;s:4:"Xylo";i:1887;s:5:"EryTr";i:1888;s:6:"BraHol";i:1889;s:13:"ImpalRummaVar";i:1890;s:4:"Trav";i:1891;s:11:"JotLoxUnfun";i:1892;s:8:"MuscSeme";i:1893;s:8:"GiLiPara";i:1894;s:9:"ViscoVouc";i:1895;s:3:"Scr";i:1896;s:6:"HaMaNo";i:1897;s:6:"StaSwe";i:1898;s:9:"InteRadio";i:1899;s:12:"PrThynnUnvol";i:1900;s:8:"PhilRecr";i:1901;s:9:"OmelTecpa";i:1902;s:9:"PettyUnwe";i:1903;s:5:"Melan";i:1904;s:14:"GasteQuinqTric";i:1905;s:12:"CommuDaInter";i:1906;s:5:"Megam";i:1907;s:12:"MiPickpTakam";i:1908;s:4:"Hydr";i:1909;s:4:"Torv";i:1910;s:7:"ExtiInt";i:1911;s:13:"EuphoFruOutdw";i:1912;s:5:"Tinni";i:1913;s:4:"Subs";i:1914;s:5:"OvPho";i:1915;s:11:"GlyphMonRig";i:1916;s:4:"Pion";i:1917;s:10:"IndagPieTi";i:1918;s:11:"TakiUnprUpa";i:1919;s:5:"LoVar";i:1920;s:5:"FaPla";i:1921;s:7:"MiscOns";i:1922;s:7:"DusStee";i:1923;s:9:"BeetlHang";i:1924;s:12:"FigMarmUnend";i:1925;s:5:"Fordo";i:1926;s:4:"Soci";i:1927;s:12:"HygrHypShopk";i:1928;s:11:"HabPlowWenc";i:1929;s:8:"PerSpent";i:1930;s:4:"Camp";i:1931;s:5:"PatRu";i:1932;s:8:"GhaSuthe";i:1933;s:10:"OuttPaUnim";i:1934;s:9:"StockTacc";i:1935;s:7:"InneUns";i:1936;s:4:"Trac";i:1937;s:4:"Unin";i:1938;s:8:"PolUninv";i:1939;s:9:"PheSterUn";i:1940;s:8:"DysYukia";i:1941;s:5:"PenSc";i:1942;s:7:"DaInShi";i:1943;s:14:"HepaNonshOrbic";i:1944;s:7:"PluPrPr";i:1945;s:4:"Semp";i:1946;s:3:"Unb";i:1947;s:9:"LancNonco";i:1948;s:10:"FiKlockNon";i:1949;s:4:"InSw";i:1950;s:8:"RoUnsuWi";i:1951;s:6:"ObscSe";i:1952;s:8:"ScythSub";i:1953;s:7:"HistMot";i:1954;s:5:"GoUtt";i:1955;s:5:"Inter";i:1956;s:7:"MiThUnp";i:1957;s:8:"BreComus";i:1958;s:8:"HurMemTu";i:1959;s:6:"OdylSn";i:1960;s:5:"Misec";i:1961;s:10:"PolypScler";i:1962;s:10:"OverSintTh";i:1963;s:8:"OverSexu";i:1964;s:12:"DruMagneSant";i:1965;s:10:"ParoPawPri";i:1966;s:7:"MaPrVar";i:1967;s:12:"LancNeolShas";i:1968;s:7:"SelUnsh";i:1969;s:5:"Nephr";i:1970;s:11:"NaSeismSept";i:1971;s:9:"DrivaNySi";i:1972;s:8:"PePheUnt";i:1973;s:9:"BusElSilp";i:1974;s:10:"SarclSever";i:1975;s:10:"ChirpDeEde";i:1976;s:10:"SarSigUndi";i:1977;s:8:"PyxidSup";i:1978;s:4:"Nubb";i:1979;s:8:"HederPne";i:1980;s:10:"PhthiTeneb";i:1981;s:7:"FrFreon";i:1982;s:12:"QuareResiSke";i:1983;s:6:"GangNo";i:1984;s:6:"NoonSp";i:1985;s:5:"StrUn";i:1986;s:11:"CrDarogYera";i:1987;s:9:"PhPogamPr";i:1988;s:11:"EneugInceOs";i:1989;s:5:"Carac";i:1990;s:11:"NaysaOvSupe";i:1991;s:5:"BlaHu";i:1992;s:10:"RoselUnWoo";i:1993;s:10:"CorinGraTe";i:1994;s:7:"InUnobv";i:1995;s:9:"BaChuroIn";i:1996;s:8:"MulSerol";i:1997;s:4:"Cast";i:1998;s:6:"DeQuXy";i:1999;s:8:"MiPnVeri";i:2000;s:7:"MyrStor";i:2001;s:8:"IncavZin";i:2002;s:9:"KayRulaTr";i:2003;s:3:"Ser";i:2004;s:7:"PaucRus";i:2005;s:2:"Tu";i:2006;s:9:"OddmWindb";i:2007;s:8:"UnpWhang";i:2008;s:4:"GaMe";i:2009;s:6:"MaPost";i:2010;s:7:"PomRach";i:2011;s:2:"Wy";i:2012;s:11:"MaQueeTapst";i:2013;s:5:"Denar";i:2014;s:10:"MethoSneer";i:2015;s:9:"CovaSpell";i:2016;s:8:"SlanTuis";i:2017;s:12:"ChiReprTaunt";i:2018;s:9:"LaMeasUne";i:2019;s:5:"PoPre";i:2020;s:5:"SpaSs";i:2021;s:4:"Salm";i:2022;s:5:"Endop";i:2023;s:3:"Tut";i:2024;s:6:"PeriPh";i:2025;s:13:"IrreSodaVeget";i:2026;s:5:"Locri";i:2027;s:7:"UnZooma";i:2028;s:4:"Prou";i:2029;s:5:"Outdw";i:2030;s:12:"MesneReThrou";i:2031;s:2:"Se";i:2032;s:4:"Sate";i:2033;s:4:"AtDi";i:2034;s:5:"OrPhe";i:2035;s:5:"Quond";i:2036;s:5:"Samar";i:2037;s:2:"Ke";i:2038;s:5:"Nonmu";i:2039;s:12:"ForcTaggyTea";i:2040;s:4:"Uncr";i:2041;s:5:"PlaRa";i:2042;s:7:"FeFemPr";i:2043;s:5:"ClDis";i:2044;s:14:"BackbIlluvPseu";i:2045;s:10:"BrDemiLuxu";i:2046;s:10:"GaMyoplOut";i:2047;s:14:"MeteOutwoPeriu";i:2048;s:8:"GaMycSha";i:2049;s:5:"Unapp";i:2050;s:4:"Gibb";i:2051;s:3:"Hem";i:2052;s:5:"Syngn";i:2053;s:5:"Lophi";i:2054;s:7:"OvReUnl";i:2055;s:6:"ProfWo";i:2056;s:11:"BaElasmElop";i:2057;s:2:"Eq";i:2058;s:5:"Workm";i:2059;s:9:"AppelUnic";i:2060;s:4:"Rabb";i:2061;s:8:"DovInspi";i:2062;s:5:"Katip";i:2063;s:12:"MiPortmTecto";i:2064;s:8:"ScSiVola";i:2065;s:3:"Cra";i:2066;s:14:"HexaPassaPhila";i:2067;s:9:"FrHoUndet";i:2068;s:7:"DipLint";i:2069;s:4:"IsPa";i:2070;s:3:"New";i:2071;s:3:"Ton";i:2072;s:11:"ImshMacrScr";i:2073;s:5:"Pampr";i:2074;s:9:"InnocUnch";i:2075;s:13:"LithxUnrZipsx";i:2076;s:13:"MingyUngeUnor";i:2077;s:10:"NonnoUngUn";i:2078;s:4:"Pict";i:2079;s:8:"RemeSpon";i:2080;s:4:"Plas";i:2081;s:5:"IntRu";i:2082;s:3:"Hyb";i:2083;s:3:"Tec";i:2084;s:3:"Dia";i:2085;s:4:"Unme";i:2086;s:11:"CarlDeliVam";i:2087;s:8:"NeUncrUn";i:2088;s:3:"Ker";i:2089;s:10:"ObjuProlTw";i:2090;s:8:"DeOverSu";i:2091;s:2:"An";i:2092;s:7:"GraduUn";i:2093;s:9:"PalaeSyTr";i:2094;s:3:"Sen";i:2095;s:6:"SubTet";i:2096;s:9:"MadMultSu";i:2097;s:10:"GermaUnpre";i:2098;s:10:"GibbNonsVo";i:2099;s:3:"Phr";i:2100;s:4:"Macr";i:2101;s:4:"ExUn";i:2102;s:11:"KaibMeUnpar";i:2103;s:5:"Mutil";i:2104;s:12:"PentaPoVentr";i:2105;s:3:"For";i:2106;s:10:"PedeUnciUp";i:2107;s:9:"FranTheop";i:2108;s:10:"InterJerUn";i:2109;s:6:"CyaUnt";i:2110;s:4:"Chic";i:2111;s:10:"RemTanThri";i:2112;s:4:"BeSa";i:2113;s:3:"Fec";i:2114;s:10:"CozilMoUht";i:2115;s:2:"Pa";i:2116;s:5:"Mispr";i:2117;s:4:"PrSt";i:2118;s:4:"DiHe";i:2119;s:10:"FakoMoQuix";i:2120;s:11:"PtePyrUnarr";i:2121;s:6:"PhRoSt";i:2122;s:4:"BeEn";i:2123;s:8:"GuiHypha";i:2124;s:8:"GuInoPre";i:2125;s:9:"PatRhaUnt";i:2126;s:4:"Holo";i:2127;s:8:"PrioUnme";i:2128;s:11:"GradRubytUn";i:2129;s:10:"CoeCredeSi";i:2130;s:9:"ReifUndis";i:2131;s:6:"LuVaWi";i:2132;s:7:"AnBuDia";i:2133;s:4:"Trad";i:2134;s:11:"CardOvRocks";i:2135;s:7:"UnhaWas";i:2136;s:13:"MaggeOthWilli";i:2137;s:8:"MycNoPol";i:2138;s:9:"FasGriNig";i:2139;s:6:"LanPar";i:2140;s:9:"FeoffPrSu";i:2141;s:11:"GonoGreUnco";i:2142;s:8:"SmotStom";i:2143;s:4:"Tute";i:2144;s:6:"MellRa";i:2145;s:4:"Pter";i:2146;s:9:"ThrThroTu";i:2147;s:5:"InTap";i:2148;s:7:"CollTub";i:2149;s:2:"Fa";i:2150;s:9:"PiRibbiSu";i:2151;s:7:"ExuPaSe";i:2152;s:9:"DownHoriz";i:2153;s:12:"JudicMockUnb";i:2154;s:9:"MeloSemia";i:2155;s:6:"CoFeRa";i:2156;s:5:"Macaw";i:2157;s:6:"NeurSe";i:2158;s:8:"LattSouc";i:2159;s:8:"UninWart";i:2160;s:9:"GiSubTown";i:2161;s:12:"PaveTitheUnl";i:2162;s:10:"DragsSubUn";i:2163;s:9:"SlopUncha";i:2164;s:5:"OrgTh";i:2165;s:8:"MixScole";i:2166;s:2:"Em";i:2167;s:5:"Remon";i:2168;s:2:"Bo";i:2169;s:7:"SabSupe";i:2170;s:4:"Neri";i:2171;s:5:"TuUnd";i:2172;s:9:"FlagSciss";i:2173;s:3:"Mas";i:2174;s:9:"InIsaThar";i:2175;s:11:"SemiStiThio";i:2176;s:3:"Oth";i:2177;s:10:"NeePoUnhel";i:2178;s:9:"CarInMate";i:2179;s:9:"DenuRefRi";i:2180;s:11:"ChiwColleMo";i:2181;s:12:"EquidPrecUnv";i:2182;s:6:"KrSpha";i:2183;s:10:"ShTeeTotte";i:2184;s:3:"Tou";i:2185;s:8:"IncRoUpb";i:2186;s:7:"IlMengx";i:2187;s:6:"CephSa";i:2188;s:11:"InkPhthaTet";i:2189;s:8:"IncuMoco";i:2190;s:7:"OveSeis";i:2191;s:3:"Rub";i:2192;s:12:"ObUnctiVeloc";i:2193;s:9:"OpalPodli";i:2194;s:3:"Dec";i:2195;s:8:"CymMoPyo";i:2196;s:9:"PhSpicaTr";i:2197;s:5:"Nondy";i:2198;s:4:"Roma";i:2199;s:9:"InsitSuTr";i:2200;s:3:"Poi";i:2201;s:8:"ImInhRos";i:2202;s:9:"HemoInsPr";i:2203;s:7:"RecoSan";i:2204;s:9:"IntraLepr";i:2205;s:7:"PartiRo";i:2206;s:7:"PlacPla";i:2207;s:9:"MedieSeSy";i:2208;s:4:"BaSc";i:2209;s:2:"Sk";i:2210;s:5:"UnfUn";i:2211;s:8:"CadavEpi";i:2212;s:5:"LagPh";i:2213;s:5:"MalMo";i:2214;s:8:"SpSupeUn";i:2215;s:8:"HiOgrePo";i:2216;s:2:"Ca";i:2217;s:5:"Infol";i:2218;s:10:"DyassUninu";i:2219;s:6:"UnUnsa";i:2220;s:12:"ChoSchwZarni";i:2221;s:9:"InReUnpay";i:2222;s:9:"UntrYello";i:2223;s:12:"OraOverSland";i:2224;s:6:"HePrSt";i:2225;s:10:"OpPropiQuo";i:2226;s:9:"PeriTheUn";i:2227;s:12:"AbuPhysiRheg";i:2228;s:7:"DisShad";i:2229;s:12:"CheGalyaTeax";i:2230;s:11:"CorrKaUncol";i:2231;s:9:"HypLandLu";i:2232;s:4:"Yegu";i:2233;s:4:"Prig";i:2234;s:12:"MultiTubbaVi";i:2235;s:14:"RehaSchnoStrin";i:2236;s:8:"PelSquat";i:2237;s:8:"HexRacTu";i:2238;s:12:"SemblSomeUpb";i:2239;s:11:"GymnImplOve";i:2240;s:6:"NondUn";i:2241;s:11:"HelIneStasi";i:2242;s:7:"EstelTi";i:2243;s:10:"InterPoThe";i:2244;s:5:"Degge";i:2245;s:3:"Rel";i:2246;s:4:"Rock";i:2247;s:9:"FlaGaSpas";i:2248;s:7:"MayaTel";i:2249;s:7:"EnteFic";i:2250;s:4:"Penn";i:2251;s:7:"OvUndaz";i:2252;s:5:"Spinu";i:2253;s:11:"CoPhotoRake";i:2254;s:13:"HomocUnioUnli";i:2255;s:7:"FidGirl";i:2256;s:6:"FaceSt";i:2257;s:9:"HardePyre";i:2258;s:5:"Brand";i:2259;s:5:"Enqui";i:2260;s:5:"Workl";i:2261;s:7:"HoIncom";i:2262;s:10:"SittUloUnk";i:2263;s:2:"Ps";i:2264;s:8:"PertiTra";i:2265;s:11:"EngOverTins";i:2266;s:5:"Uncom";i:2267;s:3:"Jaw";i:2268;s:7:"PiStrSy";i:2269;s:5:"Sotti";i:2270;s:14:"AnthrNonsSiusl";i:2271;s:5:"PseQu";i:2272;s:5:"Reedl";i:2273;s:8:"DikerPea";i:2274;s:6:"NoSwar";i:2275;s:10:"PonTiTrans";i:2276;s:6:"StomWh";i:2277;s:5:"Prepa";i:2278;s:11:"EctoTraWeap";i:2279;s:7:"CeJuKet";i:2280;s:7:"CaStiTo";i:2281;s:11:"CholaScalSl";i:2282;s:5:"LeSpu";i:2283;s:7:"NonexPa";i:2284;s:5:"CuUnd";i:2285;s:5:"CoHas";i:2286;s:7:"PresVet";i:2287;s:10:"EfEndotSph";i:2288;s:4:"GeHo";i:2289;s:10:"ConEnkraEx";i:2290;s:9:"SeakUrano";i:2291;s:10:"RebScutSta";i:2292;s:11:"AmetFoStaph";i:2293;s:4:"LoPu";i:2294;s:4:"Unmo";i:2295;s:12:"ChamaCufRetr";i:2296;s:9:"CuttiPoun";i:2297;s:7:"OxToote";i:2298;s:4:"Hali";i:2299;s:14:"OverSuperTickt";i:2300;s:9:"DefeElong";i:2301;s:10:"RozumTypif";i:2302;s:11:"OnomReinhUn";i:2303;s:5:"HePat";i:2304;s:6:"PrRaff";i:2305;s:7:"UrWorld";i:2306;s:12:"MacTanyoVoli";i:2307;s:6:"KeUnbe";i:2308;s:11:"FooliPeSoun";i:2309;s:8:"FiMaStra";i:2310;s:10:"PrRevuSubc";i:2311;s:3:"Kri";i:2312;s:6:"EnneMe";i:2313;s:3:"Mar";i:2314;s:10:"PaSubmeUna";i:2315;s:14:"MitiNoncaPelta";i:2316;s:7:"TroTylo";i:2317;s:4:"Curv";i:2318;s:5:"QuaTy";i:2319;s:7:"NonsaPr";i:2320;s:5:"Urete";i:2321;s:5:"Hynex";i:2322;s:5:"Tillo";i:2323;s:4:"EnMa";i:2324;s:10:"IonPresuPr";i:2325;s:9:"OverwTale";i:2326;s:9:"EnmaSenda";i:2327;s:13:"HiodTrihUnvis";i:2328;s:3:"Viz";i:2329;s:9:"NayarSuVa";i:2330;s:9:"VasoWallo";i:2331;s:8:"CrypMans";i:2332;s:9:"CondyEpip";i:2333;s:7:"GlMalle";i:2334;s:3:"Pag";i:2335;s:7:"ScUltra";i:2336;s:11:"ScholTaUnba";i:2337;s:13:"DisarGestNonc";i:2338;s:3:"Sir";i:2339;s:9:"PugmiUltr";i:2340;s:5:"Pangl";i:2341;s:8:"MetMyoge";i:2342;s:7:"HydroSp";i:2343;s:5:"Anaca";i:2344;s:6:"OrthPs";i:2345;s:5:"Nicco";i:2346;s:12:"DactTonnUnbo";i:2347;s:3:"Tox";i:2348;s:14:"ChorExcitPhaco";i:2349;s:3:"Tab";i:2350;s:10:"BasUnUnrui";i:2351;s:6:"RefUne";i:2352;s:3:"Ope";i:2353;s:9:"OverQuWar";i:2354;s:5:"Antid";i:2355;s:9:"ExFinRust";i:2356;s:14:"PuggiSecedStri";i:2357;s:7:"IriRaWa";i:2358;s:11:"MormProrPse";i:2359;s:5:"StUno";i:2360;s:7:"GastrPh";i:2361;s:2:"Li";i:2362;s:12:"NonOndiRocam";i:2363;s:7:"MollUnt";i:2364;s:2:"Ti";i:2365;s:4:"Podu";i:2366;s:5:"SanTe";i:2367;s:13:"ChieDanaiFell";i:2368;s:7:"CentFar";i:2369;s:6:"OutTab";i:2370;s:14:"MitigNoncoPiro";i:2371;s:13:"HondMarsObnun";i:2372;s:4:"Rest";i:2373;s:7:"NostrOb";i:2374;s:7:"IconLob";i:2375;s:5:"Virag";i:2376;s:9:"ImmePhane";i:2377;s:5:"Scran";i:2378;s:10:"LeNonalUnv";i:2379;s:7:"NiParUn";i:2380;s:8:"PhyTosUn";i:2381;s:12:"HydMarinSpec";i:2382;s:8:"LocSuUnv";i:2383;s:11:"LympTreUnse";i:2384;s:10:"CondxTenta";i:2385;s:8:"LerUnmis";i:2386;s:14:"GhanKeratNekto";i:2387;s:9:"InMalPrav";i:2388;s:3:"Mul";i:2389;s:8:"PilRever";i:2390;s:13:"PrepSialaTrum";i:2391;s:10:"DammKatKir";i:2392;s:11:"KnobProloRu";i:2393;s:4:"Thie";i:2394;s:3:"Win";i:2395;s:3:"Def";i:2396;s:8:"StrWanch";i:2397;s:7:"LatriRa";i:2398;s:2:"Si";i:2399;s:6:"DiSlSm";i:2400;s:9:"HoStelaUm";i:2401;s:4:"SwTe";i:2402;s:10:"LanToVaira";i:2403;s:6:"OzonTo";i:2404;s:6:"MirSci";i:2405;s:14:"DaisiMyeloUret";i:2406;s:12:"DigitMounUnt";i:2407;s:6:"UniUnm";i:2408;s:6:"HallUn";i:2409;s:3:"Rea";i:2410;s:13:"FrushLitRecry";i:2411;s:4:"JuNa";i:2412;s:6:"SeSuev";i:2413;s:7:"RunTetr";i:2414;s:12:"NoneRoenThio";i:2415;s:4:"Wolf";i:2416;s:9:"HetaJaPyl";i:2417;s:10:"DiapaUnder";i:2418;s:3:"Wra";i:2419;s:4:"Subp";i:2420;s:3:"Sal";i:2421;s:5:"Unmea";i:2422;s:12:"FittiQuinaSe";i:2423;s:8:"PseWicke";i:2424;s:12:"BlNondePlate";i:2425;s:8:"SigTyUnt";i:2426;s:3:"San";i:2427;s:8:"LocPerRx";i:2428;s:8:"SupUnsup";i:2429;s:6:"GraTri";i:2430;s:7:"BaldnLo";i:2431;s:9:"CruroUnej";i:2432;s:10:"LovesRehoo";i:2433;s:12:"HemeNomaOuth";i:2434;s:5:"Innox";i:2435;s:11:"KierRenTele";i:2436;s:9:"SolitStaw";i:2437;s:8:"CeMamUns";i:2438;s:11:"MysoiNeotQu";i:2439;s:10:"KatakTurns";i:2440;s:10:"DisprHymno";i:2441;s:4:"Regr";i:2442;s:9:"GlobaSynt";i:2443;s:3:"Lut";i:2444;s:3:"The";i:2445;s:3:"Rhi";i:2446;s:3:"Tym";i:2447;s:7:"MeUnman";i:2448;s:9:"ExiOmnTor";i:2449;s:12:"PerfeStiSton";i:2450;s:6:"HoPrUn";i:2451;s:10:"IrSeptaTam";i:2452;s:10:"FoParTechn";i:2453;s:4:"Spha";i:2454;s:12:"StupUnflaVie";i:2455;s:7:"LoneVan";i:2456;s:8:"MonRadio";i:2457;s:10:"HomImpSynd";i:2458;s:2:"Ch";i:2459;s:9:"EnOrPoeta";i:2460;s:10:"CoSeminSen";i:2461;s:7:"ProidVe";i:2462;s:6:"MeShor";i:2463;s:4:"Hois";i:2464;s:9:"EyeMePoli";i:2465;s:3:"Rei";i:2466;s:5:"Zoste";i:2467;s:8:"SithUnwa";i:2468;s:5:"Corre";i:2469;s:9:"SilTriUnv";i:2470;s:9:"CompMysta";i:2471;s:7:"HepMuSu";i:2472;s:6:"OpeQua";i:2473;s:4:"Rema";i:2474;s:11:"DeclMassiUn";i:2475;s:3:"Lep";i:2476;s:8:"NecrPhth";i:2477;s:4:"Trir";i:2478;s:8:"MesoWelc";i:2479;s:4:"Vulp";i:2480;s:7:"LindPhr";i:2481;s:7:"EntirMo";i:2482;s:9:"RiSlaTaun";i:2483;s:8:"PreToufi";i:2484;s:9:"PalaSovra";i:2485;s:5:"Penni";i:2486;s:12:"NonprProcRad";i:2487;s:8:"PantRogu";i:2488;s:8:"ForeScom";i:2489;s:2:"Yo";i:2490;s:9:"LiOutUnti";i:2491;s:6:"PostSt";i:2492;s:10:"SpiSyUntuc";i:2493;s:7:"AlquiRh";i:2494;s:12:"PaloSkeldTir";i:2495;s:8:"BiflaUnr";i:2496;s:9:"LacRhuWin";i:2497;s:5:"Unres";i:2498;s:7:"PoPsilo";i:2499;s:3:"Obe";i:2500;s:5:"Nonin";i:2501;s:7:"UncaUnh";i:2502;s:5:"Undiv";i:2503;s:9:"InIzMorin";i:2504;s:7:"NoPicPi";i:2505;s:13:"PediPoltThiof";i:2506;s:4:"Scap";i:2507;s:11:"CoMesorTact";i:2508;s:10:"DeepPikePr";i:2509;s:8:"OmbroQui";i:2510;s:5:"InePo";i:2511;s:10:"PaPolyzWea";i:2512;s:10:"GhiziPosne";i:2513;s:5:"Nonde";i:2514;s:10:"RachyStaph";i:2515;s:9:"NorProtRh";i:2516;s:11:"ConflElusSt";i:2517;s:9:"OliSaraTa";i:2518;s:5:"Spath";i:2519;s:9:"HetIreUnr";i:2520;s:9:"GigeHoUro";i:2521;s:6:"NonSex";i:2522;s:9:"DrawIreni";i:2523;s:7:"HacMars";i:2524;s:10:"DenRaSoros";i:2525;s:10:"HolHypSupe";i:2526;s:4:"Cred";i:2527;s:5:"StUns";i:2528;s:8:"FictWagw";i:2529;s:3:"Unc";i:2530;s:9:"ShoreWhit";i:2531;s:11:"ProRehaTras";i:2532;s:5:"UnUph";i:2533;s:10:"MoPneumPsi";i:2534;s:12:"RabbSomnUnti";i:2535;s:11:"SplenTheUnb";i:2536;s:3:"Par";i:2537;s:10:"DyaFisQuin";i:2538;s:6:"LoUncl";i:2539;s:11:"DicOvariVar";i:2540;s:8:"PreSciSc";i:2541;s:8:"HarHiMor";i:2542;s:11:"QuadrSawaSi";i:2543;s:6:"SuThim";i:2544;s:5:"Vulva";i:2545;s:3:"Hou";i:2546;s:3:"Mer";i:2547;s:8:"GiInPaga";i:2548;s:2:"Co";i:2549;s:10:"PseudRenun";i:2550;s:13:"MiskMortaTana";i:2551;s:7:"OmTerro";i:2552;s:7:"ExUnbex";i:2553;s:5:"Micro";i:2554;s:11:"DenuObsSemi";i:2555;s:11:"BursDiRenea";i:2556;s:3:"Zym";i:2557;s:9:"BunNoWitt";i:2558;s:5:"Misqu";i:2559;s:4:"LaPl";i:2560;s:6:"IndKin";i:2561;s:10:"TriUnmVent";i:2562;s:10:"MoOvePlant";i:2563;s:5:"Verbe";i:2564;s:5:"CutSc";i:2565;s:9:"UnbeVigor";i:2566;s:9:"ListUnder";i:2567;s:10:"PtilSegrSt";i:2568;s:9:"GruelNaso";i:2569;s:5:"Nudis";i:2570;s:13:"LithPhrasRest";i:2571;s:10:"HyPonUngra";i:2572;s:8:"ParPrese";i:2573;s:2:"Pu";i:2574;s:7:"SeSweUn";i:2575;s:4:"Stop";i:2576;s:11:"EntSynTechn";i:2577;s:14:"OverpTrachUneq";i:2578;s:10:"SteenUtter";i:2579;s:12:"FlorMediUnco";i:2580;s:11:"CoCyancNigg";i:2581;s:4:"Sexu";i:2582;s:11:"BignoErStom";i:2583;s:12:"BiggeMyrSupe";i:2584;s:5:"Tinti";i:2585;s:9:"PhilaSubc";i:2586;s:8:"CouPoeti";i:2587;s:13:"DockeIriMisti";i:2588;s:11:"GramOlPityp";i:2589;s:13:"DisEvoluMycod";i:2590;s:5:"Morph";i:2591;s:2:"Ou";i:2592;s:5:"ProUn";i:2593;s:4:"Dulc";i:2594;s:7:"LongaSp";i:2595;s:8:"PolPulUn";i:2596;s:8:"BuDiInco";i:2597;s:6:"ChaiDe";i:2598;s:11:"PacabUnUnsh";i:2599;s:10:"ArthrUninv";i:2600;s:6:"PyroRo";i:2601;s:7:"VulgaYi";i:2602;s:5:"EcLio";i:2603;s:11:"EranIncouOr";i:2604;s:12:"LunuModulOrd";i:2605;s:5:"Patri";i:2606;s:2:"Dr";i:2607;s:7:"RaTrans";i:2608;s:12:"CompoLipScot";i:2609;s:10:"SardoSensa";i:2610;s:12:"OverlSupWrin";i:2611;s:9:"PhotSperm";i:2612;s:7:"TimekUn";i:2613;s:5:"Pusey";i:2614;s:7:"PoQuSou";i:2615;s:6:"FreeGr";i:2616;s:4:"Nona";i:2617;s:6:"PsilUn";i:2618;s:7:"DiseSta";i:2619;s:5:"Eluso";i:2620;s:7:"EndabFr";i:2621;s:7:"EntMaTe";i:2622;s:5:"UndUn";i:2623;s:8:"FrStavUn";i:2624;s:6:"DisSyn";i:2625;s:3:"Tub";i:2626;s:11:"BescDeRenas";i:2627;s:12:"RabbiReSuper";i:2628;s:4:"Bolo";i:2629;s:10:"NonaPectPh";i:2630;s:12:"PolymRoomtUn";i:2631;s:11:"KolTypWirem";i:2632;s:7:"CroPrae";i:2633;s:7:"SubWarr";i:2634;s:6:"SteTro";i:2635;s:7:"BaForel";i:2636;s:6:"OppiWh";i:2637;s:9:"GleanSacc";i:2638;s:10:"MisliQueru";i:2639;s:8:"ScaWoodb";i:2640;s:3:"Equ";i:2641;s:10:"NeocyUnwov";i:2642;s:13:"CoacElectUnsp";i:2643;s:4:"Unch";i:2644;s:7:"BrUncom";i:2645;s:5:"Tanni";i:2646;s:10:"CuLeiOcclu";i:2647;s:3:"Soa";i:2648;s:11:"MyxoPoUnbeg";i:2649;s:12:"PhysiTrUnexi";i:2650;s:6:"InSice";i:2651;s:7:"NonPauc";i:2652;s:6:"SecuUl";i:2653;s:10:"HornOutOut";i:2654;s:6:"OpprOv";i:2655;s:10:"BaHypStich";i:2656;s:9:"HemoaIcTi";i:2657;s:4:"Zeug";i:2658;s:4:"Sphy";i:2659;s:5:"Shaka";i:2660;s:6:"PaPrSc";i:2661;s:5:"Unrel";i:2662;s:9:"ReSmintTw";i:2663;s:2:"Ku";i:2664;s:4:"Botu";i:2665;s:9:"TrulUnext";i:2666;s:9:"CoglWhite";i:2667;s:5:"Curle";i:2668;s:10:"InMinSince";i:2669;s:11:"NoRachTrans";i:2670;s:11:"RolexUnflZo";i:2671;s:7:"KoSwiUm";i:2672;s:9:"SemiUncUn";i:2673;s:7:"AdBosVe";i:2674;s:12:"CamphPePrein";i:2675;s:7:"PygmoSe";i:2676;s:7:"InMorco";i:2677;s:7:"OcOffen";i:2678;s:5:"Speck";i:2679;s:4:"Till";i:2680;s:11:"BestrUnWorc";i:2681;s:8:"OlOveSyn";i:2682;s:10:"UnsocWound";i:2683;s:6:"ReprSu";i:2684;s:7:"RemigUn";i:2685;s:12:"GeorOutmServ";i:2686;s:3:"Pac";i:2687;s:12:"LePerseSerop";i:2688;s:11:"FeverNonWav";i:2689;s:5:"BaBac";i:2690;s:9:"DragGaSan";i:2691;s:8:"UnforYar";i:2692;s:4:"Vent";i:2693;s:7:"BluSlug";i:2694;s:6:"OverSp";i:2695;s:12:"DiuHypoProto";i:2696;s:7:"ReUndes";i:2697;s:8:"PolUnimp";i:2698;s:5:"Unsmo";i:2699;s:9:"CuriaSulf";i:2700;s:11:"SyntToTreas";i:2701;s:13:"SaproSyceeTen";i:2702;s:5:"Thuoc";i:2703;s:6:"BroHol";i:2704;s:13:"MetaMothwVili";i:2705;s:10:"LeStuUnioc";i:2706;s:12:"PitheTeTrigo";i:2707;s:5:"LowMe";i:2708;s:12:"SoStahlTomme";i:2709;s:8:"PothSpTe";i:2710;s:11:"MultPhytoUn";i:2711;s:4:"Note";i:2712;s:13:"SuluSynanViol";i:2713;s:9:"SeapUnsta";i:2714;s:3:"Nin";i:2715;s:3:"Lat";i:2716;s:11:"BiopDespeEt";i:2717;s:9:"FiSuperVo";i:2718;s:5:"Cereb";i:2719;s:10:"BoNonbUnde";i:2720;s:2:"Lu";i:2721;s:10:"PrerPsyWhe";i:2722;s:11:"MeReferShee";i:2723;s:12:"GrosInvitUna";i:2724;s:8:"SarrSeri";i:2725;s:4:"Rags";i:2726;s:2:"Sm";i:2727;s:5:"Unint";i:2728;s:3:"Gut";i:2729;s:9:"InteMyPyr";i:2730;s:7:"IsoloUn";i:2731;s:5:"SiUnb";i:2732;s:10:"BlCanniEqu";i:2733;s:5:"Konar";i:2734;s:4:"Step";i:2735;s:6:"InteNa";i:2736;s:7:"KnaSubc";i:2737;s:9:"ChaUnaUnc";i:2738;s:6:"LaNeUp";i:2739;s:3:"Reb";i:2740;s:9:"DiscPePot";i:2741;s:8:"NonNonVi";i:2742;s:4:"Tata";i:2743;s:4:"Cent";i:2744;s:7:"HandPho";i:2745;s:11:"GazetMenWoa";i:2746;s:9:"PolyPredi";i:2747;s:12:"LaboPreScase";i:2748;s:7:"PaTheTh";i:2749;s:14:"DeafDiaclSides";i:2750;s:4:"Dixi";i:2751;s:8:"MiscUnpo";i:2752;s:9:"RepShaUpt";i:2753;s:13:"GaberJewdPont";i:2754;s:6:"DyoInc";i:2755;s:11:"FanaOeQuinq";i:2756;s:6:"ChThre";i:2757;s:4:"Orth";i:2758;s:9:"LaborMiSp";i:2759;s:6:"DeNavi";i:2760;s:10:"RioShSwain";i:2761;s:3:"Men";i:2762;s:4:"Ghib";i:2763;s:9:"SunpTrust";i:2764;s:5:"Feloi";i:2765;s:9:"NotorOiko";i:2766;s:5:"Laryn";i:2767;s:5:"Wishf";i:2768;s:10:"DoMultiUne";i:2769;s:4:"Unow";i:2770;s:10:"DumpiEvePy";i:2771;s:14:"OctonTwelUnman";i:2772;s:11:"NasSterXylo";i:2773;s:8:"CompOppu";i:2774;s:9:"CoalEnure";i:2775;s:4:"Suba";i:2776;s:5:"Histo";i:2777;s:12:"PaPsidiTooth";i:2778;s:5:"Tubul";i:2779;s:4:"Outg";i:2780;s:5:"HolNi";i:2781;s:2:"El";i:2782;s:11:"SpurnSuUnst";i:2783;s:3:"Soc";i:2784;s:7:"MachSyn";i:2785;s:12:"LoriPraePren";i:2786;s:7:"ProTric";i:2787;s:5:"Disre";i:2788;s:11:"IntePseuXen";i:2789;s:3:"Sei";i:2790;s:4:"Refl";i:2791;s:11:"MisomSperUn";i:2792;s:9:"RetraVaca";i:2793;s:6:"PolyRe";i:2794;s:12:"GrizzImpSnow";i:2795;s:8:"NumUroxa";i:2796;s:4:"LePa";i:2797;s:3:"Qua";i:2798;s:14:"InvolSearSemio";i:2799;s:6:"LeStan";i:2800;s:10:"SantaStaph";i:2801;s:4:"Imag";i:2802;s:9:"PreRakiSu";i:2803;s:13:"DegeTrigoUnch";i:2804;s:8:"FracUngr";i:2805;s:12:"EzrFlukShast";i:2806;s:10:"PlaneSteth";i:2807;s:8:"PresiUnd";i:2808;s:9:"BroDrivIn";i:2809;s:4:"Vice";i:2810;s:3:"Mah";i:2811;s:4:"AcXy";i:2812;s:10:"IsrMegaUst";i:2813;s:9:"PeriReaTr";i:2814;s:10:"CoOswaZami";i:2815;s:5:"JacUn";i:2816;s:9:"FaLeanPar";i:2817;s:14:"EngauInerrSpha";i:2818;s:5:"Sager";i:2819;s:13:"SteeSubwUnpry";i:2820;s:9:"RhagoStag";i:2821;s:4:"Plag";i:2822;s:4:"Sens";i:2823;s:11:"MonTylosWoo";i:2824;s:5:"Toxop";i:2825;s:4:"MiMn";i:2826;s:6:"PhlePy";i:2827;s:14:"LatoPeramUpval";i:2828;s:10:"PerStTarox";i:2829;s:5:"Thero";i:2830;s:9:"ForHaPras";i:2831;s:6:"PeTubi";i:2832;s:13:"DiffeIneVesic";i:2833;s:10:"NonveTeneb";i:2834;s:6:"TauUna";i:2835;s:14:"JeronUncuUntha";i:2836;s:5:"Telem";i:2837;s:9:"BargHaSul";i:2838;s:11:"InartMelaSt";i:2839;s:5:"Confe";i:2840;s:9:"MobPseTen";i:2841;s:4:"Obst";i:2842;s:9:"IvanPedan";i:2843;s:5:"Noctu";i:2844;s:8:"MythTiUn";i:2845;s:13:"ParlaQuadRash";i:2846;s:10:"CyOpiloPre";i:2847;s:13:"OsteUngyvUnsp";i:2848;s:5:"StZoo";i:2849;s:4:"Slid";i:2850;s:9:"ParRuVibr";i:2851;s:14:"EndoImposSubmi";i:2852;s:7:"SpiUnUn";i:2853;s:7:"PreRais";i:2854;s:9:"EpigMyxVo";i:2855;s:5:"ReUnd";i:2856;s:9:"RusSheUnm";i:2857;s:6:"PretWr";i:2858;s:3:"Hom";i:2859;s:6:"GrSini";i:2860;s:11:"ColeNonvPos";i:2861;s:3:"Tor";i:2862;s:8:"CraMonoc";i:2863;s:15:"MisfoPrestSaliv";i:2864;s:7:"NonWaho";i:2865;s:12:"GlanReliSeax";i:2866;s:10:"BrNonpUnse";i:2867;s:7:"TarocTh";i:2868;s:3:"Ora";i:2869;s:8:"GrudgPra";i:2870;s:6:"PeSnUn";i:2871;s:13:"LigniMicroUnc";i:2872;s:7:"ClogHor";i:2873;s:10:"MiserRebUn";i:2874;s:10:"EntSpeSple";i:2875;s:10:"ColleGuard";i:2876;s:5:"Totte";i:2877;s:8:"IsataTax";i:2878;s:8:"NonWorra";i:2879;s:5:"Unsha";i:2880;s:10:"EuStanxUne";i:2881;s:3:"Pin";i:2882;s:4:"MoSe";i:2883;s:5:"WeaWh";i:2884;s:7:"ProviRa";i:2885;s:11:"PreTibiUnin";i:2886;s:11:"MyeloUnsUnt";i:2887;s:9:"InspiStee";i:2888;s:5:"Sensu";i:2889;s:9:"StufSwerv";i:2890;s:2:"Sy";i:2891;s:11:"GunnHaiTrun";i:2892;s:7:"NeopPre";i:2893;s:11:"BitMooncTip";i:2894;s:4:"Unso";i:2895;s:12:"MajPhlebSpin";i:2896;s:5:"Furil";i:2897;s:5:"Sledf";i:2898;s:10:"LadylMaSac";i:2899;s:10:"ChMylioSen";i:2900;s:9:"IxParaUre";i:2901;s:9:"DoMedalUn";i:2902;s:6:"OuUnsa";i:2903;s:8:"DouNonax";i:2904;s:4:"Univ";i:2905;s:4:"Moly";i:2906;s:9:"MonitPeda";i:2907;s:9:"CelaLunul";i:2908;s:8:"AnDenaMe";i:2909;s:6:"IrTerr";i:2910;s:3:"Usu";i:2911;s:7:"UnfoUnv";i:2912;s:7:"JudMono";i:2913;s:14:"PentRagsoUnimb";i:2914;s:9:"ReTransWh";i:2915;s:14:"EquisHornsInco";i:2916;s:12:"HukxOligiSup";i:2917;s:9:"PhSpSuper";i:2918;s:11:"SemUndaUnpr";i:2919;s:4:"Self";i:2920;s:11:"FleeMatePro";i:2921;s:6:"SupWor";i:2922;s:5:"Unben";i:2923;s:9:"MemorTach";i:2924;s:6:"SegUns";i:2925;s:10:"CoDisplSod";i:2926;s:7:"EleSple";i:2927;s:8:"PolyUror";i:2928;s:3:"Yal";i:2929;s:5:"JiTri";i:2930;s:10:"TaiThyroUn";i:2931;s:4:"Wath";i:2932;s:7:"EquiRep";i:2933;s:10:"ShimSubUnd";i:2934;s:6:"HasSan";i:2935;s:5:"HemUt";i:2936;s:4:"Spiv";i:2937;s:10:"MunycPhary";i:2938;s:8:"LargOver";i:2939;s:6:"OveSab";i:2940;s:14:"AulosLarxTraga";i:2941;s:9:"DePubesZa";i:2942;s:9:"LutSeYaki";i:2943;s:8:"PoSphaTh";i:2944;s:3:"Igl";i:2945;s:5:"Contr";i:2946;s:10:"PolysRamSu";i:2947;s:5:"Unack";i:2948;s:10:"AnCapsHyda";i:2949;s:6:"PoeSli";i:2950;s:6:"SausUn";i:2951;s:12:"PostgStaghWi";i:2952;s:8:"TetrTita";i:2953;s:14:"MendaPostScran";i:2954;s:9:"CharaSeag";i:2955;s:8:"HexSpodi";i:2956;s:5:"Quadr";i:2957;s:8:"SubpSwea";i:2958;s:9:"DoNicoTer";i:2959;s:7:"MilliSl";i:2960;s:13:"HelpPneumSlim";i:2961;s:6:"ToeUrb";i:2962;s:10:"DiMaionVen";i:2963;s:7:"PestePo";i:2964;s:7:"LiyPura";i:2965;s:10:"SparlTrian";i:2966;s:5:"BraGa";i:2967;s:7:"FrontRe";i:2968;s:5:"Unall";i:2969;s:5:"Diape";i:2970;s:8:"EscIdiot";i:2971;s:5:"Salam";i:2972;s:13:"CommHypeInest";i:2973;s:4:"Wors";i:2974;s:7:"ReinfSa";i:2975;s:8:"ResciTre";i:2976;s:10:"PiStaurSup";i:2977;s:8:"PorraUpl";i:2978;s:8:"StocUnki";i:2979;s:4:"IsSe";i:2980;s:11:"SattTaTrans";i:2981;s:3:"Mel";i:2982;s:11:"UnanUnUnexp";i:2983;s:5:"Green";i:2984;s:13:"SokemStulWape";i:2985;s:6:"TacoVe";i:2986;s:5:"Coral";i:2987;s:13:"ChoroDipicShr";i:2988;s:11:"PseSterTepe";i:2989;s:6:"OverRe";i:2990;s:10:"FreehMonPo";i:2991;s:12:"KreiLocaPlas";i:2992;s:9:"HurMorPty";i:2993;s:10:"DaSeqTirre";i:2994;s:13:"HypsiReproUre";i:2995;s:5:"Subno";i:2996;s:5:"Outpo";i:2997;s:10:"AndSevenVo";i:2998;s:5:"Vehmi";i:2999;s:3:"Vet";i:3000;s:5:"Proto";i:3001;s:5:"Unbri";i:3002;s:4:"Spie";i:3003;s:11:"ClaColobWhe";i:3004;s:4:"MeSy";i:3005;s:7:"ForSuXy";i:3006;s:11:"ChaKukPrior";i:3007;s:5:"Draco";i:3008;s:5:"Stair";i:3009;s:3:"Len";i:3010;s:4:"Saga";i:3011;s:9:"PyrroReTy";i:3012;s:4:"Nigg";i:3013;s:6:"ProSki";i:3014;s:8:"AutoPeri";i:3015;s:12:"NitroPieTric";i:3016;s:5:"StaTu";i:3017;s:3:"Rec";i:3018;s:4:"Pall";i:3019;s:12:"PreceShamUpl";i:3020;s:7:"CoviWag";i:3021;s:6:"ImTran";i:3022;s:13:"MandaStageUnf";i:3023;s:9:"SemisXero";i:3024;s:3:"Eso";i:3025;s:7:"FumatTr";i:3026;s:4:"Weev";i:3027;s:8:"IntraOst";i:3028;s:11:"GaNeurUngel";i:3029;s:7:"UnUnUnp";i:3030;s:5:"SiTan";i:3031;s:5:"FlPhy";i:3032;s:10:"GmeRubWarl";i:3033;s:9:"CayapTerm";i:3034;s:10:"MoRefinVau";i:3035;s:5:"Phosp";i:3036;s:12:"EligiHexUnkn";i:3037;s:6:"OvUnor";i:3038;s:5:"Verbi";i:3039;s:4:"Wind";i:3040;s:6:"BoroPh";i:3041;s:12:"MesoRudSinec";i:3042;s:10:"DisHemaJam";i:3043;s:8:"ReSiphSt";i:3044;s:4:"Pret";i:3045;s:4:"Pros";i:3046;s:8:"GlaObstu";i:3047;s:8:"JouPaPip";i:3048;s:8:"PunUndef";i:3049;s:5:"Ultra";i:3050;s:3:"Pur";i:3051;s:12:"MisMockxNomo";i:3052;s:12:"TactThacUnhe";i:3053;s:8:"PostSund";i:3054;s:9:"QuadrSavi";i:3055;s:7:"RecTepi";i:3056;s:12:"RutteTeUnplu";i:3057;s:6:"EncPar";i:3058;s:6:"ElSexu";i:3059;s:5:"MonSe";i:3060;s:4:"Velo";i:3061;s:10:"IthaTropUn";i:3062;s:9:"DuffTaute";i:3063;s:9:"ThesaTrUn";i:3064;s:5:"Unson";i:3065;s:14:"HumisKensiPanp";i:3066;s:9:"NectShTil";i:3067;s:4:"Pais";i:3068;s:8:"FeatSemi";i:3069;s:3:"Scu";i:3070;s:11:"DispePhWavy";i:3071;s:9:"ReSexivSp";i:3072;s:12:"NonfeNonlaPh";i:3073;s:9:"CuForYipx";i:3074;s:5:"DiHap";i:3075;s:11:"OversPhytSp";i:3076;s:8:"OrthScor";i:3077;s:3:"Ofo";i:3078;s:6:"MyoPic";i:3079;s:9:"CarLeNaos";i:3080;s:8:"PalmSati";i:3081;s:9:"SpokUnimo";i:3082;s:5:"Gorin";i:3083;s:9:"DyOligUnc";i:3084;s:9:"PhorSpaeb";i:3085;s:9:"ParaSumpt";i:3086;s:11:"CloConDidym";i:3087;s:11:"MenUnaWanto";i:3088;s:5:"Tetra";i:3089;s:7:"PreTurn";i:3090;s:8:"SliTitiv";i:3091;s:8:"HowisUns";i:3092;s:12:"MemPlantUnce";i:3093;s:11:"OstePindSuc";i:3094;s:12:"NonPhycSpect";i:3095;s:4:"Pogo";i:3096;s:2:"Ex";i:3097;s:4:"SaSt";i:3098;s:14:"SeedxSheexSupe";i:3099;s:5:"Fring";i:3100;s:13:"ExcoUndefUnev";i:3101;s:6:"IrRamx";i:3102;s:3:"Rab";i:3103;s:2:"Oe";i:3104;s:8:"UnevZhmu";i:3105;s:5:"OutPr";i:3106;s:3:"Ger";i:3107;s:6:"MesVer";i:3108;s:9:"FuchTidel";i:3109;s:10:"ChRetUnter";i:3110;s:4:"Mall";i:3111;s:10:"ReddySanda";i:3112;s:3:"Ido";i:3113;s:12:"FonSylviUnha";i:3114;s:10:"SamsoTrans";i:3115;s:6:"OrchTe";i:3116;s:10:"NotSemUnse";i:3117;s:4:"Ultr";i:3118;s:4:"PoUn";i:3119;s:8:"TransVal";i:3120;s:8:"FuciGlob";i:3121;s:7:"ScotTet";i:3122;s:15:"RicheRonsdWindo";i:3123;s:5:"Steel";i:3124;s:5:"Semif";i:3125;s:6:"SupUpw";i:3126;s:4:"Bedp";i:3127;s:13:"DagDispiUnsen";i:3128;s:3:"Coa";i:3129;s:12:"JetPedalSego";i:3130;s:4:"Lion";i:3131;s:11:"CymSnipjTeu";i:3132;s:4:"Prop";i:3133;s:7:"NeuroYi";i:3134;s:9:"MasMeTrom";i:3135;s:10:"EthylLoRef";i:3136;s:10:"CombDogSpi";i:3137;s:8:"FrLoMidm";i:3138;s:4:"Myog";i:3139;s:9:"PrScleSub";i:3140;s:13:"RefTuboaUnsor";i:3141;s:9:"EvasiStei";i:3142;s:9:"SpUnValix";i:3143;s:5:"Spira";i:3144;s:4:"EuPs";i:3145;s:9:"HardPenna";i:3146;s:5:"Wonde";i:3147;s:12:"NeonVocXipho";i:3148;s:10:"ChalJuckRe";i:3149;s:8:"DeopMadd";i:3150;s:4:"Grea";i:3151;s:3:"Tik";i:3152;s:5:"SuTar";i:3153;s:9:"LimacScTo";i:3154;s:13:"OverpPenxUnci";i:3155;s:5:"Rimpi";i:3156;s:4:"PySa";i:3157;s:10:"HydLamaiSq";i:3158;s:12:"HyReserSpiro";i:3159;s:11:"BeaBothDrif";i:3160;s:10:"PlRhiSikar";i:3161;s:4:"Olid";i:3162;s:7:"DiSperm";i:3163;s:4:"Prel";i:3164;s:5:"Mioce";i:3165;s:5:"Nonim";i:3166;s:5:"Prize";i:3167;s:7:"StasVul";i:3168;s:10:"PreliWoods";i:3169;s:3:"Rif";i:3170;s:3:"Bur";i:3171;s:13:"PleurUncluVes";i:3172;s:6:"RefSam";i:3173;s:8:"TickeXer";i:3174;s:4:"Unla";i:3175;s:7:"HyPelec";i:3176;s:12:"ForHumbuMalm";i:3177;s:9:"FuOrbitPh";i:3178;s:7:"FerFoRe";i:3179;s:4:"CoVe";i:3180;s:6:"NuncSu";i:3181;s:7:"CuUnfor";i:3182;s:11:"DemoPerStru";i:3183;s:6:"ReevUn";i:3184;s:9:"UndeWhelk";i:3185;s:4:"FuTu";i:3186;s:5:"Ithom";i:3187;s:5:"Sopex";i:3188;s:7:"InSpeci";i:3189;s:5:"Nontu";i:3190;s:6:"HomPre";i:3191;s:10:"InteMyceSu";i:3192;s:9:"CelLoSlac";i:3193;s:4:"Piny";i:3194;s:13:"HeterSpionTur";i:3195;s:4:"Slot";i:3196;s:8:"MetPresh";i:3197;s:13:"DisiNonnuVert";i:3198;s:9:"ArOdonWhi";i:3199;s:8:"InInteMe";i:3200;s:4:"Weat";i:3201;s:9:"GaUnsupUn";i:3202;s:7:"PrisoSh";i:3203;s:10:"IndiLycMol";i:3204;s:7:"PaRehUn";i:3205;s:7:"PollPro";i:3206;s:3:"Gro";i:3207;s:4:"Past";i:3208;s:10:"LambsPanty";i:3209;s:9:"ImpliProc";i:3210;s:5:"Cried";i:3211;s:6:"CycaUn";i:3212;s:14:"KeaxScreeUnlet";i:3213;s:8:"NundRevo";i:3214;s:12:"MadSherWeebl";i:3215;s:2:"Hi";i:3216;s:11:"RajaUnWokex";i:3217;s:12:"PseudRiviSte";i:3218;s:7:"FlaPaUn";i:3219;s:3:"Tax";i:3220;s:4:"PhPu";i:3221;s:11:"GraPsammStr";i:3222;s:14:"CelluEquiRailb";i:3223;s:7:"CongKer";i:3224;s:7:"MagnePs";i:3225;s:13:"NovelSeqSignl";i:3226;s:10:"DauncFoute";i:3227;s:11:"ArianPucRig";i:3228;s:10:"AlaCapThir";i:3229;s:7:"ConteDe";i:3230;s:12:"RupRuskySpri";i:3231;s:8:"FreUncon";i:3232;s:8:"HxLonYvo";i:3233;s:9:"PeriaStag";i:3234;s:2:"Op";i:3235;s:6:"LibiVa";i:3236;s:7:"PouTumu";i:3237;s:5:"Unerr";i:3238;s:7:"OblOrch";i:3239;s:8:"CountUng";i:3240;s:10:"NordiUneas";i:3241;s:9:"CtOrtSail";i:3242;s:5:"Roomm";i:3243;s:4:"Fant";i:3244;s:3:"Gan";i:3245;s:6:"PeUnle";i:3246;s:8:"MuPolRok";i:3247;s:9:"DrawHyper";i:3248;s:13:"EpiMaywiNotho";i:3249;s:7:"LySaxTe";i:3250;s:6:"NoncRh";i:3251;s:6:"FoUnsh";i:3252;s:3:"Sym";i:3253;s:11:"DiaOveThraw";i:3254;s:8:"CycloSem";i:3255;s:8:"PanjaThe";i:3256;s:2:"Ri";i:3257;s:5:"SuUnm";i:3258;s:9:"ArCoPirop";i:3259;s:9:"GoffLibMa";i:3260;s:10:"InsepTalpa";i:3261;s:4:"Steg";i:3262;s:5:"Renai";i:3263;s:9:"SubUnUnwi";i:3264;s:9:"PerPersQu";i:3265;s:5:"DisHo";i:3266;s:4:"Test";i:3267;s:8:"OpenhShi";i:3268;s:4:"SaTe";i:3269;s:5:"SarVe";i:3270;s:8:"PrSpVisi";i:3271;s:9:"KeLoloxRe";i:3272;s:3:"Exe";i:3273;s:4:"Plet";i:3274;s:3:"Uno";i:3275;s:5:"Overr";i:3276;s:7:"MyQuadr";i:3277;s:8:"MacSemSo";i:3278;s:11:"EgghoFeThur";i:3279;s:9:"GaNeTickl";i:3280;s:10:"CafEnlUnpr";i:3281;s:7:"CroScap";i:3282;s:12:"EspaNonmValv";i:3283;s:7:"ParaUnb";i:3284;s:3:"Tal";i:3285;s:9:"CysDitNon";i:3286;s:5:"Unsan";i:3287;s:5:"GlyRe";i:3288;s:4:"Tent";i:3289;s:3:"Bio";i:3290;s:9:"MeSpielUn";i:3291;s:12:"GrufRewoUnch";i:3292;s:5:"EumSe";i:3293;s:3:"Mog";i:3294;s:7:"SoUnswa";i:3295;s:9:"RidSpXero";i:3296;s:4:"Pock";i:3297;s:5:"Steno";i:3298;s:9:"EndMiliVi";i:3299;s:6:"EvocRh";i:3300;s:8:"JoQuisUn";i:3301;s:4:"Gemm";i:3302;s:7:"PinSoma";i:3303;s:6:"JubMul";i:3304;s:10:"BecivBrent";i:3305;s:9:"JaunSynco";i:3306;s:10:"KenMalSure";i:3307;s:8:"SeTriaWo";i:3308;s:9:"ScTriUpal";i:3309;s:10:"FeMycoZucc";i:3310;s:7:"FeUntru";i:3311;s:10:"ScathWeath";i:3312;s:5:"Knubb";i:3313;s:5:"OvUnu";i:3314;s:11:"DoNonliUnre";i:3315;s:5:"Relie";i:3316;s:4:"Must";i:3317;s:4:"PaRe";i:3318;s:2:"Il";i:3319;s:9:"DartPaTat";i:3320;s:5:"KilPr";i:3321;s:4:"DoMi";i:3322;s:7:"ScoSuff";i:3323;s:5:"PirSi";i:3324;s:4:"Rota";i:3325;s:3:"Wad";i:3326;s:14:"InfaMesolMonoh";i:3327;s:7:"RigidUn";i:3328;s:10:"RosSimilUn";i:3329;s:3:"Thr";i:3330;s:9:"DecolDupl";i:3331;s:11:"DialGlazePr";i:3332;s:6:"FunUnt";i:3333;s:6:"ScSemi";i:3334;s:4:"Elec";i:3335;s:14:"HeauLargeUpsta";i:3336;s:7:"SpUptra";i:3337;s:3:"Sno";i:3338;s:7:"NoNontr";i:3339;s:7:"DubTurb";i:3340;s:9:"MilkSupra";i:3341;s:7:"PhiPySu";i:3342;s:14:"NightPerioRect";i:3343;s:4:"EuMe";i:3344;s:12:"FuliLutePros";i:3345;s:12:"AutDeroEyoty";i:3346;s:10:"HulPrusSpu";i:3347;s:7:"PatWeez";i:3348;s:5:"Fragm";i:3349;s:6:"NuTigx";i:3350;s:6:"InfUlt";i:3351;s:6:"CoSubj";i:3352;s:8:"GreHyLea";i:3353;s:6:"CypsEm";i:3354;s:4:"Unsa";i:3355;s:5:"GuPro";i:3356;s:4:"Rotu";i:3357;s:5:"DoEmb";i:3358;s:3:"Pia";i:3359;s:7:"DrMoroc";i:3360;s:7:"LeOpsim";i:3361;s:5:"Sextu";i:3362;s:13:"EpipRecaShoop";i:3363;s:9:"ExaraSiVe";i:3364;s:12:"PreasSooUndi";i:3365;s:6:"FroInv";i:3366;s:7:"MorthPa";i:3367;s:3:"Wri";i:3368;s:7:"OverTet";i:3369;s:3:"Yea";i:3370;s:4:"Sand";i:3371;s:11:"DemonDiManq";i:3372;s:5:"MoiTi";i:3373;s:8:"ForsHype";i:3374;s:8:"HaloMont";i:3375;s:11:"InvPacUnexh";i:3376;s:12:"SilvUnaggWir";i:3377;s:8:"MuSemSen";i:3378;s:4:"Disp";i:3379;s:6:"ProUnq";i:3380;s:10:"ImploVenet";i:3381;s:4:"Hors";i:3382;s:5:"LucTh";i:3383;s:9:"ObliTibio";i:3384;s:4:"Homo";i:3385;s:12:"MonoSabSelen";i:3386;s:7:"NonSubm";i:3387;s:4:"Seri";i:3388;s:8:"CypriTeh";i:3389;s:8:"LocSewer";i:3390;s:12:"PiliTubUnmor";i:3391;s:5:"Beami";i:3392;s:8:"HyRegRep";i:3393;s:7:"SmUnrou";i:3394;s:7:"HeNoUnd";i:3395;s:8:"CyResSob";i:3396;s:9:"ElecaMocm";i:3397;s:5:"Quini";i:3398;s:10:"TegeaUnsca";i:3399;s:10:"ScorSeTrip";i:3400;s:8:"OligSeTh";i:3401;s:9:"HuRooUnde";i:3402;s:5:"Razor";i:3403;s:4:"Uncl";i:3404;s:6:"ScriSu";i:3405;s:4:"Unpu";i:3406;s:8:"RomneSin";i:3407;s:4:"Supe";i:3408;s:5:"Subor";i:3409;s:10:"PhotoProSt";i:3410;s:5:"MaVer";i:3411;s:8:"GrImToba";i:3412;s:10:"PaRetUnfor";i:3413;s:9:"PanPriaRe";i:3414;s:8:"FlokiPht";i:3415;s:6:"PreSol";i:3416;s:8:"QuiniVar";i:3417;s:12:"BurnRetSphae";i:3418;s:7:"GondSpe";i:3419;s:5:"Pseud";i:3420;s:7:"MeRespe";i:3421;s:5:"OtTur";i:3422;s:7:"OuPedRe";i:3423;s:10:"CeraNoSara";i:3424;s:7:"EpiFiRe";i:3425;s:14:"SulphThallTwee";i:3426;s:7:"OuRhema";i:3427;s:4:"Fanc";i:3428;s:8:"OoscoWay";i:3429;s:14:"ComfoHomodHypo";i:3430;s:12:"ImTapisUnfit";i:3431;s:4:"Laix";i:3432;s:5:"Unfes";i:3433;s:2:"Bu";i:3434;s:7:"EtReoTo";i:3435;s:9:"SnippYard";i:3436;s:5:"SaUnd";i:3437;s:5:"Osteo";i:3438;s:8:"PageaUnd";i:3439;s:8:"InhNonUn";i:3440;s:14:"MiscPilasSilic";i:3441;s:9:"OvePnStyc";i:3442;s:8:"BaNoncTo";i:3443;s:5:"Super";i:3444;s:6:"IrSeUn";i:3445;s:9:"CountEchi";i:3446;s:5:"BliRo";i:3447;s:11:"KeMoveaUnha";i:3448;s:15:"CratcSeamrSuper";i:3449;s:4:"Mist";i:3450;s:4:"Wrec";i:3451;s:7:"CenNons";i:3452;s:5:"Confr";i:3453;s:9:"IndecUnal";i:3454;s:5:"Groov";i:3455;s:5:"Nonre";i:3456;s:12:"OuthiSoSuper";i:3457;s:6:"HeSubc";i:3458;s:15:"MetriScuftTable";i:3459;s:5:"Satie";i:3460;s:12:"IncoOrphaSqu";i:3461;s:4:"HyTh";i:3462;s:10:"DirepGiMoi";i:3463;s:3:"Mor";i:3464;s:5:"PaPho";i:3465;s:6:"TavTol";i:3466;s:9:"IsthmNapp";i:3467;s:6:"CopSpl";i:3468;s:6:"BuTren";i:3469;s:11:"PrepUncrUnp";i:3470;s:3:"Mis";i:3471;s:5:"Twitt";i:3472;s:5:"Koiar";i:3473;s:10:"BuHirTetra";i:3474;s:7:"DipiWis";i:3475;s:5:"BasGh";i:3476;s:11:"DeziPreRune";i:3477;s:5:"PerPr";i:3478;s:5:"Scrol";i:3479;s:9:"CenSapSna";i:3480;s:12:"ObraOchleTyk";i:3481;s:6:"AreLan";i:3482;s:10:"MeniNoProa";i:3483;s:4:"Wadm";i:3484;s:10:"LaMotleUnd";i:3485;s:7:"CoSurfe";i:3486;s:5:"KaUnm";i:3487;s:5:"IlSim";i:3488;s:5:"Plero";i:3489;s:9:"LanceSele";i:3490;s:2:"Ro";i:3491;s:11:"DrawsSecuVe";i:3492;s:4:"Vine";i:3493;s:5:"Mythm";i:3494;s:8:"DiJesuKo";i:3495;s:9:"CorLiScut";i:3496;s:5:"ObeOr";i:3497;s:9:"PreStouTe";i:3498;s:8:"SubUnfor";i:3499;s:11:"DiEtonThala";i:3500;s:13:"FamOrallSuper";i:3501;s:5:"Unrib";i:3502;s:7:"PrReUno";i:3503;s:11:"MichTricWai";i:3504;s:8:"OveUtric";i:3505;s:5:"Propa";i:3506;s:10:"PolycVikin";i:3507;s:9:"DivMeduTh";i:3508;s:13:"LuxuTranViper";i:3509;s:8:"DiFrHypo";i:3510;s:13:"MagniMontWres";i:3511;s:10:"CantDeUnci";i:3512;s:10:"PeScripUnf";i:3513;s:10:"ClaitSpUnc";i:3514;s:10:"DecoPhoSup";i:3515;s:5:"InSys";i:3516;s:13:"RhetoUdoUnder";i:3517;s:4:"Marr";i:3518;s:5:"LaRed";i:3519;s:10:"KilolPiUns";i:3520;s:5:"Monoc";i:3521;s:13:"GalliUreViato";i:3522;s:3:"Mac";i:3523;s:9:"SadhScamm";i:3524;s:11:"PhoenSinUns";i:3525;s:8:"EpiUnjud";i:3526;s:8:"JasMonTu";i:3527;s:8:"ParWangx";i:3528;s:9:"AverCaste";i:3529;s:11:"BindMonoUnm";i:3530;s:3:"Sph";i:3531;s:5:"Postf";i:3532;s:5:"Oligo";i:3533;s:10:"ComexRodin";i:3534;s:4:"ThWe";i:3535;s:5:"Unfra";i:3536;s:10:"PleurUnaug";i:3537;s:8:"DepeNeSe";i:3538;s:10:"DiProRaddl";i:3539;s:7:"FeThere";i:3540;s:10:"HenOverpSi";i:3541;s:5:"Epido";i:3542;s:5:"GarTr";i:3543;s:7:"HypThZi";i:3544;s:4:"ReTw";i:3545;s:5:"Trans";i:3546;s:8:"AfReSchi";i:3547;s:5:"Dacry";i:3548;s:12:"QuartTruncWi";i:3549;s:10:"DishoFooti";i:3550;s:12:"ChasInvLutec";i:3551;s:4:"Whip";i:3552;s:5:"MaWin";i:3553;s:5:"HyUns";i:3554;s:11:"EmEvangPoly";i:3555;s:5:"Submo";i:3556;s:4:"PaSw";i:3557;s:6:"DipLac";i:3558;s:7:"MegRemo";i:3559;s:12:"ExtraHymeSec";i:3560;s:7:"OutlePl";i:3561;s:12:"KhasRanjUnle";i:3562;s:10:"RhRounxSan";i:3563;s:4:"Thea";i:3564;s:12:"GraRelatUnri";i:3565;s:4:"Snar";i:3566;s:4:"SoTh";i:3567;s:5:"Undel";i:3568;s:9:"GazHydSem";i:3569;s:11:"CatCopiUnho";i:3570;s:5:"Cerol";i:3571;s:6:"MisrTa";i:3572;s:11:"IntJouLiqui";i:3573;s:3:"Sec";i:3574;s:8:"UnrowVil";i:3575;s:8:"LocoThTh";i:3576;s:10:"HandmUngue";i:3577;s:2:"Is";i:3578;s:11:"RefUterXant";i:3579;s:5:"Canid";i:3580;s:7:"InIsote";i:3581;s:7:"PeUncor";i:3582;s:5:"HoWin";i:3583;s:9:"DisadNoti";i:3584;s:13:"GuttMaeaRamma";i:3585;s:4:"UnWa";i:3586;s:13:"EpiMerrySexua";i:3587;s:7:"FlunkSu";i:3588;s:4:"Solv";i:3589;s:8:"MiNeOnag";i:3590;s:4:"Nibo";i:3591;s:11:"FlocHydMuri";i:3592;s:9:"CaJozyOle";i:3593;s:9:"FemeResti";i:3594;s:7:"PhRocce";i:3595;s:4:"Urun";i:3596;s:9:"DrakeFrum";i:3597;s:11:"InsaMaOctin";i:3598;s:8:"PertuTea";i:3599;s:9:"MisOuriPh";i:3600;s:12:"HeSeaweWretc";i:3601;s:4:"MaPo";i:3602;s:9:"PancQuidd";i:3603;s:2:"Wh";i:3604;s:7:"SmugSol";i:3605;s:4:"Tris";i:3606;s:5:"CeInf";i:3607;s:7:"OphiTeg";i:3608;s:6:"FoFrem";i:3609;s:10:"HabilStore";i:3610;s:3:"Ste";i:3611;s:3:"Vei";i:3612;s:6:"HetmSy";i:3613;s:13:"RivoSpinoZoop";i:3614;s:7:"GyrMiSo";i:3615;s:11:"MeNoncPathi";i:3616;s:10:"DerOrPobsx";i:3617;s:5:"Volti";i:3618;s:9:"PoacUnrep";i:3619;s:9:"ExacSnaUn";i:3620;s:3:"Sce";i:3621;s:7:"DisSple";i:3622;s:11:"KiMonoUnaro";i:3623;s:4:"Tall";i:3624;s:12:"MyelOldSheet";i:3625;s:3:"Con";i:3626;s:14:"CollExpedPreci";i:3627;s:11:"InfecNevYol";i:3628;s:8:"ExHyTomf";i:3629;s:3:"Shi";i:3630;s:2:"Na";i:3631;s:11:"ErGownsMous";i:3632;s:7:"ScUtsuk";i:3633;s:9:"IsoQuRecr";i:3634;s:6:"ChaHon";i:3635;s:11:"EquIconoNep";i:3636;s:10:"TuitiUnsin";i:3637;s:11:"FoxMooUnpor";i:3638;s:4:"Synt";i:3639;s:7:"HemNerv";i:3640;s:5:"Wroth";i:3641;s:7:"UnZirba";i:3642;s:10:"HeterThUnm";i:3643;s:8:"ReUnraVo";i:3644;s:7:"PissaRo";i:3645;s:9:"DiFretSix";i:3646;s:8:"RabUnpro";i:3647;s:12:"InteIrksLipo";i:3648;s:10:"ByrSumpUnp";i:3649;s:2:"Oo";i:3650;s:13:"AntimDaggPseu";i:3651;s:12:"SuVaginVerbe";i:3652;s:5:"InLar";i:3653;s:5:"Fibro";i:3654;s:10:"FoldMeUnab";i:3655;s:12:"BiPrediProar";i:3656;s:11:"SyphThrasTr";i:3657;s:11:"ExNitroPala";i:3658;s:7:"DegrPre";i:3659;s:13:"ExormFeudxTer";i:3660;s:7:"SuTraUn";i:3661;s:7:"NyaSche";i:3662;s:7:"EntoGer";i:3663;s:9:"MacrTrans";i:3664;s:6:"DenoGn";i:3665;s:12:"MultiUnbarUn";i:3666;s:10:"InsLipPenc";i:3667;s:10:"JanTyroWhi";i:3668;s:10:"HalHydruMo";i:3669;s:3:"Irr";i:3670;s:13:"SkaffSubTriad";i:3671;s:5:"Windr";i:3672;s:5:"Unebb";i:3673;s:5:"RevWi";i:3674;s:7:"MajTend";i:3675;s:7:"PreUnbe";i:3676;s:12:"MyoOutscPala";i:3677;s:10:"DrainIlUnm";i:3678;s:13:"RepeSaxxUndis";i:3679;s:11:"ImidMuPsila";i:3680;s:7:"DopLuci";i:3681;s:7:"DecTezx";i:3682;s:9:"ToothViri";i:3683;s:14:"MagneRaspiTach";i:3684;s:10:"SluSwYalix";i:3685;s:10:"PhanSyUnel";i:3686;s:8:"HuReSpec";i:3687;s:4:"Pitc";i:3688;s:8:"HiHyShor";i:3689;s:12:"LieNonacPseu";i:3690;s:13:"KnaOinomSerri";i:3691;s:6:"EntUph";i:3692;s:9:"OdoSaraSu";i:3693;s:5:"Varis";i:3694;s:6:"CorOrp";i:3695;s:9:"BlNocSpli";i:3696;s:7:"SwomWis";i:3697;s:12:"PanscResWigw";i:3698;s:6:"RepTin";i:3699;s:5:"Chitc";i:3700;s:6:"InquMi";i:3701;s:6:"InWhin";i:3702;s:7:"HerTabo";i:3703;s:7:"RackfTu";i:3704;s:10:"MediRabbUn";i:3705;s:12:"CauloExospIn";i:3706;s:11:"HydroSiUnch";i:3707;s:8:"CyPrRect";i:3708;s:7:"AllBand";i:3709;s:8:"HystMail";i:3710;s:12:"HypLooseSole";i:3711;s:10:"CoFreckNon";i:3712;s:10:"AnEffeTali";i:3713;s:10:"DoctrPerit";i:3714;s:5:"SiUna";i:3715;s:4:"Rhiz";i:3716;s:4:"OuRe";i:3717;s:4:"Hobb";i:3718;s:3:"Cer";i:3719;s:9:"AnOrangRa";i:3720;s:9:"SoulfSpZo";i:3721;s:11:"UnreUnsVeto";i:3722;s:5:"HyTec";i:3723;s:9:"AtPhotUns";i:3724;s:4:"Lune";i:3725;s:3:"Tro";i:3726;s:8:"PhagoPim";i:3727;s:9:"NagNoUnde";i:3728;s:9:"FezzeMike";i:3729;s:10:"RiffxVersa";i:3730;s:8:"SigSusan";i:3731;s:7:"OverRei";i:3732;s:10:"NonOverPer";i:3733;s:11:"CoundSpriTc";i:3734;s:5:"Bismu";i:3735;s:9:"ClefThrea";i:3736;s:9:"PinkTetra";i:3737;s:5:"Therm";i:3738;s:5:"PeXyl";i:3739;s:5:"SaSma";i:3740;s:15:"PerinTransUnart";i:3741;s:5:"Pytha";i:3742;s:7:"SyUngen";i:3743;s:9:"BeMonotPa";i:3744;s:11:"DiDictyMoto";i:3745;s:11:"PolyTrWarbl";i:3746;s:9:"FaForeHor";i:3747;s:4:"Inkl";i:3748;s:5:"Perfr";i:3749;s:8:"FunMeRep";i:3750;s:10:"PrePrSkunk";i:3751;s:6:"DoHepa";i:3752;s:12:"NonParoPhilo";i:3753;s:7:"GroUnre";i:3754;s:9:"PillaUnwa";i:3755;s:10:"CixoxSocTh";i:3756;s:6:"HypPat";i:3757;s:15:"TautoTreacUnhar";i:3758;s:4:"Cant";i:3759;s:7:"DisUnsa";i:3760;s:15:"InconMilleWenon";i:3761;s:13:"EmbryNonacPre";i:3762;s:5:"Nonfl";i:3763;s:12:"RegaTripUngr";i:3764;s:9:"ScratWarn";i:3765;s:6:"BiGluc";i:3766;s:7:"BaPolyp";i:3767;s:11:"NovaReskSto";i:3768;s:4:"Utte";i:3769;s:6:"PlaPle";i:3770;s:9:"HematMona";i:3771;s:8:"OphZoono";i:3772;s:10:"StaidUnpre";i:3773;s:9:"DispoIntr";i:3774;s:7:"JeluJet";i:3775;s:4:"Four";i:3776;s:10:"IntMycoUpl";i:3777;s:5:"Skulk";i:3778;s:11:"LepPoodlSer";i:3779;s:13:"OxyrhSpiSquar";i:3780;s:7:"ExHulPa";i:3781;s:5:"SaSod";i:3782;s:15:"PretySweepSweet";i:3783;s:11:"GryMystSter";i:3784;s:5:"RuSmo";i:3785;s:7:"SuperUn";i:3786;s:8:"PolStorm";i:3787;s:8:"IncliPac";i:3788;s:5:"Prepr";i:3789;s:8:"MeckeMeg";i:3790;s:5:"Unobj";i:3791;s:3:"Gra";i:3792;s:9:"OwerlPrTe";i:3793;s:9:"BrShaVesi";i:3794;s:5:"Thaum";i:3795;s:2:"Ki";i:3796;s:7:"HeUngui";i:3797;s:4:"Sout";i:3798;s:4:"Ross";i:3799;s:8:"EyeWhips";i:3800;s:10:"HeIatroUnp";i:3801;s:5:"MePro";i:3802;s:5:"Fault";i:3803;s:9:"MutaSabba";i:3804;s:3:"Swa";i:3805;s:8:"ReSoWive";i:3806;s:5:"FlIsl";i:3807;s:4:"HiPh";i:3808;s:8:"ChelMerc";i:3809;s:6:"BlaReq";i:3810;s:4:"Codi";i:3811;s:9:"SpTriWote";i:3812;s:9:"LegiPyrSt";i:3813;s:6:"EnLida";i:3814;s:4:"Ungr";i:3815;s:11:"PuSchoSnudg";i:3816;s:8:"HyOsmUnh";i:3817;s:7:"UndeZos";i:3818;s:12:"PhilProvSnap";i:3819;s:11:"OoPeriSangu";i:3820;s:5:"Smutt";i:3821;s:5:"MePac";i:3822;s:5:"Thuri";i:3823;s:14:"ArsenHerseSuba";i:3824;s:4:"Macc";i:3825;s:5:"Untra";i:3826;s:8:"CrNonPil";i:3827;s:4:"CaMe";i:3828;s:8:"PanTherm";i:3829;s:12:"InMesolPatac";i:3830;s:8:"MatriNon";i:3831;s:6:"GeoSex";i:3832;s:9:"NurseShit";i:3833;s:4:"Stro";i:3834;s:11:"BavPreinTug";i:3835;s:11:"KarsMuUnwit";i:3836;s:4:"Meta";i:3837;s:7:"OvPrill";i:3838;s:7:"MiMucos";i:3839;s:10:"CouMobsSha";i:3840;s:4:"Visi";i:3841;s:7:"SmooSub";i:3842;s:6:"CyPaSi";i:3843;s:9:"MyPacUntu";i:3844;s:5:"Oricy";i:3845;s:3:"Sup";i:3846;s:6:"TerUnd";i:3847;s:8:"IsMonoSa";i:3848;s:9:"HidSunrWo";i:3849;s:12:"MolaxSanUnst";i:3850;s:5:"MoPha";i:3851;s:8:"PieSubri";i:3852;s:5:"Watch";i:3853;s:4:"Team";i:3854;s:10:"PrSesaVind";i:3855;s:10:"HexadNaVac";i:3856;s:9:"MelanNoRa";i:3857;s:7:"PrSepSt";i:3858;s:5:"Sridh";i:3859;s:5:"MasPo";i:3860;s:7:"LiStatu";i:3861;s:10:"SprawTrans";i:3862;s:8:"LooPhoto";i:3863;s:9:"CaTaZingi";i:3864;s:3:"Oro";i:3865;s:5:"Dermi";i:3866;s:7:"DrierRe";i:3867;s:10:"MiskPerSup";i:3868;s:3:"Wat";i:3869;s:6:"CoWelc";i:3870;s:11:"NonPediScho";i:3871;s:10:"JemmOuRubo";i:3872;s:5:"Urtic";i:3873;s:5:"FrGal";i:3874;s:6:"LaceVa";i:3875;s:8:"RecSubch";i:3876;s:5:"SaSph";i:3877;s:12:"MarylMnemoOn";i:3878;s:3:"Lie";i:3879;s:8:"FluPrSuf";i:3880;s:5:"Pangx";i:3881;s:13:"MediReoccUnda";i:3882;s:9:"CelFatGou";i:3883;s:4:"Xant";i:3884;s:4:"Moil";i:3885;s:11:"DeltForIned";i:3886;s:7:"RegiUnp";i:3887;s:7:"KabylTh";i:3888;s:8:"ShaTrade";i:3889;s:7:"VilWaWi";i:3890;s:9:"MappiOsph";i:3891;s:5:"DriSl";i:3892;s:5:"Tauto";i:3893;s:5:"Sinia";i:3894;s:5:"PrUnr";i:3895;s:7:"UnsVerb";i:3896;s:13:"DesExploTorsi";i:3897;s:5:"PaUna";i:3898;s:8:"PhotUpis";i:3899;s:12:"FemHalfSubur";i:3900;s:10:"BesoDolMem";i:3901;s:9:"WordZebra";i:3902;s:5:"Sweep";i:3903;s:7:"TrUnpro";i:3904;s:11:"ResSerorWid";i:3905;s:8:"SafrSouv";i:3906;s:4:"Ridg";i:3907;s:11:"CancMessUnd";i:3908;s:6:"OvUnUn";i:3909;s:9:"ShSqueUne";i:3910;s:7:"OratoRo";i:3911;s:5:"GaSpe";i:3912;s:7:"CoOolog";i:3913;s:5:"NonPr";i:3914;s:9:"VanguWaho";i:3915;s:7:"ConseLa";i:3916;s:4:"Zimb";i:3917;s:2:"Im";i:3918;s:11:"AzDiasFonsx";i:3919;s:11:"CrEmbleGale";i:3920;s:7:"DiHonUn";i:3921;s:8:"PerjSphy";i:3922;s:12:"PomonStUnvol";i:3923;s:9:"MiPokoTik";i:3924;s:10:"BikhxConic";i:3925;s:4:"BiFi";i:3926;s:6:"CruFig";i:3927;s:4:"Requ";i:3928;s:5:"Amoeb";i:3929;s:9:"FeathHusb";i:3930;s:8:"ExcrLave";i:3931;s:3:"Obl";i:3932;s:10:"HyperMonSh";i:3933;s:7:"UnerrXe";i:3934;s:8:"HypJibNe";i:3935;s:11:"HousSbUnent";i:3936;s:4:"Pyra";i:3937;s:10:"BacParaSub";i:3938;s:5:"Occam";i:3939;s:12:"MichiRumblTu";i:3940;s:4:"Supr";i:3941;s:7:"FeUnsuf";i:3942;s:7:"DowieSp";i:3943;s:10:"FaceOppoUn";i:3944;s:12:"MetamTopoUbi";i:3945;s:7:"PeriPre";i:3946;s:7:"PsycSep";i:3947;s:8:"MeloUncl";i:3948;s:8:"UndanWau";i:3949;s:11:"AutoChoResy";i:3950;s:7:"OvPegUn";i:3951;s:10:"ArseSoyUns";i:3952;s:5:"SpeUn";i:3953;s:4:"Pinn";i:3954;s:5:"Unspr";i:3955;s:3:"Glo";i:3956;s:5:"BraLe";i:3957;s:10:"IdylNonUnm";i:3958;s:9:"ChilChimp";i:3959;s:2:"Hy";i:3960;s:11:"KharNicomPi";i:3961;s:14:"HemipPariUnpre";i:3962;s:8:"TexUnciv";i:3963;s:12:"MitNaphtRevi";i:3964;s:12:"IraqiKoreTat";i:3965;s:12:"HephInfuThix";i:3966;s:13:"ButtFratcPrer";i:3967;s:11:"BanExtraPro";i:3968;s:10:"PsPulpVomi";i:3969;s:9:"DraffTutw";i:3970;s:10:"NoSoliTheo";i:3971;s:6:"NonvSo";i:3972;s:10:"BeSpurSuba";i:3973;s:3:"Rey";i:3974;s:8:"FadGuTel";i:3975;s:12:"FluGeocPascu";i:3976;s:5:"Punty";i:3977;s:5:"Alcid";i:3978;s:5:"Soggy";i:3979;s:7:"PurpRes";i:3980;s:3:"Por";i:3981;s:7:"MultThw";i:3982;s:2:"Of";i:3983;s:7:"GalicOd";i:3984;s:13:"HyperMilUndis";i:3985;s:7:"ElegiUn";i:3986;s:4:"Inst";i:3987;s:8:"MonkcPan";i:3988;s:4:"Jawx";i:3989;s:12:"CoDonneRewar";i:3990;s:11:"MerkSemidUn";i:3991;s:14:"ErectRomerSero";i:3992;s:4:"Jett";i:3993;s:10:"DeJohRahul";i:3994;s:2:"Ar";i:3995;s:5:"Silic";i:3996;s:10:"PrearPrSem";i:3997;s:4:"Meso";i:3998;s:10:"CysLicheRe";i:3999;s:4:"Snag";i:4000;s:9:"GenecPres";i:4001;s:7:"PropSha";i:4002;s:9:"HamaTraUn";i:4003;s:9:"GyroMatUn";i:4004;s:12:"MisuNonParas";i:4005;s:13:"KindeOvePrein";i:4006;s:13:"IconUnentUnpl";i:4007;s:10:"MyrmeNotel";i:4008;s:10:"KrobPoUnsa";i:4009;s:10:"IndusPalau";i:4010;s:7:"HostPar";i:4011;s:9:"HelPreiSu";i:4012;s:5:"Kacha";i:4013;s:3:"Nac";i:4014;s:7:"SafeWan";i:4015;s:8:"ScrViost";i:4016;s:9:"LoSinnSub";i:4017;s:5:"Vedai";i:4018;s:12:"IdeoPanVaunt";i:4019;s:9:"DeErgxOcy";i:4020;s:8:"HanMePal";i:4021;s:7:"ShValky";i:4022;s:11:"DingIncuTel";i:4023;s:8:"PePillSp";i:4024;s:6:"FocPos";i:4025;s:5:"KnaTr";i:4026;s:4:"Wint";i:4027;s:12:"InsiTheUnmis";i:4028;s:7:"AtmogLe";i:4029;s:8:"MePalRec";i:4030;s:8:"ComKwann";i:4031;s:4:"Over";i:4032;s:12:"NiobiNoneqTo";i:4033;s:11:"KiScytStrop";i:4034;s:4:"Wast";i:4035;s:10:"CasuInteMo";i:4036;s:5:"ShWhi";i:4037;s:3:"Wro";i:4038;s:9:"SwasThTot";i:4039;s:5:"AndSc";i:4040;s:6:"GrapSc";i:4041;s:7:"FirepUn";i:4042;s:13:"BoerBuffaPass";i:4043;s:7:"CoSpTin";i:4044;s:3:"Gor";i:4045;s:7:"DisbeHi";i:4046;s:5:"EleSi";i:4047;s:12:"LympUninkYer";i:4048;s:5:"ShaSl";i:4049;s:9:"IlLiPlagi";i:4050;s:7:"CeOrtho";i:4051;s:7:"AntShel";i:4052;s:7:"DiPeris";i:4053;s:3:"Flo";i:4054;s:10:"GladiNonfa";i:4055;s:4:"Unen";i:4056;s:5:"Myosa";i:4057;s:8:"ReqUnder";i:4058;s:8:"IdyTortr";i:4059;s:10:"CanPrTheri";i:4060;s:2:"Ur";i:4061;s:10:"AtollCorti";i:4062;s:8:"DexGestx";i:4063;s:6:"MerQua";i:4064;s:4:"Usat";i:4065;s:14:"BromLicenNaseb";i:4066;s:11:"GoOrthoSull";i:4067;s:11:"QuinSuperUn";i:4068;s:12:"ConfKoftPass";i:4069;s:8:"OrgaSkTr";i:4070;s:6:"CheaOu";i:4071;s:11:"BafGynRamul";i:4072;s:9:"OpPerZepp";i:4073;s:9:"HypMerTom";i:4074;s:7:"RarelUn";i:4075;s:13:"EpidoPostcSta";i:4076;s:7:"VandyWh";i:4077;s:10:"OutwaRapSo";i:4078;s:11:"OverSouWall";i:4079;s:11:"BeclaChorCo";i:4080;s:3:"Sin";i:4081;s:6:"RaSnak";i:4082;s:10:"FiHomLumbr";i:4083;s:12:"PapaProaThyr";i:4084;s:7:"IntTric";i:4085;s:10:"DisInfrOrl";i:4086;s:10:"GoldeIntVo";i:4087;s:8:"DainOoUl";i:4088;s:9:"FullMulti";i:4089;s:9:"MolRizWoo";i:4090;s:5:"Mimos";i:4091;s:5:"Unfun";i:4092;s:7:"HiSuber";i:4093;s:9:"OpistTrac";i:4094;s:9:"MourPreho";i:4095;s:10:"ProtoRebra";i:4096;s:7:"DiManif";i:4097;s:9:"RepuSubin";i:4098;s:5:"Khald";i:4099;s:5:"SkiSu";i:4100;s:8:"BecloNon";i:4101;s:5:"Mesol";i:4102;s:12:"InnaSmeltTur";i:4103;s:9:"ExtooSidt";i:4104;s:12:"InduTitTrywo";i:4105;s:8:"CoMarsMa";i:4106;s:3:"Wei";i:4107;s:6:"GrSiph";i:4108;s:9:"MelOvPyro";i:4109;s:9:"JovinUnin";i:4110;s:6:"OlPsyc";i:4111;s:10:"GiggeWinly";i:4112;s:5:"Shoem";i:4113;s:8:"CoSyncUn";i:4114;s:10:"NomOverhSp";i:4115;s:10:"TrembUncon";i:4116;s:8:"ReinScSm";i:4117;s:5:"Gager";i:4118;s:11:"TiUnprWorke";i:4119;s:9:"MaParanRe";i:4120;s:9:"StruUnche";i:4121;s:3:"Div";i:4122;s:13:"IndiNeomWoodb";i:4123;s:7:"FiFlaUn";i:4124;s:6:"BryCru";i:4125;s:9:"SubdoSubs";i:4126;s:9:"ReveUnWin";i:4127;s:2:"Ir";i:4128;s:7:"GlSkill";i:4129;s:8:"MagySent";i:4130;s:6:"SarsUn";i:4131;s:14:"SquirVaricVola";i:4132;s:6:"GallWa";i:4133;s:7:"PlumbPr";i:4134;s:10:"EmersHaStr";i:4135;s:10:"EffForSupe";i:4136;s:7:"ReiSpin";i:4137;s:12:"PeacPleTinny";i:4138;s:4:"Tara";i:4139;s:11:"DoghInterSi";i:4140;s:9:"KetPoSpik";i:4141;s:7:"LiMalle";i:4142;s:4:"Unbo";i:4143;s:12:"SharUnfVersa";i:4144;s:7:"UndeWea";i:4145;s:3:"Myx";i:4146;s:7:"DetPlut";i:4147;s:7:"IroqRec";i:4148;s:7:"IntPsha";i:4149;s:5:"PosSe";i:4150;s:10:"SubTimarUn";i:4151;s:5:"MetPa";i:4152;s:9:"HoSnarStr";i:4153;s:5:"Phall";i:4154;s:10:"NecrThUnte";i:4155;s:12:"GemaHortSwam";i:4156;s:4:"Nong";i:4157;s:7:"CerSole";i:4158;s:10:"LatinPenma";i:4159;s:11:"PieriRejSem";i:4160;s:5:"PrPro";i:4161;s:8:"MultiPri";i:4162;s:4:"Twol";i:4163;s:7:"TraTurb";i:4164;s:7:"NaNodRe";i:4165;s:5:"Ouaba";i:4166;s:6:"KerPlu";i:4167;s:4:"Pont";i:4168;s:3:"Gur";i:4169;s:11:"PersSpoliUn";i:4170;s:7:"PlantSl";i:4171;s:2:"Fl";i:4172;s:8:"DiSuUnbo";i:4173;s:8:"IseReque";i:4174;s:11:"GenePtVentr";i:4175;s:4:"Rain";i:4176;s:7:"TrUnUns";i:4177;s:7:"DisUnmi";i:4178;s:10:"OcuReVorti";i:4179;s:8:"AzComSiz";i:4180;s:11:"InterStaVes";i:4181;s:6:"FoPanc";i:4182;s:12:"DeutLifNocta";i:4183;s:4:"HyVo";i:4184;s:7:"OvePres";i:4185;s:6:"SaUnpr";i:4186;s:13:"IzduPostePros";i:4187;s:11:"PePiscoUnri";i:4188;s:9:"FlakePist";i:4189;s:10:"GrappOratr";i:4190;s:9:"OilmaPoly";i:4191;s:4:"Soro";i:4192;s:11:"BellUncloUn";i:4193;s:4:"Ribb";i:4194;s:5:"Encri";i:4195;s:11:"NocuShopSia";i:4196;s:8:"GloTraum";i:4197;s:10:"NondParaPh";i:4198;s:12:"GooxPanWeapo";i:4199;s:8:"ScleWhor";i:4200;s:6:"LokaRa";i:4201;s:9:"SaWeaseWi";i:4202;s:8:"ConUnglo";i:4203;s:6:"TafiWo";i:4204;s:13:"EmpPrayfSubal";i:4205;s:11:"CallCamComp";i:4206;s:8:"CorPaleo";i:4207;s:9:"FrOpiuPal";i:4208;s:7:"CardoHe";i:4209;s:10:"LapMaQuebr";i:4210;s:11:"EncycKupUnh";i:4211;s:3:"Opi";i:4212;s:12:"HydroMeRecti";i:4213;s:4:"Nomo";i:4214;s:5:"Unsub";i:4215;s:7:"HomesRa";i:4216;s:12:"ForksMoStepg";i:4217;s:8:"OctoPopp";i:4218;s:12:"FrazQuernSna";i:4219;s:5:"Serol";i:4220;s:7:"NonelSc";i:4221;s:11:"PepPlaUncom";i:4222;s:11:"NonRetrUnha";i:4223;s:5:"Moril";i:4224;s:4:"CoTo";i:4225;s:7:"EnduLin";i:4226;s:8:"PhoebUng";i:4227;s:11:"HetTalkWrec";i:4228;s:12:"JadisMuUnfor";i:4229;s:5:"BitPu";i:4230;s:5:"EuOle";i:4231;s:10:"UnpUnrarUp";i:4232;s:3:"Vis";i:4233;s:7:"OilskPe";i:4234;s:9:"MaSuVicel";i:4235;s:12:"HypoiIlocaWa";i:4236;s:5:"Figle";i:4237;s:5:"Level";i:4238;s:7:"EntalIn";i:4239;s:7:"PrePrun";i:4240;s:7:"ScolUnf";i:4241;s:3:"Gna";i:4242;s:8:"SepSymph";i:4243;s:5:"LeiSp";i:4244;s:5:"Onrus";i:4245;s:12:"NonOxidoStee";i:4246;s:9:"AsymReiRe";i:4247;s:11:"OvePluRelin";i:4248;s:9:"MePedVege";i:4249;s:12:"HemMarkMasse";i:4250;s:10:"OrogeUnpea";i:4251;s:9:"ForPilThy";i:4252;s:7:"MaPtery";i:4253;s:10:"OraShrUndi";i:4254;s:5:"Bacte";i:4255;s:6:"RefoUn";i:4256;s:13:"ParabPhysaTwa";i:4257;s:13:"ClaDandlItera";i:4258;s:9:"LeucMicOp";i:4259;s:3:"Vip";i:4260;s:7:"TrunkWr";i:4261;s:5:"Vermi";i:4262;s:10:"DupHirUnde";i:4263;s:14:"HoardSalteTaur";i:4264;s:3:"Vio";i:4265;s:5:"Goatb";i:4266;s:12:"DressInMaryx";i:4267;s:4:"Neph";i:4268;s:12:"TanstTrivaWe";i:4269;s:6:"LupeSu";i:4270;s:2:"Us";i:4271;s:6:"PerTab";i:4272;s:9:"FiMerYeas";i:4273;s:4:"OnOt";i:4274;s:10:"AntihSmich";i:4275;s:7:"ObiRoSa";i:4276;s:9:"UnscWelsh";i:4277;s:7:"RhombUn";i:4278;s:5:"Think";i:4279;s:6:"SinWes";i:4280;s:5:"LesSu";i:4281;s:5:"NoObs";i:4282;s:8:"ScarWusp";i:4283;s:8:"HoNaPhot";i:4284;s:5:"Vulca";i:4285;s:12:"MarrOwsYeast";i:4286;s:4:"Togu";i:4287;s:13:"FiloPilgrRuth";i:4288;s:8:"CouPyrTe";i:4289;s:7:"ConUnpa";i:4290;s:4:"Unag";i:4291;s:9:"SaUncUroc";i:4292;s:6:"UnrWhe";i:4293;s:9:"PolyShatt";i:4294;s:5:"ReaSi";i:4295;s:7:"NonOuac";i:4296;s:10:"OlidPsUnex";i:4297;s:6:"SwunUn";i:4298;s:7:"TorvVac";i:4299;s:9:"SoariVall";i:4300;s:9:"EreGaShea";i:4301;s:10:"PospoSemip";i:4302;s:8:"NoSuscUn";i:4303;s:3:"Ost";i:4304;s:9:"ErytMolSa";i:4305;s:5:"SaTre";i:4306;s:7:"PaShaZe";i:4307;s:11:"EnlTaarxTra";i:4308;s:5:"Puppi";i:4309;s:3:"War";i:4310;s:4:"Fera";i:4311;s:13:"CircHandkStal";i:4312;s:6:"PiSubc";i:4313;s:5:"Morrh";i:4314;s:10:"JoiPhytoTe";i:4315;s:8:"DevExcur";i:4316;s:7:"NunsPig";i:4317;s:10:"MarsPiePri";i:4318;s:6:"DuraSa";i:4319;s:5:"FluGe";i:4320;s:4:"RoWi";i:4321;s:5:"Ovine";i:4322;s:10:"PepsiPhVir";i:4323;s:8:"MiSpSupe";i:4324;s:3:"Sel";i:4325;s:5:"Sympt";i:4326;s:11:"IsUndrWhatt";i:4327;s:6:"AnOstr";i:4328;s:4:"IrSa";i:4329;s:4:"Spal";i:4330;s:4:"Sear";i:4331;s:3:"Fiq";i:4332;s:7:"FaOutro";i:4333;s:11:"DamoMePolyd";i:4334;s:13:"HarmfOreTushx";i:4335;s:5:"MaUnt";i:4336;s:7:"DesmoTa";i:4337;s:9:"CossaPhPh";i:4338;s:5:"Notho";i:4339;s:5:"Sowli";i:4340;s:7:"MisesPo";i:4341;s:4:"Uplo";i:4342;s:5:"Recti";i:4343;s:7:"GloHolo";i:4344;s:9:"TyppUnnob";i:4345;s:3:"Euc";i:4346;s:8:"MonNotPr";i:4347;s:7:"LogiSoo";i:4348;s:6:"NoUnde";i:4349;s:4:"Mosa";i:4350;s:3:"Cor";i:4351;s:9:"CinquSupr";i:4352;s:7:"PunkVra";i:4353;s:10:"CarSlWebwo";i:4354;s:5:"CarDe";i:4355;s:7:"TetraUl";i:4356;s:2:"Jo";i:4357;s:4:"OvPo";i:4358;s:4:"Spoi";i:4359;s:8:"IrresTyp";i:4360;s:6:"OvRySo";i:4361;s:6:"MicrPa";i:4362;s:3:"Ral";i:4363;s:5:"PrSem";i:4364;s:8:"OuttrSol";i:4365;s:12:"DisInduSmoke";i:4366;s:7:"PneuSag";i:4367;s:4:"Pstx";i:4368;s:8:"MeOveUnr";i:4369;s:5:"Diaer";i:4370;s:8:"FrorGiUn";i:4371;s:6:"SciSea";i:4372;s:6:"ImOver";i:4373;s:7:"CuLoath";i:4374;s:13:"MatriSorTawgi";i:4375;s:5:"SulWa";i:4376;s:11:"DemiHoodxMu";i:4377;s:9:"GladGuiMu";i:4378;s:10:"MaiMazPeri";i:4379;s:9:"ReedTetra";i:4380;s:8:"MeUnUnpe";i:4381;s:11:"HistoHouTro";i:4382;s:7:"DumGoUn";i:4383;s:3:"Ses";i:4384;s:12:"ReceScincUpg";i:4385;s:9:"ChaDiNonm";i:4386;s:9:"HyraxUnsc";i:4387;s:7:"MiNephr";i:4388;s:5:"PlePr";i:4389;s:5:"OpPre";i:4390;s:8:"AwnlBitt";i:4391;s:12:"JuraMucUnrue";i:4392;s:4:"NoRu";i:4393;s:4:"Rita";i:4394;s:10:"DyStenTetr";i:4395;s:6:"MoPoUn";i:4396;s:11:"ConKokoPapi";i:4397;s:8:"HoUnUnde";i:4398;s:13:"RhiUnsweWapac";i:4399;s:10:"BecLadRema";i:4400;s:13:"JordaSeleWitn";i:4401;s:8:"TramUnwh";i:4402;s:13:"GladePanzoZym";i:4403;s:7:"EvilOli";i:4404;s:11:"LeoUnconWea";i:4405;s:5:"ThToo";i:4406;s:8:"SubvVisi";i:4407;s:11:"IloInaTrogo";i:4408;s:5:"Troch";i:4409;s:5:"TriWo";i:4410;s:10:"IsoJuvVanq";i:4411;s:7:"NaTalon";i:4412;s:11:"CauRenSemin";i:4413;s:11:"HectoMancPa";i:4414;s:5:"HySwa";i:4415;s:6:"CuprLe";i:4416;s:4:"Tain";i:4417;s:4:"Watc";i:4418;s:13:"NegriPosWollo";i:4419;s:10:"DetInterLy";i:4420;s:11:"HamiManSpoa";i:4421;s:6:"FuUran";i:4422;s:11:"EpitLegitSi";i:4423;s:4:"Resi";i:4424;s:9:"FlobIctPh";i:4425;s:13:"QopSpaniTroch";i:4426;s:12:"ReediThirUna";i:4427;s:14:"ItaliNondeRuck";i:4428;s:8:"UntUpsho";i:4429;s:11:"InquStanTri";i:4430;s:10:"PeSebiTarg";i:4431;s:5:"ReUnp";i:4432;s:9:"FlocHecRe";i:4433;s:7:"MogrSum";i:4434;s:5:"ForHi";i:4435;s:6:"NicePe";i:4436;s:4:"Unob";i:4437;s:8:"MnemSupe";i:4438;s:5:"StUnc";i:4439;s:5:"Basop";i:4440;s:4:"Rust";i:4441;s:10:"ChGonVerme";i:4442;s:6:"SigYet";i:4443;s:4:"Trap";i:4444;s:5:"Uproo";i:4445;s:7:"BrSpecu";i:4446;s:5:"DePro";i:4447;s:11:"PrPterUness";i:4448;s:7:"LipPeTi";i:4449;s:8:"RoostTru";i:4450;s:12:"EngarIndeSub";i:4451;s:9:"SipeTaint";i:4452;s:13:"HutxLibelUnem";i:4453;s:10:"DuEtheUnor";i:4454;s:9:"SmStockSw";i:4455;s:7:"TarTeYu";i:4456;s:5:"LoUnr";i:4457;s:4:"Yesx";i:4458;s:9:"SleeStone";i:4459;s:10:"FraGemmPer";i:4460;s:9:"IsocThesm";i:4461;s:10:"DerogEritr";i:4462;s:13:"ConHarasLippy";i:4463;s:5:"UnUnr";i:4464;s:6:"GastSt";i:4465;s:4:"Unsh";i:4466;s:9:"GalHypUnt";i:4467;s:2:"Fe";i:4468;s:13:"HypotIntReali";i:4469;s:4:"Uner";i:4470;s:6:"MoUnid";i:4471;s:11:"HomodMymVil";i:4472;s:9:"FibPrepUn";i:4473;s:9:"SpracWart";i:4474;s:5:"EdxSo";i:4475;s:8:"AxeOverf";i:4476;s:12:"EunucFanhoMo";i:4477;s:4:"DeFl";i:4478;s:8:"ErGnSulp";i:4479;s:9:"MoOvePeri";i:4480;s:11:"ScUnanUnpow";i:4481;s:11:"NautiTaYawn";i:4482;s:6:"QuScSu";i:4483;s:3:"Urf";i:4484;s:4:"Phyt";i:4485;s:7:"GhMyelo";i:4486;s:5:"ClEle";i:4487;s:12:"MetePyrotSne";i:4488;s:7:"MonSpoi";i:4489;s:5:"Operc";i:4490;s:5:"HaHex";i:4491;s:10:"BivFirefPh";i:4492;s:7:"TrabUpt";i:4493;s:5:"Maund";i:4494;s:10:"MalebPrere";i:4495;s:4:"Quar";i:4496;s:9:"MaStarbUn";i:4497;s:11:"PythUnVello";i:4498;s:4:"Domi";i:4499;s:8:"PoiSprew";i:4500;s:9:"MeagrUnwi";i:4501;s:8:"NapRevea";i:4502;s:5:"Unact";i:4503;s:15:"CorniJumboSubur";i:4504;s:6:"JudUnd";i:4505;s:10:"InteMisRow";i:4506;s:9:"OleanSyba";i:4507;s:10:"ElaRedlSup";i:4508;s:4:"Farm";i:4509;s:4:"Hipp";i:4510;s:9:"PangPedPh";i:4511;s:5:"RhiTi";i:4512;s:9:"HomisPaTs";i:4513;s:4:"Reas";i:4514;s:7:"AnaboDi";i:4515;s:9:"JarlxRaTh";i:4516;s:11:"GravSunsVer";i:4517;s:4:"Real";i:4518;s:7:"EfPulta";i:4519;s:9:"GunlxMaRe";i:4520;s:7:"PhaPhre";i:4521;s:5:"PlUnr";i:4522;s:5:"Skipp";i:4523;s:4:"Mura";i:4524;s:14:"SerosUnentWork";i:4525;s:3:"Ske";i:4526;s:11:"AttrFourLac";i:4527;s:8:"PreShrin";i:4528;s:7:"InsProf";i:4529;s:11:"ClSwottWebm";i:4530;s:11:"EndPhylaPle";i:4531;s:8:"MenyaThe";i:4532;s:8:"FissVaul";i:4533;s:7:"HastiOv";i:4534;s:3:"Met";i:4535;s:2:"Ta";i:4536;s:8:"HatbaPan";i:4537;s:6:"SyndTe";i:4538;s:5:"Hoppl";i:4539;s:8:"FerNecro";i:4540;s:4:"Rese";i:4541;s:8:"EnoHiUna";i:4542;s:7:"MaOverh";i:4543;s:11:"ItzNonsPecu";i:4544;s:5:"PhiTh";i:4545;s:3:"Jus";i:4546;s:9:"CoLevoTra";i:4547;s:4:"Sent";i:4548;s:7:"PeUrami";i:4549;s:7:"MuWoman";i:4550;s:4:"Ooph";i:4551;s:10:"InterRocUn";i:4552;s:7:"SaShadd";i:4553;s:14:"PaniTwiteUnirh";i:4554;s:7:"PaPhaRe";i:4555;s:4:"SaSy";i:4556;s:11:"ExarcTestTr";i:4557;s:3:"Vex";i:4558;s:3:"Yuz";i:4559;s:5:"UnWea";i:4560;s:11:"HylPanPapil";i:4561;s:9:"WineWulfe";i:4562;s:7:"PenSpar";i:4563;s:8:"WaveWove";i:4564;s:10:"DisFlStenc";i:4565;s:14:"DelegImpreMult";i:4566;s:7:"DiOpina";i:4567;s:5:"PenPr";i:4568;s:5:"Pinna";i:4569;s:14:"HieroIdylYoick";i:4570;s:6:"CougSt";i:4571;s:5:"RevSt";i:4572;s:10:"IndiMusPro";i:4573;s:4:"SkSu";i:4574;s:4:"Becl";i:4575;s:7:"IndiIns";i:4576;s:9:"NickeOuri";i:4577;s:9:"DeDiHundr";i:4578;s:9:"PerfeSeUn";i:4579;s:5:"MerTh";i:4580;s:7:"LanMann";i:4581;s:13:"FileOtheUndev";i:4582;s:9:"JupaSymme";i:4583;s:5:"Overb";i:4584;s:9:"RelocSnoo";i:4585;s:13:"MckayPetiQuee";i:4586;s:12:"SantaSophUnt";i:4587;s:10:"ConInvinSa";i:4588;s:4:"SyZo";i:4589;s:7:"DessSal";i:4590;s:5:"Septu";i:4591;s:10:"EchenOuTel";i:4592;s:8:"AsPeWith";i:4593;s:5:"Rubli";i:4594;s:11:"DonInspiMor";i:4595;s:12:"CypriDeHorto";i:4596;s:14:"ShravSoureSqua";i:4597;s:11:"IsothUncoYu";i:4598;s:5:"Softe";i:4599;s:8:"FiliTegx";i:4600;s:11:"PreRotteTan";i:4601;s:12:"FulgPitcVulc";i:4602;s:5:"Raphi";i:4603;s:4:"Silk";i:4604;s:7:"IntMilk";i:4605;s:7:"EthExor";i:4606;s:4:"InTe";i:4607;s:12:"HousePetrPre";i:4608;s:5:"Techn";i:4609;s:4:"Spir";i:4610;s:6:"MaThul";i:4611;s:4:"Phae";i:4612;s:9:"MythPipRe";i:4613;s:7:"PottlUn";i:4614;s:10:"FarOverStu";i:4615;s:12:"CranDhawxMis";i:4616;s:14:"ImprOverlTrach";i:4617;s:14:"DoohiGrimiNond";i:4618;s:7:"RedfiSe";i:4619;s:8:"EnteUpra";i:4620;s:13:"IrreKoalPicud";i:4621;s:9:"SaSenSiva";i:4622;s:4:"Quad";i:4623;s:5:"Japon";i:4624;s:9:"SeveSodSt";i:4625;s:13:"CyanhExtMicro";i:4626;s:6:"PavRig";i:4627;s:9:"NaphtProv";i:4628;s:12:"HypovIrreTet";i:4629;s:10:"GiloxLapsi";i:4630;s:5:"ToTri";i:4631;s:8:"GroggPre";i:4632;s:5:"Perco";i:4633;s:5:"Upclo";i:4634;s:8:"GenitLab";i:4635;s:6:"UnXylo";i:4636;s:5:"Devir";i:4637;s:8:"FleNassa";i:4638;s:4:"Salt";i:4639;s:13:"DeliManipUnen";i:4640;s:7:"ShinSho";i:4641;s:6:"IliaOu";i:4642;s:10:"EleImponPu";i:4643;s:9:"ProSuWild";i:4644;s:8:"AnNymRum";i:4645;s:14:"HexamInteUnrou";i:4646;s:11:"CopiHealTem";i:4647;s:14:"PieceSometUnre";i:4648;s:5:"HadRa";i:4649;s:10:"CamacJohan";i:4650;s:9:"OverZeugo";i:4651;s:3:"Sha";i:4652;s:6:"PrReZo";i:4653;s:10:"CoeffPhoUn";i:4654;s:9:"MycoObjec";i:4655;s:4:"MiTa";i:4656;s:9:"BiQuadrSe";i:4657;s:13:"OverPhantSanc";i:4658;s:4:"Poni";i:4659;s:7:"MyeTerr";i:4660;s:4:"Inri";i:4661;s:5:"SemZy";i:4662;s:8:"AuFruKer";i:4663;s:8:"GrPeVasu";i:4664;s:8:"NooQuant";i:4665;s:10:"PlodPtarTa";i:4666;s:8:"SubWistx";i:4667;s:14:"CoccSuperTundx";i:4668;s:5:"Spass";i:4669;s:8:"PuzzSapl";i:4670;s:4:"Snon";i:4671;s:8:"InstPega";i:4672;s:13:"HomoOrthRadia";i:4673;s:5:"Phyll";i:4674;s:8:"ChondRev";i:4675;s:9:"MoroPessi";i:4676;s:5:"Fores";i:4677;s:11:"NeOligPtole";i:4678;s:4:"Serf";i:4679;s:10:"InSymUnacu";i:4680;s:8:"BigemMis";i:4681;s:8:"OvicRaSc";i:4682;s:9:"IsmxUnder";i:4683;s:13:"HaeShoweTesta";i:4684;s:4:"Gram";i:4685;s:7:"TipsUnc";i:4686;s:6:"EuPerm";i:4687;s:9:"EyLoPhone";i:4688;s:7:"RepScat";i:4689;s:4:"MiSu";i:4690;s:11:"ChaucRoriUn";i:4691;s:5:"Slowh";i:4692;s:3:"Osp";i:4693;s:5:"Windo";i:4694;s:3:"Izt";i:4695;s:4:"Hoga";i:4696;s:7:"DrUndis";i:4697;s:9:"NucPyraTh";i:4698;s:5:"Unrum";i:4699;s:10:"BotchGrGue";i:4700;s:9:"LaPreaSem";i:4701;s:7:"OdaxSho";i:4702;s:4:"Outb";i:4703;s:9:"CreeUniun";i:4704;s:12:"JeaniMandSun";i:4705;s:6:"DeDigr";i:4706;s:10:"RotSciurSe";i:4707;s:7:"ConfiUn";i:4708;s:4:"Regi";i:4709;s:11:"DoSterThimb";i:4710;s:4:"Vamp";i:4711;s:3:"Hae";i:4712;s:6:"HyRete";i:4713;s:2:"Up";i:4714;s:9:"FumarRece";i:4715;s:3:"Loc";i:4716;s:5:"Unatt";i:4717;s:7:"OstrVea";i:4718;s:11:"InNettlPres";i:4719;s:7:"BuMilks";i:4720;s:4:"Bone";i:4721;s:10:"MyopPorpSy";i:4722;s:12:"EmmenMeUndis";i:4723;s:9:"DaggeDiGi";i:4724;s:7:"UnVarie";i:4725;s:5:"Perfe";i:4726;s:9:"AzoDaffTa";i:4727;s:10:"IneffWheal";i:4728;s:10:"DeconPinSe";i:4729;s:10:"TeUnmVolut";i:4730;s:10:"SaproTrach";i:4731;s:10:"PlaRhiUrba";i:4732;s:9:"StropSubv";i:4733;s:7:"IcNatur";i:4734;s:8:"FluxaRei";i:4735;s:6:"ChEcTo";i:4736;s:12:"QuadrUnovZoo";i:4737;s:12:"NecroThakuWa";i:4738;s:5:"SeSer";i:4739;s:2:"Go";i:4740;s:12:"FrogxPredSar";i:4741;s:12:"CaFrumpTortr";i:4742;s:7:"LePrakr";i:4743;s:6:"KurtWa";i:4744;s:13:"NymphOthVowma";i:4745;s:14:"InduMurgeTrabe";i:4746;s:10:"CytogUrodi";i:4747;s:12:"CarMarkwPrep";i:4748;s:9:"DyPalatRi";i:4749;s:15:"LazarMimusRemov";i:4750;s:9:"OfPterRef";i:4751;s:10:"PapawTherm";i:4752;s:9:"MoProTrea";i:4753;s:9:"PushfScut";i:4754;s:6:"NonSub";i:4755;s:9:"OcSubWido";i:4756;s:8:"UnchaUng";i:4757;s:9:"IcIntePer";i:4758;s:12:"PurgaReiRepl";i:4759;s:13:"CryLoxiaPutri";i:4760;s:12:"HomolMeaslTa";i:4761;s:4:"Pent";i:4762;s:7:"MisMoRu";i:4763;s:9:"ColorCyMa";i:4764;s:7:"HaemoTr";i:4765;s:5:"ParTa";i:4766;s:8:"MesOrxUn";i:4767;s:5:"Kavix";i:4768;s:3:"Pha";i:4769;s:13:"CaliCatsPenba";i:4770;s:10:"OverRaUnsm";i:4771;s:5:"Psych";i:4772;s:9:"SphaeUnfa";i:4773;s:4:"Wyli";i:4774;s:6:"SuSwan";i:4775;s:10:"DichoElkho";i:4776;s:6:"OsteSt";i:4777;s:5:"Overa";i:4778;s:10:"ReprTeUnpa";i:4779;s:9:"PaTonnZei";i:4780;s:4:"Ostr";i:4781;s:5:"Octob";i:4782;s:3:"Exo";i:4783;s:3:"Res";i:4784;s:3:"But";i:4785;s:8:"RhoTreVi";i:4786;s:6:"PrReda";i:4787;s:4:"IlUn";i:4788;s:7:"MeMonNo";i:4789;s:12:"FluMyrmePaho";i:4790;s:6:"ImprRe";i:4791;s:8:"EpichGla";i:4792;s:12:"RepaRolliUnr";i:4793;s:8:"MininOve";i:4794;s:7:"ProsaUn";i:4795;s:12:"HypNonapYoke";i:4796;s:7:"LalopSc";i:4797;s:8:"HoUneVis";i:4798;s:12:"DorKenmMicro";i:4799;s:15:"ProclResubZoops";i:4800;s:15:"SemirSerraSuper";i:4801;s:7:"SaceUna";i:4802;s:5:"Monoa";i:4803;s:5:"NoUns";i:4804;s:9:"DiEmTauto";i:4805;s:10:"BoehmSupUn";i:4806;s:10:"SuperUnres";i:4807;s:14:"BattDemonVitam";i:4808;s:9:"FilInxRap";i:4809;s:10:"PremiStStr";i:4810;s:10:"DesyGooPer";i:4811;s:4:"CoSo";i:4812;s:8:"HypeTric";i:4813;s:4:"Writ";i:4814;s:8:"PolSangu";i:4815;s:7:"PreUnig";i:4816;s:10:"RubServuTo";i:4817;s:5:"Sider";i:4818;s:9:"UnhauUnpe";i:4819;s:9:"HerniVine";i:4820;s:5:"MaMud";i:4821;s:5:"Nonan";i:4822;s:9:"CurraEnte";i:4823;s:8:"RaTenuTe";i:4824;s:2:"Ba";i:4825;s:5:"CuNeu";i:4826;s:8:"SartShat";i:4827;s:5:"Polyp";i:4828;s:7:"UnreUnv";i:4829;s:12:"InteKarakRhy";i:4830;s:3:"Ven";i:4831;s:3:"Tan";i:4832;s:8:"MeNecrNo";i:4833;s:12:"DioResoUnpre";i:4834;s:4:"Fell";i:4835;s:9:"ExGrafMai";i:4836;s:14:"SanifSuffrUnpr";i:4837;s:12:"GrimmKerUnma";i:4838;s:5:"Subsc";i:4839;s:6:"GilLaw";i:4840;s:10:"PerinPsilo";i:4841;s:8:"RenilRiv";i:4842;s:12:"FuThymoXenop";i:4843;s:7:"CassMen";i:4844;s:6:"LuMoro";i:4845;s:10:"HobPlasmSk";i:4846;s:5:"Rehum";i:4847;s:4:"Piaz";i:4848;s:5:"Defen";i:4849;s:4:"Prea";i:4850;s:9:"RedSaccSu";i:4851;s:9:"StrouUrox";i:4852;s:9:"MakObelSe";i:4853;s:5:"ReoTa";i:4854;s:7:"MiNonvi";i:4855;s:7:"AutZieg";i:4856;s:5:"Oscil";i:4857;s:9:"SuSuperUn";i:4858;s:4:"Slee";i:4859;s:5:"CaaJa";i:4860;s:8:"OvePosit";i:4861;s:7:"LianWel";i:4862;s:11:"FibOvoelTub";i:4863;s:4:"Crou";i:4864;s:5:"Wheed";i:4865;s:5:"Heter";i:4866;s:5:"MaPol";i:4867;s:8:"HundMaUr";i:4868;s:5:"ChGyr";i:4869;s:7:"CrFrPhr";i:4870;s:7:"KiPrima";i:4871;s:13:"DemibSinUnint";i:4872;s:5:"PuTyp";i:4873;s:8:"HooPhysi";i:4874;s:7:"CubitSt";i:4875;s:12:"PaletProWhos";i:4876;s:7:"RaTorme";i:4877;s:15:"LeiotSnortWally";i:4878;s:10:"LymPlaniSc";i:4879;s:5:"SuUni";i:4880;s:10:"BefrGlobRh";i:4881;s:11:"LibeNowaTro";i:4882;s:8:"ArEnerRh";i:4883;s:4:"Scar";i:4884;s:10:"CorpLumSha";i:4885;s:14:"HereaTraiTruan";i:4886;s:5:"Syrin";i:4887;s:6:"ChaInn";i:4888;s:3:"Use";i:4889;s:12:"EkahLusiUnfo";i:4890;s:10:"HelpiPhala";i:4891;s:10:"InterUnpro";i:4892;s:5:"Unred";i:4893;s:9:"ConfPePle";i:4894;s:9:"HoPreReam";i:4895;s:11:"PotTedTimer";i:4896;s:5:"Shiel";i:4897;s:10:"GoOverResc";i:4898;s:6:"NaTyle";i:4899;s:10:"FibGommeLa";i:4900;s:7:"PremoSt";i:4901;s:9:"HydroTale";i:4902;s:7:"PerThig";i:4903;s:8:"AcoelHal";i:4904;s:7:"BocNonr";i:4905;s:8:"PsySnaTe";i:4906;s:5:"Stint";i:4907;s:9:"SectSeeUn";i:4908;s:4:"FlMu";i:4909;s:4:"Reve";i:4910;s:7:"QuestUn";i:4911;s:11:"LibUnsVictu";i:4912;s:8:"SellaTra";i:4913;s:10:"CoMultParu";i:4914;s:3:"See";i:4915;s:7:"MaReTea";i:4916;s:10:"DucTowaTri";i:4917;s:7:"KeeProb";i:4918;s:10:"CitywPenta";i:4919;s:5:"Sprad";i:4920;s:5:"Fugit";i:4921;s:5:"TrVas";i:4922;s:12:"FoozlKlysSta";i:4923;s:10:"HomaMisTur";i:4924;s:8:"MensuVar";i:4925;s:13:"ForLinteNidic";i:4926;s:10:"SteToUpspl";i:4927;s:11:"JoshSuVisco";i:4928;s:5:"Semis";i:4929;s:7:"NovoxTr";i:4930;s:9:"GushxSchi";i:4931;s:10:"CitrPhthSu";i:4932;s:6:"ProUnc";i:4933;s:5:"PaVol";i:4934;s:3:"Lam";i:4935;s:7:"MatPlSo";i:4936;s:2:"Ru";i:4937;s:9:"PerRereTh";i:4938;s:11:"DokPetrSube";i:4939;s:6:"ProtSt";i:4940;s:15:"EidetParroScyph";i:4941;s:9:"OverRechi";i:4942;s:5:"Elsew";i:4943;s:12:"HomoSpecZizz";i:4944;s:5:"PrUnw";i:4945;s:8:"RattlRig";i:4946;s:5:"Helic";i:4947;s:9:"MicrSimSq";i:4948;s:8:"PreUnjil";i:4949;s:7:"InfrRep";i:4950;s:10:"GuasPalRub";i:4951;s:8:"OrgSubWa";i:4952;s:4:"Sept";i:4953;s:8:"BrEyeTri";i:4954;s:7:"NagOver";i:4955;s:12:"ButNonadSill";i:4956;s:11:"LavStympVea";i:4957;s:11:"DispoExRaph";i:4958;s:11:"FlexuMaleSa";i:4959;s:10:"IncraVihar";i:4960;s:6:"ScSkew";i:4961;s:4:"Irre";i:4962;s:8:"PeRecUna";i:4963;s:11:"CoPulviSchi";i:4964;s:10:"InconLyasx";i:4965;s:10:"MonodSparg";i:4966;s:6:"KickPi";i:4967;s:11:"TrabUnrWary";i:4968;s:14:"MuleResorUnsna";i:4969;s:13:"MetapNiggSupe";i:4970;s:9:"GraSterUv";i:4971;s:7:"LasquQu";i:4972;s:6:"UnaUnp";i:4973;s:10:"BipheConWr";i:4974;s:6:"CirUni";i:4975;s:3:"Pon";i:4976;s:5:"ExtRe";i:4977;s:5:"Inact";i:4978;s:7:"TrVendi";i:4979;s:5:"Santa";i:4980;s:9:"OsPhlPoro";i:4981;s:14:"HolidHydroTome";i:4982;s:4:"Incr";i:4983;s:3:"Hyp";i:4984;s:10:"CoOverrSug";i:4985;s:4:"Soap";i:4986;s:4:"Sole";i:4987;s:11:"PompProteSq";i:4988;s:6:"OutySu";i:4989;s:8:"FraFrPha";i:4990;s:7:"ParaPat";i:4991;s:12:"MarcOrobScot";i:4992;s:9:"PhysiTuto";i:4993;s:7:"AzygCit";i:4994;s:11:"UnharUnpUns";i:4995;s:3:"Neg";i:4996;s:6:"PrSupe";i:4997;s:9:"RosehUnso";i:4998;s:8:"NonRodom";i:4999;s:9:"IsothOpto";i:5000;s:8:"ForeFrac";i:5001;s:11:"ShoneTeZymo";i:5002;s:10:"BrKoloUnif";i:5003;s:12:"ImprPremiSup";i:5004;s:9:"EpeisGiIn";i:5005;s:8:"SnatcTes";i:5006;s:7:"GerTrav";i:5007;s:11:"ElSubsuUnsu";i:5008;s:4:"ApPr";i:5009;s:5:"Seapo";i:5010;s:7:"PoTetra";i:5011;s:11:"DeceFraOver";i:5012;s:4:"NoPa";i:5013;s:10:"BaraBiMoul";i:5014;s:8:"SchooZam";i:5015;s:3:"Omp";i:5016;s:12:"NuttiStVotar";i:5017;s:9:"DiSoarSto";i:5018;s:3:"Ges";i:5019;s:12:"OeninSubTher";i:5020;s:5:"DumJi";i:5021;s:9:"ClareDias";i:5022;s:9:"OutglPuUn";i:5023;s:5:"Salel";i:5024;s:10:"HyperOePro";i:5025;s:6:"BegNon";i:5026;s:6:"DemeLa";i:5027;s:11:"AuletCoNonr";i:5028;s:10:"JaNonRegul";i:5029;s:3:"Coc";i:5030;s:3:"Fun";i:5031;s:3:"Sti";i:5032;s:9:"MaineMile";i:5033;s:10:"CahokLikab";i:5034;s:6:"SponSt";i:5035;s:3:"Tai";i:5036;s:11:"MicrOverRef";i:5037;s:9:"SlumSphin";i:5038;s:8:"RivalSho";i:5039;s:13:"ContPredeTurb";i:5040;s:7:"TopUndi";i:5041;s:7:"PluStar";i:5042;s:2:"Gy";i:5043;s:13:"PantPiccSemid";i:5044;s:11:"NoTetraTumm";i:5045;s:7:"DaTheot";i:5046;s:13:"PiaTheorUnawa";i:5047;s:5:"Zilla";i:5048;s:12:"LikenProWhat";i:5049;s:5:"Demod";i:5050;s:2:"Ul";i:5051;s:5:"Sexlo";i:5052;s:4:"Unab";i:5053;s:5:"Tobac";i:5054;s:7:"UnVenti";i:5055;s:14:"HugeoSchuSucci";i:5056;s:4:"Octa";i:5057;s:12:"EcoFritxUncu";i:5058;s:7:"MadhvVa";i:5059;s:10:"UnbewUnive";i:5060;s:8:"PsTreUni";i:5061;s:5:"Overc";i:5062;s:7:"DarryLe";i:5063;s:8:"LateRuin";i:5064;s:8:"ParThYea";i:5065;s:5:"Reapp";i:5066;s:12:"NarProoeRhin";i:5067;s:10:"ThiUnconUn";i:5068;s:7:"OrtUnpe";i:5069;s:5:"Reliq";i:5070;s:4:"Uret";i:5071;s:6:"PsyTer";i:5072;s:3:"Gal";i:5073;s:5:"Rando";i:5074;s:6:"UnnWis";i:5075;s:12:"IndInteOutth";i:5076;s:3:"Fla";i:5077;s:7:"AntiSem";i:5078;s:7:"ConMeRh";i:5079;s:6:"SupTaf";i:5080;s:9:"MaPosScen";i:5081;s:3:"Kae";i:5082;s:8:"EquStrTi";i:5083;s:8:"GawmxOve";i:5084;s:10:"GinglUncap";i:5085;s:14:"DemodHakxSongb";i:5086;s:6:"IracSe";i:5087;s:4:"Squa";i:5088;s:7:"MicrUnp";i:5089;s:6:"LoSzla";i:5090;s:11:"JurorUnhaVe";i:5091;s:8:"ThioaZen";i:5092;s:12:"HerbaHeteIso";i:5093;s:8:"RhizUnve";i:5094;s:3:"Twe";i:5095;s:13:"InnSpraySunbe";i:5096;s:9:"KoLoRecop";i:5097;s:7:"LegaSta";i:5098;s:5:"Uncou";i:5099;s:9:"SemiSkiTh";i:5100;s:6:"BecoUn";i:5101;s:2:"Av";i:5102;s:8:"AssyCoRe";i:5103;s:7:"PrWauch";i:5104;s:8:"RhapStyl";i:5105;s:5:"Parap";i:5106;s:5:"Thrif";i:5107;s:10:"InteLophVi";i:5108;s:11:"GradIntLeas";i:5109;s:8:"AurRandy";i:5110;s:7:"HyOutdw";i:5111;s:2:"Sw";i:5112;s:4:"Pede";i:5113;s:12:"HomoeIllYame";i:5114;s:12:"NoninSclStro";i:5115;s:5:"Nonco";i:5116;s:7:"GeSpeck";i:5117;s:6:"StoUnp";i:5118;s:5:"ExpSk";i:5119;s:10:"DiEthnoPro";i:5120;s:11:"RhynUnconUn";i:5121;s:3:"Tha";i:5122;s:4:"Unst";i:5123;s:10:"MicroUncit";i:5124;s:7:"IrrTymp";i:5125;s:10:"SemUnimaWa";i:5126;s:10:"OverPontSn";i:5127;s:10:"AreLaugLau";i:5128;s:7:"DesTran";i:5129;s:7:"IrMinue";i:5130;s:11:"NoRenteVexx";i:5131;s:8:"GousPySc";i:5132;s:7:"NeOxylx";i:5133;s:5:"Unpen";i:5134;s:10:"KatexUnpat";i:5135;s:5:"PoTra";i:5136;s:4:"Nonf";i:5137;s:5:"Expos";i:5138;s:4:"Repe";i:5139;s:11:"DePisoUnide";i:5140;s:5:"EquZa";i:5141;s:8:"UnUnUnwi";i:5142;s:11:"OffcParaXyl";i:5143;s:10:"RaSemiSurv";i:5144;s:9:"PhacoVesi";i:5145;s:3:"Inv";i:5146;s:14:"EpitrOsteXanth";i:5147;s:5:"Wellb";i:5148;s:4:"CaSu";i:5149;s:11:"SincTrogUna";i:5150;s:7:"InParam";i:5151;s:13:"GabioOverbUnc";i:5152;s:6:"PlowRo";i:5153;s:13:"InsecJeremTel";i:5154;s:3:"Rat";i:5155;s:7:"IncPrYa";i:5156;s:8:"JarTwist";i:5157;s:6:"ElaPre";i:5158;s:9:"MiRopTurk";i:5159;s:11:"PrPremoSept";i:5160;s:13:"EssOverfWycli";i:5161;s:7:"TragiUn";i:5162;s:9:"InOuRatch";i:5163;s:5:"Bolar";i:5164;s:2:"Br";i:5165;s:12:"QuadrRentVol";i:5166;s:11:"OuphUnsleWh";i:5167;s:11:"GalvRachiSt";i:5168;s:12:"DeliFazPutri";i:5169;s:9:"HiHomeRet";i:5170;s:8:"SloSuper";i:5171;s:4:"Mime";i:5172;s:4:"Turb";i:5173;s:10:"MagiOrUnsu";i:5174;s:11:"BlaOrthOutg";i:5175;s:4:"Inal";i:5176;s:8:"SkeVolva";i:5177;s:12:"HexatMunicOn";i:5178;s:8:"OmnQuUnc";i:5179;s:3:"Qui";i:5180;s:8:"BiFacMan";i:5181;s:5:"Uncle";i:5182;s:10:"PalaSpUnco";i:5183;s:5:"Sabba";i:5184;s:5:"NonSe";i:5185;s:14:"JuggeTetryUnbo";i:5186;s:10:"KerniPalRe";i:5187;s:4:"Unma";i:5188;s:4:"Unmu";i:5189;s:5:"Incom";i:5190;s:7:"PinkSca";i:5191;s:11:"NaSletSperm";i:5192;s:3:"Mil";i:5193;s:10:"AnthrBuOve";i:5194;s:11:"NemaPerUnre";i:5195;s:10:"RevisSanto";i:5196;s:7:"GaGunRa";i:5197;s:13:"PhotoPreUnrec";i:5198;s:6:"ReZoop";i:5199;s:12:"DermaMaThorn";i:5200;s:4:"Scor";i:5201;s:3:"Tet";i:5202;s:10:"MesocSeric";i:5203;s:12:"OmenSomnaSub";i:5204;s:10:"FiordJochx";i:5205;s:9:"DissGaQua";i:5206;s:7:"TeTorme";i:5207;s:7:"LarrUnf";i:5208;s:6:"DiesTa";i:5209;s:7:"NonfStr";i:5210;s:7:"DisEpil";i:5211;s:5:"Smoke";i:5212;s:9:"JimSaShut";i:5213;s:11:"BandOxamPsy";i:5214;s:3:"Pul";i:5215;s:4:"Hype";i:5216;s:4:"Scon";i:5217;s:11:"FourpMilUnd";i:5218;s:12:"ChuThundTopo";i:5219;s:9:"ExMuRelev";i:5220;s:4:"Resp";i:5221;s:8:"CorMilks";i:5222;s:11:"HalfInPyrul";i:5223;s:12:"PhotoProsaUn";i:5224;s:4:"Maie";i:5225;s:7:"MaOchUb";i:5226;s:5:"SpWar";i:5227;s:8:"CalPhaTe";i:5228;s:7:"HePrYam";i:5229;s:4:"Yama";i:5230;s:4:"Trib";i:5231;s:6:"InPoUn";i:5232;s:5:"Sciss";i:5233;s:3:"Teg";i:5234;s:12:"CinctJesModi";i:5235;s:14:"FoghToxigWolfh";i:5236;s:10:"LowSuWould";i:5237;s:7:"SpittTe";i:5238;s:8:"KathUnde";i:5239;s:11:"EnanReRight";i:5240;s:4:"Unpe";i:5241;s:8:"ToppVaci";i:5242;s:11:"LymphSwirWh";i:5243;s:9:"MarkPseud";i:5244;s:10:"ElegaTlasc";i:5245;s:10:"NonmTheoWa";i:5246;s:8:"MenSynar";i:5247;s:3:"Pil";i:5248;s:5:"Thala";i:5249;s:11:"OlePreUnado";i:5250;s:2:"Ni";i:5251;s:4:"Unge";i:5252;s:8:"ProSolTo";i:5253;s:4:"Rece";i:5254;s:8:"IsoLitho";i:5255;s:3:"Col";i:5256;s:5:"Intra";i:5257;s:5:"RoUnl";i:5258;s:7:"HeronIn";i:5259;s:4:"Undu";i:5260;s:7:"LimSaVo";i:5261;s:10:"CenPentSto";i:5262;s:8:"IsraTher";i:5263;s:9:"DeperUpge";i:5264;s:9:"DispLeWoo";i:5265;s:4:"Puru";i:5266;s:3:"Rig";i:5267;s:9:"CoGolPred";i:5268;s:3:"Lyr";i:5269;s:9:"PoRediUnl";i:5270;s:12:"SnotTibiaUnt";i:5271;s:5:"Mirac";i:5272;s:4:"HyHy";i:5273;s:5:"Senti";i:5274;s:6:"RadeSe";i:5275;s:12:"LattSpheUnne";i:5276;s:5:"Sperm";i:5277;s:7:"PrStabl";i:5278;s:9:"KieyUnpam";i:5279;s:9:"NeThiocVi";i:5280;s:6:"MicrRe";i:5281;s:4:"Hint";i:5282;s:6:"OxycVi";i:5283;s:12:"TrimUndeUnex";i:5284;s:7:"EncTcUr";i:5285;s:4:"Tomb";i:5286;s:12:"RoritSxTartw";i:5287;s:9:"GametPret";i:5288;s:8:"CoNodPri";i:5289;s:13:"PhosPogrPseud";i:5290;s:6:"PalTab";i:5291;s:7:"DiscGla";i:5292;s:8:"GrHibVen";i:5293;s:14:"LeaveMassUncor";i:5294;s:9:"ReSmiUnin";i:5295;s:5:"Sacch";i:5296;s:7:"MisceSt";i:5297;s:14:"PrissRepoTauch";i:5298;s:9:"CornPeScr";i:5299;s:8:"HepSuper";i:5300;s:11:"HiroSeriUnd";i:5301;s:12:"SuTripaUnpin";i:5302;s:10:"IrPuerViti";i:5303;s:7:"SubVint";i:5304;s:12:"ScenaThWinna";i:5305;s:8:"FlorSupr";i:5306;s:8:"ProUndes";i:5307;s:12:"TranVagiVier";i:5308;s:7:"KerriQu";i:5309;s:12:"PrunQuinSter";i:5310;s:8:"HoUnWeit";i:5311;s:6:"UnUnte";i:5312;s:9:"OthinUnWe";i:5313;s:9:"PlanRouUn";i:5314;s:3:"Sex";i:5315;s:7:"KangPia";i:5316;s:5:"Uncau";i:5317;s:5:"GeJox";i:5318;s:7:"GamalPs";i:5319;s:4:"Mono";i:5320;s:7:"PaleoPa";i:5321;s:6:"KeysMa";i:5322;s:6:"SeUngo";i:5323;s:5:"StWre";i:5324;s:12:"CamelDatiFre";i:5325;s:5:"ParUn";i:5326;s:5:"Phoby";i:5327;s:12:"BrocNotorUnt";i:5328;s:5:"Repan";i:5329;s:7:"EczWeed";i:5330;s:9:"FatKornOv";i:5331;s:8:"PaReSyno";i:5332;s:10:"LeoraPolyc";i:5333;s:8:"PolSalmo";i:5334;s:11:"LeaLillSpea";i:5335;s:7:"PasPrim";i:5336;s:10:"GyPalTachy";i:5337;s:6:"ProTra";i:5338;s:10:"OdontReamy";i:5339;s:9:"PasixZoog";i:5340;s:5:"SleTo";i:5341;s:10:"IcedxPaSom";i:5342;s:3:"Nep";i:5343;s:7:"OofyShe";i:5344;s:3:"Bic";i:5345;s:11:"ExHoovRodne";i:5346;s:5:"IsQui";i:5347;s:10:"MolSkiesUn";i:5348;s:4:"Trop";i:5349;s:8:"EnterTch";i:5350;s:5:"OveSu";i:5351;s:5:"Uncre";i:5352;s:9:"InquPhren";i:5353;s:10:"StaSwUnrun";i:5354;s:9:"MoNontaSt";i:5355;s:12:"LaryUninUnme";i:5356;s:5:"Spiro";i:5357;s:8:"PhylTett";i:5358;s:4:"SaSe";i:5359;s:11:"MultiPerPsy";i:5360;s:8:"DaRemSub";i:5361;s:4:"Trip";i:5362;s:11:"HemLummoUna";i:5363;s:13:"DepigGinIntre";i:5364;s:5:"MiOog";i:5365;s:3:"Mic";i:5366;s:6:"ConExt";i:5367;s:10:"SaSturdSur";i:5368;s:8:"KinsmUle";i:5369;s:9:"ItenMilde";i:5370;s:5:"Urome";i:5371;s:10:"SolUnexVar";i:5372;s:9:"SulphTask";i:5373;s:9:"CasMetaVa";i:5374;s:10:"KyuxTriUnm";i:5375;s:13:"MyocePectuPor";i:5376;s:14:"LardiMiscuToda";i:5377;s:7:"UnfXant";i:5378;s:12:"PhaRackUnind";i:5379;s:3:"Mes";i:5380;s:8:"HepatMed";i:5381;s:8:"EarSomet";i:5382;s:6:"ExemUn";i:5383;s:8:"KeelPuQu";i:5384;s:5:"Raung";i:5385;s:13:"HyogQuadrSili";i:5386;s:8:"AmpLiPat";i:5387;s:8:"ImpTradi";i:5388;s:8:"SergeSph";i:5389;s:8:"CirUnblo";i:5390;s:9:"EvMortZin";i:5391;s:10:"MammaThioz";i:5392;s:5:"PeiPr";i:5393;s:13:"MicrNotoRadic";i:5394;s:10:"PhtPicumPs";i:5395;s:11:"GeocNonbOst";i:5396;s:8:"AvaJagVy";i:5397;s:5:"MaVen";i:5398;s:8:"ParaUnbl";i:5399;s:7:"OdonRen";i:5400;s:5:"Locus";i:5401;s:12:"DecoOrthRach";i:5402;s:9:"BlFolSyna";i:5403;s:6:"TeUnde";i:5404;s:8:"MouUntVe";i:5405;s:8:"CedarIso";i:5406;s:9:"StonTenct";i:5407;s:11:"ReinsRepSil";i:5408;s:8:"QuaSneak";i:5409;s:8:"CakeCont";i:5410;s:5:"Eucon";i:5411;s:4:"Tele";i:5412;s:4:"Nonc";i:5413;s:8:"AeMapSub";i:5414;s:10:"GigmaRebri";i:5415;s:4:"Wany";i:5416;s:5:"UnpUn";i:5417;s:5:"PorRe";i:5418;s:13:"HomotMoonPost";i:5419;s:14:"CommDecorImmed";i:5420;s:4:"LiLu";i:5421;s:11:"ConcHibZygo";i:5422;s:12:"InteSubeUnch";i:5423;s:5:"Bulim";i:5424;s:9:"RecoUnhoi";i:5425;s:11:"ProteSaloVe";i:5426;s:10:"MaMegPrair";i:5427;s:12:"OvereSeralTo";i:5428;s:4:"Saca";i:5429;s:11:"ChipLactaSl";i:5430;s:3:"Nos";i:5431;s:11:"SickSponWhi";i:5432;s:7:"MouVisi";i:5433;s:8:"OvQxUnsh";i:5434;s:12:"GlabeLePromy";i:5435;s:4:"SpUs";i:5436;s:5:"Uncan";i:5437;s:10:"SculpSuTru";i:5438;s:9:"OuStronWa";i:5439;s:9:"ChioMaste";i:5440;s:11:"DownlPrUnfe";i:5441;s:5:"Tinca";i:5442;s:10:"HidPrRoare";i:5443;s:6:"ChrEri";i:5444;s:9:"OlfaSalpi";i:5445;s:6:"PleoPr";i:5446;s:10:"UnmenWalle";i:5447;s:4:"Osop";i:5448;s:10:"SpaSubtUnt";i:5449;s:7:"EmitRou";i:5450;s:8:"GriPatSa";i:5451;s:5:"FoPhe";i:5452;s:12:"RectoSteUnre";i:5453;s:7:"NoUnequ";i:5454;s:7:"EntitRa";i:5455;s:4:"GaMa";i:5456;s:7:"PrStere";i:5457;s:14:"PalisRevieSeac";i:5458;s:10:"KeratScUnc";i:5459;s:5:"Gorra";i:5460;s:4:"Oste";i:5461;s:5:"Snipx";i:5462;s:5:"SwaTe";i:5463;s:13:"SikeUnutVolit";i:5464;s:8:"SeptTaff";i:5465;s:8:"MartPrRu";i:5466;s:12:"CeChopsRever";i:5467;s:12:"InProveVagin";i:5468;s:5:"InTri";i:5469;s:13:"OligaPalVesse";i:5470;s:6:"PhysPr";i:5471;s:14:"GlycoNeurVulva";i:5472;s:7:"BeDrScl";i:5473;s:7:"BraUnsa";i:5474;s:3:"Ory";i:5475;s:5:"Phary";i:5476;s:3:"Ini";i:5477;s:10:"MaResuWitt";i:5478;s:8:"DeMaddMa";i:5479;s:12:"HereSteZygom";i:5480;s:9:"FluHashUn";i:5481;s:5:"ChIni";i:5482;s:5:"SoUng";i:5483;s:6:"MaSpir";i:5484;s:10:"GawnxRaUns";i:5485;s:7:"ScToxic";i:5486;s:6:"LabPla";i:5487;s:4:"RoVo";i:5488;s:12:"CircuDicProt";i:5489;s:14:"MariPhiloThank";i:5490;s:3:"Wid";i:5491;s:12:"PlatTheokTou";i:5492;s:6:"ScTiVi";i:5493;s:5:"Clubm";i:5494;s:9:"PondUnvul";i:5495;s:5:"Salte";i:5496;s:11:"RotTubicUnh";i:5497;s:10:"TheoTitlUn";i:5498;s:8:"NatifRen";i:5499;s:4:"Zygn";i:5500;s:3:"Eut";i:5501;s:4:"Gene";i:5502;s:12:"ProReactSemi";i:5503;s:11:"CartPoPyrex";i:5504;s:5:"Shock";i:5505;s:4:"Zygo";i:5506;s:5:"MiTen";i:5507;s:7:"PhrTorr";i:5508;s:8:"GruSeTau";i:5509;s:7:"SmaSoUr";i:5510;s:12:"HoweMegOverw";i:5511;s:7:"NumPrUn";i:5512;s:7:"CyQuebr";i:5513;s:8:"IzzarSup";i:5514;s:8:"CoDihDor";i:5515;s:9:"MowRosSee";i:5516;s:14:"PerseSabeSalpi";i:5517;s:4:"Hear";i:5518;s:7:"StrTrep";i:5519;s:10:"NumerUnrWe";i:5520;s:8:"SleiUnch";i:5521;s:4:"NoPr";i:5522;s:4:"Buzz";i:5523;s:5:"ChMae";i:5524;s:5:"DiMer";i:5525;s:7:"RebetVe";i:5526;s:8:"RevTonsi";i:5527;s:11:"PilSquirSui";i:5528;s:8:"PaVoluYo";i:5529;s:10:"CalaCalcCr";i:5530;s:12:"HoverImpPerf";i:5531;s:7:"EmbHeZa";i:5532;s:5:"Paran";i:5533;s:8:"ElianWat";i:5534;s:13:"LumbMugfuUnsu";i:5535;s:9:"CitOvUnso";i:5536;s:11:"PreSunZerma";i:5537;s:4:"Plan";i:5538;s:10:"LaugMoPopu";i:5539;s:8:"PerSuppl";i:5540;s:11:"CapMeroThre";i:5541;s:7:"DerUndi";i:5542;s:9:"MuddiPuUn";i:5543;s:6:"PoSnai";i:5544;s:4:"Trun";i:5545;s:13:"ConfiExhauSou";i:5546;s:5:"Idiom";i:5547;s:5:"ChSpa";i:5548;s:12:"PheRectTousc";i:5549;s:11:"HemJokSelen";i:5550;s:10:"MilliPeatm";i:5551;s:8:"InacPseu";i:5552;s:7:"VegeXen";i:5553;s:6:"BarGre";i:5554;s:5:"InWhi";i:5555;s:9:"CounReove";i:5556;s:13:"PalmePlaSwang";i:5557;s:9:"DiPreiRee";i:5558;s:10:"CappaHyper";i:5559;s:9:"PatsTymUn";i:5560;s:4:"PrUn";i:5561;s:8:"BongHeat";i:5562;s:4:"Derm";i:5563;s:7:"HomoeSt";i:5564;s:13:"SignaSpeSquif";i:5565;s:9:"OlofPlaco";i:5566;s:7:"CaStoUn";i:5567;s:7:"GlMossi";i:5568;s:7:"TrUnclo";i:5569;s:14:"GlycPolycTapet";i:5570;s:15:"OchroParasVilit";i:5571;s:6:"BairDi";i:5572;s:9:"AssorJuSp";i:5573;s:10:"LooPhPluto";i:5574;s:8:"CorCroni";i:5575;s:7:"LaTerml";i:5576;s:11:"SponsTraTub";i:5577;s:6:"ConOst";i:5578;s:8:"SambuUnl";i:5579;s:8:"HormOrga";i:5580;s:7:"CytRecl";i:5581;s:6:"PySupe";i:5582;s:3:"Foo";i:5583;s:9:"GeoMatPho";i:5584;s:7:"CattPar";i:5585;s:11:"CacheHomUng";i:5586;s:13:"RefTrucuUnrip";i:5587;s:5:"HusWx";i:5588;s:13:"DumbSollyUnla";i:5589;s:7:"CoIroni";i:5590;s:11:"FiberLeniTc";i:5591;s:11:"ReanaUrduZe";i:5592;s:8:"TwiddVir";i:5593;s:5:"Possi";i:5594;s:5:"ArEus";i:5595;s:8:"NeogZono";i:5596;s:8:"ProdPsTe";i:5597;s:6:"AttSte";i:5598;s:4:"Epiz";i:5599;s:5:"Impot";i:5600;s:8:"PotWerec";i:5601;s:13:"DavidPsePseud";i:5602;s:5:"Semic";i:5603;s:4:"Hell";i:5604;s:8:"EncyRepe";i:5605;s:6:"TorUng";i:5606;s:12:"GlSauroUnlea";i:5607;s:7:"RecoThy";i:5608;s:7:"GiQuiSu";i:5609;s:5:"CrVel";i:5610;s:9:"PeSeUnthr";i:5611;s:12:"SchUnleaWitc";i:5612;s:14:"BiannGenitLevi";i:5613;s:11:"EndoMisNong";i:5614;s:3:"Slu";i:5615;s:11:"FruOordxSyn";i:5616;s:7:"RondVes";i:5617;s:4:"Upmo";i:5618;s:9:"MemorShou";i:5619;s:5:"Preli";i:5620;s:4:"Midd";i:5621;s:6:"PilTom";i:5622;s:5:"Wager";i:5623;s:12:"CollaCosSpor";i:5624;s:12:"SleuTaffyTet";i:5625;s:8:"NaceVagi";i:5626;s:5:"Ondag";i:5627;s:3:"Anc";i:5628;s:5:"Unafi";i:5629;s:5:"Parda";i:5630;s:10:"CrossIndig";i:5631;s:4:"ChCo";i:5632;s:6:"JaSeba";i:5633;s:6:"ForPen";i:5634;s:6:"PlunTr";i:5635;s:9:"OverTrUni";i:5636;s:7:"SupUnmo";i:5637;s:13:"SeeaSemilThos";i:5638;s:4:"Clad";i:5639;s:5:"MiSal";i:5640;s:5:"IntRe";i:5641;s:10:"CopGaSpeec";i:5642;s:7:"MaOaRiz";i:5643;s:9:"ElePoseUn";i:5644;s:5:"Trapf";i:5645;s:4:"Syll";i:5646;s:4:"Unof";i:5647;s:7:"SpSupTr";i:5648;s:7:"CrassOv";i:5649;s:9:"SupeTinke";i:5650;s:8:"NoneYamx";i:5651;s:4:"Jour";i:5652;s:7:"SummeSy";i:5653;s:7:"SwaTwin";i:5654;s:5:"Outse";i:5655;s:5:"Unlic";i:5656;s:12:"HospPlastQua";i:5657;s:7:"UnaYabb";i:5658;s:5:"Holly";i:5659;s:7:"PlaUnre";i:5660;s:11:"DisEngMonum";i:5661;s:3:"Opu";i:5662;s:10:"LogyxPrefe";i:5663;s:5:"OccPr";i:5664;s:7:"DrafPro";i:5665;s:8:"SeleTypi";i:5666;s:4:"SuUr";i:5667;s:4:"Sper";i:5668;s:7:"IrUnret";i:5669;s:7:"GoloSem";i:5670;s:12:"QuadrRevToly";i:5671;s:3:"Ura";i:5672;s:6:"ShopVa";i:5673;s:11:"ChucGentlVi";i:5674;s:8:"HaulmHic";i:5675;s:8:"OversOxe";i:5676;s:15:"IllumTritoUnwoo";i:5677;s:10:"ReThunUnpe";i:5678;s:3:"Phe";i:5679;s:5:"OdySe";i:5680;s:10:"DisIrrMans";i:5681;s:9:"DoEpYttri";i:5682;s:12:"OveOxazSpoof";i:5683;s:5:"Recom";i:5684;s:3:"Spy";i:5685;s:9:"ChiFooUns";i:5686;s:8:"NoSuUnov";i:5687;s:7:"LeTiUnr";i:5688;s:14:"ChromIncusSulp";i:5689;s:12:"EschaGastrRe";i:5690;s:12:"OpaquTechnUn";i:5691;s:9:"CuGasSnee";i:5692;s:9:"BrillShoo";i:5693;s:8:"NotUrete";i:5694;s:13:"SpiroSteYaupo";i:5695;s:8:"IntScyph";i:5696;s:5:"HoUnr";i:5697;s:5:"Silkg";i:5698;s:3:"Khw";i:5699;s:8:"MalSemip";i:5700;s:9:"ChrisNonp";i:5701;s:8:"PosPrefl";i:5702;s:6:"RuffSu";i:5703;s:3:"Sax";i:5704;s:8:"MulTermi";i:5705;s:10:"CooMonsUns";i:5706;s:7:"JiPaUnb";i:5707;s:5:"Thymo";i:5708;s:12:"CurstMimePos";i:5709;s:7:"UnrWood";i:5710;s:5:"Favon";i:5711;s:6:"LeSupp";i:5712;s:2:"Sq";i:5713;s:8:"FireInse";i:5714;s:10:"MonopRaffa";i:5715;s:3:"Pho";i:5716;s:14:"ConvNotwiSuper";i:5717;s:5:"OchSt";i:5718;s:10:"DeDialEogh";i:5719;s:9:"MisoUnwra";i:5720;s:8:"ProvUnad";i:5721;s:2:"Cy";i:5722;s:7:"MisenWo";i:5723;s:7:"FiPansc";i:5724;s:13:"AnomaHianPear";i:5725;s:5:"HySat";i:5726;s:4:"PrVa";i:5727;s:12:"QuicUnwWoneg";i:5728;s:9:"DefraHygr";i:5729;s:8:"CherHoMy";i:5730;s:9:"ChanVined";i:5731;s:7:"RaRavis";i:5732;s:15:"LiquiOverpSuper";i:5733;s:11:"CubPhiloUns";i:5734;s:7:"SleiSpa";i:5735;s:6:"SwaUnp";i:5736;s:10:"CoRefUnrig";i:5737;s:15:"SarciThundWantl";i:5738;s:10:"BubonIncOn";i:5739;s:7:"PlScrup";i:5740;s:7:"DeDiObv";i:5741;s:11:"RaisUnderVe";i:5742;s:12:"ConteHaIndec";i:5743;s:11:"MusPolycSul";i:5744;s:7:"SagaSub";i:5745;s:5:"OcUnr";i:5746;s:4:"Reca";i:5747;s:10:"ImmenWitti";i:5748;s:7:"PhraUnc";i:5749;s:5:"Prein";i:5750;s:10:"LievMetPre";i:5751;s:8:"OggSigil";i:5752;s:12:"ThTripyUnbro";i:5753;s:10:"KraTerebTr";i:5754;s:6:"InteSe";i:5755;s:10:"FoSheThora";i:5756;s:9:"ExiNoniUn";i:5757;s:12:"QuRoentSamsa";i:5758;s:6:"PhTyro";i:5759;s:10:"LazybParap";i:5760;s:8:"CaFissMo";i:5761;s:5:"Ataxi";i:5762;s:14:"JaileMolePrear";i:5763;s:10:"BarytSixha";i:5764;s:4:"SiSo";i:5765;s:12:"DiscoInterRa";i:5766;s:11:"HyposSyVici";i:5767;s:4:"InLu";i:5768;s:10:"FlPolysTot";i:5769;s:10:"PrSlaugThe";i:5770;s:9:"MegThTort";i:5771;s:7:"NodReSy";i:5772;s:9:"ConPoliVi";i:5773;s:5:"Snipp";i:5774;s:13:"CuticGunbSulf";i:5775;s:5:"Parag";i:5776;s:3:"Ili";i:5777;s:4:"Call";i:5778;s:14:"MarmSairvSuper";i:5779;s:8:"MollSeam";i:5780;s:10:"InvalSesba";i:5781;s:5:"EqInd";i:5782;s:6:"CoPodo";i:5783;s:7:"AntiWis";i:5784;s:14:"GestiHomePetra";i:5785;s:3:"Phy";i:5786;s:7:"CaimiIs";i:5787;s:8:"OstUrson";i:5788;s:6:"ReSpha";i:5789;s:10:"DiDisParas";i:5790;s:10:"OtalOvSpha";i:5791;s:7:"SaSpavi";i:5792;s:8:"UndwiUns";i:5793;s:5:"Linse";i:5794;s:7:"StUnadu";i:5795;s:4:"SaWi";i:5796;s:13:"InterPsyTempt";i:5797;s:10:"CrosDiSecl";i:5798;s:6:"CyLeMu";i:5799;s:5:"CryNu";i:5800;s:5:"Yiddi";i:5801;s:5:"StoUn";i:5802;s:9:"EggeOutwa";i:5803;s:10:"MoravVisuo";i:5804;s:5:"Ghurr";i:5805;s:14:"CompHolidToxic";i:5806;s:7:"MyoSoci";i:5807;s:9:"LiPosthUn";i:5808;s:6:"SpUnto";i:5809;s:3:"Sep";i:5810;s:11:"FumatIndiTr";i:5811;s:4:"Nege";i:5812;s:10:"PeResuScra";i:5813;s:12:"ConvLinParas";i:5814;s:6:"HooPal";i:5815;s:6:"SporSt";i:5816;s:11:"DyeForsUnem";i:5817;s:10:"PredrPrStu";i:5818;s:11:"DivHegLutem";i:5819;s:10:"ScornUnhig";i:5820;s:9:"BeneTubWa";i:5821;s:5:"SanSt";i:5822;s:7:"LaSaUnc";i:5823;s:7:"MisaPol";i:5824;s:14:"MungPenetRudol";i:5825;s:8:"NonclSur";i:5826;s:10:"HydLigPres";i:5827;s:6:"QuirSa";i:5828;s:7:"SquirTa";i:5829;s:8:"EnExpPro";i:5830;s:4:"HeUn";i:5831;s:9:"UnstUnthr";i:5832;s:5:"LiZoo";i:5833;s:5:"Somet";i:5834;s:7:"UnZucch";i:5835;s:6:"InSpUn";i:5836;s:12:"GawNeptOutbo";i:5837;s:4:"Weed";i:5838;s:9:"BoPolySig";i:5839;s:8:"HatcNucl";i:5840;s:6:"HypInn";i:5841;s:6:"UlUngr";i:5842;s:10:"MesScUnatt";i:5843;s:5:"UncYo";i:5844;s:12:"BimilFasciMe";i:5845;s:8:"PubiTass";i:5846;s:15:"GaragLouchNonlo";i:5847;s:8:"PhilhTah";i:5848;s:6:"SornWa";i:5849;s:10:"TamilUnhor";i:5850;s:3:"Bra";i:5851;s:12:"HeteParPreco";i:5852;s:15:"DazemTotanUncri";i:5853;s:9:"FahlMilly";i:5854;s:5:"ImOpp";i:5855;s:5:"Sahar";i:5856;s:14:"MelopReceTrira";i:5857;s:5:"Mimly";i:5858;s:13:"LunaSupraUnil";i:5859;s:12:"ResiVerWhipp";i:5860;s:10:"NucTolUnou";i:5861;s:6:"SuTele";i:5862;s:6:"PinShu";i:5863;s:8:"HyphYuzl";i:5864;s:7:"SplinUn";i:5865;s:5:"Stack";i:5866;s:5:"Odont";i:5867;s:11:"MoParamPreo";i:5868;s:7:"LiMonst";i:5869;s:6:"StroUn";i:5870;s:4:"Tica";i:5871;s:7:"CouElec";i:5872;s:8:"EnrKusim";i:5873;s:3:"Sic";i:5874;s:9:"IncoUnali";i:5875;s:11:"RedeSelexUp";i:5876;s:5:"Parat";i:5877;s:9:"NonacWhif";i:5878;s:12:"RoSangaWistl";i:5879;s:8:"RatTranq";i:5880;s:9:"JentLogUp";i:5881;s:3:"Mus";i:5882;s:14:"ServaSparkSper";i:5883;s:5:"Sylvi";i:5884;s:10:"SnackSurge";i:5885;s:11:"AztecHomPou";i:5886;s:4:"PrPs";i:5887;s:4:"Unex";i:5888;s:7:"CeorGon";i:5889;s:8:"DisesWin";i:5890;s:8:"EglesIsl";i:5891;s:5:"Remix";i:5892;s:5:"BuRes";i:5893;s:11:"HemogOvSupe";i:5894;s:14:"MeasMenacSpora";i:5895;s:8:"OsphyTal";i:5896;s:4:"Blan";i:5897;s:6:"EfflHo";i:5898;s:9:"PrSpeceUn";i:5899;s:6:"IscUnt";i:5900;s:4:"InTa";i:5901;s:9:"PrehuTene";i:5902;s:9:"MatRuShak";i:5903;s:11:"NervePetRed";i:5904;s:8:"EpiMoOut";i:5905;s:7:"CuOsUnp";i:5906;s:6:"InfiSu";i:5907;s:8:"DeMnSkid";i:5908;s:5:"Secti";i:5909;s:5:"CurEc";i:5910;s:11:"FlankMiShri";i:5911;s:12:"ReeliRuRusty";i:5912;s:7:"PluviTu";i:5913;s:12:"MonoNonasStr";i:5914;s:5:"PreTo";i:5915;s:7:"StuUnif";i:5916;s:5:"Unord";i:5917;s:7:"DichrNa";i:5918;s:9:"NimmProlo";i:5919;s:3:"Jol";i:5920;s:9:"HadScoSub";i:5921;s:5:"Stoma";i:5922;s:8:"PrSignTe";i:5923;s:10:"RebTubeVul";i:5924;s:8:"DiNoWood";i:5925;s:5:"OrSwa";i:5926;s:9:"GaIntelOr";i:5927;s:5:"Scuti";i:5928;s:4:"Gent";i:5929;s:7:"NoniPte";i:5930;s:6:"CaHeat";i:5931;s:10:"PhalaWarve";i:5932;s:8:"PrPygUra";i:5933;s:5:"Nutcr";i:5934;s:11:"LepidMonUnr";i:5935;s:7:"PalPatr";i:5936;s:9:"ReiSixVes";i:5937;s:6:"MesUnf";i:5938;s:3:"Tsu";i:5939;s:5:"Ununi";i:5940;s:6:"ReSpie";i:5941;s:4:"SuUn";i:5942;s:9:"OrdinRabb";i:5943;s:11:"MiNapuPlebx";i:5944;s:8:"PodogSta";i:5945;s:9:"KuskuNigg";i:5946;s:4:"Capr";i:5947;s:5:"Chlam";i:5948;s:5:"CoSch";i:5949;s:13:"IndisMyseTubx";i:5950;s:10:"MazRhiTran";i:5951;s:4:"Prer";i:5952;s:7:"DoMecRu";i:5953;s:11:"RamaTopeZen";i:5954;s:13:"OverSpicUnmel";i:5955;s:5:"Prata";i:5956;s:6:"NebaSt";i:5957;s:12:"BudmaCritDio";i:5958;s:11:"GyroPaleoUn";i:5959;s:8:"EsMaRede";i:5960;s:8:"SizTetra";i:5961;s:7:"AsStaTa";i:5962;s:12:"NurseSmyrUna";i:5963;s:9:"CoUnmWrea";i:5964;s:10:"SisUnaltUn";i:5965;s:11:"GigarGranPr";i:5966;s:9:"MacabMyop";i:5967;s:7:"CrediGu";i:5968;s:10:"OncRinSlug";i:5969;s:4:"Rose";i:5970;s:5:"MisMo";i:5971;s:11:"ShoeSlUnmem";i:5972;s:10:"PasquPreci";i:5973;s:9:"DedicInIr";i:5974;s:12:"GlovePyjamSa";i:5975;s:9:"CockThroa";i:5976;s:3:"Jau";i:5977;s:7:"LibTrip";i:5978;s:13:"MegaRaceTobac";i:5979;s:5:"Atwix";i:5980;s:12:"PlatyReUnben";i:5981;s:11:"MoPropSulph";i:5982;s:5:"Twere";i:5983;s:4:"Timi";i:5984;s:8:"CoOophUn";i:5985;s:7:"KentiRe";i:5986;s:11:"AgrolKaPter";i:5987;s:5:"Xeres";i:5988;s:14:"ChoriLochiMaga";i:5989;s:12:"FucoxGaoNutt";i:5990;s:9:"PrStrTerp";i:5991;s:7:"ItSciss";i:5992;s:11:"GassiNatUnb";i:5993;s:4:"Unri";i:5994;s:8:"PrSarSir";i:5995;s:4:"HeUs";i:5996;s:11:"CyMatamStan";i:5997;s:9:"MarcSuTub";i:5998;s:7:"UnrVall";i:5999;s:7:"PentaPh";i:6000;s:5:"Knobs";i:6001;s:5:"Poste";i:6002;s:4:"InPr";i:6003;s:12:"DoldrRecUros";i:6004;s:12:"OctodParkeTh";i:6005;s:6:"PlaThe";i:6006;s:2:"En";i:6007;s:13:"PseudReheSpri";i:6008;s:8:"NitPraTo";i:6009;s:6:"PrTetr";i:6010;s:8:"DiscKary";i:6011;s:5:"Rattl";i:6012;s:6:"SpicSu";i:6013;s:7:"NonfTet";i:6014;s:7:"UnUteri";i:6015;s:14:"LesbiNawxPrere";i:6016;s:4:"Thra";i:6017;s:7:"MercThu";i:6018;s:6:"PiSini";i:6019;s:3:"Ten";i:6020;s:10:"ExecuXylos";i:6021;s:6:"IaKoUn";i:6022;s:4:"Coin";i:6023;s:6:"HagsLo";i:6024;s:8:"ProsScha";i:6025;s:5:"Weepx";i:6026;s:7:"MirdaPo";i:6027;s:4:"Pegm";i:6028;s:8:"DemForgo";i:6029;s:5:"Meado";i:6030;s:10:"ArchLimbSk";i:6031;s:8:"NegOrSem";i:6032;s:10:"KonRusseUn";i:6033;s:4:"PrSm";i:6034;s:7:"MuRenUn";i:6035;s:3:"Ras";i:6036;s:10:"InterKaTep";i:6037;s:13:"RedoToseTropi";i:6038;s:6:"LibeTa";i:6039;s:8:"ChQuinRe";i:6040;s:4:"Zoop";i:6041;s:10:"MorSpanUne";i:6042;s:10:"IndicRoUnr";i:6043;s:5:"SarTi";i:6044;s:3:"Mou";i:6045;s:7:"CaSatra";i:6046;s:12:"ForamMoaMura";i:6047;s:8:"MaMoSulp";i:6048;s:13:"PiscaTonnVisi";i:6049;s:14:"IndusMuskPodic";i:6050;s:9:"ResprSeni";i:6051;s:9:"AftHypeOa";i:6052;s:9:"DeDigEuco";i:6053;s:8:"TriUndes";i:6054;s:7:"MoskSik";i:6055;s:9:"FifthLuSu";i:6056;s:5:"Proli";i:6057;s:9:"PolyeQuin";i:6058;s:9:"InIsUnmat";i:6059;s:7:"CrPondo";i:6060;s:9:"LantStrid";i:6061;s:13:"HaveSubpTechn";i:6062;s:8:"MaMusaSc";i:6063;s:7:"MoSeSup";i:6064;s:5:"Timef";i:6065;s:9:"LoPyvuSyn";i:6066;s:3:"Spl";i:6067;s:9:"MouReseUm";i:6068;s:4:"ToWa";i:6069;s:9:"MonocSept";i:6070;s:13:"KanepTransTri";i:6071;s:4:"Enhy";i:6072;s:13:"SpareSubTaran";i:6073;s:8:"PagaSupe";i:6074;s:13:"MaesNaturSero";i:6075;s:6:"ClDere";i:6076;s:6:"BuruSn";i:6077;s:5:"PerPs";i:6078;s:7:"PanmUpw";i:6079;s:6:"GreeRe";i:6080;s:7:"ErUnpro";i:6081;s:7:"CycliHe";i:6082;s:2:"Eu";i:6083;s:7:"HoPandr";i:6084;s:11:"MesNonOscil";i:6085;s:10:"ExtPoTetra";i:6086;s:13:"MastoMonoPyro";i:6087;s:6:"HiNoSp";i:6088;s:10:"GlPraUnhed";i:6089;s:6:"RewTho";i:6090;s:7:"UnaWoor";i:6091;s:14:"ElfhPicknUntes";i:6092;s:4:"Tinw";i:6093;s:6:"CrucEx";i:6094;s:8:"FloInoge";i:6095;s:11:"HadexPremTh";i:6096;s:3:"Mys";i:6097;s:6:"TiUnau";i:6098;s:12:"EurNonsuNonv";i:6099;s:5:"Woonx";i:6100;s:5:"DiUnr";i:6101;s:7:"PoRaUlt";i:6102;s:5:"Ethno";i:6103;s:4:"Heat";i:6104;s:6:"ShacSm";i:6105;s:11:"NonPhantSyn";i:6106;s:4:"Quin";i:6107;s:14:"FewnKieseOptio";i:6108;s:11:"ClypImpaUns";i:6109;s:9:"ParalUnbe";i:6110;s:7:"ParSing";i:6111;s:10:"CleSexuaUn";i:6112;s:10:"SacchSolid";i:6113;s:9:"HorsIncor";i:6114;s:13:"FoodlHusNight";i:6115;s:8:"MonSubUn";i:6116;s:5:"Inkho";i:6117;s:4:"Panz";i:6118;s:4:"NoPe";i:6119;s:7:"PonTatu";i:6120;s:8:"CotVangl";i:6121;s:4:"Xero";i:6122;s:5:"CurPi";i:6123;s:3:"Str";i:6124;s:4:"Sacr";i:6125;s:4:"Quai";i:6126;s:5:"Uncoa";i:6127;s:9:"ChitProsu";i:6128;s:6:"PenuUn";i:6129;s:4:"BrLa";i:6130;s:7:"EnterJu";i:6131;s:11:"CoOutsTroph";i:6132;s:11:"ComNondRele";i:6133;s:12:"PreleScenUnp";i:6134;s:12:"ExHogwaPerip";i:6135;s:10:"UndWaZibet";i:6136;s:12:"GinkxQuinqRa";i:6137;s:6:"EmmVer";i:6138;s:10:"PalReTeasa";i:6139;s:12:"MePrepoSurge";i:6140;s:12:"HomSommUncti";i:6141;s:9:"TheoTinin";i:6142;s:12:"IrrMonoPetio";i:6143;s:13:"MultOxysuThes";i:6144;s:4:"Natc";i:6145;s:11:"DisiEnStoma";i:6146;s:11:"HegarPolTan";i:6147;s:5:"StTra";i:6148;s:5:"Unexc";i:6149;s:12:"AweSyllaUnpr";i:6150;s:6:"CaReci";i:6151;s:12:"SatirUnmiVac";i:6152;s:5:"SeUnc";i:6153;s:8:"ProtTint";i:6154;s:5:"Waikl";i:6155;s:10:"MaMegasSpr";i:6156;s:3:"Gam";i:6157;s:7:"CoVagar";i:6158;s:7:"ToppUre";i:6159;s:7:"ArcImpa";i:6160;s:15:"MokoxOcherSubar";i:6161;s:10:"DeeEtiolTh";i:6162;s:10:"TrottUnUnf";i:6163;s:5:"Bronz";i:6164;s:4:"Tutr";i:6165;s:6:"PisaRi";i:6166;s:6:"PuSuTe";i:6167;s:5:"PoSpi";i:6168;s:7:"LiReefe";i:6169;s:9:"QuadWimex";i:6170;s:11:"GoniSizalYa";i:6171;s:3:"Ins";i:6172;s:15:"GinglSemigSerpe";i:6173;s:13:"GadinSemUnfei";i:6174;s:7:"TinUnne";i:6175;s:5:"Grapt";i:6176;s:7:"PhScaTh";i:6177;s:5:"Preaf";i:6178;s:3:"Kap";i:6179;s:10:"MaywMohaWe";i:6180;s:4:"TaTe";i:6181;s:5:"FiTig";i:6182;s:3:"Jer";i:6183;s:11:"OdobPawneSp";i:6184;s:15:"NonbaTorchUnext";i:6185;s:4:"SlSt";i:6186;s:5:"Weelx";i:6187;s:5:"ExTem";i:6188;s:4:"EnUn";i:6189;s:12:"HurlyPythoTr";i:6190;s:4:"Glos";i:6191;s:13:"SpisuTriceUne";i:6192;s:11:"EpacImpoPro";i:6193;s:12:"MetOakeOuttr";i:6194;s:9:"OrScWoodn";i:6195;s:7:"HoMazum";i:6196;s:9:"MesenSemi";i:6197;s:9:"RegulSand";i:6198;s:5:"Stasi";i:6199;s:6:"UnZoog";i:6200;s:4:"Paro";i:6201;s:11:"SinapStaSup";i:6202;s:9:"TaeTeTheo";i:6203;s:10:"KrapiProrh";i:6204;s:9:"GuarMarxi";i:6205;s:13:"SybarTanUnwed";i:6206;s:4:"JaUn";i:6207;s:6:"SemiSo";i:6208;s:8:"UniUnind";i:6209;s:12:"DulTriuTubul";i:6210;s:5:"Engra";i:6211;s:12:"UnpreZygonZy";i:6212;s:5:"Recko";i:6213;s:9:"GrinnInUn";i:6214;s:7:"EleGeLi";i:6215;s:12:"MolSyconUnst";i:6216;s:4:"Scum";i:6217;s:10:"FlaFostUnd";i:6218;s:5:"Peris";i:6219;s:8:"CophLava";i:6220;s:12:"SmetSpriTran";i:6221;s:8:"NephUnwa";i:6222;s:7:"QueetSc";i:6223;s:10:"FeifGueTab";i:6224;s:10:"OliveUnciv";i:6225;s:10:"BuilCompTa";i:6226;s:7:"RecliRe";i:6227;s:4:"OrUn";i:6228;s:7:"ExRadSa";i:6229;s:3:"Jux";i:6230;s:12:"ShikiSupeUns";i:6231;s:4:"DeUn";i:6232;s:9:"MiNuReine";i:6233;s:8:"TheTrime";i:6234;s:6:"SemWot";i:6235;s:3:"Pyr";i:6236;s:9:"NerthOuts";i:6237;s:6:"DyscGl";i:6238;s:3:"Mag";i:6239;s:8:"LucraPer";i:6240;s:7:"ParUlVi";i:6241;s:3:"Ken";i:6242;s:8:"ScrUnsca";i:6243;s:10:"PewmaToUnp";i:6244;s:13:"MangNeglPolys";i:6245;s:9:"FoInhiSor";i:6246;s:11:"DrunSporTir";i:6247;s:4:"HaLo";i:6248;s:11:"PharyQuUnch";i:6249;s:12:"MiamMilPhary";i:6250;s:4:"Stuc";i:6251;s:10:"DomElectPs";i:6252;s:4:"Kumn";i:6253;s:9:"PreteVaga";i:6254;s:4:"MiPr";i:6255;s:9:"GimGrooPr";i:6256;s:5:"ForSc";i:6257;s:3:"Opa";i:6258;s:5:"Hirud";i:6259;s:6:"OverPo";i:6260;s:9:"MarNomaSt";i:6261;s:4:"Saxo";i:6262;s:6:"HyLept";i:6263;s:7:"MyxaOcy";i:6264;s:3:"Iso";i:6265;s:9:"NonchPeri";i:6266;s:9:"ElytrTric";i:6267;s:6:"MePurb";i:6268;s:6:"ChaOut";i:6269;s:8:"NonTrave";i:6270;s:8:"InsiPent";i:6271;s:6:"PrTern";i:6272;s:4:"Subg";i:6273;s:7:"ImprUnv";i:6274;s:4:"Unha";i:6275;s:8:"ProgUngl";i:6276;s:12:"LaMammiToros";i:6277;s:5:"SeaSu";i:6278;s:5:"Vigon";i:6279;s:9:"AriIdiLog";i:6280;s:8:"NovPsyTh";i:6281;s:8:"KrausTro";i:6282;s:5:"Undup";i:6283;s:10:"ContrMysTe";i:6284;s:4:"Harl";i:6285;s:3:"Upk";i:6286;s:6:"InfThi";i:6287;s:7:"GriMyct";i:6288;s:9:"BleaCoccy";i:6289;s:12:"NeuroSoldiSw";i:6290;s:8:"HeKathRa";i:6291;s:10:"NackeNitro";i:6292;s:14:"CapacPestPsych";i:6293;s:8:"OutlaUnl";i:6294;s:7:"PhrenVe";i:6295;s:10:"PluQuicYum";i:6296;s:5:"Tesse";i:6297;s:5:"Poiki";i:6298;s:6:"AppaWr";i:6299;s:8:"CattChPo";i:6300;s:5:"Unsuc";i:6301;s:10:"JotnOtoUns";i:6302;s:10:"ArgNubiPre";i:6303;s:9:"GastLagga";i:6304;s:3:"Yom";i:6305;s:8:"SpSteVet";i:6306;s:12:"ColPleoSheri";i:6307;s:10:"FrankNeSes";i:6308;s:3:"Kon";i:6309;s:14:"CraigMayorOpul";i:6310;s:8:"UnwUnVer";i:6311;s:7:"NonpeRe";i:6312;s:3:"Ort";i:6313;s:7:"HirsQui";i:6314;s:7:"HurOver";i:6315;s:5:"PrSlo";i:6316;s:5:"Cerem";i:6317;s:10:"PleaToXero";i:6318;s:9:"ProUnemUn";i:6319;s:4:"UnWi";i:6320;s:5:"PrePr";i:6321;s:11:"MigSerUnref";i:6322;s:5:"Progu";i:6323;s:8:"HaMultSe";i:6324;s:6:"RiRoll";i:6325;s:5:"Unthi";i:6326;s:14:"ExtolMisnSperm";i:6327;s:7:"PreTimb";i:6328;s:7:"RickeSh";i:6329;s:10:"PericPyrrh";i:6330;s:7:"TiUnder";i:6331;s:13:"HeaVocalWhewt";i:6332;s:4:"Misw";i:6333;s:3:"Bol";i:6334;s:14:"PlatiPunnSphac";i:6335;s:3:"Vag";i:6336;s:14:"SainxSlowSteep";i:6337;s:10:"MacrPaguTr";i:6338;s:4:"Scut";i:6339;s:8:"ShooUnin";i:6340;s:10:"OenanSayax";i:6341;s:14:"EpigLegioTiara";i:6342;s:11:"MenogStopVa";i:6343;s:6:"PlUniq";i:6344;s:10:"EmOverZepp";i:6345;s:11:"SeTelenWork";i:6346;s:6:"MoReco";i:6347;s:4:"Reda";i:6348;s:8:"PelRucTh";i:6349;s:10:"UngriWitho";i:6350;s:4:"MuOr";i:6351;s:14:"PrincThiopVivi";i:6352;s:6:"NonaPh";i:6353;s:5:"NeZoo";i:6354;s:8:"PuffySup";i:6355;s:4:"Bair";i:6356;s:14:"ManwaSinaiUroc";i:6357;s:6:"AntLux";i:6358;s:9:"FungKokTo";i:6359;s:10:"AquipPhyto";i:6360;s:8:"OrtTuVie";i:6361;s:11:"CaloGudgPie";i:6362;s:4:"Palt";i:6363;s:7:"HubXeno";i:6364;s:9:"KnobSyTra";i:6365;s:10:"MirzaObiUn";i:6366;s:10:"CongeStali";i:6367;s:5:"Pomox";i:6368;s:3:"Vol";i:6369;s:7:"InepMel";i:6370;s:10:"ResiRhynSe";i:6371;s:8:"PrTychUn";i:6372;s:9:"DactyTrut";i:6373;s:13:"BradaCarpHera";i:6374;s:9:"OctRebiSu";i:6375;s:10:"ShTruerVer";i:6376;s:9:"HeMeTellu";i:6377;s:12:"FairyGraveSt";i:6378;s:8:"PergTalp";i:6379;s:3:"Sty";i:6380;s:6:"IntSol";i:6381;s:9:"SpeciToUn";i:6382;s:8:"NutaSkir";i:6383;s:5:"Rhomb";i:6384;s:9:"SharUnsni";i:6385;s:5:"DiInt";i:6386;s:5:"Splen";i:6387;s:6:"OraTer";i:6388;s:5:"Dahli";i:6389;s:8:"ClaOliSo";i:6390;s:8:"PeSangSa";i:6391;s:4:"Tors";i:6392;s:9:"HypopPari";i:6393;s:14:"ThiosTonoUnise";i:6394;s:7:"CatPara";i:6395;s:4:"Sumb";i:6396;s:7:"OsPreSw";i:6397;s:8:"HattUrsi";i:6398;s:6:"DiNotc";i:6399;s:5:"Disso";i:6400;s:8:"ReRenaWh";i:6401;s:12:"MonocSeroWha";i:6402;s:5:"Toade";i:6403;s:4:"CnMo";i:6404;s:8:"CardiSca";i:6405;s:4:"Corn";i:6406;s:14:"ExtrPotorPreve";i:6407;s:13:"HomalRepreSub";i:6408;s:4:"Vers";i:6409;s:5:"Unbla";i:6410;s:12:"PalaPneStodg";i:6411;s:5:"PyTri";i:6412;s:10:"DeyshPlPul";i:6413;s:9:"IvorUndis";i:6414;s:7:"PellTid";i:6415;s:5:"Thatx";i:6416;s:8:"DecaEleu";i:6417;s:4:"Maea";i:6418;s:9:"AuObUnadj";i:6419;s:11:"EntInoJumps";i:6420;s:12:"TreUnnotUnsw";i:6421;s:9:"AtechGeOv";i:6422;s:9:"LecUndeUn";i:6423;s:9:"DimnStrin";i:6424;s:13:"MonopNonsuRep";i:6425;s:3:"Ver";i:6426;s:6:"PesTho";i:6427;s:11:"InPredSemis";i:6428;s:7:"PoPrint";i:6429;s:4:"Coch";i:6430;s:4:"Mopp";i:6431;s:3:"Dra";i:6432;s:7:"DrygoPr";i:6433;s:9:"SulciUnco";i:6434;s:8:"SaboUnUn";i:6435;s:10:"TanqTreUns";i:6436;s:7:"UnjVesp";i:6437;s:4:"Pror";i:6438;s:4:"Love";i:6439;s:10:"EmeHyPlaty";i:6440;s:6:"JucRec";i:6441;s:11:"ConfePhoTra";i:6442;s:9:"ConcoPoss";i:6443;s:12:"GalacIrSemif";i:6444;s:9:"ParaUnawa";i:6445;s:7:"UnUnZam";i:6446;s:7:"PinSabr";i:6447;s:9:"MicOverSu";i:6448;s:8:"PoilViny";i:6449;s:8:"SentiSup";i:6450;s:10:"ParlaProSu";i:6451;s:11:"BipBrancObu";i:6452;s:5:"Uncri";i:6453;s:5:"Suran";i:6454;s:12:"BloClaviTitu";i:6455;s:4:"TwUn";i:6456;s:6:"PiPost";i:6457;s:7:"ElaFeHy";i:6458;s:5:"Unnav";i:6459;s:13:"OphidPenthUni";i:6460;s:3:"Lar";i:6461;s:15:"LongiRisibTopog";i:6462;s:7:"ThamuUn";i:6463;s:11:"LotProUnbla";i:6464;s:7:"TaUnmer";i:6465;s:7:"MilPhyl";i:6466;s:5:"IncNi";i:6467;s:3:"Fix";i:6468;s:6:"ExSwip";i:6469;s:5:"OraUn";i:6470;s:4:"Scle";i:6471;s:9:"HoReparSu";i:6472;s:9:"OvangUnpr";i:6473;s:12:"DoorSnowbUni";i:6474;s:9:"OverPolUn";i:6475;s:3:"Mit";i:6476;s:5:"Unsop";i:6477;s:14:"HeavyHeterJump";i:6478;s:9:"PostpWall";i:6479;s:11:"RepRicTetra";i:6480;s:12:"LiqPalaUnipu";i:6481;s:7:"ClMesPe";i:6482;s:13:"HeterLirParda";i:6483;s:5:"Trieq";i:6484;s:9:"SamarTigr";i:6485;s:5:"Diver";i:6486;s:4:"LiUn";i:6487;s:4:"Beta";i:6488;s:6:"DivuOp";i:6489;s:9:"NoniScruf";i:6490;s:9:"LoafOnchi";i:6491;s:3:"Ele";i:6492;s:7:"TeraUnm";i:6493;s:5:"Palee";i:6494;s:5:"Solid";i:6495;s:4:"Mynp";i:6496;s:10:"FairyPulWo";i:6497;s:4:"Wate";i:6498;s:4:"Rodd";i:6499;s:10:"OffPlUngui";i:6500;s:9:"OvPlayUrd";i:6501;s:7:"SocioUp";i:6502;s:5:"EtPim";i:6503;s:10:"ParonPrVir";i:6504;s:2:"Ju";i:6505;s:10:"EchiSaThuy";i:6506;s:12:"NepNodulRefi";i:6507;s:11:"IncSinecUni";i:6508;s:9:"GarbStThe";i:6509;s:13:"GluttHeadsRun";i:6510;s:8:"EvaKafir";i:6511;s:9:"CoInNonen";i:6512;s:7:"InuOtho";i:6513;s:14:"DeutParenPrere";i:6514;s:10:"EnvMetamSh";i:6515;s:8:"ButadDis";i:6516;s:9:"MendPseud";i:6517;s:6:"PaProv";i:6518;s:3:"Ina";i:6519;s:10:"EcclInfPol";i:6520;s:6:"PrUnde";i:6521;s:14:"IneffPudgPursu";i:6522;s:9:"SchizToVo";i:6523;s:3:"Imb";i:6524;s:4:"ChSt";i:6525;s:9:"LarLecoSt";i:6526;s:5:"UnUnd";i:6527;s:7:"IntReoc";i:6528;s:7:"FixedIm";i:6529;s:9:"CogTabWoo";i:6530;s:8:"SpaciUnp";i:6531;s:6:"BaraBe";i:6532;s:5:"Unbar";i:6533;s:12:"CometDeIntra";i:6534;s:12:"ErePeracWhee";i:6535;s:7:"CounUnw";i:6536;s:8:"NonTormo";i:6537;s:10:"PreiSpeTri";i:6538;s:11:"CerLankWeve";i:6539;s:12:"TractUngelVe";i:6540;s:10:"DepDrUnsol";i:6541;s:4:"Mult";i:6542;s:6:"RewVol";i:6543;s:5:"MorSy";i:6544;s:8:"UndWilkx";i:6545;s:4:"BeUn";i:6546;s:7:"ImpasUn";i:6547;s:10:"IndiaMerca";i:6548;s:4:"Unfo";i:6549;s:8:"ImMiMuti";i:6550;s:13:"NaviPreaUnspa";i:6551;s:5:"Extra";i:6552;s:11:"RenuWhWicke";i:6553;s:7:"TergUnp";i:6554;s:8:"MydTabid";i:6555;s:3:"Lod";i:6556;s:4:"Cruc";i:6557;s:5:"DiaSo";i:6558;s:8:"HetInter";i:6559;s:7:"ClMisap";i:6560;s:3:"Spe";i:6561;s:9:"IllecPant";i:6562;s:5:"Rhabd";i:6563;s:13:"BrushWireYell";i:6564;s:7:"DilaOve";i:6565;s:12:"CyprDegPotma";i:6566;s:8:"TicUtero";i:6567;s:6:"InPtyc";i:6568;s:12:"DelaMaraScul";i:6569;s:7:"AlpCrSt";i:6570;s:12:"HeUnproVagra";i:6571;s:4:"Theo";i:6572;s:12:"RecSplanVenu";i:6573;s:4:"Groc";i:6574;s:14:"BasilNoncoZami";i:6575;s:10:"LifexPasto";i:6576;s:14:"PsychSubdWhipp";i:6577;s:5:"MosTe";i:6578;s:14:"CoplaObsiXyloq";i:6579;s:10:"FatbrStrat";i:6580;s:7:"ToUnpit";i:6581;s:5:"PitSh";i:6582;s:8:"JapRatch";i:6583;s:8:"VarniYod";i:6584;s:11:"HancoRemTen";i:6585;s:10:"KoreiOverf";i:6586;s:9:"TineVimfu";i:6587;s:7:"NoruUne";i:6588;s:3:"Ure";i:6589;s:11:"CultrPlaSun";i:6590;s:10:"ExogaTrowe";i:6591;s:5:"Upcom";i:6592;s:10:"CuneiFePre";i:6593;s:10:"MatPlSnaff";i:6594;s:8:"PhaTarTy";i:6595;s:9:"BetHenrUn";i:6596;s:6:"BruMet";i:6597;s:4:"Peck";i:6598;s:5:"Makes";i:6599;s:5:"Unpit";i:6600;s:8:"ScThewTo";i:6601;s:4:"Spec";i:6602;s:9:"UnplUnres";i:6603;s:11:"OxytoSaftUp";i:6604;s:5:"CiHoo";i:6605;s:9:"InverMoTi";i:6606;s:3:"Upt";i:6607;s:15:"OverfPolymPrein";i:6608;s:9:"CotePhoto";i:6609;s:4:"Crew";i:6610;s:8:"PredPrim";i:6611;s:10:"CephaShrub";i:6612;s:3:"Nuc";i:6613;s:3:"Ouz";i:6614;s:9:"ThereVena";i:6615;s:3:"Sug";i:6616;s:3:"Nam";i:6617;s:7:"QuinoTr";i:6618;s:5:"Reove";i:6619;s:10:"GliomIntSc";i:6620;s:9:"DuchReban";i:6621;s:6:"DisHot";i:6622;s:10:"PhoroRatio";i:6623;s:4:"BrTi";i:6624;s:10:"HyInterTae";i:6625;s:4:"Plic";i:6626;s:6:"IsoSar";i:6627;s:8:"CyaniPos";i:6628;s:7:"JossaTh";i:6629;s:7:"MoTease";i:6630;s:9:"PenciSynt";i:6631;s:12:"TobUnjelUrti";i:6632;s:7:"StorTri";i:6633;s:4:"Squi";i:6634;s:10:"IsoThUnsof";i:6635;s:9:"EpilNonbu";i:6636;s:4:"Recr";i:6637;s:12:"GlossMinTown";i:6638;s:3:"Sid";i:6639;s:10:"MoireNoTri";i:6640;s:9:"FungSkUna";i:6641;s:10:"LewPemmUne";i:6642;s:9:"MetaOveSc";i:6643;s:11:"FlaMiscaOwl";i:6644;s:6:"PrWhis";i:6645;s:7:"SpTesUn";i:6646;s:12:"BroSubjuUnmo";i:6647;s:6:"SupTch";i:6648;s:10:"HeromLodPo";i:6649;s:12:"BeniCheesSur";i:6650;s:9:"HypeOverl";i:6651;s:4:"Sela";i:6652;s:10:"StiTurtlVe";i:6653;s:11:"GreMacrMarr";i:6654;s:8:"AsHanImp";i:6655;s:6:"FaSher";i:6656;s:12:"MicPonerTran";i:6657;s:11:"GigarHyMudd";i:6658;s:11:"AmErytFemin";i:6659;s:5:"Sacer";i:6660;s:9:"OutmUneph";i:6661;s:7:"DissWar";i:6662;s:9:"ObPlScabr";i:6663;s:5:"Inten";i:6664;s:3:"Raj";i:6665;s:8:"LaPipeUn";i:6666;s:8:"PreReUne";i:6667;s:11:"InpMonobPle";i:6668;s:4:"Here";i:6669;s:8:"GasPicWe";i:6670;s:12:"GamoInfiMyos";i:6671;s:8:"MinoPlai";i:6672;s:4:"Unbe";i:6673;s:5:"Outla";i:6674;s:7:"PseuVer";i:6675;s:4:"Wing";i:6676;s:5:"Unrav";i:6677;s:6:"GreTur";i:6678;s:11:"OysStaTrith";i:6679;s:8:"SaSymTur";i:6680;s:13:"MisliOdontPha";i:6681;s:11:"HaysNanomRe";i:6682;s:8:"PasPhySe";i:6683;s:11:"ColoLutOpta";i:6684;s:7:"LyUrtic";i:6685;s:6:"TimbTo";i:6686;s:9:"ShotTeete";i:6687;s:13:"BrushCafCompu";i:6688;s:9:"UncrUnhum";i:6689;s:6:"FibrTa";i:6690;s:7:"GameInc";i:6691;s:5:"Weakh";i:6692;s:10:"ObfusQuave";i:6693;s:13:"FurlIrreUngen";i:6694;s:8:"FoulPant";i:6695;s:11:"DisEuryQuar";i:6696;s:4:"Fati";i:6697;s:5:"Shalt";i:6698;s:9:"GhosMiThe";i:6699;s:12:"BandlKowtoTe";i:6700;s:10:"ImponTabUn";i:6701;s:10:"HexOnsUnpe";i:6702;s:8:"ElegiTem";i:6703;s:7:"PenhRep";i:6704;s:9:"OdonPhosp";i:6705;s:6:"PlWenl";i:6706;s:7:"ReprUns";i:6707;s:4:"Smit";i:6708;s:5:"Terro";i:6709;s:7:"ResusTe";i:6710;s:10:"HoppiPrSop";i:6711;s:5:"Shini";i:6712;s:12:"HeterRoamSal";i:6713;s:6:"OverWo";i:6714;s:5:"ScUnp";i:6715;s:4:"Mead";i:6716;s:5:"Upstr";i:6717;s:5:"Unrep";i:6718;s:4:"Rumi";i:6719;s:7:"SuperTe";i:6720;s:5:"ThVer";i:6721;s:12:"SupeThrTomop";i:6722;s:12:"OugPedanStib";i:6723;s:6:"CiCoun";i:6724;s:9:"HeHobThug";i:6725;s:6:"CohGno";i:6726;s:4:"Styr";i:6727;s:9:"MePresRes";i:6728;s:9:"ExPhThumb";i:6729;s:8:"SheSkipp";i:6730;s:10:"CaFaunaUnq";i:6731;s:4:"Meri";i:6732;s:10:"FerReWaste";i:6733;s:5:"Ninet";i:6734;s:9:"KmetxUnar";i:6735;s:8:"PulsSaxt";i:6736;s:6:"PrepUp";i:6737;s:5:"Marxi";i:6738;s:10:"EpiscSubpr";i:6739;s:8:"KochProh";i:6740;s:5:"GemOr";i:6741;s:15:"HeroiSubcoUnbra";i:6742;s:4:"Scot";i:6743;s:8:"MisSnort";i:6744;s:6:"PhaPha";i:6745;s:8:"RevUnpre";i:6746;s:8:"AnoSupVe";i:6747;s:4:"Stam";i:6748;s:3:"Pru";i:6749;s:7:"BeCatap";i:6750;s:5:"DevSc";i:6751;s:11:"SexiSocUnil";i:6752;s:6:"InNons";i:6753;s:11:"RecaTecnTre";i:6754;s:5:"CiCoa";i:6755;s:11:"CoDiscPachy";i:6756;s:4:"Pleu";i:6757;s:10:"ExtrHesiMu";i:6758;s:6:"TilbTo";i:6759;s:5:"Vacuo";i:6760;s:13:"PlaTheopTrica";i:6761;s:12:"OsirProtRhoe";i:6762;s:8:"MulWeava";i:6763;s:4:"Mort";i:6764;s:10:"QuSchilTan";i:6765;s:7:"SqueTar";i:6766;s:12:"OrthPhaRoent";i:6767;s:9:"MoPifTrib";i:6768;s:15:"SubcaSuperUnbra";i:6769;s:7:"LilaNan";i:6770;s:10:"OrnisPresu";i:6771;s:7:"AndreSo";i:6772;s:5:"Sloug";i:6773;s:9:"HoOxyheSc";i:6774;s:13:"DermLawlMetac";i:6775;s:13:"DirTwelvVirgi";i:6776;s:11:"NuttRatapVi";i:6777;s:4:"Teet";i:6778;s:9:"GardeScWr";i:6779;s:6:"PaPlUn";i:6780;s:8:"PhrUrrad";i:6781;s:4:"OrTh";i:6782;s:10:"LenUnUtopi";i:6783;s:7:"FaOssZi";i:6784;s:9:"NonmTexas";i:6785;s:8:"SuTricUn";i:6786;s:11:"NaOrchiRive";i:6787;s:6:"KleUnp";i:6788;s:6:"PhilUn";i:6789;s:4:"Cade";i:6790;s:13:"MacanOvercUpc";i:6791;s:8:"PinnSpha";i:6792;s:11:"IcMegalPara";i:6793;s:5:"NonTi";i:6794;s:10:"PienxVaria";i:6795;s:9:"EncoNoYal";i:6796;s:4:"Uptr";i:6797;s:8:"AnconSyc";i:6798;s:9:"FeIntoSta";i:6799;s:7:"RelShif";i:6800;s:7:"ExonePr";i:6801;s:6:"PuThio";i:6802;s:6:"HesiKa";i:6803;s:5:"PanTy";i:6804;s:11:"MacuMiRomag";i:6805;s:12:"LearnNotaSti";i:6806;s:4:"Raki";i:6807;s:8:"OrthUnfl";i:6808;s:10:"KurvePhySp";i:6809;s:7:"HisMump";i:6810;s:9:"PanxTreen";i:6811;s:8:"IndifUnc";i:6812;s:5:"ByMus";i:6813;s:11:"OuSuspUnplu";i:6814;s:12:"IsoLoundOutp";i:6815;s:15:"HexaxSinuaUntro";i:6816;s:8:"SiccUnde";i:6817;s:7:"CaprSep";i:6818;s:8:"RetroTet";i:6819;s:9:"InteQuSem";i:6820;s:5:"Imper";i:6821;s:3:"Psy";i:6822;s:12:"GnarLogTogsx";i:6823;s:4:"Unpa";i:6824;s:7:"HorseRe";i:6825;s:12:"PaUndisUndre";i:6826;s:3:"Lus";i:6827;s:2:"Cu";i:6828;s:3:"Sip";i:6829;s:3:"Tom";i:6830;s:7:"MicRask";i:6831;s:4:"Pect";i:6832;s:12:"ThesTrichVir";i:6833;s:5:"Unwas";i:6834;s:5:"Naple";i:6835;s:9:"MegPrTumo";i:6836;s:11:"HastaPeteSu";i:6837;s:4:"Unrh";i:6838;s:7:"PolyTol";i:6839;s:13:"DisaOrnitPlat";i:6840;s:3:"Oes";i:6841;s:5:"Puboi";i:6842;s:5:"Polyt";i:6843;s:11:"NonmPsTetra";i:6844;s:4:"Uniu";i:6845;s:11:"FasPreRamis";i:6846;s:5:"Stylo";i:6847;s:13:"PonciScyUnloc";i:6848;s:9:"MiaoRecol";i:6849;s:11:"SleSuperVig";i:6850;s:6:"RampRe";i:6851;s:5:"Hongx";i:6852;s:9:"ReticUnpo";i:6853;s:9:"LactiTrip";i:6854;s:7:"PolStTr";i:6855;s:10:"AxonoGraci";i:6856;s:12:"LinSuddeVerm";i:6857;s:9:"CataSuste";i:6858;s:7:"GiRussi";i:6859;s:8:"SextoSla";i:6860;s:5:"Suthe";i:6861;s:6:"PreSha";i:6862;s:10:"MoisRaSpir";i:6863;s:5:"Herco";i:6864;s:9:"TepaWalac";i:6865;s:5:"Tempe";i:6866;s:7:"RaisiUn";i:6867;s:9:"PremUnwif";i:6868;s:6:"MacSta";i:6869;s:12:"EphahPaurUnd";i:6870;s:9:"ParafSurv";i:6871;s:10:"FiRelatUns";i:6872;s:10:"OverdSinto";i:6873;s:5:"NoPup";i:6874;s:10:"CounForPty";i:6875;s:6:"MethVi";i:6876;s:11:"DecayKnocPu";i:6877;s:4:"Xena";i:6878;s:8:"ReRetrUn";i:6879;s:5:"KlTwi";i:6880;s:14:"BeechSubpUnmea";i:6881;s:5:"Unpro";i:6882;s:4:"PrSe";i:6883;s:6:"ReStUn";i:6884;s:8:"FeruOcra";i:6885;s:8:"HomTetry";i:6886;s:5:"IneNa";i:6887;s:7:"IndiPro";i:6888;s:11:"GinGuppScle";i:6889;s:9:"FellLight";i:6890;s:6:"LymPro";i:6891;s:5:"HaUnd";i:6892;s:12:"DaboiIntPant";i:6893;s:11:"CyaJangPann";i:6894;s:8:"PulStink";i:6895;s:12:"BolDevicOpis";i:6896;s:8:"HyTempWh";i:6897;s:7:"CheerSe";i:6898;s:5:"OmPyo";i:6899;s:3:"Tit";i:6900;s:7:"RetiSow";i:6901;s:8:"SemShall";i:6902;s:9:"SecStroVa";i:6903;s:10:"PieSemiSub";i:6904;s:4:"Conv";i:6905;s:10:"PiemaUndex";i:6906;s:11:"BreFrankUng";i:6907;s:9:"OkiTenUnw";i:6908;s:6:"PoStav";i:6909;s:2:"Zi";i:6910;s:11:"DiarrDoWind";i:6911;s:8:"AlicPara";i:6912;s:8:"SarcSnuf";i:6913;s:5:"Poetr";i:6914;s:5:"Nonma";i:6915;s:12:"BathMegUnple";i:6916;s:8:"PoSatUnd";i:6917;s:4:"Exor";i:6918;s:5:"Megar";i:6919;s:7:"HyIndMe";i:6920;s:8:"DuPhUnsp";i:6921;s:7:"SugViki";i:6922;s:9:"PreSquUns";i:6923;s:5:"Tiger";i:6924;s:2:"Dy";i:6925;s:8:"DebaRoun";i:6926;s:10:"PrecTicTra";i:6927;s:5:"Myoca";i:6928;s:9:"PinaSundr";i:6929;s:12:"NonioSonoTes";i:6930;s:8:"PersTone";i:6931;s:7:"PloPrel";i:6932;s:13:"EyepNorthVisc";i:6933;s:7:"RatiRou";i:6934;s:5:"Place";i:6935;s:5:"Proch";i:6936;s:9:"AppRepSto";i:6937;s:6:"OnlySe";i:6938;s:8:"DieguOsk";i:6939;s:11:"MatteOptaRa";i:6940;s:12:"SqTricuUncon";i:6941;s:12:"BreaDolpTrea";i:6942;s:10:"SerabUnlec";i:6943;s:4:"TaUn";i:6944;s:5:"HyPro";i:6945;s:12:"HeteIrraLupi";i:6946;s:6:"OverPa";i:6947;s:4:"Pili";i:6948;s:7:"MediVen";i:6949;s:7:"StUnple";i:6950;s:4:"Toxi";i:6951;s:4:"Medi";i:6952;s:11:"RadiiSoTouc";i:6953;s:8:"PeriPhan";i:6954;s:11:"EpopHeadsSh";i:6955;s:2:"Ka";i:6956;s:6:"IchSpe";i:6957;s:6:"ChTeta";i:6958;s:9:"LateSemih";i:6959;s:4:"Lutr";i:6960;s:10:"BedebHysMa";i:6961;s:8:"SardShru";i:6962;s:10:"CoreDePain";i:6963;s:3:"Tsa";i:6964;s:2:"De";i:6965;s:12:"MotRhinoVoll";i:6966;s:5:"Prefa";i:6967;s:3:"Est";i:6968;s:10:"FitOverdUn";i:6969;s:11:"PontaQuaSem";i:6970;s:8:"ForMaMis";i:6971;s:11:"PlumlPraeZi";i:6972;s:4:"Pseu";i:6973;s:8:"PuritTru";i:6974;s:12:"EquSpirWokex";i:6975;s:8:"SleepUnt";i:6976;s:5:"MidPo";i:6977;s:6:"ProtRu";i:6978;s:6:"ProgRe";i:6979;s:12:"PleniRunoUnu";i:6980;s:8:"BorJeann";i:6981;s:4:"Unwo";i:6982;s:8:"PamphSho";i:6983;s:8:"IneSkirt";i:6984;s:10:"PeRyukTrag";i:6985;s:9:"EnnoRonVa";i:6986;s:14:"MastySikarTrir";i:6987;s:3:"Tem";i:6988;s:15:"MozamRepliUncon";i:6989;s:8:"HecKoUnd";i:6990;s:8:"TellxThi";i:6991;s:7:"PseRadi";i:6992;s:8:"MissTrac";i:6993;s:7:"SlTrust";i:6994;s:8:"MacrSpUn";i:6995;s:9:"DaisyGoWh";i:6996;s:7:"PeriSor";i:6997;s:13:"HyposInteOver";i:6998;s:4:"Maza";i:6999;s:11:"QuSubscWeez";i:7000;s:6:"TruUre";i:7001;s:9:"PamlRecus";i:7002;s:10:"CycliStren";i:7003;s:5:"Serpi";i:7004;s:3:"Top";i:7005;s:3:"Moo";i:7006;s:7:"KneMaSe";i:7007;s:7:"IsatPol";i:7008;s:11:"ErytFattPeu";i:7009;s:7:"OsteUnd";i:7010;s:5:"Bulba";i:7011;s:8:"PaSnVerb";i:7012;s:5:"Unsin";i:7013;s:7:"PseuRub";i:7014;s:5:"Exsan";i:7015;s:10:"InterMiPen";i:7016;s:5:"Pleur";i:7017;s:13:"HydrInterOver";i:7018;s:4:"Coag";i:7019;s:7:"SaSicar";i:7020;s:6:"MonPre";i:7021;s:8:"SaSumbWi";i:7022;s:7:"GePreci";i:7023;s:4:"Tymp";i:7024;s:9:"SinuoUbii";i:7025;s:5:"Overw";i:7026;s:7:"HeorUnp";i:7027;s:6:"NeisUn";i:7028;s:10:"FrKikaPrec";i:7029;s:3:"Obt";i:7030;s:11:"BowmCroMedi";i:7031;s:12:"GreenMasUnde";i:7032;s:10:"CathoComed";i:7033;s:8:"SmeStUna";i:7034;s:5:"Undig";i:7035;s:8:"MicProba";i:7036;s:5:"Unvai";i:7037;s:8:"PreStoTo";i:7038;s:6:"LibWar";i:7039;s:9:"SaccVampi";i:7040;s:9:"ScoSqWanl";i:7041;s:13:"IndiKiloZephy";i:7042;s:3:"Rah";i:7043;s:8:"UncoUnUn";i:7044;s:7:"SwartUn";i:7045;s:4:"Sord";i:7046;s:4:"Nasi";i:7047;s:4:"Phil";i:7048;s:4:"Suss";i:7049;s:9:"HomopRiSp";i:7050;s:3:"Sca";i:7051;s:2:"Bi";i:7052;s:5:"Unret";i:7053;s:5:"LocTo";i:7054;s:6:"RubUnd";i:7055;s:4:"Foca";i:7056;s:7:"PePreRu";i:7057;s:9:"BaptiUnpa";i:7058;s:5:"ScSig";i:7059;s:11:"EndGenevUns";i:7060;s:6:"LepSpi";i:7061;s:4:"Vorl";i:7062;s:4:"Thro";i:7063;s:9:"FugHaHete";i:7064;s:8:"InteNote";i:7065;s:6:"PapUnd";i:7066;s:5:"Lands";i:7067;s:11:"FluPseuThel";i:7068;s:5:"Letha";i:7069;s:8:"GomaRidi";i:7070;s:9:"CourtMadd";i:7071;s:9:"NovePenSh";i:7072;s:2:"Ut";i:7073;s:4:"Vatm";i:7074;s:4:"Taxi";i:7075;s:7:"QuaveSp";i:7076;s:9:"MonstPred";i:7077;s:11:"PedTriUntoi";i:7078;s:11:"PlaUpteVivi";i:7079;s:8:"SurrTabl";i:7080;s:4:"Imid";i:7081;s:6:"NonZoo";i:7082;s:9:"PalaTrich";i:7083;s:5:"Thecl";i:7084;s:13:"OphPaleoUnout";i:7085;s:12:"DrumNebQuila";i:7086;s:11:"EpMiniProag";i:7087;s:13:"MuleRotuTriac";i:7088;s:5:"Ostra";i:7089;s:5:"Endoc";i:7090;s:12:"HydrVaiYouwa";i:7091;s:5:"RevSe";i:7092;s:8:"DermSigh";i:7093;s:5:"Splat";i:7094;s:5:"MerUn";i:7095;s:8:"KrisPaPr";i:7096;s:9:"LodgMaPol";i:7097;s:9:"FlMenoVul";i:7098;s:8:"MyelaRab";i:7099;s:5:"Commo";i:7100;s:10:"HaPhyTorcx";i:7101;s:10:"NomiReUnfo";i:7102;s:5:"Unwal";i:7103;s:10:"MucSiniTea";i:7104;s:9:"PsSolUnha";i:7105;s:7:"CraHyPr";i:7106;s:12:"IntRheuSerop";i:7107;s:12:"ManWindYouth";i:7108;s:8:"NotoSemi";i:7109;s:11:"MaPhytPosts";i:7110;s:8:"DeaPeWal";i:7111;s:12:"NotaPrimaSou";i:7112;s:4:"Sera";i:7113;s:7:"PaSaUnt";i:7114;s:6:"SimSup";i:7115;s:9:"MalpPhoto";i:7116;s:11:"AsbConiPred";i:7117;s:10:"MetatSpoon";i:7118;s:3:"Hol";i:7119;s:8:"DilLoTap";i:7120;s:4:"OuSe";i:7121;s:4:"SeYe";i:7122;s:7:"SulpUns";i:7123;s:7:"FliQuak";i:7124;s:8:"OphtRecu";i:7125;s:6:"CheNon";i:7126;s:12:"PandSarcoUns";i:7127;s:9:"MeMuleOxy";i:7128;s:10:"CerGarisMe";i:7129;s:9:"BoDuskPer";i:7130;s:4:"Moos";i:7131;s:13:"LiberPeaRolle";i:7132;s:4:"Unhi";i:7133;s:9:"ReadUnroo";i:7134;s:6:"BeaUnu";i:7135;s:5:"Taget";i:7136;s:8:"CellExPr";i:7137;s:7:"PaoScSu";i:7138;s:11:"DonHaeSubro";i:7139;s:3:"Gun";i:7140;s:8:"HePyraSu";i:7141;s:13:"AscaErythLett";i:7142;s:10:"HypocZoonu";i:7143;s:7:"SpewiUn";i:7144;s:5:"Sylva";i:7145;s:8:"MesSteno";i:7146;s:9:"RhomTiger";i:7147;s:4:"Rumm";i:7148;s:2:"Hu";i:7149;s:9:"DosGeopRe";i:7150;s:5:"GlWot";i:7151;s:7:"PaUnUno";i:7152;s:8:"CapeYenx";i:7153;s:10:"TouchTrUnf";i:7154;s:11:"EnaPreRigwi";i:7155;s:9:"TyphlUnUn";i:7156;s:12:"MecoMuddSpea";i:7157;s:4:"Myel";i:7158;s:10:"ExcoReiSej";i:7159;s:11:"ConjMotorZy";i:7160;s:6:"JoinUn";i:7161;s:10:"ExudSympUn";i:7162;s:10:"DisHorseSp";i:7163;s:8:"PreTherm";i:7164;s:7:"SupeTuc";i:7165;s:9:"CaDemSame";i:7166;s:5:"Zenag";i:7167;s:3:"Rug";i:7168;s:7:"RatioZo";i:7169;s:12:"InconPrQuidd";i:7170;s:8:"DevoiPal";i:7171;s:11:"CaIndaTourn";i:7172;s:5:"Infer";i:7173;s:9:"HydroPrec";i:7174;s:4:"Yout";i:7175;s:3:"Hak";i:7176;s:7:"UntZeph";i:7177;s:4:"Peed";i:7178;s:8:"MetPiTuc";i:7179;s:11:"LiNonsaOsci";i:7180;s:3:"Hea";i:7181;s:11:"PiprPostSen";i:7182;s:10:"MiSniUnmet";i:7183;s:6:"CaiExt";i:7184;s:6:"UnfWom";i:7185;s:7:"NonfUnw";i:7186;s:6:"NajNon";i:7187;s:10:"PaProTruck";i:7188;s:10:"RemoSemiSt";i:7189;s:8:"PerUnsym";i:7190;s:5:"Xyrid";i:7191;s:7:"AnaChun";i:7192;s:7:"HaLepro";i:7193;s:5:"Veuve";i:7194;s:14:"NoaxOverpWanto";i:7195;s:4:"Lith";i:7196;s:7:"FlaTara";i:7197;s:7:"PsychTe";i:7198;s:3:"Fra";i:7199;s:5:"Sitti";i:7200;s:13:"SnottTroTwitt";i:7201;s:9:"LampWreck";i:7202;s:8:"SuperVar";i:7203;s:7:"NondSym";i:7204;s:7:"FeetaSo";i:7205;s:9:"GrafNonfi";i:7206;s:2:"Od";i:7207;s:5:"Butan";i:7208;s:9:"LippLiPhy";i:7209;s:5:"ParPr";i:7210;s:7:"ScuUnUs";i:7211;s:6:"InPsUn";i:7212;s:7:"PipSaye";i:7213;s:9:"MatcStirr";i:7214;s:13:"ParrTenuUnpla";i:7215;s:7:"DurEnMe";i:7216;s:5:"PoPor";i:7217;s:11:"CriCutSauce";i:7218;s:10:"StViceWeax";i:7219;s:9:"FingNeuri";i:7220;s:6:"SubVir";i:7221;s:7:"TrWildi";i:7222;s:6:"ReSeUn";i:7223;s:10:"IsoPuSandl";i:7224;s:6:"SenSpl";i:7225;s:12:"LabryPrUnfel";i:7226;s:10:"LingaOpist";i:7227;s:10:"HydPeUninq";i:7228;s:15:"CloudObeyeUnder";i:7229;s:4:"Post";i:7230;s:7:"CrPhoto";i:7231;s:10:"MoPredePre";i:7232;s:12:"CardSchisWhi";i:7233;s:11:"JapKolVenom";i:7234;s:4:"Unfl";i:7235;s:8:"PhacVers";i:7236;s:3:"Lab";i:7237;s:3:"Jig";i:7238;s:10:"CorybIrrem";i:7239;s:9:"TaguUnimp";i:7240;s:5:"Whipp";i:7241;s:4:"Stoc";i:7242;s:13:"ConveOwregShi";i:7243;s:10:"BromoCaFor";i:7244;s:9:"MoStahlTy";i:7245;s:14:"IndigLoriStaye";i:7246;s:10:"ElProeUnsu";i:7247;s:8:"PanUnrid";i:7248;s:5:"Prehe";i:7249;s:3:"Leg";i:7250;s:9:"BotryPrem";i:7251;s:5:"UnWed";i:7252;s:7:"CraPudd";i:7253;s:12:"HainSnonSulf";i:7254;s:12:"PerSouthUnpo";i:7255;s:8:"ElGrafTh";i:7256;s:8:"CrassWil";i:7257;s:9:"ConNonOly";i:7258;s:5:"Schni";i:7259;s:9:"TertZygom";i:7260;s:11:"ScrVacYawwe";i:7261;s:10:"ButDisceTr";i:7262;s:11:"ChoriEcarVe";i:7263;s:4:"Femi";i:7264;s:7:"NeUnpos";i:7265;s:13:"MurPerveRunol";i:7266;s:5:"PrSig";i:7267;s:10:"EmbMidmTro";i:7268;s:8:"CestInca";i:7269;s:5:"CorPy";i:7270;s:12:"BylSpoonTymp";i:7271;s:9:"NotiSlunk";i:7272;s:5:"Whitr";i:7273;s:4:"Unba";i:7274;s:10:"MonatTheor";i:7275;s:14:"IdioShoalTamac";i:7276;s:7:"PartiTo";i:7277;s:11:"CounCraMill";i:7278;s:4:"Uppe";i:7279;s:9:"PatavPewt";i:7280;s:4:"CoSa";i:7281;s:4:"Vase";i:7282;s:6:"ColcNo";i:7283;s:14:"ThrifTransWate";i:7284;s:10:"NoTacTartu";i:7285;s:12:"ReiUnforUngl";i:7286;s:8:"CrExpaEx";i:7287;s:5:"ParPh";i:7288;s:6:"SkylUn";i:7289;s:5:"StaUn";i:7290;s:10:"FibuSlTric";i:7291;s:10:"KartvMagne";i:7292;s:13:"BotcCatstSenc";i:7293;s:7:"EnduHem";i:7294;s:12:"MammaStrUnfo";i:7295;s:9:"SlidSpUro";i:7296;s:13:"PatSnabbVolat";i:7297;s:5:"Mysti";i:7298;s:4:"OsSc";i:7299;s:5:"Trick";i:7300;s:5:"Cohen";i:7301;s:12:"HypMoralTinh";i:7302;s:10:"PettySacri";i:7303;s:8:"StrowUlt";i:7304;s:5:"Circu";i:7305;s:4:"Rifl";i:7306;s:13:"FlocxLaxUnacc";i:7307;s:10:"HirsMyodPe";i:7308;s:5:"LiMic";i:7309;s:9:"MesRainWa";i:7310;s:8:"BuntiSyp";i:7311;s:12:"AgroConveOrt";i:7312;s:4:"Rais";i:7313;s:8:"NeSemiTr";i:7314;s:7:"CrGenPe";i:7315;s:7:"RecUnch";i:7316;s:10:"LatchPosse";i:7317;s:9:"BavenWeal";i:7318;s:5:"NonSp";i:7319;s:6:"MontVo";i:7320;s:15:"MisfaNarcaNonto";i:7321;s:5:"DeTuc";i:7322;s:8:"CountEuc";i:7323;s:10:"HaiIliocUn";i:7324;s:10:"CoaptLumPa";i:7325;s:5:"Thoms";i:7326;s:5:"TaTop";i:7327;s:8:"PhalaVib";i:7328;s:6:"BoraKa";i:7329;s:12:"TassTempeVir";i:7330;s:8:"MonosNam";i:7331;s:10:"SpiTethThe";i:7332;s:13:"QuerUnchiVare";i:7333;s:6:"BipNon";i:7334;s:9:"JaPolyoSi";i:7335;s:12:"AmbiEntGloam";i:7336;s:13:"MetalRegalSup";i:7337;s:10:"ErotiRetun";i:7338;s:12:"PyraSteprSyn";i:7339;s:9:"StabUngui";i:7340;s:5:"Pates";i:7341;s:12:"CaEnseeRunbo";i:7342;s:13:"NeurPteroSoma";i:7343;s:10:"RitarSquTa";i:7344;s:3:"Hum";i:7345;s:7:"PangePo";i:7346;s:5:"InOut";i:7347;s:11:"CoExtoUncan";i:7348;s:11:"HomoeNoctUn";i:7349;s:7:"BuPoRes";i:7350;s:8:"PhalRect";i:7351;s:3:"Mea";i:7352;s:13:"JoyleNotReplu";i:7353;s:4:"Nonh";i:7354;s:4:"Reco";i:7355;s:2:"Fu";i:7356;s:9:"OctSaSpic";i:7357;s:8:"NinUntes";i:7358;s:5:"NoSpl";i:7359;s:5:"OuSte";i:7360;s:9:"ResurStau";i:7361;s:14:"RevokSclerThan";i:7362;s:5:"Tombl";i:7363;s:10:"IsMarooNaz";i:7364;s:11:"OtotoSeriSo";i:7365;s:8:"CerePleu";i:7366;s:7:"ForaPse";i:7367;s:8:"CentTube";i:7368;s:14:"CebuEkamaSauce";i:7369;s:10:"GlenxHypog";i:7370;s:6:"HyOafx";i:7371;s:9:"RackWillo";i:7372;s:5:"LoOgh";i:7373;s:9:"WigfuWint";i:7374;s:14:"IndiOrthoProdu";i:7375;s:12:"ClCoconUnpre";i:7376;s:12:"ExpFlunkMega";i:7377;s:9:"ChorInsWo";i:7378;s:4:"Hair";i:7379;s:6:"UncWin";i:7380;s:7:"PaPsoro";i:7381;s:9:"TradUndit";i:7382;s:9:"MakeUnlik";i:7383;s:10:"AntiApMeta";i:7384;s:7:"PhoPhyt";i:7385;s:7:"ColMust";i:7386;s:10:"CathaConPh";i:7387;s:8:"NoTromVe";i:7388;s:3:"Cos";i:7389;s:10:"CapDunPres";i:7390;s:14:"HypanIncuLeopa";i:7391;s:6:"UnasWe";i:7392;s:5:"ExpUn";i:7393;s:5:"IntUn";i:7394;s:5:"Overf";i:7395;s:5:"Rameq";i:7396;s:9:"ImmLoxoUn";i:7397;s:5:"EmaGi";i:7398;s:13:"EsoEurasUnlab";i:7399;s:8:"LobaPrZo";i:7400;s:9:"ProaUnrYa";i:7401;s:8:"SubUnleg";i:7402;s:9:"ComaExNeg";i:7403;s:10:"HandwPrUnc";i:7404;s:3:"Bre";i:7405;s:7:"QuatrVo";i:7406;s:3:"Erm";i:7407;s:8:"ParThioc";i:7408;s:7:"NoctiTr";i:7409;s:7:"ElUncha";i:7410;s:11:"PitiRecStri";i:7411;s:4:"OtPa";i:7412;s:9:"GanoMyrrh";i:7413;s:4:"Redu";i:7414;s:8:"HuPifTon";i:7415;s:6:"NeUnmu";i:7416;s:5:"GeHus";i:7417;s:14:"DisafProvQuino";i:7418;s:11:"LoydQuReman";i:7419;s:3:"Sta";i:7420;s:12:"RefTeasUnchi";i:7421;s:6:"ClaTam";i:7422;s:5:"Disho";i:7423;s:11:"BaNowneRein";i:7424;s:7:"CoFocus";i:7425;s:6:"SemiWa";i:7426;s:14:"BottoObsceUltr";i:7427;s:4:"Shoa";i:7428;s:7:"MonoTri";i:7429;s:10:"LackQuadUn";i:7430;s:13:"SarcTetaTrump";i:7431;s:11:"UmbUntawVin";i:7432;s:14:"NewlSkewnUnpar";i:7433;s:4:"Podo";i:7434;s:3:"Wor";i:7435;s:12:"InterKeratMy";i:7436;s:11:"ResStrTesta";i:7437;s:5:"Unfat";i:7438;s:4:"Prof";i:7439;s:5:"Misco";i:7440;s:10:"ChurLimbUn";i:7441;s:5:"Rammi";i:7442;s:10:"CarCeleoSn";i:7443;s:9:"DysaSeven";i:7444;s:4:"Inno";i:7445;s:5:"PhoUn";i:7446;s:7:"QuiReUn";i:7447;s:14:"AlgarBrumEquiv";i:7448;s:4:"FiWo";i:7449;s:5:"Wuthe";i:7450;s:11:"MoguePorSpr";i:7451;s:7:"HiMarRe";i:7452;s:9:"UndeUnder";i:7453;s:13:"PinUndelUpspe";i:7454;s:9:"SomitSwSy";i:7455;s:7:"FeGaMed";i:7456;s:10:"ImmPowSore";i:7457;s:7:"DisUnop";i:7458;s:9:"LactOliUn";i:7459;s:5:"GroVe";i:7460;s:6:"StTele";i:7461;s:3:"Exc";i:7462;s:4:"MePa";i:7463;s:8:"SubcZaca";i:7464;s:9:"SyUnsWast";i:7465;s:2:"Gh";i:7466;s:9:"RecRobTum";i:7467;s:11:"DistPreUnre";i:7468;s:12:"EbHoerxMatro";i:7469;s:13:"BeeCorreGetae";i:7470;s:12:"LariOutflPro";i:7471;s:9:"InSmVocab";i:7472;s:5:"Hecta";i:7473;s:6:"IgnaTw";i:7474;s:5:"Seric";i:7475;s:8:"SaeSeiTi";i:7476;s:6:"OppPat";i:7477;s:5:"MoTha";i:7478;s:6:"NonvSk";i:7479;s:4:"Sarc";i:7480;s:5:"Autho";i:7481;s:13:"BestoStiUncla";i:7482;s:9:"CanToolUn";i:7483;s:9:"FornModio";i:7484;s:9:"RhapWartx";i:7485;s:10:"GynodImKra";i:7486;s:13:"FirepPreShinz";i:7487;s:12:"KroLucuMetem";i:7488;s:6:"ReUnsu";i:7489;s:5:"Rooib";i:7490;s:9:"ExpFiGout";i:7491;s:8:"EuTeYess";i:7492;s:11:"PluRecReins";i:7493;s:3:"Com";i:7494;s:5:"FooUn";i:7495;s:4:"Tort";i:7496;s:4:"Brac";i:7497;s:5:"EquTo";i:7498;s:9:"ExTrUnsmi";i:7499;s:4:"Lobe";i:7500;s:5:"GynSu";i:7501;s:10:"PondSxTric";i:7502;s:9:"FocaUnreq";i:7503;s:6:"IrrePr";i:7504;s:4:"Styt";i:7505;s:4:"FoPi";i:7506;s:6:"NaTenn";i:7507;s:5:"Bookb";i:7508;s:3:"Yet";i:7509;s:10:"MyxedSpinn";i:7510;s:9:"AweeNonco";i:7511;s:8:"PrenRecr";i:7512;s:7:"CoImmod";i:7513;s:8:"ApocEeMe";i:7514;s:11:"GiNilsxVisa";i:7515;s:4:"Taxe";i:7516;s:4:"Epip";i:7517;s:10:"ConduMeSub";i:7518;s:10:"CrouReVerm";i:7519;s:10:"OversWeath";i:7520;s:6:"ChMeso";i:7521;s:4:"Dipl";i:7522;s:6:"PlinTh";i:7523;s:7:"OrPreSu";i:7524;s:10:"HipPrRevis";i:7525;s:7:"SchSter";i:7526;s:8:"PlasPlum";i:7527;s:5:"UnWol";i:7528;s:7:"MightSp";i:7529;s:9:"PseuSynca";i:7530;s:7:"PsUnpur";i:7531;s:7:"LynxxMa";i:7532;s:4:"Clun";i:7533;s:12:"OverPhlResil";i:7534;s:12:"MetSatiStabl";i:7535;s:5:"Scien";i:7536;s:3:"Tee";i:7537;s:6:"NoVago";i:7538;s:8:"HomMortg";i:7539;s:4:"Stic";i:7540;s:9:"CaCongrUn";i:7541;s:4:"Whar";i:7542;s:9:"OverQuadr";i:7543;s:8:"MisPlata";i:7544;s:9:"CaiSquUnh";i:7545;s:10:"TenUncouUn";i:7546;s:7:"OutTrom";i:7547;s:3:"Lec";i:7548;s:7:"MoSpili";i:7549;s:6:"CaUnab";i:7550;s:10:"MuddPsUnwa";i:7551;s:12:"CoseExpUncon";i:7552;s:5:"Verde";i:7553;s:7:"CoMoWes";i:7554;s:7:"SimuSli";i:7555;s:9:"MylodTran";i:7556;s:7:"CymbSub";i:7557;s:10:"ImThyUnfor";i:7558;s:4:"Stev";i:7559;s:7:"HoploTa";i:7560;s:7:"CoRabix";i:7561;s:7:"OdoTurk";i:7562;s:3:"Fre";i:7563;s:7:"JoKorex";i:7564;s:10:"CofNoneUnc";i:7565;s:3:"Ery";i:7566;s:7:"MusResu";i:7567;s:5:"Valid";i:7568;s:7:"OncoShi";i:7569;s:11:"FoKibbUndim";i:7570;s:3:"Tim";i:7571;s:8:"MortThWi";i:7572;s:13:"ReaalUnsedUnt";i:7573;s:4:"Degl";i:7574;s:9:"MiniOutPe";i:7575;s:13:"HelioHyetMemo";i:7576;s:11:"InvePrediSl";i:7577;s:7:"GhostHe";i:7578;s:10:"RevUncUntr";i:7579;s:5:"Bemai";i:7580;s:7:"TrikeWh";i:7581;s:8:"TelTikix";i:7582;s:9:"MaliUncir";i:7583;s:12:"ForksHepTher";i:7584;s:7:"HypNond";i:7585;s:5:"Wintr";i:7586;s:7:"JeeSubm";i:7587;s:9:"InadeOrUn";i:7588;s:11:"MilnOversTr";i:7589;s:4:"Thal";i:7590;s:3:"Duk";i:7591;s:7:"SleUpla";i:7592;s:2:"Ha";i:7593;s:5:"PeUnm";i:7594;s:9:"DeHipOryz";i:7595;s:4:"PhTe";i:7596;s:8:"UnpZygos";i:7597;s:11:"LovRefiUnco";i:7598;s:6:"DwHodd";i:7599;s:3:"Phi";i:7600;s:7:"DonatSu";i:7601;s:4:"Gran";i:7602;s:8:"LaboTurr";i:7603;s:5:"Geode";i:7604;s:3:"Gle";i:7605;s:5:"Hebra";i:7606;s:4:"Crot";i:7607;s:10:"BloPahSupe";i:7608;s:8:"PostmSer";i:7609;s:6:"IncoUn";i:7610;s:4:"Rere";i:7611;s:11:"ObstTetraUn";i:7612;s:13:"ForehSanieUnc";i:7613;s:6:"SpToma";i:7614;s:5:"Triha";i:7615;s:13:"GallProceWeis";i:7616;s:10:"NonpePolys";i:7617;s:8:"PartrPol";i:7618;s:5:"Volle";i:7619;s:7:"BockPle";i:7620;s:9:"DeDichWel";i:7621;s:10:"IncIndTher";i:7622;s:5:"Minor";i:7623;s:5:"Shado";i:7624;s:6:"ShSlav";i:7625;s:12:"MazalVelVera";i:7626;s:12:"EmargSaUnapp";i:7627;s:11:"OveTussoUnc";i:7628;s:13:"NovaToniUnfor";i:7629;s:12:"FormOnaOutba";i:7630;s:7:"LouvReg";i:7631;s:8:"SerShZau";i:7632;s:10:"EbullIncav";i:7633;s:12:"SmirkStryUna";i:7634;s:7:"StraiUn";i:7635;s:4:"Besn";i:7636;s:6:"DuchIm";i:7637;s:4:"Cowp";i:7638;s:8:"GermJuMi";i:7639;s:11:"BurdHydProm";i:7640;s:9:"PeSeTimbe";i:7641;s:3:"Cac";i:7642;s:6:"MortUn";i:7643;s:5:"Straw";i:7644;s:10:"ExterProph";i:7645;s:11:"RetroSwTele";i:7646;s:6:"ThiUnf";i:7647;s:4:"Unsk";i:7648;s:9:"AnnodHoIl";i:7649;s:5:"ErgEt";i:7650;s:13:"JoviPreabSnee";i:7651;s:5:"Gentl";i:7652;s:3:"Bet";i:7653;s:12:"NuPebaxTitan";i:7654;s:4:"Tato";i:7655;s:7:"SulphUn";i:7656;s:5:"DubSt";i:7657;s:9:"PlowwUnmi";i:7658;s:9:"PaPhotPis";i:7659;s:5:"Subex";i:7660;s:11:"OptoProSubc";i:7661;s:4:"Rout";i:7662;s:4:"Vapo";i:7663;s:9:"HyMidriSy";i:7664;s:7:"NulliWi";i:7665;s:9:"FerStoUnt";i:7666;s:7:"LusSaun";i:7667;s:7:"SterUnc";i:7668;s:5:"BlOst";i:7669;s:7:"InMicro";i:7670;s:5:"Induc";i:7671;s:4:"Tope";i:7672;s:4:"Disi";i:7673;s:5:"SuUte";i:7674;s:7:"CohMiRe";i:7675;s:11:"AmpuScroWin";i:7676;s:10:"MilToUncit";i:7677;s:12:"CenTerrVesic";i:7678;s:8:"QuixUnhu";i:7679;s:10:"SupeTifTub";i:7680;s:4:"Tens";i:7681;s:4:"SeSy";i:7682;s:5:"Precu";i:7683;s:4:"LiSe";i:7684;s:5:"HerLe";i:7685;s:8:"PapyPhot";i:7686;s:9:"ShantSooh";i:7687;s:10:"TradeVicto";i:7688;s:10:"GuardHiYex";i:7689;s:7:"AlkSpra";i:7690;s:4:"EmSt";i:7691;s:8:"HalosPor";i:7692;s:12:"GrotReasVerb";i:7693;s:13:"InchoNonprPor";i:7694;s:8:"LievLubr";i:7695;s:8:"PhalWith";i:7696;s:7:"HemerLu";i:7697;s:9:"HaMoldUnr";i:7698;s:8:"SpanUnwi";i:7699;s:9:"ConnStTri";i:7700;s:7:"HypSuki";i:7701;s:4:"None";i:7702;s:14:"OverPartuUncal";i:7703;s:13:"JessSperSpide";i:7704;s:11:"ReSynodUpba";i:7705;s:4:"Unsq";i:7706;s:10:"MystaReint";i:7707;s:8:"SubcTeno";i:7708;s:7:"ImpaSom";i:7709;s:10:"PsychUncom";i:7710;s:8:"OverProc";i:7711;s:8:"OvePrRec";i:7712;s:6:"DaiPri";i:7713;s:9:"HeavThUnp";i:7714;s:9:"MesolUntr";i:7715;s:11:"SulUncUncoq";i:7716;s:7:"OvileUn";i:7717;s:10:"EnthuSiale";i:7718;s:10:"ErythOrYen";i:7719;s:6:"DeUnVa";i:7720;s:14:"SemidUnpitVege";i:7721;s:8:"CannWhee";i:7722;s:8:"FratPhRe";i:7723;s:7:"MuSulph";i:7724;s:9:"GhaNudiSl";i:7725;s:7:"SomSuTr";i:7726;s:5:"Nomen";i:7727;s:2:"Be";i:7728;s:7:"LabPreb";i:7729;s:6:"UnqUns";i:7730;s:10:"IntraVespe";i:7731;s:8:"HoUncVot";i:7732;s:8:"GroinSto";i:7733;s:5:"Cooke";i:7734;s:12:"OligoScarVol";i:7735;s:12:"CarGoldUndel";i:7736;s:9:"ReceSqUnd";i:7737;s:7:"GaliJam";i:7738;s:3:"Ole";i:7739;s:7:"LaSilve";i:7740;s:3:"Pne";i:7741;s:3:"Sig";i:7742;s:12:"HugPseudVert";i:7743;s:12:"IleocPolVera";i:7744;s:6:"PrShak";i:7745;s:5:"HyRie";i:7746;s:4:"Swee";i:7747;s:12:"PetThelWinet";i:7748;s:11:"DongoHeReci";i:7749;s:9:"MonoPaZyg";i:7750;s:8:"FrowzGap";i:7751;s:6:"GuInte";i:7752;s:4:"File";i:7753;s:6:"AsinHy";i:7754;s:8:"StotUnfi";i:7755;s:11:"RetTetUname";i:7756;s:13:"BiriCedarQuir";i:7757;s:6:"LuPlWe";i:7758;s:6:"IndSty";i:7759;s:7:"ForePlo";i:7760;s:8:"IntOvipo";i:7761;s:13:"TubuUncomUpdr";i:7762;s:9:"BrLilOver";i:7763;s:3:"Kow";i:7764;s:3:"Nut";i:7765;s:3:"Yuk";i:7766;s:11:"PePhoenVege";i:7767;s:8:"PerceUns";i:7768;s:13:"TalloUnqVesic";i:7769;s:4:"Elen";i:7770;s:13:"GriSymmeUsuri";i:7771;s:4:"Esqu";i:7772;s:5:"PaPea";i:7773;s:6:"EtheTo";i:7774;s:7:"PolyPse";i:7775;s:5:"FibUr";i:7776;s:9:"PassiReSo";i:7777;s:14:"EspiGnomoPerch";i:7778;s:9:"InePoUnsp";i:7779;s:10:"SmitSquaTe";i:7780;s:5:"Trunc";i:7781;s:6:"ChClum";i:7782;s:4:"Pear";i:7783;s:8:"BromoCic";i:7784;s:8:"ExItPayr";i:7785;s:6:"GaSulb";i:7786;s:15:"DeindDiscoWoodr";i:7787;s:4:"Sple";i:7788;s:7:"UndreVi";i:7789;s:12:"ImpPerobStur";i:7790;s:5:"Moder";i:7791;s:3:"Det";i:7792;s:8:"SubUndec";i:7793;s:9:"ProphTris";i:7794;s:10:"PlPreSedul";i:7795;s:9:"PedaUlotr";i:7796;s:6:"GeGing";i:7797;s:9:"BugfChrom";i:7798;s:8:"IntPerso";i:7799;s:10:"SicexSplay";i:7800;s:3:"Ces";i:7801;s:12:"PusSelenSten";i:7802;s:11:"NurseReWars";i:7803;s:9:"CoNaUnbir";i:7804;s:5:"Sospi";i:7805;s:7:"CirGeol";i:7806;s:9:"SesquUnpr";i:7807;s:13:"BioLaticPsora";i:7808;s:10:"IntOstarPe";i:7809;s:5:"PiTwa";i:7810;s:5:"Pleom";i:7811;s:13:"PerinProSasse";i:7812;s:10:"GuanUnsWat";i:7813;s:7:"RekiUnt";i:7814;s:7:"CarPoly";i:7815;s:13:"BiangImprLeti";i:7816;s:9:"ObUnapVeg";i:7817;s:13:"OxanaRasSulph";i:7818;s:11:"InidoShuVis";i:7819;s:7:"SciUnha";i:7820;s:5:"Nonpr";i:7821;s:5:"Sandm";i:7822;s:10:"PolygTwUnc";i:7823;s:7:"GenScTa";i:7824;s:8:"PreSuVin";i:7825;s:11:"MeShekUpren";i:7826;s:6:"PaPicr";i:7827;s:3:"Oph";i:7828;s:9:"CracPeria";i:7829;s:9:"DiscDownl";i:7830;s:5:"Trias";i:7831;s:13:"SecSkullVeris";i:7832;s:9:"FructTher";i:7833;s:6:"DiaZea";i:7834;s:4:"Tren";i:7835;s:14:"LudgaMastProge";i:7836;s:8:"ExteMock";i:7837;s:3:"Vir";i:7838;s:5:"RegSt";i:7839;s:7:"OccuUdx";i:7840;s:10:"GrNeriUnha";i:7841;s:10:"SpiraTopic";i:7842;s:5:"Oreas";i:7843;s:5:"Unmou";i:7844;s:3:"Wes";i:7845;s:2:"Ec";i:7846;s:5:"Probo";i:7847;s:9:"DiscoGano";i:7848;s:8:"NonaSmok";i:7849;s:8:"RamTraUn";i:7850;s:9:"LameMusic";i:7851;s:8:"CowPopes";i:7852;s:12:"PorcStrUnbio";i:7853;s:4:"Rash";i:7854;s:11:"FielInteWes";i:7855;s:4:"Anth";i:7856;s:9:"CeCubiSaf";i:7857;s:7:"PeaPoRo";i:7858;s:7:"PrPyram";i:7859;s:7:"DiseaDo";i:7860;s:10:"HeterPeSac";i:7861;s:9:"FixiLaSla";i:7862;s:8:"HuaProSa";i:7863;s:13:"JuglJustTrivi";i:7864;s:5:"Selac";i:7865;s:7:"HaWacke";i:7866;s:3:"Pas";i:7867;s:12:"DeInaniPolyt";i:7868;s:9:"UncomUnim";i:7869;s:5:"Slaug";i:7870;s:8:"UnbloUnc";i:7871;s:6:"NonPho";i:7872;s:6:"ProfTh";i:7873;s:11:"EpictJuriPe";i:7874;s:7:"MerPhyt";i:7875;s:12:"PhiloRoVirgi";i:7876;s:12:"SpVasolWhiff";i:7877;s:7:"NonloPa";i:7878;s:7:"AbFaUnm";i:7879;s:5:"Tetar";i:7880;s:8:"ReideUre";i:7881;s:9:"EsoPrevRe";i:7882;s:5:"Plymo";i:7883;s:10:"HandlNaTra";i:7884;s:12:"DisbGlumVipe";i:7885;s:9:"OppreWhea";i:7886;s:5:"GueKo";i:7887;s:8:"MonuNond";i:7888;s:7:"SalUnpi";i:7889;s:4:"Syne";i:7890;s:14:"SluitWeisWhatk";i:7891;s:10:"GinwOaPerg";i:7892;s:11:"PleurRaUnde";i:7893;s:10:"MetMetPtil";i:7894;s:11:"OchPenSuper";i:7895;s:3:"Jar";i:7896;s:9:"PreciSond";i:7897;s:3:"Des";i:7898;s:9:"HeKenoNon";i:7899;s:13:"ConneNonspOdy";i:7900;s:9:"AspBliIna";i:7901;s:9:"JansePhPi";i:7902;s:6:"RhTamm";i:7903;s:9:"PoetTucka";i:7904;s:6:"TricZo";i:7905;s:4:"Furd";i:7906;s:5:"Squee";i:7907;s:13:"HippoSteTrigo";i:7908;s:14:"CombiInseLoine";i:7909;s:12:"HaemImprQuav";i:7910;s:4:"Unad";i:7911;s:4:"Uros";i:7912;s:4:"Palp";i:7913;s:4:"ReUl";i:7914;s:6:"ExcPea";i:7915;s:6:"PodTri";i:7916;s:14:"QuibbRobiUntem";i:7917;s:5:"Mothe";i:7918;s:12:"MansThorWald";i:7919;s:6:"HearUr";i:7920;s:13:"DarkPalaeUnar";i:7921;s:10:"SpeTeUntra";i:7922;s:5:"Ineff";i:7923;s:9:"LazexMisi";i:7924;s:7:"HarPseu";i:7925;s:13:"IntSalesVeloc";i:7926;s:5:"Halop";i:7927;s:7:"HyPyroc";i:7928;s:11:"HymeJeProdu";i:7929;s:8:"PseSinga";i:7930;s:7:"UtopXan";i:7931;s:5:"OvPro";i:7932;s:11:"SalUnsWoman";i:7933;s:10:"PyrTesToxo";i:7934;s:5:"GunPr";i:7935;s:7:"OveraUn";i:7936;s:12:"LaPacktWease";i:7937;s:5:"Lepto";i:7938;s:6:"MeStTr";i:7939;s:7:"OwlVerm";i:7940;s:4:"Spad";i:7941;s:4:"Unap";i:7942;s:12:"CulgeDideMan";i:7943;s:8:"PoPreaPr";i:7944;s:10:"TelauUnhus";i:7945;s:9:"CalInJuba";i:7946;s:9:"MicUnfVol";i:7947;s:7:"EumeFle";i:7948;s:10:"NumiRuWide";i:7949;s:6:"TritTu";i:7950;s:5:"Sanuk";i:7951;s:7:"HazarQu";i:7952;s:8:"LeroQuUg";i:7953;s:3:"Who";i:7954;s:12:"MakefMetScul";i:7955;s:9:"FamiPluri";i:7956;s:5:"Purse";i:7957;s:9:"PhTissuUn";i:7958;s:12:"AloDemopSens";i:7959;s:9:"InteSluic";i:7960;s:4:"Mesi";i:7961;s:8:"ReTuliUn";i:7962;s:14:"CyanLycanSpenc";i:7963;s:4:"NeRo";i:7964;s:7:"AmmocCe";i:7965;s:6:"MiSika";i:7966;s:8:"LongiNoa";i:7967;s:8:"ColMiPla";i:7968;s:11:"CoincMillPn";i:7969;s:11:"MoraePrUmpx";i:7970;s:7:"PromaSh";i:7971;s:7:"TaTorre";i:7972;s:7:"PresPro";i:7973;s:7:"GayVomi";i:7974;s:7:"EncVagi";i:7975;s:3:"Geo";i:7976;s:12:"GroupOverUnh";i:7977;s:8:"CaltMeNo";i:7978;s:10:"IsochTogVi";i:7979;s:5:"Sphae";i:7980;s:6:"HeHoIn";i:7981;s:4:"Plis";i:7982;s:9:"MisjoPhar";i:7983;s:10:"AscCoUnthi";i:7984;s:12:"HemiPannaSha";i:7985;s:9:"RosiScrol";i:7986;s:8:"RepSepia";i:7987;s:9:"RaReagRev";i:7988;s:5:"SpThe";i:7989;s:8:"FilaPiez";i:7990;s:10:"GeoboHeNec";i:7991;s:7:"OverSen";i:7992;s:3:"Har";i:7993;s:4:"Torp";i:7994;s:9:"OpilUnder";i:7995;s:7:"KaSupra";i:7996;s:4:"Ikat";i:7997;s:5:"Forea";i:7998;s:6:"FoRere";i:7999;s:13:"PeridSecluTru";i:8000;s:10:"JeewhPigeo";i:8001;s:5:"DiPer";i:8002;s:8:"IndTheUn";i:8003;s:13:"ChlorHesSacri";i:8004;s:7:"UncoUnk";i:8005;s:6:"ComInc";i:8006;s:10:"HelLimPlet";i:8007;s:3:"Tau";i:8008;s:13:"HexaRepreSidd";i:8009;s:11:"LeptoReliUt";i:8010;s:3:"Din";i:8011;s:10:"ChronCuSay";i:8012;s:15:"CaphtHymenPsych";i:8013;s:4:"Saim";i:8014;s:5:"RenSh";i:8015;s:6:"AntiFo";i:8016;s:9:"RecadUnad";i:8017;s:3:"Ben";i:8018;s:5:"Forma";i:8019;s:4:"OrQu";i:8020;s:11:"AutGuesInnk";i:8021;s:10:"DacryUltZa";i:8022;s:8:"SubcoTes";i:8023;s:4:"Sapp";i:8024;s:14:"EuchPostaRipco";i:8025;s:7:"PatbRej";i:8026;s:5:"Maxil";i:8027;s:10:"HeMalaProv";i:8028;s:14:"RakexStagVomer";i:8029;s:9:"MonosPrRa";i:8030;s:4:"Oket";i:8031;s:7:"PaTrack";i:8032;s:9:"CausUnYaw";i:8033;s:9:"IntraUncl";i:8034;s:5:"Staro";i:8035;s:4:"Walk";i:8036;s:4:"Pitt";i:8037;s:10:"SappSmaTan";i:8038;s:6:"ReUnhu";i:8039;s:5:"Measl";i:8040;s:9:"UrbaWhimb";i:8041;s:7:"JaSucci";i:8042;s:10:"CoPyrTeles";i:8043;s:9:"MelilScle";i:8044;s:8:"IntPrStr";i:8045;s:11:"CatFrogSwif";i:8046;s:7:"DiscPar";i:8047;s:10:"PeRecoSpon";i:8048;s:10:"EpiOvePont";i:8049;s:14:"PrefeScatTrans";i:8050;s:7:"OutTele";i:8051;s:8:"HenKluxe";i:8052;s:14:"GametGrubrMono";i:8053;s:3:"Sho";i:8054;s:8:"EschaIso";i:8055;s:11:"EcliPropUnd";i:8056;s:6:"DePros";i:8057;s:13:"BetocCaecaInt";i:8058;s:7:"PrescPr";i:8059;s:12:"DeGeniiSkiam";i:8060;s:5:"SlTre";i:8061;s:11:"SeSpooTrich";i:8062;s:8:"PteroZor";i:8063;s:3:"Tru";i:8064;s:6:"FlSter";i:8065;s:12:"ReptiTrUndec";i:8066;s:14:"HyperProphWood";i:8067;s:10:"TimbaUnfis";i:8068;s:8:"CaSenUni";i:8069;s:8:"RathUrrh";i:8070;s:5:"ReSte";i:8071;s:8:"AutoTheg";i:8072;s:5:"Unrus";i:8073;s:10:"CorLePeaco";i:8074;s:10:"DepaMeRewh";i:8075;s:5:"HomUp";i:8076;s:7:"DeguFis";i:8077;s:10:"DreyfRefal";i:8078;s:4:"IlIn";i:8079;s:8:"OutsOvPr";i:8080;s:9:"RoteSulfa";i:8081;s:12:"CladuPolyStu";i:8082;s:5:"Susce";i:8083;s:8:"CoHexaHu";i:8084;s:12:"KnaggPsychUg";i:8085;s:5:"Pytho";i:8086;s:5:"FloTa";i:8087;s:6:"OuSple";i:8088;s:8:"CliPiWee";i:8089;s:4:"Unar";i:8090;s:10:"InvoMarPar";i:8091;s:5:"Homoo";i:8092;s:7:"SaSceni";i:8093;s:6:"FreQua";i:8094;s:13:"ArchsArtilCoc";i:8095;s:7:"MalMult";i:8096;s:5:"Scree";i:8097;s:10:"PhaPoisThy";i:8098;s:7:"GeLemTo";i:8099;s:5:"Perip";i:8100;s:9:"MartWineb";i:8101;s:5:"Trise";i:8102;s:10:"HyRatTehue";i:8103;s:9:"ExImsonUn";i:8104;s:4:"Warf";i:8105;s:11:"LarriMinWit";i:8106;s:6:"TriUps";i:8107;s:11:"MangTaTouch";i:8108;s:10:"ReddiTange";i:8109;s:7:"SwirVal";i:8110;s:11:"IliaInfiNab";i:8111;s:10:"BackFrieUn";i:8112;s:8:"ChaThrom";i:8113;s:5:"JeOve";i:8114;s:5:"Royet";i:8115;s:5:"Plian";i:8116;s:12:"ImprePeUnspi";i:8117;s:5:"Kaffi";i:8118;s:4:"Skim";i:8119;s:6:"MuRewa";i:8120;s:5:"Wicex";i:8121;s:8:"PruReSce";i:8122;s:10:"ConEpiUnli";i:8123;s:9:"MoPresaSc";i:8124;s:3:"Wel";i:8125;s:5:"PyrPy";i:8126;s:9:"CordoStTi";i:8127;s:12:"PetrSteUnsmo";i:8128;s:9:"HissOtocr";i:8129;s:8:"EuMeSlas";i:8130;s:4:"Leth";i:8131;s:5:"IrLon";i:8132;s:9:"AuliIsUin";i:8133;s:6:"GameYe";i:8134;s:9:"NoncNonsa";i:8135;s:12:"FamisPoStrew";i:8136;s:4:"Stan";i:8137;s:8:"ShiSulph";i:8138;s:10:"MyogrResUn";i:8139;s:13:"MultUncheUnco";i:8140;s:7:"KasOpUn";i:8141;s:10:"DiploPaTyl";i:8142;s:4:"Mann";i:8143;s:11:"LuffxUnbUne";i:8144;s:6:"OutsSu";i:8145;s:5:"Shape";i:8146;s:9:"ScreTripe";i:8147;s:13:"CrimeNapPreim";i:8148;s:6:"MiZest";i:8149;s:5:"Suito";i:8150;s:5:"Learx";i:8151;s:14:"CursoOracPenna";i:8152;s:6:"EnstRa";i:8153;s:9:"ChowdPref";i:8154;s:9:"ClansThre";i:8155;s:7:"BlCurub";i:8156;s:6:"SaffUn";i:8157;s:8:"OuScUndr";i:8158;s:7:"DeWista";i:8159;s:7:"AnImmMe";i:8160;s:8:"InscUnra";i:8161;s:9:"RanceUnco";i:8162;s:3:"Lob";i:8163;s:8:"HumorPoo";i:8164;s:4:"GoSu";i:8165;s:6:"TalaTe";i:8166;s:10:"ChoirPoVet";i:8167;s:12:"MinNecrNonra";i:8168;s:4:"Unes";i:8169;s:11:"ForOvePrele";i:8170;s:4:"GaPe";i:8171;s:5:"IntTh";i:8172;s:5:"Prece";i:8173;s:7:"PoikiSc";i:8174;s:13:"CloudMedSuper";i:8175;s:5:"PreQu";i:8176;s:7:"SwagSwi";i:8177;s:10:"MorOutliPr";i:8178;s:13:"NaissNuclePre";i:8179;s:4:"Chla";i:8180;s:4:"Zapt";i:8181;s:10:"VentrWeany";i:8182;s:7:"ParabSa";i:8183;s:9:"CenoFillx";i:8184;s:5:"Undul";i:8185;s:5:"Trade";i:8186;s:8:"BizeColc";i:8187;s:6:"PhPugh";i:8188;s:12:"PreSporSport";i:8189;s:8:"GyneZarz";i:8190;s:6:"CalcIp";i:8191;s:8:"UnqVakia";i:8192;s:9:"SeUnViola";i:8193;s:7:"HySnoop";i:8194;s:5:"MaiTo";i:8195;s:12:"GaviaMeliNic";i:8196;s:4:"Prae";i:8197;s:6:"HorrMo";i:8198;s:8:"TauroWag";i:8199;s:5:"Punic";i:8200;s:4:"Matr";i:8201;s:5:"Jimba";i:8202;s:2:"Ya";i:8203;s:10:"JapRemaScr";i:8204;s:12:"PrThiasUnten";i:8205;s:11:"MisdPhanPsy";i:8206;s:5:"Store";i:8207;s:6:"StTigh";i:8208;s:9:"ApChoreSl";i:8209;s:4:"Refo";i:8210;s:14:"BlowlHydraPump";i:8211;s:11:"PalaeUnpWha";i:8212;s:8:"ArBiUnco";i:8213;s:12:"ConvPrevSuet";i:8214;s:9:"HemocStag";i:8215;s:9:"TutuVario";i:8216;s:6:"HeiUns";i:8217;s:5:"InTen";i:8218;s:8:"SeroSphe";i:8219;s:4:"Tarr";i:8220;s:5:"ExKro";i:8221;s:8:"MukdPoly";i:8222;s:10:"SpliVotWas";i:8223;s:8:"RecomSca";i:8224;s:11:"ManaPneumSo";i:8225;s:3:"Cha";i:8226;s:9:"MicrOvRet";i:8227;s:8:"PreyTwad";i:8228;s:7:"MoNoRes";i:8229;s:7:"EpUnboi";i:8230;s:7:"DodgiUn";i:8231;s:8:"NovSotti";i:8232;s:8:"RenSubSu";i:8233;s:10:"JurisUncVe";i:8234;s:12:"SteatSutToxo";i:8235;s:11:"TucUncUnpro";i:8236;s:8:"EpiSciss";i:8237;s:8:"OleUnave";i:8238;s:5:"CaFor";i:8239;s:9:"PostRedSc";i:8240;s:7:"ImpeSav";i:8241;s:7:"LocSupr";i:8242;s:8:"HaddInSu";i:8243;s:13:"PolitVerWorth";i:8244;s:9:"MaxilSymp";i:8245;s:3:"Wha";i:8246;s:5:"Oroba";i:8247;s:10:"HolocPurSe";i:8248;s:12:"ChEnsmaMonia";i:8249;s:14:"SaponToxeUnven";i:8250;s:9:"CriDosPre";i:8251;s:5:"Turbo";i:8252;s:13:"FisnHyponVine";i:8253;s:3:"Sol";i:8254;s:10:"PunctSuspe";i:8255;s:12:"BedeCaninPer";i:8256;s:3:"Uro";i:8257;s:7:"StiUnsu";i:8258;s:9:"PaleShore";i:8259;s:7:"LeQuadx";i:8260;s:8:"CryExcTa";i:8261;s:8:"PaProUnp";i:8262;s:9:"PinelScol";i:8263;s:8:"CoHyLayl";i:8264;s:8:"HeOptPri";i:8265;s:8:"PaSliTry";i:8266;s:6:"HaPumi";i:8267;s:6:"SofTra";i:8268;s:4:"Redh";i:8269;s:5:"Round";i:8270;s:10:"PhyUltrVel";i:8271;s:9:"TyrtaZami";i:8272;s:12:"ProbRumeTins";i:8273;s:6:"FlooLa";i:8274;s:9:"RaroSolei";i:8275;s:11:"GorgeNavSma";i:8276;s:4:"Dicy";i:8277;s:5:"ReSpi";i:8278;s:9:"InOcPastu";i:8279;s:11:"CounMyStell";i:8280;s:3:"Sau";i:8281;s:4:"InUn";i:8282;s:11:"NonPredSpin";i:8283;s:5:"Outpr";i:8284;s:11:"ComMilRebuf";i:8285;s:10:"HyStraTell";i:8286;s:6:"PiTris";i:8287;s:6:"RoTect";i:8288;s:6:"SloSpe";i:8289;s:10:"MuttoUnpre";i:8290;s:8:"ChUnwoVe";i:8291;s:5:"Thirt";i:8292;s:9:"PredUnres";i:8293;s:12:"FreelHydroIn";i:8294;s:4:"SaUn";i:8295;s:8:"ErraSage";i:8296;s:10:"QuadrSeaYa";i:8297;s:5:"PerSo";i:8298;s:12:"AvenNonNookl";i:8299;s:4:"DaHe";i:8300;s:8:"ChiDemUk";i:8301;s:8:"MaUnWind";i:8302;s:6:"CaInWe";i:8303;s:11:"EndeOsseoUn";i:8304;s:8:"MyriPeri";i:8305;s:10:"PestpSonat";i:8306;s:4:"PhRa";i:8307;s:9:"HawxPemph";i:8308;s:6:"ReTrem";i:8309;s:9:"NonciScot";i:8310;s:10:"MicPerSpon";i:8311;s:3:"Chr";i:8312;s:9:"GuttTrico";i:8313;s:7:"HagiScr";i:8314;s:6:"PlesPo";i:8315;s:10:"MesorMinNi";i:8316;s:8:"DisPlano";i:8317;s:8:"HyaInOut";i:8318;s:6:"OmTosh";i:8319;s:6:"SuTrVa";i:8320;s:12:"CombiPyrenUn";i:8321;s:5:"PhaPo";i:8322;s:8:"ImpInInt";i:8323;s:8:"ParWandx";i:8324;s:4:"Robo";i:8325;s:9:"MulQuiSpa";i:8326;s:6:"MicOsm";i:8327;s:6:"OvZoog";i:8328;s:11:"OveRemanSel";i:8329;s:10:"BrickGuLac";i:8330;s:12:"PapaSakSensi";i:8331;s:11:"HistPondTel";i:8332;s:4:"Vert";i:8333;s:7:"OestrRe";i:8334;s:10:"MagStrTetr";i:8335;s:8:"BridChry";i:8336;s:7:"ResubUn";i:8337;s:10:"EqPolyTabl";i:8338;s:5:"Matri";i:8339;s:10:"ElectWater";i:8340;s:7:"AmnesUn";i:8341;s:7:"GeRetro";i:8342;s:10:"OstPicValu";i:8343;s:10:"HolPrSpatt";i:8344;s:7:"BrighSe";i:8345;s:11:"MusiNonUniv";i:8346;s:9:"NonSittVo";i:8347;s:4:"Rewo";i:8348;s:7:"ResoUra";i:8349;s:9:"MaPaTolfr";i:8350;s:8:"BunWicke";i:8351;s:13:"HobParasPindy";i:8352;s:8:"IllfMiOu";i:8353;s:11:"DisrTabiUnd";i:8354;s:10:"KoffxPaRua";i:8355;s:13:"GogoxSunkeTom";i:8356;s:9:"UnbeWafer";i:8357;s:9:"SecreSpUp";i:8358;s:4:"Mend";i:8359;s:11:"HallmHydrWa";i:8360;s:7:"ChInPer";i:8361;s:10:"IsoQuinSte";i:8362;s:7:"RelUnta";i:8363;s:7:"GigbaLo";i:8364;s:13:"DrumPipeVentr";i:8365;s:4:"Unil";i:8366;s:10:"PneProviSh";i:8367;s:6:"InInte";i:8368;s:8:"LiUnhuUn";i:8369;s:12:"MismaNeWrith";i:8370;s:5:"Preor";i:8371;s:8:"GeiPrUnp";i:8372;s:9:"NonsuPoly";i:8373;s:5:"Ivory";i:8374;s:9:"TaleYowlr";i:8375;s:13:"MitosNotTrisi";i:8376;s:11:"MeniNeuTatu";i:8377;s:14:"ImprMetalUncon";i:8378;s:12:"PessReaSilic";i:8379;s:12:"RooUnmatVina";i:8380;s:5:"Pedan";i:8381;s:5:"Hattx";i:8382;s:4:"Sham";i:8383;s:3:"Bum";i:8384;s:5:"Polyn";i:8385;s:8:"BaeSerfd";i:8386;s:11:"InureUnleWe";i:8387;s:5:"Outmi";i:8388;s:10:"PaleoTaVer";i:8389;s:11:"HexasLaddSt";i:8390;s:7:"ChevrNo";i:8391;s:7:"LanMeMe";i:8392;s:6:"PhoUps";i:8393;s:6:"ResWri";i:8394;s:8:"PlatTerr";i:8395;s:15:"BilgyDisedUgand";i:8396;s:4:"CrDe";i:8397;s:12:"CholeSaTommy";i:8398;s:9:"OmniSheep";i:8399;s:9:"PeaPtQuat";i:8400;s:8:"IsocNilx";i:8401;s:6:"CeHete";i:8402;s:4:"Voci";i:8403;s:6:"SamSca";i:8404;s:4:"Lapa";i:8405;s:10:"DeuSimUnfr";i:8406;s:9:"HucMarsSc";i:8407;s:11:"PerPlatSpor";i:8408;s:12:"GratuHeKaemp";i:8409;s:13:"MastiShipTemp";i:8410;s:7:"PsePycn";i:8411;s:9:"NubecPipp";i:8412;s:12:"FrencManiuUn";i:8413;s:3:"Gas";i:8414;s:9:"MesoScSub";i:8415;s:12:"FomenMerobUn";i:8416;s:8:"OverPhre";i:8417;s:7:"IcostMi";i:8418;s:10:"BioscMisPa";i:8419;s:10:"ArcExtWham";i:8420;s:9:"TickTitex";i:8421;s:9:"ForfNiSpe";i:8422;s:5:"Unbig";i:8423;s:10:"IrredLiftm";i:8424;s:12:"AugeDebbyUnr";i:8425;s:11:"BleekImmPax";i:8426;s:5:"Dowdi";i:8427;s:8:"SilThimb";i:8428;s:14:"NonrePantiStre";i:8429;s:13:"IncesLentoMar";i:8430;s:12:"CytoPonSludx";i:8431;s:7:"CoSuper";i:8432;s:4:"RoTh";i:8433;s:6:"NiSupe";i:8434;s:7:"ExpPhlo";i:8435;s:3:"Via";i:8436;s:9:"PurbYiddi";i:8437;s:10:"OrPedaRush";i:8438;s:5:"LaTec";i:8439;s:3:"Sod";i:8440;s:9:"CorvDreIm";i:8441;s:9:"NoProUngr";i:8442;s:8:"ContInIn";i:8443;s:5:"Stupe";i:8444;s:4:"Sync";i:8445;s:4:"Sloo";i:8446;s:3:"Hep";i:8447;s:7:"DesFePh";i:8448;s:4:"Toxo";i:8449;s:11:"ConjHeLater";i:8450;s:5:"Mistu";i:8451;s:8:"KnapPsSi";i:8452;s:7:"ArFacQu";i:8453;s:13:"PneuSemiWoode";i:8454;s:7:"KnNisha";i:8455;s:9:"PoQueStak";i:8456;s:13:"LegitRelicRom";i:8457;s:7:"HaIchno";i:8458;s:10:"EleutScept";i:8459;s:7:"ProSter";i:8460;s:11:"HatbSequUna";i:8461;s:4:"Micr";i:8462;s:6:"GlGlut";i:8463;s:12:"ChannMicrPre";i:8464;s:4:"Tyri";i:8465;s:4:"Supp";i:8466;s:5:"Unpre";i:8467;s:9:"JiggeSong";i:8468;s:5:"Wards";i:8469;s:5:"FeInd";i:8470;s:3:"Spa";i:8471;s:12:"BuoyDecuRedu";i:8472;s:5:"Wolfh";i:8473;s:7:"PolonRe";i:8474;s:5:"Astro";i:8475;s:14:"ClareUnlaUntom";i:8476;s:4:"Tria";i:8477;s:11:"UnjarUnUnva";i:8478;s:10:"LampMyeUnb";i:8479;s:4:"Unho";i:8480;s:11:"FraiRiXebec";i:8481;s:9:"EndoThUnr";i:8482;s:9:"FulgMaMin";i:8483;s:13:"HydrPosolProf";i:8484;s:10:"EcholSaumo";i:8485;s:13:"CopeDozexMona";i:8486;s:7:"FlePort";i:8487;s:5:"Usnin";i:8488;s:4:"PaUn";i:8489;s:6:"MourSa";i:8490;s:9:"ChiLarNon";i:8491;s:3:"Sna";i:8492;s:11:"KioPhotPrep";i:8493;s:9:"OligSubco";i:8494;s:8:"InflPiUn";i:8495;s:9:"GlaHetTre";i:8496;s:10:"ChronEucPh";i:8497;s:6:"RuiUne";i:8498;s:10:"ResumUngla";i:8499;s:4:"Corp";i:8500;s:7:"IndPape";i:8501;s:8:"PalProje";i:8502;s:4:"Sepi";i:8503;s:9:"OvariSpin";i:8504;s:10:"QuiveUncor";i:8505;s:5:"Picra";i:8506;s:14:"MythiOutbWedan";i:8507;s:6:"ShowUl";i:8508;s:11:"ParasRecRev";i:8509;s:7:"EugGall";i:8510;s:3:"Coe";i:8511;s:6:"SurrWr";i:8512;s:12:"FlabHetePsyc";i:8513;s:5:"ChDev";i:8514;s:9:"NoneUnbek";i:8515;s:12:"DiagrMesPopu";i:8516;s:8:"ShSupeUn";i:8517;s:11:"KeysMeVicto";i:8518;s:13:"ShriTirriWhos";i:8519;s:15:"PhilaPrickRutil";i:8520;s:13:"EnfesRortyThe";i:8521;s:3:"Ket";i:8522;s:12:"GreePerniPur";i:8523;s:7:"OoSorce";i:8524;s:7:"SonioUn";i:8525;s:8:"QuadSaum";i:8526;s:7:"CorCrGr";i:8527;s:11:"PistShaThou";i:8528;s:6:"DisePh";i:8529;s:8:"SatinWit";i:8530;s:7:"SchisSp";i:8531;s:4:"Upcu";i:8532;s:13:"MadeUnconWitc";i:8533;s:4:"Antu";i:8534;s:10:"SecatTaqua";i:8535;s:5:"Proco";i:8536;s:7:"UntwiWr";i:8537;s:8:"PiProRep";i:8538;s:13:"OstScrimVadim";i:8539;s:5:"Subsu";i:8540;s:10:"CruttLappa";i:8541;s:6:"ShUnli";i:8542;s:7:"EpitRes";i:8543;s:4:"Kuld";i:8544;s:4:"Stru";i:8545;s:6:"UncUne";i:8546;s:3:"Tel";i:8547;s:4:"MuTu";i:8548;s:12:"FreckRippRoc";i:8549;s:10:"UnbefVilay";i:8550;s:9:"HydrInflo";i:8551;s:9:"NotidPred";i:8552;s:12:"GoniLustfUnd";i:8553;s:12:"ImbosMaOverb";i:8554;s:7:"ShThymo";i:8555;s:6:"KaMuPl";i:8556;s:10:"PyogRecoRe";i:8557;s:10:"NestoTrUnt";i:8558;s:12:"MissMonodNon";i:8559;s:6:"UncoUn";i:8560;s:6:"UnUned";i:8561;s:3:"Nes";i:8562;s:6:"DumHem";i:8563;s:4:"Yawn";i:8564;s:5:"Medie";i:8565;s:7:"MetSubi";i:8566;s:9:"SeltSteSt";i:8567;s:8:"LivOlivi";i:8568;s:4:"LiPa";i:8569;s:4:"Sarr";i:8570;s:5:"Porit";i:8571;s:8:"NebbyRam";i:8572;s:6:"PloTim";i:8573;s:9:"MilliOrri";i:8574;s:9:"GessHomTh";i:8575;s:6:"HighLi";i:8576;s:13:"HetHypogSupra";i:8577;s:5:"Stave";i:8578;s:8:"LingTass";i:8579;s:4:"StTh";i:8580;s:6:"SeSong";i:8581;s:4:"Gyra";i:8582;s:9:"OnaxUnhos";i:8583;s:4:"Noto";i:8584;s:6:"PeVerb";i:8585;s:5:"Opera";i:8586;s:7:"SaSoUni";i:8587;s:10:"OphrPeUrea";i:8588;s:5:"InWin";i:8589;s:13:"NecesNoweQues";i:8590;s:7:"SauteSu";i:8591;s:7:"BloBrac";i:8592;s:9:"ExHebriLu";i:8593;s:7:"MpangRa";i:8594;s:12:"DemagEllipMo";i:8595;s:10:"ImprSkiWat";i:8596;s:8:"LocTende";i:8597;s:7:"PaUnadv";i:8598;s:11:"SavSlagStra";i:8599;s:8:"BlTasUnd";i:8600;s:4:"Riss";i:8601;s:5:"MoTah";i:8602;s:5:"Hypot";i:8603;s:5:"Prali";i:8604;s:11:"ExsOverSola";i:8605;s:4:"Omni";i:8606;s:10:"MacrSeSupe";i:8607;s:7:"NautWin";i:8608;s:7:"UnswWhe";i:8609;s:5:"Untoo";i:8610;s:5:"Mimmo";i:8611;s:10:"NotoRegrSu";i:8612;s:7:"MonaPse";i:8613;s:9:"ChiRetSqu";i:8614;s:11:"CatarEpiIde";i:8615;s:8:"SerUnrev";i:8616;s:7:"UnoWrit";i:8617;s:9:"MisSuTeas";i:8618;s:8:"MonWhare";i:8619;s:14:"ElzevRoughUtri";i:8620;s:5:"Uninf";i:8621;s:4:"Volu";i:8622;s:9:"ExpOdsRet";i:8623;s:10:"DiaFendPhy";i:8624;s:7:"OversPh";i:8625;s:3:"Van";i:8626;s:3:"Pic";i:8627;s:3:"Hoo";i:8628;s:7:"MetPneu";i:8629;s:11:"GranuTeleTe";i:8630;s:2:"Ep";i:8631;s:5:"Verti";i:8632;s:8:"BerdaRei";i:8633;s:11:"PolStylWasa";i:8634;s:10:"TemUnbowUn";i:8635;s:10:"HiSeldToli";i:8636;s:8:"PlaRaTre";i:8637;s:7:"SalUnro";i:8638;s:6:"LipoQu";i:8639;s:5:"Refle";i:8640;s:9:"OutloScUn";i:8641;s:7:"GrMaVat";i:8642;s:7:"ShardTr";i:8643;s:6:"PolStr";i:8644;s:9:"StacTiTub";i:8645;s:10:"GangGrooZi";i:8646;s:4:"Titi";i:8647;s:7:"LocPala";i:8648;s:4:"Skin";i:8649;s:11:"DiaphRapSpu";i:8650;s:8:"GlarMeta";i:8651;s:7:"InOffic";i:8652;s:4:"Hete";i:8653;s:7:"RefeSuc";i:8654;s:5:"MeSie";i:8655;s:4:"DaMe";i:8656;s:4:"Yard";i:8657;s:4:"Vene";i:8658;s:8:"MelaShUn";i:8659;s:9:"EjPiUnnab";i:8660;s:9:"OrnitPayn";i:8661;s:12:"CotarPhohUnd";i:8662;s:9:"HaitiUnUn";i:8663;s:8:"NealxSup";i:8664;s:4:"Tetr";i:8665;s:8:"UnlitZeu";i:8666;s:9:"GammaGuid";i:8667;s:9:"TaTraUndi";i:8668;s:10:"SizSuWahah";i:8669;s:7:"PoliPun";i:8670;s:3:"Sum";i:8671;s:13:"PenthRegrTasi";i:8672;s:9:"RetroUnat";i:8673;s:11:"ElInveNickx";i:8674;s:14:"EbionParmeSpid";i:8675;s:4:"Gurg";i:8676;s:4:"Ente";i:8677;s:9:"IntMilTer";i:8678;s:11:"HomoPiRetar";i:8679;s:8:"InspReco";i:8680;s:14:"RealSanctSepar";i:8681;s:12:"CyclOuttSlag";i:8682;s:12:"ExogNadiSupe";i:8683;s:4:"LeTe";i:8684;s:10:"BenefInter";i:8685;s:10:"HarmRotUpp";i:8686;s:8:"PseTunna";i:8687;s:10:"PreResSati";i:8688;s:6:"FloTra";i:8689;s:5:"Troph";i:8690;s:4:"InMo";i:8691;s:15:"PlaceRaciaRuntx";i:8692;s:9:"CauSrTolu";i:8693;s:12:"IncomXenopXe";i:8694;s:12:"CaeciCaPaleo";i:8695;s:4:"LoPh";i:8696;s:12:"GamIodyXerop";i:8697;s:5:"Chond";i:8698;s:5:"MeTel";i:8699;s:8:"ObediPou";i:8700;s:4:"PhVa";i:8701;s:5:"UndUr";i:8702;s:5:"Rachi";i:8703;s:11:"BrickGreeLe";i:8704;s:5:"Unreb";i:8705;s:7:"EnwiTew";i:8706;s:13:"EleonHearScha";i:8707;s:4:"PrRe";i:8708;s:8:"SchUnabr";i:8709;s:6:"CoEmMi";i:8710;s:6:"HypeSh";i:8711;s:5:"FuUna";i:8712;s:10:"RabiSanjTr";i:8713;s:13:"ExamiPredUnsh";i:8714;s:12:"InflaNaSchop";i:8715;s:13:"BoldDoliUnpla";i:8716;s:6:"PaUntw";i:8717;s:4:"Tasi";i:8718;s:3:"Cat";i:8719;s:15:"CountMerisSpott";i:8720;s:3:"Sco";i:8721;s:9:"ManPuWhau";i:8722;s:9:"BlocCapri";i:8723;s:9:"BakinLaLi";i:8724;s:9:"ScreStran";i:8725;s:5:"Thick";i:8726;s:10:"DunkPePost";i:8727;s:9:"SkippStim";i:8728;s:4:"Subr";i:8729;s:5:"CaDer";i:8730;s:5:"MarTe";i:8731;s:5:"Terna";i:8732;s:10:"TelThUnver";i:8733;s:6:"NuclPn";i:8734;s:3:"Vim";i:8735;s:4:"Teac";i:8736;s:5:"PaUno";i:8737;s:11:"CompoDiShru";i:8738;s:6:"MonUnr";i:8739;s:6:"SeSwee";i:8740;s:7:"ErgaPol";i:8741;s:11:"EmbOveStrid";i:8742;s:12:"ArsonPrRepud";i:8743;s:9:"PaliProvi";i:8744;s:9:"MopinOxyp";i:8745;s:9:"GobKentUn";i:8746;s:12:"HypeOdontSpi";i:8747;s:12:"ChiRefoUnthr";i:8748;s:7:"PePress";i:8749;s:11:"HiPeriUndep";i:8750;s:12:"LieutSeToywo";i:8751;s:4:"Gunp";i:8752;s:9:"GuSchTele";i:8753;s:9:"DrumMulti";i:8754;s:8:"InflPray";i:8755;s:9:"PrebTubVi";i:8756;s:9:"DeturEnfi";i:8757;s:7:"KishaWe";i:8758;s:12:"MicPapuThala";i:8759;s:5:"Univa";i:8760;s:6:"PruUrx";i:8761;s:5:"Meato";i:8762;s:5:"SiUro";i:8763;s:11:"PterSnarTeb";i:8764;s:9:"MiscoMySy";i:8765;s:10:"ScotcSubVe";i:8766;s:4:"Unwe";i:8767;s:6:"MasPol";i:8768;s:3:"Pra";i:8769;s:5:"SheWe";i:8770;s:12:"NandSeasoWat";i:8771;s:8:"ImpSnake";i:8772;s:9:"HaubeOver";i:8773;s:11:"NaRetroUnma";i:8774;s:7:"SlSombr";i:8775;s:4:"ExTe";i:8776;s:10:"ReducSancy";i:8777;s:6:"CrVent";i:8778;s:5:"Death";i:8779;s:5:"EmTri";i:8780;s:4:"Bric";i:8781;s:5:"Paron";i:8782;s:10:"MyzOmmiaRe";i:8783;s:14:"ChirThereWallo";i:8784;s:10:"ProceUnUnt";i:8785;s:10:"ConSchapSu";i:8786;s:7:"GymPrUn";i:8787;s:7:"PrimiTr";i:8788;s:9:"OitiTraff";i:8789;s:4:"Mini";i:8790;s:10:"RegeStoiZy";i:8791;s:15:"CategInhabResth";i:8792;s:10:"DipEnsHexo";i:8793;s:9:"PlaPsTana";i:8794;s:10:"NontrTiUnd";i:8795;s:7:"CutirMe";i:8796;s:9:"JamdSubtu";i:8797;s:7:"PredoUn";i:8798;s:11:"BenzoHyVoca";i:8799;s:7:"ChDuHus";i:8800;s:12:"TsarUntuVuls";i:8801;s:9:"PrStTrich";i:8802;s:8:"UnbudVer";i:8803;s:6:"SanaUn";i:8804;s:7:"MoScint";i:8805;s:7:"CaDaFac";i:8806;s:8:"AmbCarpo";i:8807;s:10:"KukSipinUn";i:8808;s:7:"SaUnVen";i:8809;s:13:"PentSubbUnthi";i:8810;s:5:"Unbea";i:8811;s:6:"OrgiPe";i:8812;s:7:"ReScSle";i:8813;s:4:"Whis";i:8814;s:11:"DexPalUnher";i:8815;s:4:"Vaga";i:8816;s:4:"Sins";i:8817;s:4:"PhRe";i:8818;s:7:"KatUnsw";i:8819;s:8:"PenSynov";i:8820;s:9:"QuerRxUnl";i:8821;s:3:"Rac";i:8822;s:6:"OstrUb";i:8823;s:7:"GiMoMon";i:8824;s:5:"ReUnb";i:8825;s:5:"Moral";i:8826;s:14:"PhantUrostVajr";i:8827;s:13:"NoncUnfriUnto";i:8828;s:6:"HarPin";i:8829;s:9:"PeSpaTrim";i:8830;s:10:"CollIrToby";i:8831;s:10:"StyTroUnsl";i:8832;s:6:"LuckPh";i:8833;s:5:"Resou";i:8834;s:8:"MatriPap";i:8835;s:4:"Sugg";i:8836;s:3:"Pos";i:8837;s:10:"ReSquamUnh";i:8838;s:8:"HonInves";i:8839;s:6:"ScreSu";i:8840;s:4:"Whel";i:8841;s:5:"InWag";i:8842;s:9:"MembUnfil";i:8843;s:6:"PrUnth";i:8844;s:14:"HierSubnuUnent";i:8845;s:10:"PogRetinUn";i:8846;s:8:"TidedWit";i:8847;s:9:"EphorSnob";i:8848;s:12:"KinetLopeMit";i:8849;s:10:"NoRaspaSub";i:8850;s:11:"AmaMisSarga";i:8851;s:7:"SuThUns";i:8852;s:13:"DefleThreYeme";i:8853;s:3:"Fas";i:8854;s:4:"Viha";i:8855;s:2:"Kh";i:8856;s:10:"GirJudiOxy";i:8857;s:10:"NeurNonPro";i:8858;s:9:"HydroUnco";i:8859;s:5:"Forec";i:8860;s:7:"EmbExub";i:8861;s:5:"Unpho";i:8862;s:13:"AristPreseTra";i:8863;s:8:"PaSyntUn";i:8864;s:7:"HiPledg";i:8865;s:8:"PostUnze";i:8866;s:10:"MallaUngui";i:8867;s:12:"DrOceanUncor";i:8868;s:6:"CalTur";i:8869;s:3:"Vul";i:8870;s:3:"Ult";i:8871;s:8:"RecTitul";i:8872;s:6:"DilaEa";i:8873;s:7:"OnesWhe";i:8874;s:10:"PlSeroTolu";i:8875;s:7:"RecoSoc";i:8876;s:4:"Leuc";i:8877;s:10:"CaninEnPro";i:8878;s:11:"DisStrTrans";i:8879;s:4:"Pani";i:8880;s:6:"PrSten";i:8881;s:4:"Misc";i:8882;s:6:"NoSemi";i:8883;s:13:"GannPodoSlipo";i:8884;s:5:"MyrUn";i:8885;s:5:"Helio";i:8886;s:10:"MonVerniWa";i:8887;s:4:"Gyno";i:8888;s:7:"InnWint";i:8889;s:11:"CeroShoUnav";i:8890;s:8:"PushSiUn";i:8891;s:8:"DioNeSup";i:8892;s:4:"AuTh";i:8893;s:7:"FeHyPyr";i:8894;s:9:"MePamiUnl";i:8895;s:7:"MePikey";i:8896;s:5:"MacUn";i:8897;s:9:"PoleUnexc";i:8898;s:9:"GeocViper";i:8899;s:9:"JointUnUr";i:8900;s:9:"BuCheTigx";i:8901;s:5:"Ochra";i:8902;s:9:"NjaNoStro";i:8903;s:12:"CnemiGrUnreq";i:8904;s:9:"MellRamSc";i:8905;s:11:"InPistoSubr";i:8906;s:6:"ElamKe";i:8907;s:9:"CounDiagr";i:8908;s:8:"CorRevil";i:8909;s:11:"PurSuoUrini";i:8910;s:3:"Sma";i:8911;s:8:"GralHudd";i:8912;s:10:"BurgaGossi";i:8913;s:8:"FimbIdeo";i:8914;s:5:"Viril";i:8915;s:13:"JuverPredeRep";i:8916;s:7:"PhysiUn";i:8917;s:7:"NiTrans";i:8918;s:11:"IsPrickTrol";i:8919;s:7:"GoOment";i:8920;s:9:"TectUnfus";i:8921;s:10:"OvProtUnen";i:8922;s:5:"LeTre";i:8923;s:4:"Vaul";i:8924;s:8:"PhenRecu";i:8925;s:7:"SaTwelv";i:8926;s:5:"Trypt";i:8927;s:5:"Schiz";i:8928;s:6:"FeNonc";i:8929;s:12:"PolarScirSer";i:8930;s:8:"PraseTin";i:8931;s:10:"OfTattlWis";i:8932;s:4:"ShUn";i:8933;s:11:"GiNemeVicar";i:8934;s:7:"FotUnab";i:8935;s:6:"HeMiOr";i:8936;s:13:"FanxLegatUnid";i:8937;s:3:"Med";i:8938;s:14:"EarnScoroSlaye";i:8939;s:7:"GujrSci";i:8940;s:5:"VeViv";i:8941;s:5:"MeaUn";i:8942;s:6:"PtSpor";i:8943;s:6:"MoisSp";i:8944;s:10:"MopinOtViv";i:8945;s:12:"ExognPanoSpo";i:8946;s:7:"HedSuff";i:8947;s:7:"FifteRe";i:8948;s:4:"Sack";i:8949;s:9:"PiRasSerr";i:8950;s:3:"Vam";i:8951;s:11:"EnFlinPertu";i:8952;s:5:"Vexed";i:8953;s:5:"HenSu";i:8954;s:5:"Picad";i:8955;s:10:"CuirReTusc";i:8956;s:11:"PinPreaSeco";i:8957;s:14:"LaddePapaiUrey";i:8958;s:11:"GirlMoPhoen";i:8959;s:5:"Subli";i:8960;s:9:"UnjaVerti";i:8961;s:9:"ReUnUndes";i:8962;s:4:"PsTe";i:8963;s:7:"ParaWhi";i:8964;s:9:"LetxRetou";i:8965;s:9:"PinfeRass";i:8966;s:12:"RacReadStyle";i:8967;s:7:"TriclUn";i:8968;s:7:"SauSpre";i:8969;s:10:"IncoRhyUnc";i:8970;s:9:"HeftiUtra";i:8971;s:10:"ForSeasoUn";i:8972;s:15:"KorunPlateSynus";i:8973;s:10:"ForHappePo";i:8974;s:9:"SeSquZoon";i:8975;s:12:"HypocOriPent";i:8976;s:11:"SheTanUltra";i:8977;s:8:"OctaUpca";i:8978;s:13:"MuzhiPleniTip";i:8979;s:10:"MiscPhoeSa";i:8980;s:4:"Quan";i:8981;s:9:"NariTricl";i:8982;s:6:"InsTro";i:8983;s:13:"CantoPontoSub";i:8984;s:12:"MirReciSavan";i:8985;s:9:"LeNoVivif";i:8986;s:4:"Paid";i:8987;s:9:"OversTagu";i:8988;s:7:"MyVaunt";i:8989;s:8:"OversStr";i:8990;s:8:"ThyUndup";i:8991;s:10:"LaOuthoRou";i:8992;s:4:"Lepi";i:8993;s:12:"NoUnkinUnmut";i:8994;s:5:"Sermo";i:8995;s:5:"StiSt";i:8996;s:4:"Neos";i:8997;s:8:"IsothNon";i:8998;s:8:"SluiWind";i:8999;s:7:"FelicPa";i:9000;s:7:"UndisUn";i:9001;s:8:"NeoSupra";i:9002;s:10:"JaLontaTus";i:9003;s:5:"Outpa";i:9004;s:12:"HeteSubSupra";i:9005;s:5:"Nephe";i:9006;s:9:"LeProSqua";i:9007;s:10:"CountLofti";i:9008;s:12:"DiagSpeciTiw";i:9009;s:4:"Wien";i:9010;s:8:"PhoniSup";i:9011;s:10:"HardePolyo";i:9012;s:7:"RaRecha";i:9013;s:11:"CydGalInobs";i:9014;s:3:"Yah";i:9015;s:8:"SiStTorn";i:9016;s:4:"Anab";i:9017;s:7:"HolaWen";i:9018;s:7:"CaGusSt";i:9019;s:8:"BinPhoPl";i:9020;s:12:"TracUnaffUnc";i:9021;s:12:"GuHeremOvige";i:9022;s:12:"StimyUnVirus";i:9023;s:8:"MultUnfa";i:9024;s:8:"ChoComCo";i:9025;s:8:"ErotPres";i:9026;s:6:"HypSul";i:9027;s:8:"PrSwUnen";i:9028;s:9:"PeThamViv";i:9029;s:9:"ThyrUnder";i:9030;s:10:"PorphPrRiv";i:9031;s:10:"SchooSubju";i:9032;s:5:"SnaUn";i:9033;s:10:"LamasOvers";i:9034;s:7:"HyUnwis";i:9035;s:3:"Rho";i:9036;s:12:"FrigPawnSani";i:9037;s:9:"SnUnUntar";i:9038;s:11:"BundEnigWhe";i:9039;s:9:"PrusRebUn";i:9040;s:10:"CuOverPutt";i:9041;s:6:"EphyNo";i:9042;s:4:"Stap";i:9043;s:5:"PasPo";i:9044;s:5:"EnwGa";i:9045;s:5:"ExtZy";i:9046;s:7:"RoofwSm";i:9047;s:6:"InfMal";i:9048;s:9:"BriDeVale";i:9049;s:7:"PhasSna";i:9050;s:7:"CaExSpr";i:9051;s:8:"ObiRiSla";i:9052;s:8:"ThuUnpre";i:9053;s:6:"PleUri";i:9054;s:7:"FoSemei";i:9055;s:5:"ImpPh";i:9056;s:13:"RootShemuSpec";i:9057;s:5:"KoSem";i:9058;s:11:"MetaNaphPer";i:9059;s:10:"PolReTrans";i:9060;s:7:"MitPres";i:9061;s:7:"NonspOn";i:9062;s:12:"PancPoinUnre";i:9063;s:11:"GerLactTrin";i:9064;s:4:"ObQu";i:9065;s:5:"Saliv";i:9066;s:4:"Symb";i:9067;s:7:"LopSlee";i:9068;s:8:"PropTaip";i:9069;s:12:"LacteMediSwa";i:9070;s:13:"PeacPreteStyl";i:9071;s:6:"RaWorr";i:9072;s:10:"InspiSacro";i:9073;s:11:"CouFactoSmo";i:9074;s:7:"CoelFat";i:9075;s:8:"StagnSym";i:9076;s:5:"SchTr";i:9077;s:4:"Myth";i:9078;s:3:"Pap";i:9079;s:11:"ReSubcThumb";i:9080;s:4:"InWa";i:9081;s:4:"Coen";i:9082;s:6:"RecThy";i:9083;s:10:"KumbiPhPos";i:9084;s:10:"StradVedan";i:9085;s:10:"LiturSubTi";i:9086;s:12:"PediSubaSupp";i:9087;s:3:"Eff";i:9088;s:14:"InterNeogPreab";i:9089;s:6:"CoPrUn";i:9090;s:8:"InPacTro";i:9091;s:5:"AlUnd";i:9092;s:6:"IsoPen";i:9093;s:6:"PyWave";i:9094;s:9:"OculPithi";i:9095;s:9:"RecSithUr";i:9096;s:6:"ReTant";i:9097;s:7:"TheraTr";i:9098;s:9:"ReRespeWh";i:9099;s:6:"DvaTri";i:9100;s:7:"MiVolca";i:9101;s:11:"PaniPelvUne";i:9102;s:12:"CoutDonSpoon";i:9103;s:4:"DaIr";i:9104;s:12:"OvervScUnder";i:9105;s:7:"OuPolys";i:9106;s:13:"GratiPhyTitan";i:9107;s:12:"ScStaliTipma";i:9108;s:11:"RoVeheVelif";i:9109;s:12:"NiccoPostWas";i:9110;s:7:"MendiPr";i:9111;s:9:"MareUnpVe";i:9112;s:6:"OliSal";i:9113;s:6:"AmpOct";i:9114;s:6:"HeToad";i:9115;s:10:"NapOutpWyc";i:9116;s:10:"CaMerchSup";i:9117;s:5:"Telod";i:9118;s:3:"Cyc";i:9119;s:8:"PraepVol";i:9120;s:4:"Syre";i:9121;s:3:"Ble";i:9122;s:6:"FlSubj";i:9123;s:13:"DelMaledUpait";i:9124;s:7:"PopinUn";i:9125;s:9:"DemiEntSe";i:9126;s:12:"FiltRamaRheo";i:9127;s:9:"RacUntWit";i:9128;s:2:"Pf";i:9129;s:5:"FloPi";i:9130;s:14:"ProinSalaWinge";i:9131;s:11:"GodSmashUnl";i:9132;s:14:"MartMicroNeuro";i:9133;s:6:"PaikUn";i:9134;s:4:"ErUs";i:9135;s:6:"UnUnch";i:9136;s:7:"ConUred";i:9137;s:7:"TaysUng";i:9138;s:7:"LacMyxa";i:9139;s:10:"GouSerXylo";i:9140;s:11:"DeIpomeUnre";i:9141;s:11:"HomoJuTatsa";i:9142;s:8:"TetraUnd";i:9143;s:8:"BragPici";i:9144;s:13:"CompDissQuart";i:9145;s:10:"FuNonvStra";i:9146;s:5:"RaRid";i:9147;s:9:"RisTheUnd";i:9148;s:11:"DendrHySand";i:9149;s:8:"ChrJuWor";i:9150;s:10:"CalDemicSn";i:9151;s:5:"UnaUn";i:9152;s:8:"OppPolTu";i:9153;s:4:"PrTr";i:9154;s:8:"NoncoWor";i:9155;s:7:"BookHyp";i:9156;s:12:"BakesCrEpaul";i:9157;s:5:"Tarum";i:9158;s:5:"Helli";i:9159;s:7:"ImpSpon";i:9160;s:5:"Unpri";i:9161;s:13:"OversPasVerst";i:9162;s:7:"CaPaUnr";i:9163;s:10:"LuMonNeckm";i:9164;s:9:"InSerdaSt";i:9165;s:11:"SemicSucVej";i:9166;s:5:"Portu";i:9167;s:5:"Whiti";i:9168;s:8:"PyopSann";i:9169;s:4:"GyMa";i:9170;s:13:"InduInterMega";i:9171;s:5:"Mykis";i:9172;s:4:"Phot";i:9173;s:12:"InamOssuaSca";i:9174;s:12:"SuTweenZoeal";i:9175;s:5:"SqWor";i:9176;s:8:"RepTarge";i:9177;s:7:"OpUntri";i:9178;s:8:"QueeStSw";i:9179;s:8:"DiopThul";i:9180;s:7:"MyitStr";i:9181;s:8:"SemiTrap";i:9182;s:9:"SluStaSty";i:9183;s:5:"Neorn";i:9184;s:5:"Socia";i:9185;s:6:"LameUn";i:9186;s:5:"Weigh";i:9187;s:5:"ByMor";i:9188;s:9:"MinceSaun";i:9189;s:11:"OvUnceUnper";i:9190;s:11:"ForecHaemPh";i:9191;s:10:"IndusLoSpi";i:9192;s:5:"PanSc";i:9193;s:5:"Vomit";i:9194;s:9:"MazucPoly";i:9195;s:8:"JeProVil";i:9196;s:5:"Swith";i:9197;s:4:"Wave";i:9198;s:9:"OrgaTramf";i:9199;s:12:"InsePrelSuwa";i:9200;s:8:"LoggiOve";i:9201;s:13:"PetPleurSolpu";i:9202;s:9:"SclerTrif";i:9203;s:4:"Wrea";i:9204;s:4:"Dysc";i:9205;s:13:"LapidNonThack";i:9206;s:10:"CumKinsmSh";i:9207;s:8:"GaIdeKas";i:9208;s:12:"BrokaGuiltSy";i:9209;s:11:"BrothFaLoca";i:9210;s:10:"LabPlUncon";i:9211;s:7:"EquimMa";i:9212;s:11:"DiHomoPinak";i:9213;s:5:"Holop";i:9214;s:7:"OliOxyt";i:9215;s:6:"GoWenr";i:9216;s:11:"BaCompTerna";i:9217;s:6:"LymMyt";i:9218;s:8:"CountMon";i:9219;s:9:"ShramTack";i:9220;s:10:"PreScToher";i:9221;s:4:"Wool";i:9222;s:6:"HaPeSo";i:9223;s:10:"EnHypeMarq";i:9224;s:9:"NonPaResu";i:9225;s:10:"SupThyUntu";i:9226;s:9:"FetteFoPa";i:9227;s:12:"MayanThrUnte";i:9228;s:7:"PeerlUn";i:9229;s:10:"ChrysFruTi";i:9230;s:8:"OverbVej";i:9231;s:6:"CirCri";i:9232;s:10:"PuinaTabet";i:9233;s:5:"Pulkx";i:9234;s:7:"UnpreUn";i:9235;s:4:"JaRa";i:9236;s:4:"Disa";i:9237;s:11:"ItinOculoOp";i:9238;s:8:"SophTeet";i:9239;s:4:"Text";i:9240;s:12:"PrehPunnRivu";i:9241;s:11:"ImpSupSyner";i:9242;s:10:"DiscoKensp";i:9243;s:4:"Nond";i:9244;s:6:"MariSe";i:9245;s:7:"BalafHa";i:9246;s:8:"PoPreTea";i:9247;s:8:"LuxNapSc";i:9248;s:5:"Bookk";i:9249;s:5:"AspVa";i:9250;s:10:"MonoNoSkew";i:9251;s:11:"BuDirgUnenv";i:9252;s:12:"LumbTrochVir";i:9253;s:5:"Escha";i:9254;s:7:"NarPeti";i:9255;s:9:"ThorUnmas";i:9256;s:13:"CollFarleUnqu";i:9257;s:8:"FerroPol";i:9258;s:6:"ReimSa";i:9259;s:5:"Robus";i:9260;s:10:"DorSpSpong";i:9261;s:9:"SubdSuper";i:9262;s:7:"PhSalic";i:9263;s:9:"PaulRecor";i:9264;s:7:"IliacUn";i:9265;s:8:"ExPeSupe";i:9266;s:10:"ForehIntRo";i:9267;s:12:"CoHeterNoset";i:9268;s:9:"ScumlStan";i:9269;s:5:"Bulbo";i:9270;s:9:"PateQuVis";i:9271;s:11:"FaradGhoMes";i:9272;s:12:"MurraNidOste";i:9273;s:10:"NeyanPinke";i:9274;s:10:"BewilDoOve";i:9275;s:5:"Prefe";i:9276;s:10:"GasManaPhr";i:9277;s:7:"DiGaPho";i:9278;s:5:"Saltw";i:9279;s:12:"HypeLaiLeuca";i:9280;s:13:"CenEgomiReocc";i:9281;s:8:"HeOmiRet";i:9282;s:14:"CottoGaumPrima";i:9283;s:4:"Flec";i:9284;s:9:"PowelToUn";i:9285;s:3:"Net";i:9286;s:4:"MoPi";i:9287;s:7:"DidHowa";i:9288;s:4:"View";i:9289;s:7:"HadLuUn";i:9290;s:6:"ConvIr";i:9291;s:4:"Xyri";i:9292;s:5:"MalPe";i:9293;s:11:"ScSperTetra";i:9294;s:7:"PreSigh";i:9295;s:4:"Suan";i:9296;s:6:"EquSta";i:9297;s:11:"CoptMitSubc";i:9298;s:10:"EuhModifRo";i:9299;s:9:"RepinStab";i:9300;s:9:"SpleUnipo";i:9301;s:5:"PhoPh";i:9302;s:8:"SlTriWha";i:9303;s:4:"HoSp";i:9304;s:5:"Bystr";i:9305;s:14:"NonsuOxycScorb";i:9306;s:11:"LympSkaffWa";i:9307;s:12:"MonosMudProt";i:9308;s:10:"KinMenViro";i:9309;s:3:"Enz";i:9310;s:8:"SupUnfis";i:9311;s:10:"MorpUnUret";i:9312;s:12:"OveRevisUnre";i:9313;s:9:"NoPauldRe";i:9314;s:5:"ObOld";i:9315;s:12:"FlyflPrUphol";i:9316;s:9:"PetrTouri";i:9317;s:5:"Vesti";i:9318;s:4:"Xiph";i:9319;s:11:"FlouSuzThia";i:9320;s:5:"Tzapo";i:9321;s:9:"PercyWate";i:9322;s:7:"PiSeSpa";i:9323;s:9:"BlizzSupe";i:9324;s:10:"MyopProPse";i:9325;s:9:"TotUnUnre";i:9326;s:8:"LepSubTh";i:9327;s:5:"NonRe";i:9328;s:9:"SatScSpon";i:9329;s:5:"FlVir";i:9330;s:6:"GoIgPu";i:9331;s:10:"PuiSuUnive";i:9332;s:5:"DyMye";i:9333;s:9:"CarHuKhok";i:9334;s:7:"OxoniWe";i:9335;s:7:"PaPerXa";i:9336;s:12:"AteloChPheno";i:9337;s:4:"Jagr";i:9338;s:12:"NewTheaUndro";i:9339;s:7:"DisInfe";i:9340;s:6:"HemMas";i:9341;s:6:"KhOcel";i:9342;s:4:"TaTw";i:9343;s:12:"RedawStUngro";i:9344;s:14:"BuffwImmeOctog";i:9345;s:12:"PardoPhReste";i:9346;s:9:"OrnitSynd";i:9347;s:5:"Suspi";i:9348;s:9:"PancaProv";i:9349;s:6:"PhylVi";i:9350;s:4:"HoIn";i:9351;s:8:"CheNonbe";i:9352;s:8:"MicPraUn";i:9353;s:6:"SuUnes";i:9354;s:5:"StiTy";i:9355;s:7:"SlUnska";i:9356;s:4:"VeWh";i:9357;s:6:"LupiPr";i:9358;s:10:"KaRufVoidl";i:9359;s:7:"RaRhina";i:9360;s:8:"FungSubm";i:9361;s:10:"PatmiPerdu";i:9362;s:3:"Tog";i:9363;s:12:"CanCoalSlips";i:9364;s:10:"DrDubioTri";i:9365;s:3:"Spu";i:9366;s:5:"There";i:9367;s:10:"HomeLecWoo";i:9368;s:5:"BloFo";i:9369;s:7:"ParsPho";i:9370;s:13:"BlizCeroQuitr";i:9371;s:4:"Surr";i:9372;s:10:"QuakReorSu";i:9373;s:13:"DressRhySteno";i:9374;s:5:"OveTo";i:9375;s:5:"PnPol";i:9376;s:10:"MicroThecl";i:9377;s:11:"EchelRuScan";i:9378;s:7:"FluorPr";i:9379;s:4:"Some";i:9380;s:4:"Rhyn";i:9381;s:6:"ChEuro";i:9382;s:13:"PrenuRoariTri";i:9383;s:8:"GuiPosse";i:9384;s:10:"EnsInlySer";i:9385;s:9:"EffUnUnsp";i:9386;s:10:"DoHaluTang";i:9387;s:12:"LeNomadRootw";i:9388;s:10:"HorSincStr";i:9389;s:8:"IntKePre";i:9390;s:10:"CastrFubLo";i:9391;s:5:"Theur";i:9392;s:10:"LubOmeReto";i:9393;s:11:"PreSubopUss";i:9394;s:7:"OrOtWai";i:9395;s:7:"GoverIn";i:9396;s:6:"DrHowk";i:9397;s:6:"ExigPo";i:9398;s:5:"Teler";i:9399;s:9:"MarSpUnbr";i:9400;s:5:"Unrec";i:9401;s:6:"MuNeot";i:9402;s:8:"LeSeaSom";i:9403;s:6:"GaJaco";i:9404;s:6:"CoDisp";i:9405;s:6:"OceTub";i:9406;s:7:"StomUnl";i:9407;s:4:"Stea";i:9408;s:8:"PamShore";i:9409;s:8:"PolysSof";i:9410;s:9:"OpporPres";i:9411;s:5:"ConUn";i:9412;s:4:"Imbo";i:9413;s:11:"PoliStTelev";i:9414;s:11:"ChrysHemiRa";i:9415;s:9:"DivPopPse";i:9416;s:6:"PhUnid";i:9417;s:12:"MiniSomThlas";i:9418;s:5:"ShaSo";i:9419;s:8:"SataTryp";i:9420;s:5:"Visce";i:9421;s:4:"Decl";i:9422;s:6:"DiRoga";i:9423;s:5:"Leafl";i:9424;s:8:"BalStagn";i:9425;s:6:"PrefSc";i:9426;s:6:"LithUm";i:9427;s:8:"IntTruss";i:9428;s:7:"ChlamEx";i:9429;s:5:"Shedh";i:9430;s:8:"CoelOvan";i:9431;s:8:"ProUnder";i:9432;s:8:"EmbryUnk";i:9433;s:4:"Pedo";i:9434;s:7:"MurksWi";i:9435;s:9:"PhiliShSl";i:9436;s:5:"SupTa";i:9437;s:10:"DropoHaLou";i:9438;s:8:"BrChylUn";i:9439;s:10:"PrTetUnpre";i:9440;s:8:"PreScowb";i:9441;s:13:"LimiTortZygon";i:9442;s:9:"HansSpiWa";i:9443;s:7:"DiNonUl";i:9444;s:7:"MalUnco";i:9445;s:9:"IncoStave";i:9446;s:4:"Muni";i:9447;s:10:"PsychTurbi";i:9448;s:5:"Nonig";i:9449;s:9:"CorParPos";i:9450;s:7:"GrUrrho";i:9451;s:5:"Priva";i:9452;s:3:"Gue";i:9453;s:5:"TreUn";i:9454;s:8:"GirnyNom";i:9455;s:9:"GeInPavag";i:9456;s:5:"Poeta";i:9457;s:7:"PrerUro";i:9458;s:8:"PalSacch";i:9459;s:9:"CutliSesq";i:9460;s:4:"Sine";i:9461;s:8:"EasPedun";i:9462;s:11:"DotaNonpSic";i:9463;s:13:"CotyStudiTher";i:9464;s:7:"InTripu";i:9465;s:5:"SteUr";i:9466;s:8:"ConvSeab";i:9467;s:3:"Yor";i:9468;s:4:"Prov";i:9469;s:5:"ChiHe";i:9470;s:7:"NePaPre";i:9471;s:5:"Seque";i:9472;s:10:"EmeHaUpswa";i:9473;s:9:"SorceUnde";i:9474;s:11:"StrTacklUnw";i:9475;s:5:"Johan";i:9476;s:7:"PaSpira";i:9477;s:11:"UncaUncoUnd";i:9478;s:5:"CoGor";i:9479;s:8:"BarrMaWi";i:9480;s:4:"TuXy";i:9481;s:6:"MinPro";i:9482;s:6:"MetUnm";i:9483;s:5:"PrWei";i:9484;s:14:"TatoUnbedWovex";i:9485;s:15:"HuronOpeidPetas";i:9486;s:8:"ThesTool";i:9487;s:8:"MalUnbro";i:9488;s:4:"Tars";i:9489;s:7:"DiGrain";i:9490;s:9:"OgOvRiver";i:9491;s:10:"NonclVexer";i:9492;s:4:"Morg";i:9493;s:10:"BushiParTo";i:9494;s:5:"CanWh";i:9495;s:14:"KerriLampMetap";i:9496;s:11:"MayhaUnpWil";i:9497;s:8:"CtenoNin";i:9498;s:10:"CoDisepSta";i:9499;s:5:"Vitri";i:9500;s:5:"Lecit";i:9501;s:12:"HaqPatriSulp";i:9502;s:5:"Loyal";i:9503;s:12:"KeraRuniTene";i:9504;s:3:"Sne";i:9505;s:13:"HemaShadZeall";i:9506;s:5:"Undif";i:9507;s:8:"DisfrSqu";i:9508;s:6:"SeTrip";i:9509;s:14:"EumitNetbrSche";i:9510;s:7:"MoWentl";i:9511;s:11:"OveProfUnme";i:9512;s:9:"DetesMyZi";i:9513;s:4:"Napa";i:9514;s:10:"DeprMetUnt";i:9515;s:12:"InduParUnrec";i:9516;s:10:"PeachUnthe";i:9517;s:5:"PssTu";i:9518;s:5:"DoTom";i:9519;s:5:"Gavia";i:9520;s:8:"DifDumEp";i:9521;s:9:"NonwaShor";i:9522;s:9:"NeStaUnde";i:9523;s:6:"TestUn";i:9524;s:8:"DemZonoc";i:9525;s:6:"InmUnl";i:9526;s:8:"RedUrino";i:9527;s:9:"StenUsurp";i:9528;s:4:"TaZi";i:9529;s:4:"Phys";i:9530;s:12:"HemoIxoSulph";i:9531;s:6:"HoonSh";i:9532;s:8:"RendeVet";i:9533;s:7:"ScrStun";i:9534;s:6:"NonPat";i:9535;s:5:"Rundi";i:9536;s:9:"GyOmTankm";i:9537;s:5:"Ravel";i:9538;s:4:"MeSe";i:9539;s:10:"LiSeymShel";i:9540;s:14:"CeltEnsnaJesti";i:9541;s:3:"Wal";i:9542;s:14:"InwrTressUnsap";i:9543;s:5:"Remen";i:9544;s:8:"DaUndWit";i:9545;s:8:"PhalaRec";i:9546;s:4:"Vicx";i:9547;s:3:"Pel";i:9548;s:4:"MoPo";i:9549;s:5:"Profr";i:9550;s:8:"JustiRed";i:9551;s:5:"IdThr";i:9552;s:5:"ExMet";i:9553;s:5:"Gleno";i:9554;s:13:"IndeParaTerte";i:9555;s:4:"Uniq";i:9556;s:15:"FilipSourhUnhur";i:9557;s:12:"EuhyoRopeUnr";i:9558;s:12:"FervScapuTec";i:9559;s:7:"IrrKisl";i:9560;s:6:"DefNon";i:9561;s:7:"OmniShe";i:9562;s:6:"OidSup";i:9563;s:10:"MetanSpWin";i:9564;s:5:"Torso";i:9565;s:7:"PrRoShi";i:9566;s:9:"OutpRicke";i:9567;s:7:"InWarmu";i:9568;s:9:"EpaPosPro";i:9569;s:11:"CroInviOvof";i:9570;s:5:"DemRa";i:9571;s:5:"Sacka";i:9572;s:4:"SiSy";i:9573;s:4:"Movi";i:9574;s:5:"Neore";i:9575;s:6:"AmWatc";i:9576;s:6:"ScleSm";i:9577;s:11:"BipaFreWalk";i:9578;s:5:"ArtSh";i:9579;s:8:"PaPikRoo";i:9580;s:13:"ImporTodeVari";i:9581;s:5:"Upste";i:9582;s:10:"MesVolWugg";i:9583;s:7:"CharmPa";i:9584;s:12:"PennWashwWur";i:9585;s:7:"UnWeath";i:9586;s:4:"TrUr";i:9587;s:9:"NervResti";i:9588;s:7:"CruSeSp";i:9589;s:7:"NonnaTe";i:9590;s:5:"Uncal";i:9591;s:11:"HyKatciUnin";i:9592;s:5:"Katun";i:9593;s:11:"ThemsUnUnde";i:9594;s:5:"UndVa";i:9595;s:14:"GapyxIliaMesen";i:9596;s:5:"StUnj";i:9597;s:4:"TiUn";i:9598;s:12:"CreatDecUnfa";i:9599;s:8:"DrumxIrr";i:9600;s:12:"HawPennSceno";i:9601;s:7:"InLitPr";i:9602;s:11:"MisbRumpxTh";i:9603;s:12:"ForesIaJamni";i:9604;s:6:"QuaTal";i:9605;s:13:"HenhPerrUnsto";i:9606;s:7:"ShStere";i:9607;s:7:"SterVan";i:9608;s:10:"NeotPlSwar";i:9609;s:5:"UnWac";i:9610;s:10:"BrFrostInd";i:9611;s:8:"BarbNoNu";i:9612;s:9:"FleKnoPho";i:9613;s:8:"MayPaSub";i:9614;s:8:"ScrawUns";i:9615;s:6:"SeThev";i:9616;s:11:"FiresFoWood";i:9617;s:10:"OvigePaSub";i:9618;s:13:"HolidIntelLuc";i:9619;s:13:"MonotOximaSen";i:9620;s:14:"GangSawhoWoman";i:9621;s:10:"HoImpTepeh";i:9622;s:5:"ImpMe";i:9623;s:8:"LuvaSpee";i:9624;s:9:"DeFolGoye";i:9625;s:12:"EboniMoXiphi";i:9626;s:5:"Milts";i:9627;s:5:"QuSte";i:9628;s:10:"QuisShepSu";i:9629;s:7:"ScatoSp";i:9630;s:9:"RadiSigge";i:9631;s:9:"LollRampa";i:9632;s:10:"JuluRehTri";i:9633;s:8:"CeliObPa";i:9634;s:3:"Scl";i:9635;s:6:"PhoPro";i:9636;s:7:"IrUnWhi";i:9637;s:4:"Whee";i:9638;s:12:"HepOutgrPost";i:9639;s:5:"TacWa";i:9640;s:9:"DulaPleas";i:9641;s:10:"PrPunkeTet";i:9642;s:5:"Presu";i:9643;s:7:"ReSepte";i:9644;s:11:"MicMorphRet";i:9645;s:6:"IcTurn";i:9646;s:7:"CoSlumb";i:9647;s:3:"Kho";i:9648;s:9:"MajPosSti";i:9649;s:6:"OveTyr";i:9650;s:9:"JuraUnali";i:9651;s:10:"HeterUpbur";i:9652;s:4:"Invo";i:9653;s:7:"ChaRuma";i:9654;s:5:"Otoco";i:9655;s:10:"FoHouUnrab";i:9656;s:7:"FumaRom";i:9657;s:10:"BriOnaxUnj";i:9658;s:7:"QuSecUn";i:9659;s:11:"IodaNaumUnc";i:9660;s:9:"PoRiTonsu";i:9661;s:9:"BridHespe";i:9662;s:7:"HeliSup";i:9663;s:11:"LefPoroReso";i:9664;s:5:"NinUn";i:9665;s:14:"LitasPrebPresb";i:9666;s:6:"SaUnUn";i:9667;s:10:"GrHidPsych";i:9668;s:9:"PreceRaRo";i:9669;s:13:"OverPittSadrx";i:9670;s:5:"Ignif";i:9671;s:8:"LighUnsa";i:9672;s:9:"OvUnYeast";i:9673;s:7:"DumFiMi";i:9674;s:4:"Scou";i:9675;s:7:"SexteWr";i:9676;s:5:"HieNo";i:9677;s:6:"CaMala";i:9678;s:4:"StUn";i:9679;s:6:"GrotUn";i:9680;s:5:"InSpi";i:9681;s:10:"PolycShama";i:9682;s:12:"ConEncepRest";i:9683;s:5:"PlaSm";i:9684;s:5:"Blatt";i:9685;s:14:"BilipCensuCont";i:9686;s:7:"DiscOve";i:9687;s:8:"InsLeaUn";i:9688;s:2:"Id";i:9689;s:6:"ShSqui";i:9690;s:10:"StatuTaxed";i:9691;s:7:"StUnale";i:9692;s:7:"PyVampi";i:9693;s:12:"PsyTranqUnco";i:9694;s:4:"Mise";i:9695;s:4:"Wayw";i:9696;s:7:"FleLoSp";i:9697;s:10:"InLixOvert";i:9698;s:9:"IsfahOrPu";i:9699;s:11:"BeniCacoUlt";i:9700;s:8:"FleTarra";i:9701;s:4:"DiOp";i:9702;s:4:"HyPo";i:9703;s:13:"NaumaOveRolle";i:9704;s:10:"TeartUncon";i:9705;s:5:"CirDa";i:9706;s:13:"ImploNondTurb";i:9707;s:10:"DyaSexTric";i:9708;s:10:"GaImpWeapo";i:9709;s:4:"Myas";i:9710;s:11:"OpSpadVolse";i:9711;s:5:"Olent";i:9712;s:11:"BiopLaevoSn";i:9713;s:8:"TagalWai";i:9714;s:8:"HeOxyVal";i:9715;s:4:"Infr";i:9716;s:9:"MicrUmbel";i:9717;s:9:"FaNeedlPe";i:9718;s:11:"LysisPseuUn";i:9719;s:10:"CadChroSib";i:9720;s:12:"GooSyncaTuft";i:9721;s:10:"QuaShodeUn";i:9722;s:5:"OveSt";i:9723;s:4:"Perl";i:9724;s:4:"HuPo";i:9725;s:13:"IntoParaSedim";i:9726;s:5:"Carce";i:9727;s:9:"KlMegaPyr";i:9728;s:12:"OrthSeeaWind";i:9729;s:9:"InsulRhin";i:9730;s:6:"MicRis";i:9731;s:15:"IsaacMediaUnmed";i:9732;s:8:"DeStSwim";i:9733;s:14:"KadayPhospPrea";i:9734;s:10:"MesaPrProb";i:9735;s:11:"PediPrPromo";i:9736;s:4:"Dawt";i:9737;s:11:"NariOrThean";i:9738;s:4:"Word";i:9739;s:10:"ExcitPassu";i:9740;s:7:"HoPoPre";i:9741;s:5:"Sampl";i:9742;s:9:"LePhilaUn";i:9743;s:8:"MalebOve";i:9744;s:9:"BoyaTrigi";i:9745;s:8:"DaDiGuai";i:9746;s:9:"DeerhLiQu";i:9747;s:9:"EpicSquee";i:9748;s:6:"PiSupp";i:9749;s:6:"SenSub";i:9750;s:9:"RemuSubba";i:9751;s:12:"HighlSophiSu";i:9752;s:9:"OptimSpor";i:9753;s:4:"Sech";i:9754;s:9:"AmCartCys";i:9755;s:9:"MushmOsPa";i:9756;s:5:"Decon";i:9757;s:4:"Sexh";i:9758;s:10:"ResisSaThu";i:9759;s:3:"Zec";i:9760;s:4:"Vill";i:9761;s:3:"Pod";i:9762;s:9:"OweSisWai";i:9763;s:11:"EmWassaWeig";i:9764;s:9:"HaPostTub";i:9765;s:4:"Stel";i:9766;s:8:"PePrScru";i:9767;s:6:"GastPr";i:9768;s:10:"TeretTrich";i:9769;s:7:"ResiSpu";i:9770;s:3:"Gre";i:9771;s:14:"CunjOversPneum";i:9772;s:8:"OdOzoUmi";i:9773;s:10:"ConfuCover";i:9774;s:9:"PaSubuUnb";i:9775;s:3:"Och";i:9776;s:6:"OvPorc";i:9777;s:11:"ReweSubvWin";i:9778;s:7:"FouUnfo";i:9779;s:12:"FluMicrRecre";i:9780;s:14:"RecruUnivUnspr";i:9781;s:10:"UnsavUnsea";i:9782;s:9:"HormoPiSe";i:9783;s:8:"SpheTwis";i:9784;s:5:"Thema";i:9785;s:13:"DidelTailUnwh";i:9786;s:5:"Marsi";i:9787;s:14:"InfrPleurPurre";i:9788;s:12:"MekomPreSync";i:9789;s:8:"EartNota";i:9790;s:6:"SoddWa";i:9791;s:3:"Obv";i:9792;s:14:"MarmNaphtPunis";i:9793;s:9:"PhillTaut";i:9794;s:12:"InomaNaPremi";i:9795;s:6:"PagaSa";i:9796;s:9:"LoMidleRe";i:9797;s:14:"MonotPsalTetar";i:9798;s:3:"Mum";i:9799;s:13:"PopuTheorWone";i:9800;s:5:"Worth";i:9801;s:6:"SkWhiz";i:9802;s:8:"DemEroHo";i:9803;s:5:"Soili";i:9804;s:7:"StoutTa";i:9805;s:11:"InteManShaf";i:9806;s:11:"DeyxSpTouri";i:9807;s:7:"GlagLac";i:9808;s:8:"RedaSauc";i:9809;s:11:"PseuTintiTo";i:9810;s:7:"NoachOa";i:9811;s:11:"HyPacinSnor";i:9812;s:4:"Ghee";i:9813;s:5:"Shive";i:9814;s:3:"Urv";i:9815;s:15:"SupraUnaptUnhis";i:9816;s:11:"BullwCrUnge";i:9817;s:11:"GuitaPredVa";i:9818;s:5:"Tarqu";i:9819;s:10:"InsecQuaTh";i:9820;s:11:"EnOverTrans";i:9821;s:11:"DelPeloPeti";i:9822;s:7:"DiFicLo";i:9823;s:4:"FoMa";i:9824;s:11:"InexObjPara";i:9825;s:5:"Stere";i:9826;s:7:"LaiSail";i:9827;s:10:"PrRiddScir";i:9828;s:7:"UnVinat";i:9829;s:7:"OvPileo";i:9830;s:7:"BliCuTr";i:9831;s:12:"ArchsHormoTo";i:9832;s:7:"ForMaTh";i:9833;s:5:"ConDi";i:9834;s:7:"HabblSy";i:9835;s:11:"BioSetulTra";i:9836;s:5:"Twigl";i:9837;s:12:"DarnHesteMed";i:9838;s:9:"ElFrShagb";i:9839;s:9:"DeSticUnc";i:9840;s:5:"Repug";i:9841;s:12:"PamSacroValo";i:9842;s:10:"ThrasUnmod";i:9843;s:6:"DidEco";i:9844;s:11:"AntiDolefRh";i:9845;s:8:"EucomSer";i:9846;s:6:"OxyhPo";i:9847;s:10:"MononPulmo";i:9848;s:4:"Urba";i:9849;s:11:"HolPhoUnshi";i:9850;s:11:"TiamUnguaUn";i:9851;s:6:"EnRoUn";i:9852;s:5:"Semia";i:9853;s:9:"DisbPyrTe";i:9854;s:4:"Geob";i:9855;s:8:"BeInSupe";i:9856;s:8:"DepreNon";i:9857;s:7:"PoWhoms";i:9858;s:4:"Pori";i:9859;s:12:"MisprPhUnarg";i:9860;s:3:"Oxy";i:9861;s:12:"CephaMaPanti";i:9862;s:9:"HyotPhala";i:9863;s:12:"InexUntVoidl";i:9864;s:13:"HendePolysVan";i:9865;s:11:"FusilInTast";i:9866;s:6:"UngUnv";i:9867;s:13:"CaleInterMors";i:9868;s:5:"HeTri";i:9869;s:8:"ElHaPrer";i:9870;s:9:"EcoUnUnwa";i:9871;s:10:"RefinRhTub";i:9872;s:6:"MallPl";i:9873;s:5:"Overm";i:9874;s:14:"EntraProfSynge";i:9875;s:8:"MonUnemb";i:9876;s:4:"Osci";i:9877;s:8:"SwoThink";i:9878;s:14:"OsiaOveriWimpl";i:9879;s:7:"BuHinny";i:9880;s:7:"SulUpgr";i:9881;s:5:"PlSma";i:9882;s:8:"SacchSir";i:9883;s:9:"GristRift";i:9884;s:8:"UncUppar";i:9885;s:10:"SnSubUntho";i:9886;s:4:"Loaf";i:9887;s:13:"PyrocSteekTax";i:9888;s:3:"Zac";i:9889;s:10:"OyeUnVioli";i:9890;s:12:"GimMyeliPyro";i:9891;s:10:"RhodSeliTe";i:9892;s:12:"FisUnadUnsub";i:9893;s:8:"WudgXant";i:9894;s:10:"NoOinPyrop";i:9895;s:6:"ExItal";i:9896;s:5:"Totty";i:9897;s:5:"Octam";i:9898;s:11:"OverReticUl";i:9899;s:9:"ElabrFenc";i:9900;s:13:"EnantUnnUnoxi";i:9901;s:5:"PeSyr";i:9902;s:9:"EtymPhoto";i:9903;s:5:"LilMi";i:9904;s:12:"GlypMedUnfet";i:9905;s:8:"LiaThrWi";i:9906;s:10:"OrShoaThur";i:9907;s:8:"UnthUpru";i:9908;s:7:"LepNihi";i:9909;s:12:"FiliMesoUpst";i:9910;s:9:"PetaTenni";i:9911;s:5:"PedRe";i:9912;s:12:"ColoProfTher";i:9913;s:10:"KatabOvSyr";i:9914;s:5:"Cequi";i:9915;s:7:"DisDiEn";i:9916;s:9:"DorMyzoWi";i:9917;s:8:"NiphaPol";i:9918;s:4:"BiCo";i:9919;s:12:"CompPolypUls";i:9920;s:8:"HeaveStr";i:9921;s:5:"MaMos";i:9922;s:13:"EudoMacarSore";i:9923;s:4:"OlVa";i:9924;s:4:"Cosw";i:9925;s:11:"MalOverdSub";i:9926;s:10:"DiKilUnder";i:9927;s:4:"MaPe";i:9928;s:10:"MetrPeProm";i:9929;s:6:"TekUnd";i:9930;s:7:"PlotiSu";i:9931;s:11:"PaPetalTrac";i:9932;s:11:"MoneyUndUnv";i:9933;s:7:"InsurYo";i:9934;s:11:"FoosMicTact";i:9935;s:7:"OlOther";i:9936;s:7:"MonMyOn";i:9937;s:11:"EmexPySymbo";i:9938;s:11:"HypaxSpiTar";i:9939;s:8:"AntUmbVi";i:9940;s:7:"OcclSqu";i:9941;s:8:"ExaPlush";i:9942;s:12:"PreSuccuVerv";i:9943;s:3:"Tre";i:9944;s:5:"MerTo";i:9945;s:11:"GlossSeptSo";i:9946;s:4:"Magn";i:9947;s:13:"QuintSourwThu";i:9948;s:5:"Kinet";i:9949;s:4:"NoUn";i:9950;s:4:"MaUn";i:9951;s:12:"MatriSpirSwe";i:9952;s:8:"OnlooUnl";i:9953;s:13:"MorwoSubarUne";i:9954;s:4:"Impo";i:9955;s:4:"Phac";i:9956;s:8:"DeprePri";i:9957;s:10:"CatLakarPr";i:9958;s:14:"GuttLophoMildr";i:9959;s:12:"OnychSmeUnwe";i:9960;s:5:"GroWo";i:9961;s:8:"LiRadTru";i:9962;s:13:"IncomTitVidui";i:9963;s:12:"ImpMerePrein";i:9964;s:7:"MaProto";i:9965;s:12:"RamusShrTibi";i:9966;s:11:"BurwFalciSn";i:9967;s:5:"RodTh";i:9968;s:8:"DoxaOlch";i:9969;s:4:"Tere";i:9970;s:4:"DiPo";i:9971;s:8:"DenucLit";i:9972;s:11:"CountInKusk";i:9973;s:5:"HeKok";i:9974;s:5:"PrSta";i:9975;s:7:"PhrenPr";i:9976;s:8:"MyoneNet";i:9977;s:14:"GeasMisfeRepre";i:9978;s:13:"OphidProveSub";i:9979;s:11:"PolProrSien";i:9980;s:5:"Grudg";i:9981;s:10:"LiReglUnde";i:9982;s:7:"DiMyoSu";i:9983;s:7:"SymTyVu";i:9984;s:11:"FiguHebSpon";i:9985;s:8:"CeDoTele";i:9986;s:10:"OkiTipTyig";i:9987;s:9:"PySphTetr";i:9988;s:3:"Pep";i:9989;s:11:"PiuUncUnson";i:9990;s:9:"OchiPrWor";i:9991;s:8:"RequiRyn";i:9992;s:13:"JimbeReceRegi";i:9993;s:4:"HeMe";i:9994;s:5:"Toffy";i:9995;s:7:"EriodSu";i:9996;s:9:"UnexViola";i:9997;s:11:"OrgaUnUnhos";i:9998;s:3:"Dav";i:9999;s:6:"HydRev";} \ No newline at end of file diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testLazyJsonMapper.php b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testLazyJsonMapper.php new file mode 100755 index 0000000..f47480d --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testLazyJsonMapper.php @@ -0,0 +1,1897 @@ += 0; + +$json = << 'int', + 'just_a_string' => 'float[]', + 'test_pure_lazymapper_object' => '\LazyJsonMapper\LazyJsonMapper', + // test the shortcut to avoid having to write the whole path: + 'test_pure_lazymapper_object_shortcut' => 'LazyJsonMapper', + 'test_pure_lazymapper_object_shortarr' => 'LazyJsonMapper[][]', + // test without strict case-sensitive checking: (MUST fail) + // 'test_pure_lazymapper_object_shortcut' => 'lazyJsonMapper', + ]; +} +// var_dump(new TestDeep()); // look at the LazyJsonMapper shortcut success +class TestMid extends TestDeep +{ +} + +class Test extends TestMid +{ + const JSON_PROPERTY_MAP = [ + 'just_a_string' => 'string', + 'camelCaseProp' => 'int', + // full namespace path, with case-sensitivity typos on purpose (php + // allows it, but LazyJsonMapper compiles this to the proper name + // instead so that we have strict names internally): + 'self_object' => '\foo\Test', + 'string_array' => 'string[]', + // relative notation instead of full "\namespace\path": + // when relative mode is used, it looks in the defining class' own namespace. + 'self_array' => 'Test[]', + ]; +} + +$jsonData = json_decode($json, true, 512, JSON_BIGINT_AS_STRING); + +var_dump($jsonData); + +$x = new Test($jsonData, true); + +// begin with basic tests... +var_dump($x); +$sub = $x->getSelfObject(); +$sub->setJustAString('modifying nested object and propagating the change to root object $x'); +var_dump($sub); +var_dump($x->getSelfObject()); +var_dump($x); +$multi = $x->getSelfArray(); // resolves all objects in array, but avoids doing + // it recursively. sub-properties are lazy-converted + // when they are actually requested. +var_dump($multi); // array of objects, with no resolved sub-objects yet +var_dump($x); // now has array of objects +$deepsub = $multi[1]->getSelfObject(); // causes nested sub to be resolved +var_dump($multi); +var_dump($x); +$deepsub->setJustAString('wow, propagating change of very deep object!'); +var_dump($multi); +var_dump($x); +var_dump($x->getCamelCaseProp()); +var_dump($x->getJustAString()); +var_dump($x->isJustAString()); +var_dump($x->getJustAString()); +var_dump($x); +var_dump($x->getSelfObject()); +var_dump($x->getSelfObject()->getJustAString()); +var_dump($x->self_object->just_a_string); +var_dump($x->getStringArray()); +var_dump($x->getSelfArray()); + +try { + echo $x->a_missing_property_not_in_data_or_def; +} catch (LazyJsonMapperException $e) { + printf("Test missing property via property access Exception: %s\n", $e->getMessage()); +} + +try { + $x->getAMissingPropertyNotInDataOrDef(); +} catch (LazyJsonMapperException $e) { + printf("Test missing property via magic getter Exception: %s\n", $e->getMessage()); +} + +$x = new Test($jsonData, true); +var_dump($x); // no data is resolved yet +// test deeply nested chain of getters and setters. +$x->getSelfArray()[1]->getSelfObject()->setJustAString('chained command for deep modification')->setCamelCaseProp(9944); +var_dump($x); // chain has been resolved and change has propagated +var_dump($x->getSelfArray()[1]->getSelfObject()->getCamelCaseProp()); // int(9944) + +class SubClassOfTest extends Test +{ +} +$foo = new SubClassOfTest(); // Test acceptance of subclasses of required class. +$x->setSelfObject($foo); +var_dump($x->getSelfObject()); +var_dump($x->getSelfObject()->getJustAString()); + +try { + $x->setSelfObject('x'); // trying to set non-object value for object property +} catch (LazyJsonMapperException $e) { + printf("Test non-object assignment Exception: %s\n", $e->getMessage()); +} + +class Bleh +{ +} + +try { + $x->setSelfObject(new Bleh()); // trying wrong class for property +} catch (LazyJsonMapperException $e) { + printf("Test wrong object assignment Exception: %s\n", $e->getMessage()); +} + +$foo = new Test(['just_a_string' => 'example']); +$x->setSelfObject($foo); +var_dump($x->getSelfObject()); +var_dump($x->getSelfObject()->getJustAString()); +$x->printJson(); +var_dump($x->just_a_string); +var_dump(isset($x->just_a_string)); +unset($x->just_a_string); +var_dump($x->just_a_string); +var_dump(isset($x->just_a_string)); +unset($x->self_array); +unset($x->camelCaseProp); +$x->printJson(); + +var_dump('---------------------'); + +// test creation of objects from empty object-arrays "{}" in JSON +class EmptyObjTest extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'self' => '\foo\EmptyObjTest', + ]; +} +$x = new EmptyObjTest(json_decode('{"self":null}', true)); // allow null object +var_dump($x->getSelf()); +// NOTE: the empty-array test is because empty arrays are indistinguishable from +// objects when decoded from JSON. but if it had been an actual JSON array +// (which is always non-associative), then we detect that it's non-object data. +$x = new EmptyObjTest(json_decode('{"self":{}}', true)); // allow empty object +var_dump($x->getSelf()); +$x = new EmptyObjTest(json_decode('{"self":[]}', true)); // allow empty array +var_dump($x->getSelf()); +$x = new EmptyObjTest(json_decode('{"self":[1,2]}', true)); // forbid non-object +try { + var_dump($x->getSelf()); +} catch (\Exception $e) { + printf("Test converting invalid regular JSON array to object Exception: %s\n", $e->getMessage()); +} + +var_dump('---------------------'); + +class TestUndefinedProps extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'self' => '\foo\TestUndefinedProps', + 'selfArray' => '\foo\TestUndefinedProps[]', + 'foo_bar' => 'int[][]', + 'property' => 'string', + ]; +} + +$json = <<getMessage()); +} + +// now create the class without analysis enabled... which enables regular +// operation where the user can access the undefined properties too. +$y = new TestUndefinedProps($data, false); +var_dump($y); // look at the internal data and the compiled class map + +// now verify what the exported property map says. +// the only defined properties are foo_bar, self, selfArray and property. +// the undefined ones are missing_property and another_missing. +$allowRelativeTypes = true; +$includeUndefined = true; +$descriptions = $y->exportPropertyDescriptions($allowRelativeTypes, $includeUndefined); +var_dump($descriptions); +foreach ($descriptions as $property) { + printf("* Property: '%s'. Defined: %s\n", $property->name, + $property->is_defined ? 'Yes!' : 'No.'); +} + +// Now just test the automatic printing function too... +$showFunctions = true; +$y->printPropertyDescriptions($showFunctions, $allowRelativeTypes, $includeUndefined); +$showFunctions = true; +$allowRelativeTypes = false; +$includeUndefined = false; +$y->printPropertyDescriptions($showFunctions, $allowRelativeTypes, $includeUndefined); +$showFunctions = false; +$y->printPropertyDescriptions($showFunctions, $allowRelativeTypes, $includeUndefined); + +// And test it on the main class too: +$y = new Test(); +$y->printPropertyDescriptions(); +$y->printPropertyDescriptions(false, true); // without functions, with relative + +var_dump('---------------------'); + +// Test the hasX() functions, which are useful when verifying that non-defined +// (not in class definition) fields exist in data before trying to read, to +// avoid causing any exceptions in the getter. +$x = new Test($data); +var_dump($x->hasReallyMissing()); // false, since it's not in class def or data. +var_dump($x->hasAnotherMissing()); // true, since it's in data (but not in class def) +var_dump($x->hasJustAString()); // true, since it's in class def (but not in data) +var_dump($x->getJustAString()); // null, since it's not in data (but is in class def) +try { + $x->getReallyMissing(); // exception, since it's not in class def or data. + // var_dump($x->really_missing); // also exception, "no such object property". +} catch (LazyJsonMapperException $e) { + printf("Test getReallyMissing() Exception: %s\n", $e->getMessage()); +} + +try { + $x->setReallyMissing('a'); // exception, since it's not in class def or data. + // $x->really_missing = 'a'; // also exception, "no such object property". +} catch (LazyJsonMapperException $e) { + printf("Test setReallyMissing() Exception: %s\n", $e->getMessage()); +} +// intended usage by end-users when accessing undefined values: +if ($x->hasReallyMissing()) { + // this won't run, since ReallyMissing didn't exist. but if it HAD existed + // in the JSON data, this function call would now be safe without exceptions: + var_dump($x->getReallyMissing()); +} else { + var_dump('not running getReallyMissing() since the property is missing'); +} + +var_dump('---------------------'); + +class TestNotSubClass extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'not_subclass' => '\foo\NotSubClass', + ]; +} +class NotSubClass +{ +} // Not instance of LazyJsonMapper + +$json = <<getNotSubclass(); +} catch (LazyJsonMapperException $e) { + printf("TestNotSubClass Exception: %s\n", $e->getMessage()); +} + +var_dump('---------------------'); + +class TestMissingClass extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'a_missing_class' => '\foo\Missing', + ]; +} + +$json = <<getMessage()); +} + +var_dump('---------------------'); + +class TestMissingPropAndMissingClass extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'a_missing_class' => '\foo\Missing', + ]; +} + +$json = <<getMessage()); +} + +var_dump('---------------------'); + +// this test checks two things: +// definitions that do not match the data. +// properties whose classes cannot be constructed (due to custom _init() fail). +class TestUnmappableAndFailConstructor extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'bad_definition' => 'int[][][]', // too deep arrays for the data + // this one will not be able to construct during the getting of this property... + 'impossible_constructor' => '\foo\WithBadConstructor', + ]; +} + +class WithBadConstructor extends LazyJsonMapper +{ + protected function _init() + { + // Uncomment this other exception to test the "Invalid exception thrown + // by _init(). Must use LazyUserException." error when users throw the + // wrong exception: + // throw new \Exception('test'); + + throw new \LazyJsonMapper\Exception\LazyUserException('Hello world! Thrown by a failing constructor.'); + } +} + +$json = <<getMessage()); +} + +var_dump('---------------------'); + +class TestImpossibleSubPropertyCompile extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + // this one links to a class that exists but isn't compiled yet and + // therefore must be sub-compiled. but that particular one actually + // failed its own compilation earlier (above) - because the + // "TestMissingClass" class CANNOT be compiled... so OUR map compilation + // HERE will succeed (it points at TestMissingClass which is a + // LazyJsonMapper class which exists), but then WE will fail with a + // sub-property class error when we try to ALSO compile OUR property's + // uncompiled class ("TestMissingClass") at the end of its own + // compilation process. + 'impossible_subcompilation' => '\foo\TestMissingClass', + ]; +} + +try { + $x = new TestImpossibleSubPropertyCompile(); +} catch (\Exception $e) { + printf("Test impossible sub-property class compilation: %s\n", $e->getMessage()); +} + +var_dump('---------------------'); + +// this test is very similar to the previous test, but it ensures that the +// validation works for deep hierarchies too, of classes with properties that +// refer to classes with properties that refer to classes that refer to +// uncompilable classes. +class TopFailChainClass extends LazyJsonMapper +{ + // successfully compiles since MiddleFailChainClass exists and is based on LazyJsonMapper + const JSON_PROPERTY_MAP = [ + 'middle_fail_chain_class' => '\Foo\MiddleFailChainClass', + ]; +} + +class MiddleFailChainClass extends LazyJsonMapper +{ + // successfully compiles since DeepFailChainBadClass exists and is based on LazyJsonMapper + const JSON_PROPERTY_MAP = [ + 'deep_fail_chain_class' => '\Foo\DeepFailChainBadClass', + ]; +} + +class DeepFailChainBadClass extends LazyJsonMapper +{ + // this map will fail to compile, which should stop the compilation of + // whichever class began the compilation process that pointed at us... + const JSON_PROPERTY_MAP = [ + 'not_a_valid_class' => '/What/ever/...', + ]; +} + +// try starting the compilation with each of the 3 classes: +// it doesn't matter which one we start with, since the compiler cache will +// notice the failures in them all and will auto-rollback their compilations. +// which means that the other classes won't incorrectly see anything in the +// cache. so each attempt to create any of these classes will be as if it was +// the first-ever call for compiling the classes in its hierarchy. + +try { + // fails immediately since this class map cannot be compiled + $x = new DeepFailChainBadClass(); +} catch (\Exception $e) { + printf("Test compiling DeepFailChainBadClass Exception: %s\n", $e->getMessage()); +} + +try { + // succeeds at compiling its own map, but then fails when trying to compile + // the property classes (DeepFailChainBadClass) it found in the hierarchy. + $x = new MiddleFailChainClass(); +} catch (\Exception $e) { + printf("Test compiling MiddleFailChainClass Exception: %s\n", $e->getMessage()); +} + +try { + // succeeds at compiling its own map, then looks at its properties and + // succeeds at compiling MiddleFailChainClass, and then looks at that one's + // properties and fails at compiling the DeepFailChainBadClass it refers to. + $x = new TopFailChainClass(); +} catch (\Exception $e) { + printf("Test compiling TopFailChainClass Exception: %s\n", $e->getMessage()); +} + +var_dump('---------------------'); + +class TestNullValue extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'this_is_null' => '\foo\TestNullValue', + ]; +} + +$json = <<getThisIsNull()); +} catch (LazyJsonMapperException $e) { + printf("TestNullValue Exception: %s\n", $e->getMessage()); +} + +var_dump('---------------------'); + +class TestNoCastValue extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'no_cast1' => '', + 'no_cast2' => 'mixed', // same as '' + 'no_cast3' => '', + ]; +} + +$json = <<getNoCast1()); + var_dump($x->getNoCast2()); + var_dump($x->getNoCast3()); + $x->setNoCast1('should succeed without type-forcing'); + var_dump($x->getNoCast1()); +} catch (LazyJsonMapperException $e) { + printf("TestNoCastValue Exception: %s\n", $e->getMessage()); +} + +var_dump('---------------------'); + +class TestDepth extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'array_of_arrays_of_arrays_of_int' => 'int[][][]', + ]; +} +$x = new TestDepth([]); // Init with no data. +try { + $x->setArrayOfArraysOfArraysOfInt([[new Test()]]); +} catch (LazyJsonMapperException $e) { + printf("Test non-array value at depth 2 of 3 Exception: %s\n", $e->getMessage()); +} + +try { + $x->setArrayOfArraysOfArraysOfInt([[[new Test()]]]); +} catch (LazyJsonMapperException $e) { + printf("Test invalid value at depth 3 of 3 Exception: %s\n", $e->getMessage()); +} + +try { + $x->setArrayOfArraysOfArraysOfInt([[[[]]]]); +} catch (LazyJsonMapperException $e) { + printf("Test invalid array-value at depth 3 of 3 Exception: %s\n", $e->getMessage()); +} +$x->setArrayOfArraysOfArraysOfInt([[[1, '456', 100, 5.5]], [], null, [[20]]]); +var_dump($x); // 1, 456, 100, 5, 20 + +var_dump('---------------------'); + +// test working with raw properties not defined in the class property map. +class UndefinedPropertyAccess extends LazyJsonMapper +{ +} +$json = '{"some_undefined_prop":null}'; +$data = json_decode($json, true, 512, JSON_BIGINT_AS_STRING); + +try { + // if we run with VALIDATION (TRUE), this will throw an exception + // since the data's "some_undefined_prop" is not in the class property map. + // NOTE: We already did this test as TestUndefinedProps earlier... + $x = new UndefinedPropertyAccess($data, true); +} catch (\Exception $e) { + printf("Test creating class instance with validation detecting undefined properties Exception: %s\n", $e->getMessage()); +} + +$x = new UndefinedPropertyAccess($data); +var_dump($x); +var_dump($x->hasSomeUndefinedProp()); // true +var_dump($x->isSomeUndefinedProp()); // false (the null evaluates to false) +var_dump($x->getSomeUndefinedProp()); // null +$x->setSomeUndefinedProp(['no data validation since it is undefined']); +var_dump($x->isSomeUndefinedProp()); // true (the array evaluates to true) +var_dump($x->getSomeUndefinedProp()); // array with a string in it +$x->setSomeUndefinedProp('xyz'); +var_dump($x->hasSomeUndefinedProp()); // true +var_dump($x->getSomeUndefinedProp()); // "xyz" +var_dump($x->isSomeUndefinedProp()); // true (the string evaluates to true) +$x->setSomeUndefinedProp(null); +var_dump($x->hasSomeUndefinedProp()); // true +var_dump($x->getSomeUndefinedProp()); // null + +var_dump('---------------------'); + +// test of advanced multi-class inheritance: +// OurTree* is a set of classes inheriting (extending) each other. +// Unrelated* are two other classes extending each other. +// FarClass is a single class without any other parents except LazyJsonMapper. +// +// OurTreeThree compiles its own inherited hierarchy, which then imports +// UnrelatedTwo, which compiles its own hierarchy, which then finally imports +// FarClass. The result is a final, compiled map which includes all classes. +// +// (and as noted in the main source code, memory cost of inheritance is 0 since +// all classes inherit each other's PropertyDefinition objects; the only cost is +// the amount of RAM it takes for an array["key"] to link to the borrowed object) +class FarClass extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'farclass' => '\Foo\FarClass', + ]; +} +class UnrelatedOne extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + FarClass::class, + 'unrelated_one' => 'int', + ]; +} +class UnrelatedTwo extends UnrelatedOne +{ + const JSON_PROPERTY_MAP = [ + 'unrelated_two' => 'float', + 'conflicting_prop1' => '\Foo\UnrelatedOne', + 'conflicting_prop2' => '\Foo\UnrelatedOne', + ]; +} +class OurTreeOne extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'ourtree_one' => 'string', + ]; +} +class OurTreeTwo extends OurTreeOne +{ + const JSON_PROPERTY_MAP = [ + 'ourtree_two' => 'int', + 'conflicting_prop1' => '\Foo\OurTreeThree', // will be overwritten + UnrelatedTwo::class, // ... by this import + 'conflicting_prop2' => '\Foo\OurTreeThree', // will overwrite the import + ]; +} +class OurTreeThree extends OurTreeTwo +{ + const JSON_PROPERTY_MAP = [ + 'ourtree_three' => 'bool[]', + ]; + + protected function _init() + { + echo "Hello world from the init function!\n"; + } +} + +$x = new OurTreeThree(); +var_dump($x); + +var_dump('---------------------'); + +// LOTS OF TESTS OF DIRECT BY-REFERENCE ACCESS, BOTH INTERNALLY AND EXTERNALLY. +// INTERNALLY: &_getProperty(), EXTERNALLY: &__get() +class TestGetProperty extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'foo' => '\Foo\TestGetProperty[]', + 'bar' => 'int', + ]; + + protected function _init() + { + // always set "bar" to a good value after construction (this is just to + // avoid code repetition during the testing... and to test the _init function) + $this->_setProperty('bar', 1234); + + // uncommenting this will test the "must be LazyUserException" error: + // throw new \Exception('x'); // is rejected and replaced with generic + // throw new LazyUserException('What'); // okay, message propagates + } + + public function runTest() + { + // just show the current internal data (nothing exists) + var_dump($this); // foo is empty + + // test retrieving prop, but not saving missing NULL to _objectData + var_dump($this->_getProperty('foo')); // NULL + var_dump($this); // foo still empty + + // test saving reference to return-value, but not saving default NULL to _objectData + $val = &$this->_getProperty('foo'); // missing important createMissingValue param + $val = 'hi'; // does NOT modify the real property, modifies some temp var + var_dump($this); // foo still empty + + // test saving reference to return-value, and creating + filling default + // inner NULL value so that we can properly trust our references to always + // return to real inner data. this is the correct way to save the return + // by reference. + $val = &$this->_getProperty('foo', true); + var_dump($this); // foo now has a NULL value in its object data + $val = 'hi, this worked because we are linked to real internal data!'; + var_dump($this); // overwritten internal value thanks to proper link + + // notice how we have set an invalid STRING value to the internal data? + // the "foo" property was specified to need to be an array of object + // instances (or NULL is ok too). well, we will detect that the next + // time we try to retrieve that property! + try { + $this->_getProperty('foo'); + } catch (\Exception $e) { + printf("Test _getProperty() with invalid data inserted by reference Exception: %s\n", $e->getMessage()); + } + + // let's try satisfying its array requirements (but still fail its type req) + $val = ['string inside array now fits array req but not type req']; + + try { + $this->_getProperty('foo'); + } catch (\Exception $e) { + printf("Test _getProperty() with valid array but invalid type inserted by reference Exception: %s\n", $e->getMessage()); + } + + // now let's fix the property (set it back to NULL, or we could have + // made an array of this class to satisfy the requirement). + $val = null; + var_dump($this); // foo is now NULL again + + // lastly, let's show that the value is always copy-on-write if the & + // operator is omitted from the function call. because then PHP is told + // to make $val into copy-on-write. + unset($val); // important: break its current reference to avoid assigning to it + $val = $this->_getProperty('foo'); + $val = 'not modified!'; + var_dump($this); // foo still NULL, since $val is not a reference + + // for completeness sake, also test the "bar" property which has a value + // and therefore ignores the "createMissingValue" + $bar = &$this->_getProperty('bar', true); + var_dump($bar); // int(1234), since a value already existed + var_dump($this); // bar still 1234 + $bar = 456; + var_dump($this); // bar is now 456 + } +} + +// run the internal $this->_getProperty call tests: +$x = new TestGetProperty(); +$x->runTest(); + +// run the external __get() call tests used for "virtual property access": +$x = new TestGetProperty(); // reset the internal data +var_dump($x); // has no "foo" data, only "bar" +// accessing ->foo calls __get(), which creates "foo" since virtual prop access +// requires true internal data references, otherwise they would misbehave. so it +// creates the missing property and gives it the default NULL value. +var_dump($x->foo); // null +var_dump($x); // also has "foo" now +// accessing ->bar calls __get() which sees that it exists, and gives us its value. +var_dump($x->bar); // 1234 +// trying to set varibles via equals causes __set() to run, which validates all data: +try { + $x->bar = ['invalid']; // int is expected +} catch (\Exception $e) { + printf("Test __set() with invalid value Exception: %s\n", $e->getMessage()); +} +$x->bar = '932'; // this is okay, __set() sees it is valid and casts it to int +var_dump($x); // "bar" is now int(932) +// now let's do some evil special cases! we will steal a direct reference to the +// internal _objectData['bar'], and then modify it, thus bypassing all validation. +$evilRef = &$x->bar; // now holds reference to bar +$evilRef = ['invalid']; // works, since we're literally modifying internal data +var_dump($x); // "bar" now has an invalid value (an array with a string) +try { + // luckily, every call to _getProperty() (which __get() uses) will validate + // the data to ensure that its internal state is valid and fits the class map. + var_dump($x->bar); +} catch (\Exception $e) { + printf("Test detection of injected invalid data during next __get() Exception: %s\n", $e->getMessage()); +} +$x->bar = 789; // call __set() and give it a new, valid value again. +var_dump($x->bar); // int(789), it is now fixed! +// lastly, let's play with direct access to internal arrays. anytime you access +// an array, it will call __get() to get the array, and then PHP resolves your +// [] brackets on the returned array. which means that we can modify arrays by +// reference automatically! +$x->foo = []; // runs __set(): create empty array for this "\Foo\TestGetProperty[]" property +var_dump($x->foo); // runs __get() which sees valid empty array and returns it +$x->foo[] = new TestGetProperty(); // okay data written by ref to "foo" array +var_dump($x->foo); // runs __get(), which sees valid array of 1 item of right type +$x->foo[] = 'invalid'; // this is allowed because __get() gets "foo" and then + // PHP just directly modifies the array... +var_dump($x); // the "foo" prop now has invalid data in it +// but luckily, anything that calls _getProperty() again, such as __get(), will +// cause validation of the data: +try { + // var_dump($x->foo); // calls __get(), would also throw the error. + $x->foo[] = 'x'; // calls __get() again to resolve "->foo" and throws error +} catch (\Exception $e) { + printf("Test detection of invalid injected data via array access Exception: %s\n", $e->getMessage()); +} +$x->foo = [new TestGetProperty(), new TestGetProperty()]; // run __set() to give okay array again, with 2 entries +var_dump($x->foo); // shows the array with 2 objects in it +$x->foo[0] = null; // runs __get(), gets "foo" by reference, and directly modifies element +var_dump($x->foo); // shows array with 1 NULL in it (this array is valid hence no error) +// we can also __get() the internal array, then loop over the +// values-by-reference, to directly modify them without any validation: +foreach ($x->foo as $k => &$fooVal) { + $fooVal = 'invalid'; +} +var_dump($x); // array with string "invalid". +try { + // if this had been unset($x->foo) it would work, but we try to unset a + // sub-element which means it actually calls __get() instead of __unset() + unset($x->foo[0]); // calls __get(), sees that the data is now invalid +} catch (\Exception $e) { + printf("Test detection of invalid injected data via array by-reference value loop Exception: %s\n", $e->getMessage()); +} +var_dump($x); // two "invalid" remains +$x->foo = [null, new TestGetProperty()]; // let's make it a valid 2-element +var_dump($x->foo); // array of [null,obj]; +unset($x->foo[0]); // runs __get() on "foo", then unsets the 0th element + +// these tests were commented out after adding strict sequence valiation: +// var_dump($x->foo); // array of [obj];, with the 0 array key missing +// unset($x->foo[1]->bar); // runs__get() on "foo", gets array, finds 1st elem, +// // sees object, runs __unset() on that ones "bar" +// var_dump($x); // reveals that the inner object no longer has any "bar" value + +// let's test accessing an object inside an array. and for fun add in regular getters +// NOTE: there is a subtle difference. getFoo() returns copy-on-write array, but +// any objects within it are of course objects and can be modified and will propagate. +$x->foo = [new TestGetProperty()]; +var_dump($x->foo[0]->bar); // int(1234) +var_dump($x->foo[0]->getBar()); // int(1234) +var_dump($x->getFoo()[0]->getBar()); // int(1234) +var_dump($x->getFoo()[0]->bar); // int(1234) +$x->getFoo()[0]->setBar(10); +var_dump($x); // the 0th "foo" array element has a bar of int(10) now +$x->getFoo()[0] = 'xyz'; // this does nothing, since getFoo() is always copy-on-write. +var_dump($x); // still intact, statement above had no effect, which is as intended +// now let's modify the array by reference to avoid constant __get() calls... +$arr = &$x->foo; +$arr = [1, 2, 'f'=>'bar', [['very invalid data']]]; +$arr[] = 'more invalid stuff...'; +var_dump($x); // very invalid stuff... +try { + var_dump($x->foo); +} catch (\Exception $e) { + printf("Test __get() after lots of bad array edits by reference Exception: %s\n", $e->getMessage()); +} +$arr = null; +var_dump($x->foo); // now it is fine again (NULL) +// let's call a normal array-command on the returned array-by-ref +$x->foo = []; // first make it into an array +array_push($x->foo, 'zzz'); // now __get() "foo" and then directly push (same as $x->foo[] = 'bar';) +var_dump($x); // we have directly added invalid data "zzz" into the array. +$x = null; // release the object... + +var_dump('---------------------'); + +// Test PropertyDefinition equality: +$a = new PropertyDefinition('int[]'); +$b = new PropertyDefinition('int'); +$c = new PropertyDefinition('int[]'); +var_dump($a->equals($b)); // false +var_dump($a->equals($c)); // true +var_dump($b->equals($a)); // false +var_dump($b->equals($c)); // false +var_dump($c->equals($a)); // true +var_dump($c->equals($b)); // false + +var_dump('---------------------'); + +// Test inheriting from base-class and also importing from other-class +class OtherBase extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'otherbase' => 'string[]', + // ImportMapTest::class, // triggers circular map error IF ImportMapTest + // // itself refers to our class hierarchy. + ]; +} +class Other extends OtherBase +{ + const JSON_PROPERTY_MAP = [ + 'identical_key' => 'float', + 'other' => 'int', + ]; +} +class Base extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'base' => 'float', + ]; +} +class ImportMapTest extends Base +{ + const JSON_PROPERTY_MAP = [ + // Base::class, // self-hierarchy reference (not allowed) + // ImportMapTest::class, // self-class reference (not allowed) + C::class, // reference to deeper version of self (not allowed) + Other::class, // okay, since it's another class.. but only ok if that + // other class doesn't have its circular reference enabled! + 'identical_key' => 'string', // should be string, since we add it after + // importing Other. but the one in Other should + // remain as its own one (float). + ]; +} +class C extends ImportMapTest +{ +} + +try { + $x = new C(); // comment in/out various class references above to test + // various arrangements of bad circular references. + var_dump($x); // if successful inheritance, print the + // _compiledPropertyMapLink so we can verify that all values + // are properly merged. +} catch (\Exception $e) { + printf("Test resolved-shared-ancestor circular map Exception: %s\n", $e->getMessage()); +} + +class AA extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + BB::class, + ]; +} +class BB extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + AA::class, + ]; +} + +try { + $x = new AA(); +} catch (\Exception $e) { + printf("Test resolved-shared-ancestor circular map Exception: %s\n", $e->getMessage()); +} + +// ensure that the locks are empty after all the construction failures above +$x = new LazyJsonMapper(); +$reflect = new \ReflectionProperty($x, '_propertyMapCache'); +$reflect->setAccessible(true); +var_dump($reflect->getValue()->compilerLocks); // should be empty array + +var_dump('---------------------'); + +// this was written to test PropertyDefinition re-use (RAM saving) when a class +// re-defines a property to the exact same settings that it already inherited. +// properties in LazyJsonMapper will keep their parent's/imported value if their +// new value is identical, thus avoiding needless creation of useless objects +// that just describe the exact same settings. it makes identical re-definitions +// into a zero-cost operation! +class HasFoo extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'foo' => 'string[]', + ]; +} +class RedefinesFoo extends HasFoo +{ + const JSON_PROPERTY_MAP = [ + // 'foo' => 'float', // tests non-identical settings (should USE NEW obj) + 'foo' => 'string[]', // tests identical settings (should KEEP parent + // obj). memory usage should be same as if 'foo' + // wasn't re-defined on THIS object at all. + // 'foo' => 'string[][]', // tests non-identical settings (should USE NEW obj) + 'extra' => '\LazyJsonMapper\LazyJsonMapper', + ]; +} +$mem = memory_get_usage(); +$x = new RedefinesFoo(); +unset($x); // free the object itself, so we only keep the compiled map cache +printf("Memory increased by %d bytes.\n", memory_get_usage() - $mem); + +var_dump('---------------------'); + +// test function overriding: +class OverridesFunction extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'foo' => 'string', + ]; + + public function getFoo() + { + $value = $this->_getProperty('foo'); + + return 'Custom getter: '.var_export($value, true); + } + + public function setFoo( + $value) + { + $value = sprintf('Tried "%s" but we will write "%s" instead.', $value, md5(time())); + $this->_setProperty('foo', $value); + + return $this; + } +} + +$x = new OverridesFunction(); +var_dump($x->getFoo()); +$x->setFoo('ignored'); +var_dump($x->getFoo()); + +var_dump('---------------------'); + +// Test rejection of associative array keys in "array of" JSON definition, since +// those are illegal JSON. + +class TestArrayKeyValidation extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'obj_arr' => '\Foo\TestArrayKeyValidation[]', + ]; +} + +// normal sequence, okay: +$x = new TestArrayKeyValidation(['obj_arr' => [null, null, null, new TestArrayKeyValidation()]]); +var_dump($x->getObjArr()); + +// gap in sequence, not okay: +$x = new TestArrayKeyValidation(['obj_arr' => [1 => new TestArrayKeyValidation()]]); + +try { + var_dump($x->getObjArr()); +} catch (\Exception $e) { + printf("* Test numeric gap in typed 'array of' sequence: %s\n", $e->getMessage()); +} + +// This is ok because of a PHP quirk which converts '0' to 0 if used as array +// key in certain cases such as this one. The key here is literally int(0): +$x = new TestArrayKeyValidation(['obj_arr' => ['0' => new TestArrayKeyValidation()]]); +var_dump($x->getObjArr()); + +// string key in numerically indexed "array of", not okay: +$x = new TestArrayKeyValidation(['obj_arr' => ['not_allowed_to_have_key' => new TestArrayKeyValidation()]]); + +try { + var_dump($x->getObjArr()); +} catch (\Exception $e) { + printf("* Test illegal string-based key in typed 'array of' sequence: %s\n", $e->getMessage()); +} + +var_dump('---------------------'); + +// Test validation of mixed data (only allows NULL, int, float, string, bool, or +// numerically indexed arrays of any of those types). Untyped arrays always do +// array key validation. + +class TestUntypedValidation extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'unt' => '', // behavior would be the same if this property is not + // defined in class map but then it would have to exist in + // the original input data, so I defined it here as untyped. + 'strict_depth' => 'mixed[][]', // enforces mixed non-array data at 2 + // levels deep within an array + ]; +} + +$x = new TestUntypedValidation(); + +try { + $x->setUnt(new \stdClass()); +} catch (\Exception $e) { + printf("* Test set-untyped rejection of object \stdClass: %s\n", $e->getMessage()); +} + +try { + $x->setUnt([new \stdClass()]); +} catch (\Exception $e) { + printf("* Test set-untyped rejection of object [\stdClass]: %s\n", $e->getMessage()); +} + +$fh = null; + +try { + $fh = fopen(__DIR__.'/../funcListData.serialized', 'r'); + + try { + $x->setUnt($fh); + } catch (\Exception $e) { + printf("* Test set-untyped rejection of Resource: %s\n", $e->getMessage()); + } + + try { + $x->setUnt([$fh]); + } catch (\Exception $e) { + printf("* Test set-untyped rejection of [Resource]: %s\n", $e->getMessage()); + } +} finally { + if (is_resource($fh)) { + fclose($fh); + } +} + +// all other types are allowed in this untyped field: +$x->setUnt(null); +$x->setUnt(1); +$x->setUnt(1.5); +$x->setUnt('2'); +$x->setUnt(true); +$x->setUnt([null, 1, [1.5], '2', true]); +var_dump($x->getUnt()); + +// we also allow associative keys in untyped fields (which will become JSON +// objects), since that allows people to access "objects" in json data (arrays) +// without needing to manually map the properties to actual LazyJsonMapper +// NOTE: mixing key types can create weird JSON objects. so if people want +// strict validation they need to use typed fields instead, as seen above. +$x->setUnt([null, 1, ['foo' => 1.5], '2', true]); +var_dump($x->getUnt()); + +// lastly, test the "mixed[]" strict_depth which specified untyped data but +// exactly 1 array level deep. +var_dump($x->getStrictDepth()); +$x->setStrictDepth([[null, 1, null, '2', true], null, []]); +var_dump($x->getStrictDepth()); + +try { + $x->setStrictDepth([[null, 1, null, '2', true], 'not_array', []]); +} catch (\Exception $e) { + printf("* Test set-untyped rejection of non-array at array-depth: %s\n", $e->getMessage()); +} + +try { + $x->setStrictDepth([[null, 1, null, '2', true], 'foo' => 'bar', []]); +} catch (\Exception $e) { + printf("* Test set-untyped rejection of associative key in strict array depth: %s\n", $e->getMessage()); +} + +try { + $x->setStrictDepth([[null, 1, null, '2', true], [['too_deep']], []]); +} catch (\Exception $e) { + printf("* Test set-untyped rejection of array deeper than max depth: %s\n", $e->getMessage()); +} +var_dump($x->getStrictDepth()); +$x->setStrictDepth([]); // okay, since we never reach maxdepth +var_dump($x->getStrictDepth()); //accepted +$x->setStrictDepth(null); // null is always okay +var_dump($x->getStrictDepth()); //accepted +try { + $x->setStrictDepth('foo'); // rejected since the value is not at specified depth +} catch (\Exception $e) { + printf("* Test set-untyped rejection of value at not enough depth: %s\n", $e->getMessage()); +} + +var_dump('---------------------'); + +// Test FunctionCase name translations into property names: + +$x = new FunctionTranslation('ExportProp'); +var_dump($x); + +try { + // Invalid single-word lowercase FuncCase name. + $x = new FunctionTranslation('somelowercase'); +} catch (\Exception $e) { + printf("Test invalid single-word lowercase FuncCase name 'somelowercase' Exception: %s\n", $e->getMessage()); +} +$x = new FunctionTranslation('_MessageList'); +var_dump($x); +$x = new FunctionTranslation('Nocamelcase'); // Single uppercase = no camel. +var_dump($x); +$x = new FunctionTranslation('WithCamelCase'); // Multiple Ucwords = camel. +var_dump($x); + +var_dump('---------------------'); + +// Test property name translations into FunctionCase, and back... +// They must be 100% identical in both directions! + +// Test function names to property names, and then ensure that both snake_case +// and camelCase variants translate back to the same function name via PropertyTranslation. +$funcList = [ + 'getSome0XThing', + 'getSome0xThing', + 'getSomeThing', + 'get_Messages', + 'get__MessageList', + 'get0m__AnUn0x', + 'get__Foo_Bar__XBaz__', + 'get__Foo_Bar_', + 'get___M', + 'get_M', + 'get_0', + 'get_', + 'get___', + 'get123', + 'get123prop', + 'get123Prop', +]; +foreach ($funcList as $f) { + echo "---\n"; + list($functionType, $funcCase) = FunctionTranslation::splitFunctionName($f); + + $x = new FunctionTranslation($funcCase); + printf("* Function: '%s'\n- Type: '%s'\n- FuncCase: '%s'\n > snake: '%s',\n > camel: '%s'\n", $f, $functionType, $funcCase, $x->snakePropName, $x->camelPropName); + + $y = new PropertyTranslation($x->snakePropName); + $getter = 'get'.$y->propFuncCase; + printf("* Property: '%s' (snake)\n > func: '%s' (%s)\n", $x->snakePropName, $getter, $getter === $f ? 'ok' : 'fail'); + if ($x->camelPropName === null) { + echo "* Property: No Camel Property, skipping...\n"; + } else { + $y = new PropertyTranslation($x->camelPropName); + $getter = 'get'.$y->propFuncCase; + printf("* Property: '%s' (camel)\n > func: '%s' (%s)\n", $x->camelPropName, $getter, $getter === $f ? 'ok' : 'fail'); + } + echo "---\n"; +} + +var_dump('---------------------'); + +// test the special operator translator +$result = 'A + and - and * and / and finally % symbol... And some ++--**//%% close ones...'; +var_dump($result); +$result = \LazyJsonMapper\Magic\SpecialOperators::encodeOperators($result); +var_dump($result); +$result = \LazyJsonMapper\Magic\SpecialOperators::decodeOperators($result); +var_dump($result); + +class OperatorTest extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'en+US' => 'string', + 'en-US' => 'string', + 'en/US' => 'string', + 'en%US' => 'string', + 'en*US' => 'string', + 'with;semicolon_and@at' => 'string', + ]; +} + +$optest = new OperatorTest([ + 'en+US' => 'plus', + 'en-US' => 'minus', + 'en/US' => 'divide', + 'en%US' => 'modulo', + 'en*US' => 'multiply', + 'with;semicolon_and@at' => 'complex characters here!', +]); + +$optest->printPropertyDescriptions(); +var_dump($optest->getEn_x2B_US()); // plus +var_dump($optest->getEn_x2D_US()); // minus +var_dump($optest->getEn_x2F_US()); // divide +var_dump($optest->getEn_x25_US()); // modulo +var_dump($optest->getEn_x2A_US()); // multiply +var_dump($optest->getWith_x3B_semicolonAnd_x40_at()); + +var_dump('---------------------'); + +// Test the property description system (the parameters are so strict that there +// isn't really anything to test, apart from the relative property param...) +$ownerClassName = get_class(new Test()); +$desc = new PropertyDescription( + $ownerClassName, + 'the_property', + new PropertyDefinition('\Foo\Test[][]'), + false // do not allow relative paths +); +var_dump($desc); + +$desc = new PropertyDescription( + $ownerClassName, + 'the_property', + new PropertyDefinition('\Foo\Test[][]'), + true // allow relative paths +); +var_dump($desc); + +// and now test the is_defined detection of UndefinedProperty: + +$desc = new PropertyDescription( + $ownerClassName, + 'the_property', + \LazyJsonMapper\Property\UndefinedProperty::getInstance(), + false // do not allow relative paths +); +var_dump($desc); + +$desc = new PropertyDescription( + $ownerClassName, + 'the_property', + \LazyJsonMapper\Property\UndefinedProperty::getInstance(), + true // allow relative paths +); +var_dump($desc); + +var_dump('---------------------'); + +// calculate the memsize of a propertydefinition under various circumstances + +// first... force autoloading to find each class if not already loaded, to avoid +// messing up the measurement. +$x = new PropertyDefinition(); +$x = new LazyJsonMapper(); + +unset($x); +$mem = memory_get_usage(); +$x = new PropertyDefinition('\LazyJsonMapper\LazyJsonMapper'); +printf("Memory size of a PropertyDefinition object referring to '\\LazyJsonMapper\\LazyJsonMapper': %d bytes.\n", memory_get_usage() - $mem); + +unset($x); +$mem = memory_get_usage(); +$x = new PropertyDefinition(); +printf("Memory size of a PropertyDefinition object referring to NULL ('mixed'/untyped): %d bytes.\n", memory_get_usage() - $mem); + +unset($x); +$mem = memory_get_usage(); +$x = new PropertyDefinition('int'); +printf("Memory size of a PropertyDefinition object referring to 'int': %d bytes.\n", memory_get_usage() - $mem); + +unset($x); +$mem = memory_get_usage(); +$x = new PropertyDefinition('int[]'); +printf("Memory size of a PropertyDefinition object referring to 'int[]': %d bytes.\n", memory_get_usage() - $mem); + +unset($x); +$mem = memory_get_usage(); +$x = new PropertyDefinition('float[][][]'); +printf("Memory size of a PropertyDefinition object referring to 'float[][][]': %d bytes.\n", memory_get_usage() - $mem); + +var_dump('---------------------'); + +// Test detection of undefined properties: +$undef = UndefinedProperty::getInstance(); +$def = new PropertyDefinition(); +var_dump($undef instanceof UndefinedProperty); // true +var_dump($def instanceof UndefinedProperty); // false + +var_dump('---------------------'); + +// the following test analyzes memory usage of FunctionTranslation objects vs +// storing the cache values as a regular array (without objects). since objects +// are specialized arrays in PHP, with lower memory needs, we see some pretty +// great space savings by using objects. +// +// these tests will determine the memory needs for the runtime function call +// translation cache. I'd say normally people use around 100 different +// properties. this code generates very realistic function names that mimic +// real-world data. + +// if true, re-use pre-built list of 10000 function names and ignore the other +// params below. that's useful because building the list of names is slow on PHP5. +// and especially because it guarantees comparable runs between PHP binaries. +$usePrebuiltFuncList = true; + +// how many function names to generate. large sample sizes = accurate averages. +// this only happens if "useprebuilt" is disabled. +// $funcCacheCount = 10000; // recommended +$funcCacheCount = 100; // fast for testing but gives inaccurate memory averages + +/* + * Here are results for PHP7 and PHP5 with 10000x entries to really demonstrate + * the correct averages by having a large enough sample size. + * + * PHP7: Array of 10000x FunctionTranslation objects: 2485704 bytes total, ~248.6 bytes per entry. + * PHP7: Array of 10000x numerically indexed arrays: 5394584 bytes total, ~539.5 bytes per entry. + * PHP5: Array of 10000x FunctionTranslation objects: 5104024 bytes total, ~510.4 bytes per entry. + * PHP5: Array of 10000x numerically indexed arrays: 6640864 bytes total, ~664.4 bytes per entry. + * + * Those numbers include the object AND the overhead of their associatively + * named string key in the parent (cache) array. The array key is the FuncCase + * portion of the name (meaning it lacks the functionType prefix like "get" or + * "unset"). + * + * The actual LazyJsonMapper project uses FunctionTranslation objects, and + * normal users can be expected to need around 100 cache entries to cover every + * property they use in their project. + * + * That's ~25kb of RAM on PHP7 or ~51kb on PHP5. ;-) + */ + +function randWords( + array $allWords) +{ + global $allWords; + + // pick 1-3 words + $keys = array_rand($allWords, mt_rand(2, 4)); + array_shift($keys); + + // ensure that they are all lowercase, with an uppercase first letter + $words = []; + foreach ($keys as $k) { + $w = ucfirst(preg_replace('/[^a-z]+/', 'x', strtolower($allWords[$k]))); + // The wordlist has many insanely long words... + // Limit the length to 2-5 chars per word (JSON programmers are terse) + $w = substr($w, 0, mt_rand(2, 5)); + $words[] = $w; + } + + return $words; +} +function randFunctionName( + array $allWords) +{ // Generates a valid "realistic" function name + // Commented out because we no longer use the function type as part of the + // parsing of FuncCase names. So we don't need it in the test-data. + // $functionType = ['has', 'get', 'set', 'is', 'unset'][mt_rand(0, 4)]; + // return $functionType.implode(randWords($allWords)); + + return implode(randWords($allWords)); +} +function buildFuncList( + array $allWords, + $count = 500) +{ // Generates a list of unique functions. + if (count($allWords) < 100) { + die('Not enough words...'); + } + $funcList = []; + while (count($funcList) < $count) { + $funcList[randFunctionName($allWords)] = true; + } + + return array_keys($funcList); +} + +if (!$usePrebuiltFuncList) { + if (!is_file('/usr/share/dict/words')) { + die('Dictionary file missing.'); + } + $allWords = @file('/usr/share/dict/words'); + + // build a list of $funcCacheCount amount functions that we'll put in a lookup cache + echo "- creating a list of {$funcCacheCount} random function names...\n"; + $funcList = buildFuncList($allWords, $funcCacheCount); + + // debug/list generation: + // var_dump($funcList); // uncomment to see quality of name generation + // file_put_contents(__DIR__.'/../funcListData.serialized', serialize($funcList)); + + echo "- function list built... running cache test...\n"; +} else { + if (!is_file(__DIR__.'/../funcListData.serialized')) { + die('No serialized function list.'); + } + $funcList = unserialize(file_get_contents(__DIR__.'/../funcListData.serialized')); +} + +// force autoloading of the class to prevent counting the class itself in mem +$x = new FunctionTranslation('Example'); + +// try storing them as FunctionTranslation objects +$holder = []; +foreach ($funcList as $funcCase) { + $newFuncCase = $funcCase.'x'; // Avoid variable re-use of incoming string. + $holder[$newFuncCase] = new FunctionTranslation($newFuncCase); + unset($newFuncCase); +} +// var_dump($holder); // warning: don't uncomment while testing; increases mem +$mem = memory_get_usage(); +unset($holder); +$totalmem = $mem - memory_get_usage(); +$indivmem = $totalmem / count($funcList); // includes the parent array overhead +printf("PHP%d: Array of %dx FunctionTranslation objects: %d bytes total, ~%.1f bytes per entry.\n", $hasSeven ? 7 : 5, count($funcList), $totalmem, $indivmem); + +// try storing them as a regular non-associative array +$holder = []; +foreach ($funcList as $funcCase) { + $newFuncCase = $funcCase.'y'; // Avoid variable re-use of incoming string. + $translation = new FunctionTranslation($newFuncCase); + $y = [ + // paranoid about PHP re-using the object's value, so let's tweak all: + substr($translation->snakePropName, 0, -1).'y', + $translation->camelPropName === null ? null : substr($translation->camelPropName, 0, -1).'y', + ]; + $holder[$newFuncCase] = $y; + unset($translation); + unset($newFuncCase); + unset($y); +} +// var_dump($holder); // warning: don't uncomment while testing; increases mem +$mem = memory_get_usage(); +unset($holder); +$totalmem = $mem - memory_get_usage(); +$indivmem = $totalmem / count($funcList); // includes the parent array overhead +printf("PHP%d: Array of %dx numerically indexed arrays: %d bytes total, ~%.1f bytes per entry.\n", $hasSeven ? 7 : 5, count($funcList), $totalmem, $indivmem); + +var_dump('---------------------'); + +// test cache clearing and the memory usage of each cache from this test-file. +$mem = memory_get_usage(); +$lookupCount = LazyJsonMapper::clearGlobalMagicLookupCache(); +printf("Saved %d bytes by clearing the magic function lookup cache, which contained %d function name translations.\n", $mem - memory_get_usage(), $lookupCount); + +$mem = memory_get_usage(); +$classCount = LazyJsonMapper::clearGlobalPropertyMapCache(); +printf("Saved %d bytes by clearing %d compiled class maps. But not all may have been freed from memory by PHP yet, if any class instance variables are still in scope.\n", $mem - memory_get_usage(), $classCount); + +var_dump('---------------------'); + +// perform lots of tests of the array converter: + +// assign the normal json data array, but do not recursively validate (convert) +// it since we want a mix of converted and unconverted data during this test... +$x = new Test($jsonData); + +// +// the magic: asArray() CLONES the internal data, then recursively validates all +// of it and then converts it back to a plain array. the result is therefore +// fully validated/type-converted as a side-effect of the conversion process. +// +// it does not touch the contents of the original object: +// +$x->getSelfObject(); // force self_object to evaluate and parse +var_dump($x); // look at raw data... nothing is parsed except self_object + +$asArray = $x->asArray(); + +// look at the original object... still nothing is parsed except self_object, +// which remains obj, with the exact same instance number. this verifies that +// asArray did not manipulate/destroy data in our object. +var_dump($x); + +// validate the asArray result for correctness: +// $asArray[] = 'x'; // uncomment this to trigger a mismatch below +// var_dump($asArray); // look at asarray contents +printf("The asArray() result matches original input array? %s\n", + // NOTE: Array === operator checks all keys, keytypes, key order, values, + // valuetypes and counts recursively. If true, arrays contain IDENTICAL. + ($asArray === $jsonData ? 'YES!' : 'No...')); + +// try tweaking the input data so that the class definition no longer matches: +$jsonData['self_array'] = [$jsonData['self_array']]; // wrap in extra array depth +$x = new Test($jsonData); + +try { + $asArray = $x->asArray(); +} catch (\Exception $e) { + printf("Trying asArray() with data that mismatches class map Exception: %s\n", $e->getMessage()); +} +$jsonData['self_array'] = $jsonData['self_array'][0]; // fix data again + +// try undefined/untyped (missing) field with acceptable basic non-object data: +// acceptable basic data is: "int, float, string, bool, NULL" (and arrays of those). +$jsonData['untyped_field_with_non_object'] = '123456foo'; +$x = new Test($jsonData); +$asArray = $x->asArray(); +printf("As array with untyped/undefined missing but ok data: %s\n", + ($asArray === $jsonData ? 'YES!' : 'No...')); + +// try undefined/untyped (missing) field with a LazyJsonMapper object. this will +// NOT be okay because untyped fields only allow basic PHP types mentioned above. +// NOTE: This can NEVER happen via real json_decode() data. It is a test against +// user's custom data arrays with bad values... +$jsonData['untyped_field_with_lazy_object'] = new LazyJsonMapper(['inner_val' => '123foo']); + +try { + $x = new Test($jsonData, true); // true = run with validation +} catch (\Exception $e) { + printf("Test construction with validation enabled, and having an illegal value (object) in an undefined property Exception: %s\n", $e->getMessage()); +} +// try with non-LazyJsonMapper object too in a different property (will fail too +// since ALL OBJECTS are forbidden in undefined/untyped properties): +$jsonData['untyped_field_with_bad_object'] = new \stdClass(); +$x = new Test($jsonData); // now construct it WITHOUT validation, so the illegal + // value is undetected... +try { + $asArray = $x->asArray(); +} catch (\Exception $e) { + // should warn about BOTH the lazy and the "bad" object: + printf("Test asArray() on previously unvalidated object containing illegal values in data array Exception: %s\n", $e->getMessage()); +} + +try { + $x->getUntypedFieldWithBadObject(); +} catch (\Exception $e) { + // should warn about BOTH the lazy and the "bad" object: + printf("Test getUntypedFieldWithBadObject() on previously unvalidated object with illegal value in that field Exception: %s\n", $e->getMessage()); +} + +// now remove the fake data value again to restore the original jsonData... +unset($jsonData['untyped_field_with_lazy_object']); +unset($jsonData['untyped_field_with_bad_object']); + +$x = new Test($jsonData); +$asArray = $x->asArray(); // works again since all bad data is gone! +var_dump($asArray); + +// now try type-conversion to ensure that the type-map is followed: +class ForceType extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'arr' => 'float[]', + ]; +} +$x = new ForceType(['arr' => ['1', '232', '94.2', 123.42]]); +var_dump($x->asArray()); // all are floats, exactly as the class-map requested +var_dump($x); // and as usual... internal _objectData remains untouched. + +// try non-integer arguments +try { + $x->asJson(false); +} catch (\Exception $e) { + printf("Test asJson() with non-int arg1: %s\n", $e->getMessage()); +} + +try { + $x->asJson(0, false); +} catch (\Exception $e) { + printf("Test asJson() with non-int arg2: %s\n", $e->getMessage()); +} + +// try requesting a json data depth that is way too low for the data: +try { + $x->asJson(0, 1); +} catch (\Exception $e) { + printf("Test asJson() with too low depth parameter Exception: %s\n", $e->getMessage()); +} + +// and for fun... +var_dump($x->asArray()); +var_dump($x->asJson()); +var_dump($x->asJson(JSON_PRETTY_PRINT)); +$x->printJson(); + +var_dump('---------------------'); + +$x = new Test($jsonData); + +// ensure that "convert object to string" works and properly outputs JSON... +echo '['.$x."]\n\n"; +echo $x; +echo PHP_EOL; + +// and test invalid data being output as with <> brackets as intended: +$bad = new Test(['self_object' => 1]); +echo PHP_EOL.'Test of clearly bad input data error handling as message string (since __toString cannot throw): '.$bad.PHP_EOL; + +var_dump('---------------------'); + +// try unsetting properties from the internal JSON data tree: +$x = new Test($jsonData); +$x->printJson(); +$x->unsetSelfArray() // NOTE: This tests the "chained unsetter" feature too. + ->unsetCamelCaseProp() + ->setSelfObject(new Test(['just_a_string' => '123 new object!'])); // Tests chained setter together with unsetters. +$x->printJson(); +$x->unsetSelfObject(); +$x->printJson(); + +// now try reading a property and then unsetting and reading it again: +var_dump($x->getStringArray()); +$x->unsetStringArray(); +var_dump($x->getStringArray()); +$x->printJson(); + +// also try using the direct unset() on the remaining values +unset($x->just_a_string); +unset($x->untyped_field_with_non_object); +$x->printJson(); + +var_dump('---------------------'); + +// Let's do some serialization tests: + +// First, run a recursive analysis to force all unparsed properties to evaluate +// into creating inner LazyJsonMapper objects. +$x = new Test($jsonData); +$x->exportClassAnalysis(); +var_dump($x); // tree of objects + +// Now test the secret, internal "tight packing" serialization method which +// returns the internal data as a plain array instead of as a serialized string: +$secretArr = $x->serialize($x); +var_dump($secretArr); + +// Now serialize the object into an actual, serialized string. The same way an +// end-user would do it. +// NOTE: This resolves all nested objects and serializes the root object with a +// single serialized, plain array within it. +$str = serialize($x); +var_dump($str); // no nested serialized objects + +// test the ability to fake "unserialize" into re-constructing objects from any +// serialized array. NOTE: this is just for testing proper re-building / +// unserialization in a different way. users should never do this. it's dumb. +// they should just create their "new TheClass([...])" instead. +$fakeunserialize = new Test(); +var_dump($fakeunserialize); // empty _objectData +$fakeunserialize->unserialize(serialize(['my_data' => 'hehe'])); +var_dump($fakeunserialize); // objectdata now has my_data + +// test exception when calling the function directly with bad params +try { + $fakeunserialize->unserialize(); + $fakeunserialize->unserialize(null); +} catch (\Exception $e) { + printf("Test unserialize manual call with bad params Exception: %s\n", $e->getMessage()); +} + +// lastly, let's test real unserialization as a new object instance. +// this creates a brand new object with the data array, and has no links to the +// original object (except using the same shared, compiled classmap since we are +// still in the same runtime and have a shared classmap cache entry available). +$new = unserialize($str); +// verify that all _objectData is there in the new object, and that unlike the +// original object (which had exportClassAnalysis() to create inner objects), +// this unserialized copy just has a plain data array: +var_dump($new); +// get a random property to cause it to convert it to its destination format: +$new->getSelfArray(); +var_dump($new); // self_array is now an array of actual objects + +var_dump('---------------------'); + +// test asArray/asStdClass which are aliases to exportObjectDataCopy +var_dump($x->exportObjectDataCopy('array')); +var_dump($x->asArray()); +// var_dump($x->exportObjectDataCopy('Array')); // test invalid type +var_dump($x->exportObjectDataCopy('stdClass')); +var_dump($x->asStdClass()); + +var_dump('---------------------'); + +// test new data assignment at a later time via assignObjectData(): +$foo = new Test(['just_a_string' => '123']); +$foo->printPropertyDescriptions(); +$foo->printJson(); +$foo->assignObjectData(['camelCaseProp' => 999, 'string_array' => ['a', 'b', 'c']]); +$foo->printJson(); + +var_dump('---------------------'); + +class TestJSONArrayKeys extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'array_of_strings' => 'string[]', + ]; +} + +// first, test the fact that objects must always be output as {} notation. +$test = new TestJSONArrayKeys(); +var_dump($test->asJson()); +$test->printJson(); // {} +$test->setArrayOfStrings(['a', 'b']); +var_dump($test->asJson()); +$test->printJson(); // {"array_of_strings":["a","b"]} +$test = new TestJSONArrayKeys(['a', 'b']); +var_dump($test->asJson()); +$test->printJson(); // {"0":"a","1":"b"} + +// now do a test of the fact that properties defined as "array of" only allow +// sequential, numerical keys. +$test->setArrayOfStrings(['a', 'b']); +$test->setArrayOfStrings(['0' => 'a', 'b']); // works because PHP converts "0" to int(0) +$test->setArrayOfStrings([0 => 'a', 1 => 'b']); // correct order +try { + $test->setArrayOfStrings([1 => 'a', 0 => 'b']); // bad order +} catch (\Exception $e) { + printf("Test wrong order array keys, Exception: %s\n", $e->getMessage()); +} + +try { + $test->setArrayOfStrings([4 => 'a', 5 => 'b']); // not starting at 0 +} catch (\Exception $e) { + printf("Test array keys not starting at 0, Exception: %s\n", $e->getMessage()); +} + +try { + $test->setArrayOfStrings(['a', 'b', 'foo' => 'b']); // string-key +} catch (\Exception $e) { + printf("Test non-numeric array key in numeric array, Exception: %s\n", $e->getMessage()); +} + +var_dump('---------------------'); + +// test that our forced-object-notation {} JSON output works in all cases (even +// when strictly numeric keys or empty arrays). +// the correct, intended format is: The outer container (the object) is always +// {}, but any inner arrays in properties are []. + +$foo = new Test(); // no internal array assigned, so uses empty default array +var_dump($foo->asJson()); +$foo->printJson(); +$foo = new Test([1, [11, 22, 33], 3]); +var_dump($foo->asJson()); +$foo->printJson(); +$foo = new Test([0=>1, 1=>[11, 22, 33], 2=>3]); +var_dump($foo->asJson()); +$foo->printJson(); +$foo = new Test([0=>1, '1'=>[11, 22, 33], 2=>3]); +var_dump($foo->asJson()); +$foo->printJson(); +$foo = new Test([0=>1, 2=>3, 1=>[11, 22, 33]]); +var_dump($foo->asJson()); +$foo->printJson(); +$foo = new Test([1, [11, 22, 33], 3, 'x'=>1]); +var_dump($foo->asJson()); +$foo->printJson(); +$foo = new Test(['x'=>1, 1, [11, 22, 33], 3]); +var_dump($foo->asJson()); +$foo->printJson(); + +var_dump('---------------------'); + +// now end with some nice data dumping tests on the final, large data object... +// and let's use the newly unserialized object instance for fun.. +var_dump($new->asJson()); +var_dump($new->asJson(JSON_PRETTY_PRINT)); // manually controlling JSON output options +$new->printPropertyDescriptions(); +echo str_repeat(PHP_EOL, 5); +$new->printJson(false); // automatic printing but without pretty-print enabled +echo str_repeat(PHP_EOL, 5); +$new->getSelfObject()->printJson(); // printing a sub-object (only safe if obj is non-NULL) +echo str_repeat(PHP_EOL, 5); +// $new->getSelfArray()->printJson(); // would not work on PHP arrays, obviously +$new->getSelfArray()[0]->printJson(); // works, since that array entry is an obj +echo str_repeat(PHP_EOL, 5); +$new->printJson(); // <-- Debug heaven! ;-) diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testPropertyDefinitionNamespaces.php b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testPropertyDefinitionNamespaces.php new file mode 100755 index 0000000..7fc1a39 --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testPropertyDefinitionNamespaces.php @@ -0,0 +1,173 @@ + 'string', + ]; + } +} + +namespace Foo\Deeper { + require __DIR__.'/../../vendor/autoload.php'; + + use LazyJsonMapper\LazyJsonMapper; + + class NoExtendsClass + { + } + + class MyClass extends LazyJsonMapper + { + const JSON_PROPERTY_MAP = ['foo' => 'string']; + } +} + +namespace Other\Space\VerySpace { + require __DIR__.'/../../vendor/autoload.php'; + + use LazyJsonMapper\LazyJsonMapper; + + class VeryDeepInSpace extends LazyJsonMapper + { + const JSON_PROPERTY_MAP = [ + 'deepspacenine' => 'string', + ]; + } +} + +namespace Other\Space { + require __DIR__.'/../../vendor/autoload.php'; + + use LazyJsonMapper\LazyJsonMapper; + use LazyJsonMapper\Property\PropertyDefinition; + + class OtherClass extends LazyJsonMapper + { + const JSON_PROPERTY_MAP = [ + 'from_other_class' => 'string', + ]; + } + + class MyClass extends LazyJsonMapper + { + const JSON_PROPERTY_MAP = [ + 'foo' => 'int', + // tests handling of missing relative classes (the warning will + // display the namespace of this class which defined the property): + // 'missing_relative' => 'NoSuchClass', // uncomment to test + // tests support for relative classes within same namespace: + 'relative_class_path' => 'OtherClass', + 'relative_sub_class_path' => 'VerySpace\VeryDeepInSpace', + // and global overrides (the "\" prefix makes PropertyDefinition + // use the global namespace instead): + 'global_class_path' => '\Foo\Deeper\MyClass', + // just for fun, let's import a class map too, via relative: + // (can be done via global or relative paths) + VerySpace\VeryDeepInSpace::class, + ]; + } + + $resolved = new MyClass(); + var_dump($resolved); +} + +namespace Foo\Other\Space { + require __DIR__.'/../../vendor/autoload.php'; + + use LazyJsonMapper\LazyJsonMapper; + + // This class is here to show that new $x->propType() construction technique + // is a bad idea since it may lead to relative resolving like this one, if + // the global path cannot be found. + class MyClass extends LazyJsonMapper + { + } +} + +namespace Foo { + require __DIR__.'/../../vendor/autoload.php'; + + use LazyJsonMapper\LazyJsonMapper; + use LazyJsonMapper\Property\PropertyDefinition; + + var_dump(\Other\Space\MyClass::class); + var_dump(class_exists('\Other\Space\MyClass')); + var_dump(class_exists('\Other\Space\\\MyClass')); + var_dump(Deeper\MyClass::class); + var_dump(__NAMESPACE__); + + echo "-----\n"; + + // test various combinations of namespaces and class prefixes: + // $x = new PropertyDefinition('\MyClass', __NAMESPACE__); + // $x = new PropertyDefinition('\MyClass\Deeper', __NAMESPACE__); + // $x = new PropertyDefinition('MyClass', __NAMESPACE__); + // $x = new PropertyDefinition('MyClass\Deeper', __NAMESPACE__); + // $x = new PropertyDefinition('MyClass'); + // $x = new PropertyDefinition('\MyClass'); + // $x = new PropertyDefinition('MyClass\Deeper'); + // var_dump($x); + + // test a valid relative path (and the cleanup/normalization of a bad name). + $x = new PropertyDefinition('deePER\MYClass[][]', __NAMESPACE__); + var_dump($x); + var_dump($x->asString()); + $y = new $x->propType(); // BAD! WE ALWAYS THE GLOBAL PATH, DO NOT USE THIS + // always use getStrictClassPath() instead! + var_dump($y); // \Foo\Deeper\MyClass instance + + // test a valid path in other space (via global path) + $x = new PropertyDefinition('\Other\SPACe\MYCLASS[][]', __NAMESPACE__); + var_dump($x); + var_dump($x->asString()); + + $type = "Deeper\MyClass"; // PHP would resolve this locally due to no \ + $y = new $type(); + var_dump($y); + + $type = "\Deeper\MyClass"; + $y = new $type(); + var_dump($y); + + echo "------\n"; + var_dump($x); + $y = new $x->propType(); // BAD IDEA! This field has no "\" prefix and may not + // resolve to the intended class in all situations + // correct way for extra safety is always: + $strictClassPath = $x->getStrictClassPath(); + var_dump($strictClassPath); + $y = new $strictClassPath(); + + var_dump($y); // \Other\Space\MyClass instance + + // test bad class warning (no extends) + // $x = new PropertyDefinition('deePER\noextendsCLASS', __NAMESPACE__); + + // test bad class warning via mistyped basic typename: + // $x = new PropertyDefinition('ints', __NAMESPACE__); +} diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testUserFeatureToggling.php b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testUserFeatureToggling.php new file mode 100755 index 0000000..e011523 --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/junk/testUserFeatureToggling.php @@ -0,0 +1,205 @@ + 'string', + 'bar' => 'string', + ]; +} + +// -------------------------------------------------------- + +// Test class that disallows functions but allows properties. + +class DisallowsFunctions extends CoreMap +{ + const ALLOW_VIRTUAL_FUNCTIONS = false; + + public function getBar() + { + return $this->_getProperty('bar'); + } +} + +$jsonData = ['foo' => 'hello', 'bar' => 'world']; + +$x = new DisallowsFunctions($jsonData); + +echo str_repeat(PHP_EOL, 5); +$x->printPropertyDescriptions(); +$x->printJson(); + +// works since we have overridden that function manually +printf("getBar(): \"%s\"\n", $x->getBar()); + +// works since we allow direct property access in the class above +$x->bar = 'changed via direct virtual property access'; + +// look at the new value +printf("getBar(): \"%s\"\n", $x->getBar()); + +// does not work since we have no setter "setBar()" in the class above +try { + $x->setBar('xyzzy'); +} catch (\Exception $e) { + printf("setBar(): %s\n", $e->getMessage()); +} + +// try all function variations of the "foo" property. none should work. +try { + $x->hasFoo(); +} catch (\Exception $e) { + printf("hasFoo(): %s\n", $e->getMessage()); +} + +try { + $x->isFoo(); +} catch (\Exception $e) { + printf("isFoo(): %s\n", $e->getMessage()); +} + +try { + $x->getFoo(); +} catch (\Exception $e) { + printf("getFoo(): %s\n", $e->getMessage()); +} + +try { + $x->setFoo(); +} catch (\Exception $e) { + printf("setFoo(): %s\n", $e->getMessage()); +} + +try { + $x->unsetFoo(); +} catch (\Exception $e) { + printf("unsetFoo(): %s\n", $e->getMessage()); +} + +// -------------------------------------------------------- + +// Test class that disallows properties but allows functions. + +class DisallowsProperties extends CoreMap +{ + const ALLOW_VIRTUAL_PROPERTIES = false; +} + +$jsonData = ['foo' => 'hello', 'bar' => 'world']; + +$x = new DisallowsProperties($jsonData); + +echo str_repeat(PHP_EOL, 5); +$x->printPropertyDescriptions(); +$x->printJson(); + +// works since we allow functions +printf("getBar(): \"%s\"\n", $x->getBar()); +$x->setBar('changed via virtual setBar() function acccess'); + +// look at the new value +printf("getBar(): \"%s\"\n", $x->getBar()); + +// try all property acccess variations of the "foo" property. none should work. +try { + $test = $x->foo; +} catch (\Exception $e) { + printf("__get() via x->foo: %s\n", $e->getMessage()); +} + +try { + $x->foo[] = 'test'; // this __get()-trigger will fail too +} catch (\Exception $e) { + printf("__get() via x->foo[]: %s\n", $e->getMessage()); +} + +try { + $x->foo = 'xyz'; +} catch (\Exception $e) { + printf("__set() via x->foo = ...: %s\n", $e->getMessage()); +} + +try { + isset($x->foo); +} catch (\Exception $e) { + printf("__isset() via isset(x->foo): %s\n", $e->getMessage()); +} + +try { + empty($x->foo); +} catch (\Exception $e) { + printf("__isset() via empty(x->foo): %s\n", $e->getMessage()); +} + +try { + unset($x->foo); +} catch (\Exception $e) { + printf("__unset() via unset(x->foo): %s\n", $e->getMessage()); +} + +// -------------------------------------------------------- + +// Test class that disallows both. + +class DisallowsBoth extends CoreMap +{ + const ALLOW_VIRTUAL_PROPERTIES = false; + const ALLOW_VIRTUAL_FUNCTIONS = false; +} + +$x = new DisallowsBoth($jsonData); + +echo str_repeat(PHP_EOL, 5); +$x->printPropertyDescriptions(); + +try { + $test = $x->foo; +} catch (\Exception $e) { + printf("__get() via x->foo: %s\n", $e->getMessage()); +} + +try { + $x->getFoo(); +} catch (\Exception $e) { + printf("getFoo(): %s\n", $e->getMessage()); +} + +// -------------------------------------------------------- + +// Test class that extends "DisallowsBoth" and re-allows both. + +class ReallowsBoth extends DisallowsBoth +{ + const ALLOW_VIRTUAL_PROPERTIES = true; + const ALLOW_VIRTUAL_FUNCTIONS = true; +} + +$x = new ReallowsBoth($jsonData); + +echo str_repeat(PHP_EOL, 5); +$x->printPropertyDescriptions(); + +printf("getFoo(): \"%s\"\n", $x->getFoo()); +printf("x->bar: \"%s\"\n", $x->bar); diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/nonRecursiveArrays.php b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/nonRecursiveArrays.php new file mode 100755 index 0000000..0b07092 --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/nonRecursiveArrays.php @@ -0,0 +1,402 @@ +current()); + } +} + +// Algorithm v1: The initial idea I had... +function array_flat_topdown_traverse( + array &$input) +{ + // Traverse top-down, processing level by level (going deeper and deeper). + $workStack = [&$input]; // The stack processes one array level at a time. + $nextStack = []; // Next stack with all deeper arrays found on this level. + $currentDepth = 1; // First level of input array should count from 1. + while (!empty($workStack)) { + // Pop a direct reference off the start of our FIFO stack. + reset($workStack); + $firstKey = key($workStack); + $pointer = &$workStack[$firstKey]; + unset($workStack[$firstKey]); + + // Now we're ready to act on the popped stack element... + foreach ($pointer as $k => &$v) { + // printf( + // "[D] %d %s\"%s\":%s\n", + // $currentDepth, + // str_repeat('-', $currentDepth), + // $k, + // is_array($v) ? '[]' : var_export($v, true) + // ); + + // Analyze the current array-child... + if (is_array($v)) { + // Add the discovered child-array to the end of the next-stack. + $nextStack[] = &$v; + } else { + // The child is a non-array element... Send it to the callback! + // TODO: Give callback key + value ref + array depth + } + } + + // If the work-stack is finished, switch to the next (deeper) stack. + if (empty($workStack)) { + $workStack = $nextStack; + $nextStack = []; + $currentDepth++; + } + } +} + +// Algorithm v2: Avoids two count() calls per stack-element iteration. +function array_flat_topdown_traverse2( + array &$input) +{ + // Traverse top-down, processing level by level (going deeper and deeper). + $workStack = [&$input]; // The stack processes one array level at a time. + $workStackSize = 1; // Hardcoded result of count($workStack). + $nextStack = []; // Next stack with all deeper arrays found on this level. + $currentDepth = 1; // First level of input array should count from 1. + while ($workStackSize > 0) { + // Pop a direct reference off the start of our FIFO stack. + reset($workStack); + $firstKey = key($workStack); + $pointer = &$workStack[$firstKey]; + unset($workStack[$firstKey]); + $workStackSize--; + + // Now we're ready to act on the popped stack element... + foreach ($pointer as $k => &$v) { + // printf( + // "[D] %d %s\"%s\":%s\n", + // $currentDepth, + // str_repeat('-', $currentDepth), + // $k, + // is_array($v) ? '[]' : var_export($v, true) + // ); + + // Analyze the current array-child... + if (is_array($v)) { + // Add the discovered child-array to the end of the next-stack. + $nextStack[] = &$v; + } else { + // The child is a non-array element... Send it to the callback! + // TODO: Give callback key + value ref + array depth + } + } + + // If the work-stack is finished, switch to the next (deeper) stack. + if ($workStackSize <= 0) { + // NOTE: There's no need to assign to workStack by reference to + // avoid copy-on-write. Because when we set nextStack to a new + // value, PHP will realize that workStack is the only instance. + // In fact, by-ref is slower it also needs an unset($nextStack) + // call to break its own reference before doing $nextStack = []. + $workStack = $nextStack; + $workStackSize = count($workStack); + $nextStack = []; + $currentDepth++; + } + } +} + +// Regular, old-school recursive function calls. +function array_recursive_traverse( + array &$input, + $currentDepth = 1) +{ + // Recursion adds 1 level to the function call stack + // per depth-level of the array: + // debug_print_backtrace(); + + $nextDepth = $currentDepth + 1; + foreach ($input as $k => &$v) { + // printf( + // "[D] %d %s\"%s\":%s\n", + // $currentDepth, + // str_repeat('-', $currentDepth), + // $k, + // is_array($v) ? '[]' : var_export($v, true) + // ); + + if (is_array($v)) { + array_recursive_traverse($v, $nextDepth); + } + } +} + +// Build an array data tree. +function generateData( + $depth) +{ + $data = []; + $pointer = &$data; + for ($d = 0; $d < $depth; ++$d) { + // $subArr = ['x', 'y', ['z'], ['foo'], [['xxyyzzyy']]]; // Harder data. + $subArr = ['x', 'y', 'z', ['foo'], 'xxyyzzyy']; + $pointer[] = &$subArr; + $pointer = &$subArr; + unset($subArr); // Unlink, otherwise next assignment overwrites pointer. + } + + return $data; +} + +// Run a single test. +function runTest( + $description, + $data, + $algorithm, + $iterations) +{ + $start = microtime(true); + + switch ($algorithm) { + case 'array_flat_topdown_traverse': + for ($i = 0; $i < $iterations; ++$i) { + array_flat_topdown_traverse($data); + } + break; + case 'array_flat_topdown_traverse2': + for ($i = 0; $i < $iterations; ++$i) { + array_flat_topdown_traverse2($data); + } + break; + case 'array_recursive_traverse': + for ($i = 0; $i < $iterations; ++$i) { + array_recursive_traverse($data); + } + break; + case 'RecursiveIteratorIterator': + for ($i = 0; $i < $iterations; ++$i) { + $iterator = new \RecursiveIteratorIterator( + new RecursiveArrayOnlyIterator($data), + \RecursiveIteratorIterator::SELF_FIRST + ); + // foreach ($iterator as $key => $value) { + // // echo "$key => $value\n"; + // } + // This iteration method takes 15% longer than foreach, + // but it's the only way to get the depth, which we + // absolutely need to know in this project. + for (; $iterator->valid(); $iterator->next()) { + $key = $iterator->key(); + $value = $iterator->current(); + $depth = $iterator->getDepth(); + } + } + break; + } + + printf( + "%dx %s %s: %.0f milliseconds.\n", + $iterations, $description, $algorithm, + 1000 * (microtime(true) - $start) + ); +} + +// Run all algorithm tests at once. +function runTestMulti( + $description, + $data, + $iterations, + $iteratorTestMode) // Time-saver: -1 off, 0 divide by ten, 1 normal +{ + if ($iteratorTestMode > -1) { + runTest($description, $data, 'RecursiveIteratorIterator', + $iteratorTestMode > 0 ? $iterations : (int) floor($iterations / 10)); + } + runTest($description, $data, 'array_flat_topdown_traverse', $iterations); + runTest($description, $data, 'array_flat_topdown_traverse2', $iterations); + runTest($description, $data, 'array_recursive_traverse', $iterations); +} + +// Special data test-tree for use together with debug-output (uncomment it in +// the algorithms), to verify that each algorithm detects the current depth. +$data = [ + '1one' => [ + '1two' => [ + '1three-nonarr1' => '1', + '1three' => [ + '1four-nonarr1' => '2', + '1four' => [ + '1five' => '3', + ], + ], + ], + ], + '2one-nonarr1' => null, + '3one' => [ + '3two-1' => [ + '3three-nonarr1' => '4', + '3three-1' => [ + '3four-1' => [ + '3five-1' => [ + '3six-nonarr1' => '5', + ], + ], + ], + '3three-nonarr2' => '6', + ], + '3two-nonarr1' => '7', + '3two-2' => [ + '3three-nonarr3' => '8', + ], + '3two-nonarr2' => '9', + ], +]; + +// The "RecursiveIteratorIterator" is ~10x slower, so this setting saves time. +// Values: -1 off, 0 divide by ten, 1 normal. +$iteratorTestMode = -1; + +// Globally extend/shorten the amount of test iterations, or "1" for no scaling. +$testScale = 1; + +// Output PHP version details. +printf("[Running %dx tests on PHP version %s]\n", $testScale, PHP_VERSION); +printf("[RecursiveIteratorIterator Tests: %s]\n", ['Disabled', 'Shortened by /10', 'Enabled'][$iteratorTestMode + 1]); + +// Test with normal data (6 levels deep). +runTestMulti('normal-6', generateData(6), $testScale * 500000, $iteratorTestMode); + +// Test unusual data (50 levels deep). +runTestMulti('rare-50', generateData(50), $testScale * 100000, $iteratorTestMode); + +// Now test with insanely deeply nested data. +runTestMulti('insane-500', generateData(500), $testScale * 10000, $iteratorTestMode); + +// Let's do one final test with even more disgustingly deep arrays. +runTestMulti('hellish-5000', generateData(5000), $testScale * 100, $iteratorTestMode); diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/prefixSplitAlgorithms.php b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/prefixSplitAlgorithms.php new file mode 100755 index 0000000..8c0acfc --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/devtools/prefixSplitAlgorithms.php @@ -0,0 +1,270 @@ + 'string', + 'users' => 'User[]', + ]; +} + +class User extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'name' => 'string', + 'details' => 'UserDetails', + ]; +} + +class UserDetails extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + 'age' => 'int', + 'hired_date' => 'string', + ]; +} + +/* + * Now simply create the root object (a Section), and give it the section JSON: + */ + +$section = new Section(json_decode($section_json, true)); + +/* + * Here's how you would look at the available properties and their functions: + */ + +$section->printPropertyDescriptions(); + +/* + * Now let's access some data, via the functions shown by the previous command. + */ + +printf("\n\nData Output Example:\n\nSection Title: %s\n", $section->getSectionTitle()); +foreach ($section->getUsers() as $user) { + // $user->printPropertyDescriptions(); // Uncomment to see User-functions. + // $user->printJson(); // Uncomment to look at the JSON data for that user. + printf( + "- User: %s\n Age: %s\n Hired Date: %s\n", + $user->getName(), + $user->getDetails()->getAge(), + $user->getDetails()->getHiredDate() + ); +} +echo "\n\n"; + +/* + * Lastly, let's demonstrate looking at the actual internal JSON data: + */ + +// var_dump($section->asJson()); // Uncomment to get a JSON data string instead. +// var_dump($section->getUsers()[0]->asJson()); // Property sub-object encoding. +// var_dump(json_encode($section->getUsers())); // Property non-object values +// // solvable via `json_encode()`. +$section->printJson(); + +/* + * There are a million other functions and features. Have fun exploring! + * Simply read the main src/LazyJsonMapper.php file for all documentation! + */ diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/import_example.php b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/import_example.php new file mode 100755 index 0000000..50d7014 --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/import_example.php @@ -0,0 +1,42 @@ + 'string', + 'age' => 'int', + ]; +} + +class AdvancedUser extends User +{ + const JSON_PROPERTY_MAP = [ + 'advanced' => 'string', + ]; +} + +class SomethingElse extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + AdvancedUser::class, // This is an "import class map"-command. + 'otherprop' => 'float[][]', + ]; +} + +/* + * This demonstrates that SomethingElse contains all fields from AdvancedUser + * (which in turn inherited User's map), as well as having its own "otherprop". + */ + +$somethingelse = new SomethingElse(); +$somethingelse->printPropertyDescriptions(); diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/inheritance_example.php b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/inheritance_example.php new file mode 100755 index 0000000..899c187 --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/inheritance_example.php @@ -0,0 +1,51 @@ + 'string', + 'age' => 'int', + ]; +} + +class AdvancedUser extends User +{ + const JSON_PROPERTY_MAP = [ + 'advanced' => 'string', + ]; +} + +/* + * This demonstrates that AdvancedUser contains all fields from User. + */ + +$advanceduser = new AdvancedUser(json_decode($advanceduser_json, true)); + +$advanceduser->printPropertyDescriptions(); +printf( + "\n\nName: %s\nAge: %s\nAdvanced: %s\n", + $advanceduser->getName(), + $advanceduser->getAge(), + $advanceduser->getAdvanced() +); +$advanceduser->printJson(); diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/unpredictable_data.php b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/unpredictable_data.php new file mode 100755 index 0000000..2d366a5 --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/examples/unpredictable_data.php @@ -0,0 +1,705 @@ + 'string', + ]; +} + +/** + * This container supports unpredictable keys. + * + * Note that it doesn't define any properties in its JSON_PROPERTY_MAP. Instead, + * we use a custom getter which reads _all_ JSON properties and processes them! + * + * In other words, this _entire_ container will hold nothing but unpredictable + * data keys. (If you have a mixture, there are other examples further down.) + */ +class UnpredictableContainer extends LazyJsonMapper +{ + /** + * Cached key-value object translations. + * + * This is optional, but speeds up repeated calls to `getUserList()`, since + * it will store all previously converted objects for future re-use. + * + * @var array + */ + protected $_userList; + + /** + * Get the list of users. + * + * @throws LazyJsonMapperException + * + * @return array Associative array of key-value pairs, keyed by userID. + */ + public function getUserList() + { + // Tell LazyJsonMapper to give us all of our internal data as an array. + // NOTE: This creates a COPY of the array. It's not attached to the main + // storage, which means that any changes we make to the new array aren't + // going to affect the actual LazyJsonMapper object's own data. That + // won't matter for pure getter-based objects like this one (which is + // all you'll need in 99.9999999% of cases where you'll want to read + // unpredictable data). So if the user serializes this LazyJsonMapper + // object, or gets it "asJson()", etc, then they'd still be serializing + // the original, untouched internal data, which is exactly what we are + // retrieving here. So everything works out perfectly as long as we + // don't have any setters! (But setters will be demonstrated later.) + if ($this->_userList === null) { + // Get a copy of the internal data as an array, and cache it. + // NOTE: This only throws if there is unmappable data internally. + $this->_userList = $this->asArray(); // Throws. + } + + // Loop through the list of JSON properties and convert every "array" + // value to a User object instead. That's because all of JSON's nested, + // not-yet-converted "JSON object values" are associative sub-arrays. + foreach ($this->_userList as &$value) { + if (is_array($value)) { + // NOTE: The User constructor can only throw if a custom _init() + // fails or if its class property map can't be compiled. + $value = new User($value); // Throws. + } + } + + // Now just return our key-value array. The inner array values have + // been converted to User objects, which makes them easy to work with. + return $this->_userList; + } +} + +/* + * Let's try it out with two sets of data that use unpredictable (numeric) keys! + */ + +/* + * This JSON data consists of various numeric keys pointing at "User"-objects. + */ +$unpredictable_json1 = <<printJson(); + +/* + * Now let's call our custom getter which retrieves all values and gives them to + * us as User objects. As you can see, their contents perfectly match the + * printJson() results, since our custom getter doesn't manipulate any data. + */ +foreach ($unpredictable1->getUserList() as $userId => $userInfo) { + printf("User ID: %s\n Name: %s\n", $userId, $userInfo->getName()); +} + +/* + * Let's do the same for another set of data with other keys... + */ +$unpredictable_json2 = <<printJson(); + +foreach ($unpredictable2->getUserList() as $userId => $userInfo) { + printf("User ID: %s\n Name: %s\n", $userId, $userInfo->getName()); +} + +/* + * Alright, that's all great... but what if we want to manipulate the data? + * + * Well, the loop above still has $userId and $userInfo variables that point at + * the last element it looped to... so let's try using those to set data! What + * can possibly go wrong!? ;-) + */ +printf("*** Changing the name of user #%s to 'FOO'.\n", $userId); +$userInfo->setName('FOO'); + +/* + * Now let's look at the contents of the "getUserList()" call... + * + * Because the user-list is cached internally in our custom object, it already + * refers to the exact same object instances... So it will indeed have updated. + */ +foreach ($unpredictable2->getUserList() as $userId => $userInfo) { + printf("User ID: %s\n Name: %s\n", $userId, $userInfo->getName()); +} + +/* + * But wait... what about the actual internal object data? Let's look at that! + * + * The name... is not updated... + */ +$unpredictable2->printJson(); + +/* + * Uh oh... since we're using a custom getter which fetches the data totally + * detached from the core LazyJsonMapper storage, we will need another solution! + * + * These extra steps are ONLY needed if you want setters that actually work... + */ + +/** + * Extends UnpredictableContainer with a custom setter. + * + * We could have put these functions on the main UnpredictableContainer, but + * this example is clearer by only explaining it here as a separate step for + * those who need setters... + */ +class UnpredictableContainerWithSetter extends UnpredictableContainer +{ + /** + * Syncs the user list cache with the LazyJsonMapper core storage. + * + * Note that we could build these steps into `setUserList()`. But by having + * it as a separate function, you are able to just update specific User + * objects and then call `syncUserList()` to write them back to the core. + * + * @throws LazyJsonMapperException + */ + public function syncUserList() + { + // If no internal cache exists yet, get its value from LazyJsonMapper. + if ($this->_userList === null) { + $this->getUserList(); // Builds our "_userList" variable. Throws. + } + + // Now, we need to create a new, internal LazyJsonMapper data array for + // our object. In undefined (unmapped) properties, you are ONLY allowed + // to store basic data types. Not objects. So we will need to convert + // all User objects to real array data. Otherwise OTHER calls would fail + // due to invalid internal data when we try things like `printJson()`. + $newObjectData = []; + foreach ($this->_userList as $k => $v) { + $newObjectData[$k] = is_object($v) && $v instanceof LazyJsonMapper + ? $v->asArray() // Throws. + : $v; // Is already a valid value. + } + + // Now give the new object data to LazyJsonMapper, which ensures that it + // contains all of the same values as our updated cache! This replaces + // the ENTIRE internal JSON property storage, so be aware of that! + $this->assignObjectData($newObjectData); // Throws. + } + + /** + * Replace the entire user list with another list. + * + * @param array $userList Associative array of User objects keyed by userID. + * + * @throws LazyJsonMapperException + * + * @return $this + */ + public function setUserList( + array $userList) + { + // First of all, let's instantly save their new value to our own + // internal cache, since our cache supports User objects and doesn't + // have to do any special transformations... + $this->_userList = $userList; + + // Now sync our internal cache with the LazyJsonMapper object...! :-) + $this->syncUserList(); // Throws. + + // Setters should always return "$this" to make them chainable! + return $this; + } +} + +/* + * Alright, let's try the example again, with the new container that has proper + * support for setters! + */ +echo "\n\nUnpredictable data #2, with setter:\n"; +$unpredictable2 = new UnpredictableContainerWithSetter(json_decode($unpredictable_json2, true)); + +$unpredictable2->printJson(); + +foreach ($unpredictable2->getUserList() as $userId => $userInfo) { + printf("User ID: %s\n Name: %s\n", $userId, $userInfo->getName()); +} + +/* + * Now let's try manipulating the data again! + */ +printf("*** Changing the name of user #%s to 'FOO'.\n", $userId); +$userInfo->setName('FOO'); + +/* + * Now let's look at the contents of the "getUserList()" call... + * + * Just as before, it has been updated since we use an internal cache which + * already refers to the exact same object instances... so our update is there! + */ +foreach ($unpredictable2->getUserList() as $userId => $userInfo) { + printf("User ID: %s\n Name: %s\n", $userId, $userInfo->getName()); +} + +/* + * Now let's look at the internal LazyJsonMapper data storage... + * + * It is NOT updated. As expected... + */ +$unpredictable2->printJson(); + +/* + * Now let's SYNC our cache back to the internal LazyJsonMapper data storage! + * + * And voila...! + */ +$unpredictable2->syncUserList(); +$unpredictable2->printJson(); + +/* + * Let's also try our custom setter, which takes a whole array of User objects + * and does the syncing automatically! + */ +$users = $unpredictable2->getUserList(); +foreach ($users as $userId => $userInfo) { + $userInfo->setName('Updated...'.$userId.'!'); +} +$unpredictable2->setUserList($users); // Replaces entire cache and syncs! + +/* + * Now let's look at the contents of our cache AND the LazyJsonMapper data! + * + * Everything has been updated, since our "setUserList()" call replaced the + * entire cache contents AND synced the new cache contents to the core storage. + */ +foreach ($unpredictable2->getUserList() as $userId => $userInfo) { + printf("User ID: %s\n Name: %s\n", $userId, $userInfo->getName()); +} +$unpredictable2->printJson(); + +/** + * This class handles a mixture of knowable and unknowable data. + * + * Let's end this with one more example... What if you DON'T want to define a + * whole custom container? What if you only want a SPECIFIC value within your + * map to be handling unpredictable keys? You could achieve that as follows! + * + * This class will contain less comments, for brevity. You hopefully understand + * all of the major workflow concepts by now! We will only explain new concepts. + * And this class won't show any `syncEmployees()` function, since you should + * understand how to do that now if you want that feature. + */ +class UnpredictableMixtureContainer extends LazyJsonMapper +{ + protected $_employees; + + const JSON_PROPERTY_MAP = [ + // This is a statically named "manager" property, which is a User. + 'manager' => 'User', + // This is a statically named "employees" property, which consists of + // unpredictable key-value pairs, keyed by userID. + 'employees' => 'mixed', // Must be 'mixed' (aka '') to allow sub-arrays. + ]; + + /** + * Get the list of employees. + * + * NOTE: This overrides the normal, automatic LazyJsonMapper getter! By + * naming our function identically, we override its behavior! + * + * @throws LazyJsonMapperException + * + * @return array + */ + public function getEmployees() + { + if ($this->_employees === null) { + // Use the internal _getProperty() API to read the actual property. + // NOTE: This function only throws if "employees" contains any + // invalid non-basic data. Only basic PHP types are accepted. + $this->_employees = $this->_getProperty('employees'); // Throws. + } + + foreach ($this->_employees as &$value) { + if (is_array($value)) { + $value = new User($value); // Throws. + } + } + + return $this->_employees; + } + + /** + * Set the list of employees. + * + * NOTE: This overrides the normal, automatic LazyJsonMapper setter! By + * naming our function identically, we override its behavior! + * + * @param array $employees + * + * @throws LazyJsonMapperException + * + * @return $this + */ + public function setEmployees( + array $employees) + { + $this->_employees = $employees; + + // We now need to construct a new, inner value for the property. Since + // it's a "mixed" property, it only accepts basic PHP types. + $newInnerValue = []; + foreach ($this->_employees as $k => $v) { + $newInnerValue[$k] = is_object($v) && $v instanceof LazyJsonMapper + ? $v->asArray() // Throws. + : $v; // Is already a valid value. + } + + // Now use the internal _setProperty() API to set the new inner value. + // NOTE: This function only throws if the new value contains any + // invalid non-basic data. Only basic PHP types are accepted. + $this->_setProperty('employees', $newInnerValue); + + return $this; + } +} + +/* + * Let's try it out! + */ +$unpredictable_json3 = <<printJson(); +printf("The manager's name is: %s\n", $unpredictable3->getManager()->getName()); +foreach ($unpredictable3->getEmployees() as $employeeId => $employeeInfo) { + printf("- Employee #%s, Name: %s\n", $employeeId, $employeeInfo->getName()); +} + +/* + * Now let's set some new employee data... This time, just for fun, let's give + * it a virtual JSON array which we construct manually. + */ +$unpredictable3->setEmployees([ + // Let's provide one value as a User object, since our setter supports + // the conversion of User objects back into plain arrays. + '10' => new User(['name' => 'Employee Ten']), + // However, we could also just provide the data as an array, since that's + // the goal that our setter performs... this is for really advanced users. + // Don't blame us if you break things by using this shortcut! ;-) + '11' => ['name' => 'Employee Eleven'], +]); + +/* + * Let's also update the manager, which is done via a normal, automatic + * LazyJsonMapper setter, since that property is completely defined. And since + * the "manager" object is owned by the LazyJsonMapper core, we're able to chain + * its getters and setters to select the manager's User object and set its name! + */ +$unpredictable3->getManager()->setName('New Manager!'); + +/* + * Now let's look at all current data again! + */ +$unpredictable3->printJson(); +printf("The manager's name is: %s\n", $unpredictable3->getManager()->getName()); +foreach ($unpredictable3->getEmployees() as $employeeId => $employeeInfo) { + printf("- Employee #%s, Name: %s\n", $employeeId, $employeeInfo->getName()); +} + +/* + * But wait... there's yet another way to solve this! + * + * Since we know that our "mixture container"'s `employees` value is a key-value + * storage of User objects, in other words it's "an unpredictable key-value + * container", then we CAN just tell LazyJsonMapper to map that property to a + * `UnpredictableContainer[WithSetter]` which we defined earlier. That way, the + * "employees" values are handled automatically by a neat sub-container. + * + * In fact, we could do something even better! We could define a basic + * "unpredictable keys" container, and then define subclasses of it for various + * types of unpredictable containers. Let's do that instead! + */ + +/** + * This class defines a core "untyped" container of unpredictable data-keys. + * + * Unpredictable data is data with keys that cannot be known ahead of time, such + * as objects whose values are keyed by things like user IDs. + * + * Here's an example of such unpredictable data: `{"9323":{"name":"foo"}}` + * + * The `getData()` function retrieves all key-value pairs, converted to the + * optional `$_type` (if one is set via a subclass). And `setData()` writes + * the new data back into the core `LazyJsonMapper` container. Most people will + * not need to use the setter. It's just provided as an extra feature. + * + * @author SteveJobzniak (https://github.com/SteveJobzniak) + */ +class CoreUnpredictableContainer extends LazyJsonMapper +{ + // Let's disable direct access to this container via anything other than + // the functions that WE define ourselves! That way, people cannot use + // virtual properties/functions to manipulate the core data storage. + const ALLOW_VIRTUAL_PROPERTIES = false; + const ALLOW_VIRTUAL_FUNCTIONS = false; + + /** + * Data cache to avoid constant processing every time the getter is used. + * + * @var array + */ + protected $_cache; + + /** + * What class-type to convert all sub-object values into. + * + * Defaults to no conversion. Override this value via a subclass! + * + * Always use the FULL path to the target class, with a leading backslash! + * The leading backslash ensures that it's found via a strict, global path. + * + * Example: `\Foo\BarClass`. + * + * @var string + */ + protected $_type; + + /** + * Get the data array of this unpredictable container. + * + * @throws LazyJsonMapperException + * + * @return array + */ + public function getData() + { + if ($this->_cache === null) { + $this->_cache = $this->asArray(); // Throws. + } + + if ($this->_type !== null) { + foreach ($this->_cache as &$value) { + if (is_array($value)) { + $value = new $this->_type($value); // Throws. + } + } + } + + return $this->_cache; + } + + /** + * Set the data array of this unpredictable container. + * + * @param array $value The new data array. + * + * @throws LazyJsonMapperException + * + * @return $this + */ + public function setData( + array $value) + { + $this->_cache = $value; + + $newObjectData = []; + foreach ($this->_cache as $k => $v) { + $newObjectData[$k] = is_object($v) && $v instanceof LazyJsonMapper + ? $v->asArray() // Throws. + : $v; // Is already a valid value. + } + + $this->assignObjectData($newObjectData); // Throws. + + return $this; + } +} + +/** + * This class defines an "unpredictable container of User objects". + * + * It's very easy to define other containers. Simply create them like this and + * override their `$_type` property to any other valid LazyJsonMapper class. + */ +class UserUnpredictableContainer extends CoreUnpredictableContainer +{ + // The FULL path to the target class, with leading backslash! + // NOTE: The leading backslash ensures it's found via a strict, global path. + protected $_type = '\User'; +} + +/** + * This is our new and improved, final class! + * + * Here is our final object for mapping our unpredictable "employees" data... + * As you can see, it is much easier to create this class now that we have + * defined a core, re-usable "unpredictable container" above. + */ +class UnpredictableMixtureContainerTwo extends LazyJsonMapper +{ + const JSON_PROPERTY_MAP = [ + // This holds a regular User object. + 'manager' => 'User', + // This property is an unpredictable container of User objets. + 'employees' => 'UserUnpredictableContainer', + ]; +} + +/* + * Let's try it out! + */ +$unpredictable_json4 = <<printJson(); +printf("The manager's name is: %s\n", $unpredictable4->getManager()->getName()); +foreach ($unpredictable4->getEmployees()->getData() as $employeeId => $employeeInfo) { + printf("- Employee #%s, Name: %s\n", $employeeId, $employeeInfo->getName()); +} + +/* + * And let's update the value of the inner, unpredictable container! + * + * The container itself takes care of updating the LazyJsonMapper data storage! + */ +$unpredictable4->getEmployees()->setData([ + '123' => ['name' => 'Final Employee 123'], + '456' => ['name' => 'Final Employee 456'], +]); + +/* + * Now finish by looking at all of the data again, via the LazyJsonMapper core + * object and via the `getEmployees()` object's cache... They are identical! + */ +$unpredictable4->printJson(); +printf("The manager's name is: %s\n", $unpredictable4->getManager()->getName()); +foreach ($unpredictable4->getEmployees()->getData() as $employeeId => $employeeInfo) { + printf("- Employee #%s, Name: %s\n", $employeeId, $employeeInfo->getName()); +} + +/* + * And that's it! Hopefully you NEVER have to work with nasty, unpredictable + * data like this. If you're able to control the JSON format, you should always + * design it properly with known keys instead. But at least you now know about + * multiple great methods for working with objects that have unpredictable keys! + * + * There are other methods too, such as if your class contains a blend of known + * (defined) keys and unpredictable keys, in which case you'd need to fetch via + * `asArray()` as in the `UnpredictableContainer` example, and then you'd simply + * filter out all known keys from your cache, to get _just_ the unpredictable + * keys. And if you need setters in that scenario, your setter functions would + * be a bit more complex since they would need to use `assignObjectData()` AND + * would have to provide BOTH the known data AND the unknown data. One way of + * doing that would be to use `_getProperty()` to merge in the CURRENT values of + * each core property into your NEW object-data array BEFORE you assign it. But + * I leave that extremely rare scenario as an excercise for you, dear reader! + * + * You should go out and adapt all of this code to fit your own needs! ;-) + * + * For example, if you don't need the unpredictable values to be converted + * to/from a specific object type, then simply skip the conversion code. + * + * If you don't need caching for performance, then skip the caching code. + * + * If you don't need setters/syncing, then skip all of that code. + * + * You may also want to disable the user-options `ALLOW_VIRTUAL_PROPERTIES` and + * `ALLOW_VIRTUAL_FUNCTIONS` on your unpredictable containers, so users cannot + * manipulate the unpredictable data via LazyJsonMapper's automatic functions! + * That's what we did for CoreUnpredictableContainer, to ensure that nobody can + * destroy its internal data by touching it directly. They can only manipulate + * the data via its safe, public `getData()` and `setData()` functions! + * + * And you may perhaps prefer to write a custom base-class which has a few other + * helper-functions for doing these kinds of data translations, caching and + * syncing, to make your own work easier (such as the CoreUnpredictableContainer + * example above). That way, your various sub-classes could just call your + * internal helper functions to do the required processing automatically! :-) + * + * The possibilities are endless! Have fun! + */ +echo "\n\nHave fun!\n"; diff --git a/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/phpdoc.dist.xml b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/phpdoc.dist.xml new file mode 100755 index 0000000..acd326c --- /dev/null +++ b/instafeed/vendor/lazyjsonmapper/lazyjsonmapper/phpdoc.dist.xml @@ -0,0 +1,24 @@ + + + LazyJsonMapper + + docs/cache + utf8 + + TODO + FIXME + + + php + + + + docs/output + + +