From 9b74cb4ee6412aca411f4698a70eb9b0dadbe13f Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 12 Feb 2020 14:24:11 -0800 Subject: [PATCH] Fully merge "libphutil/" into "arcanist/" Summary: Ref T13395. Moves all remaining code in "libphutil/" into "arcanist/". Test Plan: Ran various arc workflows, although this probably has some remaining rough edges. Maniphest Tasks: T13395 Differential Revision: https://secure.phabricator.com/D20980 --- .arclint | 14 +- .gitignore | 19 + externals/jsonlint/LICENSE | 19 + .../jsonlint/src/Seld/JsonLint/JsonParser.php | 488 + .../jsonlint/src/Seld/JsonLint/Lexer.php | 215 + .../src/Seld/JsonLint/ParsingException.php | 26 + .../jsonlint/src/Seld/JsonLint/Undefined.php | 14 + resources/php/symbol-information.json | 64365 ++++++++++++++++ resources/ssl/README | 45 + resources/ssl/default.pem | 3893 + scripts/__init_script__.php | 57 +- scripts/arcanist.php | 3 +- scripts/init/init-script.php | 100 + src/__phutil_library_init__.php | 2 +- src/__phutil_library_map__.php | 784 +- src/__tests__/PhutilLibraryTestCase.php | 191 + src/channel/PhutilChannel.php | 426 + src/channel/PhutilChannelChannel.php | 112 + src/channel/PhutilExecChannel.php | 173 + src/channel/PhutilJSONProtocolChannel.php | 94 + src/channel/PhutilLogFileChannel.php | 41 + src/channel/PhutilMetricsChannel.php | 85 + .../PhutilPHPObjectProtocolChannel.php | 90 + src/channel/PhutilProtocolChannel.php | 139 + src/channel/PhutilSocketChannel.php | 192 + .../__tests__/PhutilChannelTestCase.php | 45 + .../PhutilJSONProtocolChannelTestCase.php | 26 + ...PhutilPHPObjectProtocolChannelTestCase.php | 66 + src/conduit/ConduitClient.php | 395 + src/conduit/ConduitClientException.php | 16 + src/conduit/ConduitFuture.php | 76 + .../__tests__/ConduitClientTestCase.php | 34 + src/console/PhutilConsole.php | 295 + src/console/PhutilConsoleFormatter.php | 98 + src/console/PhutilConsoleMessage.php | 39 + src/console/PhutilConsoleMetrics.php | 65 + src/console/PhutilConsoleProgressBar.php | 179 + src/console/PhutilConsoleServer.php | 158 + src/console/PhutilConsoleServerChannel.php | 12 + ...tilConsoleStdinNotInteractiveException.php | 18 + src/console/PhutilInteractiveEditor.php | 308 + .../__tests__/PhutilConsoleWrapTestCase.php | 48 + src/console/__tests__/wrap/long.txt | 1 + src/console/__tests__/wrap/long.txt.expect | 3 + src/console/__tests__/wrap/newlines.txt | 10 + .../__tests__/wrap/newlines.txt.expect | 10 + src/console/__tests__/wrap/plain.txt | 1 + src/console/__tests__/wrap/plain.txt.expect | 9 + .../__tests__/wrap/trailing-space-prompt.txt | 1 + .../wrap/trailing-space-prompt.txt.expect | 1 + src/console/__tests__/wrap/utf8.txt | 1 + src/console/__tests__/wrap/utf8.txt.expect | 2 + src/console/format.php | 209 + src/console/view/PhutilConsoleBlock.php | 48 + src/console/view/PhutilConsoleError.php | 10 + src/console/view/PhutilConsoleInfo.php | 10 + src/console/view/PhutilConsoleList.php | 63 + src/console/view/PhutilConsoleLogLine.php | 24 + src/console/view/PhutilConsoleSkip.php | 10 + src/console/view/PhutilConsoleTable.php | 296 + src/console/view/PhutilConsoleView.php | 112 + src/console/view/PhutilConsoleWarning.php | 10 + src/docs/article/aws.diviner | 8 + src/docs/article/command_execution.diviner | 64 + src/docs/article/core_quick_reference.diviner | 45 + src/docs/article/developing_xhpast.diviner | 17 + src/docs/article/overview.diviner | 57 + src/docs/article/using_futures.diviner | 90 + src/docs/book/libphutil.book | 87 + src/error/PhutilAggregateException.php | 55 + src/error/PhutilErrorHandler.php | 595 + src/error/PhutilErrorTrap.php | 83 + .../PhutilMethodNotImplementedException.php | 34 + src/error/PhutilOpaqueEnvelope.php | 72 + src/error/PhutilOpaqueEnvelopeKey.php | 45 + src/error/PhutilProxyException.php | 37 + .../__tests__/PhutilErrorHandlerTestCase.php | 39 + .../PhutilOpaqueEnvelopeTestCase.php | 47 + src/error/phlog.php | 68 + src/events/PhutilEvent.php | 39 + src/events/PhutilEventEngine.php | 75 + src/events/PhutilEventListener.php | 37 + src/events/constant/PhutilEventConstants.php | 3 + src/events/constant/PhutilEventType.php | 10 + src/exception/PhutilInvalidStateException.php | 30 + .../PhutilInvalidStateExceptionTestCase.php | 17 + src/filesystem/FileFinder.php | 365 + src/filesystem/FileList.php | 92 + src/filesystem/Filesystem.php | 1248 + src/filesystem/FilesystemException.php | 34 + src/filesystem/PhutilDeferredLog.php | 246 + src/filesystem/PhutilDirectoryFixture.php | 50 + src/filesystem/PhutilFileLock.php | 119 + src/filesystem/PhutilFileTree.php | 112 + src/filesystem/PhutilLock.php | 235 + src/filesystem/PhutilLockException.php | 16 + src/filesystem/PhutilProcessQuery.php | 125 + src/filesystem/PhutilProcessRef.php | 85 + src/filesystem/TempFile.php | 116 + .../__tests__/FileFinderTestCase.php | 232 + .../__tests__/FilesystemTestCase.php | 216 + .../__tests__/PhutilDeferredLogTestCase.php | 169 + .../__tests__/PhutilFileLockTestCase.php | 184 + .../__tests__/PhutilProcessRefTestCase.php | 59 + src/filesystem/__tests__/data/.hidden.txt | 1 + .../__tests__/data/exclude/file.txt | 1 + src/filesystem/__tests__/data/exclude/test | 1 + src/filesystem/__tests__/data/file.txt | 1 + .../data/include_dir.txt/anotherfile.txt | 1 + .../subdir.txt/alsoinclude.txt | 1 + .../data/include_dir.txt/subdir.txt/test | 1 + .../__tests__/data/include_dir.txt/test | 1 + src/filesystem/__tests__/data/test | 1 + src/filesystem/__tests__/data/test.txt | 1 + .../binary/PhutilBinaryAnalyzer.php | 67 + .../binary/PhutilDiffBinaryAnalyzer.php | 31 + .../binary/PhutilGitBinaryAnalyzer.php | 28 + .../binary/PhutilMercurialBinaryAnalyzer.php | 83 + .../binary/PhutilPygmentizeBinaryAnalyzer.php | 31 + .../binary/PhutilSubversionBinaryAnalyzer.php | 22 + .../PhutilBinaryAnalyzerTestCase.php | 117 + .../linesofalarge/LinesOfALarge.php | 224 + .../linesofalarge/LinesOfALargeExecFuture.php | 119 + .../linesofalarge/LinesOfALargeFile.php | 106 + .../LinesOfALargeExecFutureTestCase.php | 62 + .../__tests__/LinesOfALargeFileTestCase.php | 132 + src/future/Future.php | 189 + src/future/FutureIterator.php | 327 + src/future/FutureProxy.php | 71 + src/future/ImmediateFuture.php | 17 + .../__tests__/FutureIteratorTestCase.php | 23 + src/future/asana/PhutilAsanaFuture.php | 105 + .../aws/PhutilAWSCloudFormationFuture.php | 20 + src/future/aws/PhutilAWSCloudWatchFuture.php | 19 + src/future/aws/PhutilAWSEC2Future.php | 20 + src/future/aws/PhutilAWSException.php | 52 + src/future/aws/PhutilAWSFuture.php | 170 + src/future/aws/PhutilAWSS3Future.php | 70 + src/future/aws/PhutilAWSv4Signature.php | 265 + src/future/aws/PhutilCloudWatchMetric.php | 50 + .../PhutilAWSv4SignatureTestCase.php | 195 + .../PhutilAWSManagementWorkflow.php | 83 + .../PhutilAWSS3DeleteManagementWorkflow.php | 45 + .../PhutilAWSS3GetManagementWorkflow.php | 57 + .../PhutilAWSS3ManagementWorkflow.php | 27 + .../PhutilAWSS3PutManagementWorkflow.php | 52 + src/future/exec/CommandException.php | 78 + src/future/exec/ExecFuture.php | 976 + .../exec/PhutilBacktraceSignalHandler.php | 22 + .../exec/PhutilCallbackSignalHandler.php | 22 + .../PhutilConsoleMetricsSignalHandler.php | 14 + src/future/exec/PhutilExecPassthru.php | 141 + src/future/exec/PhutilExecutableFuture.php | 193 + src/future/exec/PhutilSignalHandler.php | 8 + src/future/exec/PhutilSignalRouter.php | 86 + .../exec/__tests__/ExecFutureTestCase.php | 155 + .../exec/__tests__/ExecPassthruTestCase.php | 16 + src/future/exec/execx.php | 107 + src/future/github/PhutilGitHubFuture.php | 130 + src/future/github/PhutilGitHubResponse.php | 49 + src/future/http/BaseHTTPFuture.php | 427 + src/future/http/HTTPFuture.php | 302 + src/future/http/HTTPSFuture.php | 824 + src/future/http/PhutilHTTPEngineExtension.php | 141 + .../status/HTTPFutureCURLResponseStatus.php | 86 + .../HTTPFutureCertificateResponseStatus.php | 33 + .../status/HTTPFutureHTTPResponseStatus.php | 67 + .../status/HTTPFutureParseResponseStatus.php | 32 + .../http/status/HTTPFutureResponseStatus.php | 43 + .../HTTPFutureTransportResponseStatus.php | 44 + src/future/oauth/PhutilOAuth1Future.php | 306 + .../__tests__/PhutilOAuth1FutureTestCase.php | 159 + src/future/paypal/PhutilPayPalAPIFuture.php | 88 + src/future/postmark/PhutilPostmarkFuture.php | 100 + src/future/slack/PhutilSlackFuture.php | 87 + src/future/twitch/PhutilTwitchFuture.php | 93 + .../wordpress/PhutilWordPressFuture.php | 89 + src/init/init-library.php | 70 + src/init/lib/PhutilBootloader.php | 332 + src/init/lib/PhutilBootloaderException.php | 3 + .../lib/PhutilLibraryConflictException.php | 86 + src/init/lib/PhutilMissingSymbolException.php | 29 + .../__tests__/PhutilModuleUtilsTestCase.php | 9 + src/init/lib/core.php | 10 + src/init/lib/moduleutils.php | 53 + src/internationalization/PhutilLocale.php | 247 + src/internationalization/PhutilNumber.php | 26 + src/internationalization/PhutilPerson.php | 11 + .../PhutilTranslation.php | 85 + src/internationalization/PhutilTranslator.php | 275 + .../__tests__/PhutilLocaleTestCase.php | 10 + .../__tests__/PhutilPersonTest.php | 20 + .../__tests__/PhutilPhtTestCase.php | 101 + .../__tests__/PhutilTranslationTestCase.php | 10 + .../__tests__/PhutilTranslatorTestCase.php | 200 + .../locales/PhutilAllCapsEnglishLocale.php | 38 + .../locales/PhutilBritishEnglishLocale.php | 20 + .../locales/PhutilCzechLocale.php | 30 + .../locales/PhutilEmojiLocale.php | 33 + .../locales/PhutilEnglishCanadaLocale.php | 20 + .../locales/PhutilFrenchLocale.php | 16 + .../locales/PhutilGermanLocale.php | 16 + .../locales/PhutilKoreanLocale.php | 16 + .../locales/PhutilPirateEnglishLocale.php | 24 + .../locales/PhutilPortugueseBrazilLocale.php | 16 + .../PhutilPortuguesePortugalLocale.php | 16 + .../locales/PhutilRawEnglishLocale.php | 21 + .../locales/PhutilSimplifiedChineseLocale.php | 16 + .../locales/PhutilSpanishSpainLocale.php | 16 + .../PhutilTraditionalChineseLocale.php | 16 + .../locales/PhutilUSEnglishLocale.php | 16 + .../locales/PhutilVeryWowEnglishLocale.php | 24 + src/internationalization/pht.php | 46 + .../LibphutilUSEnglishTranslation.php | 34 + src/ip/PhutilCIDRBlock.php | 84 + src/ip/PhutilCIDRList.php | 40 + src/ip/PhutilIPAddress.php | 43 + src/ip/PhutilIPv4Address.php | 86 + src/ip/PhutilIPv6Address.php | 212 + src/ip/__tests__/PhutilIPAddressTestCase.php | 339 + src/lexer/PhutilJSONFragmentLexer.php | 27 + src/lexer/PhutilJavaFragmentLexer.php | 120 + src/lexer/PhutilLexer.php | 362 + src/lexer/PhutilPHPFragmentLexer.php | 281 + src/lexer/PhutilPythonFragmentLexer.php | 314 + src/lexer/PhutilShellLexer.php | 86 + src/lexer/PhutilSimpleOptionsLexer.php | 90 + src/lexer/PhutilTypeLexer.php | 32 + .../PhutilPHPFragmentLexerTestCase.php | 317 + .../__tests__/PhutilShellLexerTestCase.php | 208 + .../PhutilSimpleOptionsLexerTestCase.php | 61 + src/lexer/__tests__/php/basics.txt | 1 + src/lexer/__tests__/php/case-insensitive.txt | 16 + src/lexer/__tests__/php/catch.txt | 3 + src/lexer/__tests__/php/comments.txt | 17 + src/lexer/__tests__/php/extendsimplements.txt | 3 + src/lexer/__tests__/php/haltcompiler.txt | 5 + src/lexer/__tests__/php/heredocs.txt | 17 + src/lexer/__tests__/php/pop-from-php.txt | 1 + src/lexer/__tests__/php/symbols.txt | 8 + .../__tests__/php/trailing-backslash-1.txt | 1 + .../__tests__/php/trailing-backslash-2.txt | 1 + .../__tests__/php/trailing-backslash-b.txt | 1 + src/lexer/__tests__/shell/basic.txt | 1 + src/lexer/__tests__/shell/escape.txt | 1 + src/lexer/__tests__/shell/slashes.txt | 2 + src/lexer/__tests__/shell/spaces.txt | 1 + src/lexer/__tests__/shell/strings.txt | 1 + src/lexer/__tests__/shell/unterminated.txt | 1 + .../linter/ArcanistPhutilLibraryLinter.php | 2 +- ...canistPHPCompatibilityXHPASTLinterRule.php | 4 +- src/moduleutils/PhutilLibraryMapBuilder.php | 514 + src/object/Phobject.php | 104 + src/object/__tests__/PhobjectTestCase.php | 40 + src/object/__tests__/PhutilTestPhobject.php | 3 + src/parser/PhutilBugtraqParser.php | 129 + src/parser/PhutilDocblockParser.php | 163 + src/parser/PhutilEditorConfig.php | 195 + src/parser/PhutilEmailAddress.php | 114 + src/parser/PhutilGitURI.php | 92 + src/parser/PhutilJSON.php | 155 + src/parser/PhutilJSONParser.php | 64 + src/parser/PhutilLanguageGuesser.php | 47 + src/parser/PhutilParserGenerator.php | 910 + src/parser/PhutilQueryStringParser.php | 139 + src/parser/PhutilSimpleOptions.php | 195 + src/parser/PhutilTypeSpec.php | 1921 + src/parser/PhutilURI.php | 559 + .../__tests__/PhutilBugtraqParserTestCase.php | 61 + .../PhutilDocblockParserTestCase.php | 127 + .../__tests__/PhutilEditorConfigTestCase.php | 106 + .../__tests__/PhutilEmailAddressTestCase.php | 130 + src/parser/__tests__/PhutilGitURITestCase.php | 28 + .../__tests__/PhutilJSONParserTestCase.php | 139 + src/parser/__tests__/PhutilJSONTestCase.php | 21 + .../PhutilLanguageGuesserTestCase.php | 23 + .../PhutilParserGeneratorTestCase.php | 330 + .../PhutilQueryStringParserTestCase.php | 140 + .../__tests__/PhutilSimpleOptionsTestCase.php | 143 + .../__tests__/PhutilTypeSpecTestCase.php | 320 + src/parser/__tests__/PhutilURITestCase.php | 417 + .../docblock/embedded-specials.docblock | 4 + .../__tests__/docblock/flag-specials.docblock | 15 + .../docblock/indented-block.docblock | 3 + .../docblock/indented-specials.docblock | 11 + .../__tests__/docblock/indented-text.docblock | 3 + .../linebreak-breaks-specials.docblock | 5 + .../__tests__/docblock/mixed-types.docblock | 4 + .../docblock/multi-specials.docblock | 8 + .../docblock/multiline-special.docblock | 5 + .../docblock/specials-with-hyphen.docblock | 7 + .../__tests__/docblock/specials.docblock | 8 + .../__tests__/editorconfig/.editorconfig | 23 + .../editorconfig/empty/.editorconfig | 1 + .../editorconfig/externals/.editorconfig | 0 .../editorconfig/subdir/.editorconfig | 3 + src/parser/__tests__/json/base64.data | 1 + src/parser/__tests__/json/base64.json | 1 + .../__tests__/languageguesser/bash.shebang | 3 + .../__tests__/languageguesser/console.path | 8 + .../__tests__/languageguesser/console.prompt | 8 + src/parser/__tests__/languageguesser/diff.git | 7 + .../__tests__/languageguesser/diff.udiff | 5 + .../__tests__/languageguesser/nothing-useful | 2 + .../__tests__/languageguesser/php.shell | 3 + .../__tests__/languageguesser/php.shell-env | 3 + src/parser/__tests__/languageguesser/php.test | 3 + .../__tests__/languageguesser/py.emacs-mode | 3 + .../__tests__/languageguesser/sh.shebang | 3 + src/parser/aast/api/AASTNode.php | 404 + src/parser/aast/api/AASTNodeList.php | 110 + src/parser/aast/api/AASTToken.php | 91 + src/parser/aast/api/AASTTree.php | 194 + src/parser/argument/PhutilArgumentParser.php | 935 + .../argument/PhutilArgumentSpecification.php | 268 + .../PhutilArgumentSpellingCorrector.php | 155 + .../PhutilArgumentParserTestCase.php | 426 + .../PhutilArgumentSpecificationTestCase.php | 142 + ...hutilArgumentSpellingCorrectorTestCase.php | 94 + .../PhutilArgumentParserException.php | 3 + .../PhutilArgumentSpecificationException.php | 4 + .../PhutilArgumentUsageException.php | 4 + .../workflow/PhutilArgumentWorkflow.php | 191 + .../workflow/PhutilHelpArgumentWorkflow.php | 45 + .../exception/PhutilINIParserException.php | 3 + .../exception/PhutilJSONParserException.php | 42 + .../exception/PhutilTypeCheckException.php | 40 + .../PhutilTypeExtraParametersException.php | 21 + .../PhutilTypeMissingParametersException.php | 21 + ...tilInvalidRuleParserGeneratorException.php | 4 + ...rreducibleRuleParserGeneratorException.php | 4 + .../PhutilParserGeneratorException.php | 3 + ...lUnknownSymbolParserGeneratorException.php | 4 + ...nreachableRuleParserGeneratorException.php | 4 + ...chableTerminalParserGeneratorException.php | 4 + src/parser/html/PhutilDOMNode.php | 208 + src/parser/html/PhutilHTMLParser.php | 434 + .../__tests__/PhutilHTMLParserTestCase.php | 104 + .../html/__tests__/data/attributes-basic.txt | 13 + .../html/__tests__/data/content-angle.txt | 7 + .../html/__tests__/data/content-simple.txt | 7 + src/parser/html/__tests__/data/tag-angle.txt | 13 + .../html/__tests__/data/tag-mismatch.txt | 21 + src/parser/html/__tests__/data/tag-simple.txt | 135 + src/parser/html/__tests__/data/tag-table.txt | 39 + src/parser/http/PhutilHTTPResponse.php | 62 + src/parser/http/PhutilHTTPResponseParser.php | 207 + .../PhutilHTTPResponseParserTestCase.php | 145 + .../xhpast/__tests__/PHPASTParserTestCase.php | 136 + .../__tests__/data/anonymous_class.php.test | 595 + .../__tests__/data/base-fail-parse.php.test | 8 + .../__tests__/data/base-fail-syntax.php.test | 3 + .../xhpast/__tests__/data/base-pass.php.test | 35 + .../data/call-time-pass-by-ref.php.test | 101 + .../xhpast/__tests__/data/namespace.php.test | 400 + .../__tests__/data/operator-coalesce.php.test | 126 + .../data/operator-spaceship-nonassoc.php.test | 4 + .../data/operator-spaceship.php.test | 93 + .../data/optional-parameter.php.test | 282 + .../php-access-on-instanciation-invalid.test | 13 + .../data/php-access-on-instanciation.test | 663 + .../data/php-array-dereference-2.test | 185 + .../data/php-array-dereference-3.test | 209 + .../data/php-array-dereference-4.test | 153 + .../__tests__/data/php-array-dereference.test | 658 + .../data/php-binary-literal.php.test | 55 + .../data/php-callable-typehint.php.test | 148 + .../__tests__/data/php-class-expr.php.test | 5 + .../__tests__/data/php-comments.php.test | 71 + .../__tests__/data/php-empty-heredoc.php.test | 95 + .../__tests__/data/php-finally.php.test | 177 + .../__tests__/data/php-foreach-list.php.test | 3 + .../data/php-heredoc-terminal.php.test | 53 + .../__tests__/data/php-literal-index.php.test | 163 + .../__tests__/data/php-literals.php.test | 368 + .../__tests__/data/php-nested-quotes.test | 5 + .../__tests__/data/php-only-finally.test | 107 + .../__tests__/data/php-short-array.php.test | 70 + .../xhpast/__tests__/data/php-syntax.php.test | 11367 +++ .../xhpast/__tests__/data/php-tags.php.test | 215 + .../xhpast/__tests__/data/php-traits.php.test | 938 + .../data/php-try-no-catch-or-finally.test | 3 + .../xhpast/__tests__/data/php-yield.php.test | 449 + .../__tests__/data/return-type.php.test | 2197 + .../__tests__/data/unpack-fail.php.test | 4 + src/parser/xhpast/__tests__/data/use.php.test | 380 + .../xhpast/__tests__/data/variadic.php.test | 718 + .../__tests__/data/yyinitdepth.php.test | 65 + src/parser/xhpast/api/XHPASTNode.php | 301 + .../xhpast/api/XHPASTSyntaxErrorException.php | 16 + src/parser/xhpast/api/XHPASTToken.php | 39 + src/parser/xhpast/api/XHPASTTree.php | 78 + .../api/__tests__/XHPASTNodeTestCase.php | 101 + .../api/__tests__/XHPASTTreeTestCase.php | 140 + .../api/__tests__/namespace/braces.lint-test | 18 + .../api/__tests__/namespace/mixed.php.test | 14 + .../__tests__/namespace/namespace.lint-test | 7 + .../namespace/no-namespace.lint-test | 6 + src/parser/xhpast/bin/PhutilXHPASTBinary.php | 134 + src/parser/xhpast/bin/xhpast.exe | Bin 0 -> 2397674 bytes src/parser/xhpast/parser_nodes.php | 127 + src/parser/xhpast/parser_tokens.php | 147 + src/phage/__tests__/PhageAgentTestCase.php | 49 + src/phage/action/PhageAction.php | 49 + src/phage/action/PhageAgentAction.php | 274 + src/phage/action/PhageExecuteAction.php | 62 + src/phage/action/PhageLocalAction.php | 10 + src/phage/action/PhagePlanAction.php | 55 + src/phage/agent/PhagePHPAgent.php | 145 + src/phage/bootloader/PhageAgentBootloader.php | 9 + .../bootloader/PhagePHPAgentBootloader.php | 103 + src/phage/util/PhutilBallOfPHP.php | 32 + src/progress/PhutilConsoleProgressSink.php | 115 + src/progress/PhutilProgressSink.php | 54 + .../PhutilReadableSerializer.php | 189 + .../PhutilReadableSerializerTestCase.php | 23 + src/serviceprofiler/PhutilServiceProfiler.php | 222 + src/symbols/PhutilClassMapQuery.php | 332 + src/symbols/PhutilSymbolLoader.php | 413 + src/utils/AbstractDirectedGraph.php | 337 + src/utils/CaseInsensitiveArray.php | 121 + src/utils/PhutilArray.php | 80 + src/utils/PhutilArrayWithDefaultValue.php | 49 + src/utils/PhutilBufferedIterator.php | 138 + src/utils/PhutilCallbackFilterIterator.php | 25 + src/utils/PhutilChunkedIterator.php | 60 + src/utils/PhutilCowsay.php | 147 + src/utils/PhutilDirectedScalarGraph.php | 17 + src/utils/PhutilEditDistanceMatrix.php | 562 + src/utils/PhutilExampleBufferedIterator.php | 32 + src/utils/PhutilExecutionEnvironment.php | 16 + src/utils/PhutilHashingIterator.php | 40 + src/utils/PhutilLunarPhase.php | 43 + src/utils/PhutilProxyIterator.php | 57 + src/utils/PhutilRope.php | 144 + src/utils/PhutilSortVector.php | 54 + src/utils/PhutilStreamIterator.php | 68 + src/utils/PhutilSystem.php | 164 + src/utils/PhutilUTF8StringTruncator.php | 295 + .../AbstractDirectedGraphTestCase.php | 179 + .../CaseInsensitiveArrayTestCase.php | 109 + src/utils/__tests__/MFilterTestHelper.php | 27 + src/utils/__tests__/PhutilArrayTestCase.php | 72 + .../PhutilBufferedIteratorTestCase.php | 25 + .../PhutilChunkedIteratorTestCase.php | 29 + src/utils/__tests__/PhutilCowsayTestCase.php | 60 + .../PhutilEditDistanceMatrixTestCase.php | 207 + .../PhutilHashingIteratorTestCase.php | 45 + .../__tests__/PhutilLunarPhaseTestCase.php | 58 + src/utils/__tests__/PhutilRopeTestCase.php | 56 + src/utils/__tests__/PhutilSystemTestCase.php | 43 + src/utils/__tests__/PhutilUTF8TestCase.php | 813 + src/utils/__tests__/PhutilUtilsTestCase.php | 969 + .../__tests__/TestAbstractDirectedGraph.php | 16 + src/utils/__tests__/cowsay/cube.expect | 12 + src/utils/__tests__/cowsay/cube.test | 15 + src/utils/__tests__/cowsay/cube_perl.expect | 12 + src/utils/__tests__/cowsay/cube_perl.test | 17 + .../__tests__/hashingiterator/mostlyprime.txt | 1007 + .../__tests__/memory/meminfo.ubuntu14.txt | 42 + .../__tests__/memory/vmstat.yosemite.txt | 23 + src/utils/utf8.php | 950 + src/utils/utils.php | 1920 + src/utils/viewutils.php | 170 + src/workflow/ArcanistLiberateWorkflow.php | 13 +- src/workflow/ArcanistUpgradeWorkflow.php | 1 - src/workflow/ArcanistVersionWorkflow.php | 1 - src/xsprintf/PhutilCommandString.php | 85 + src/xsprintf/PhutilTerminalString.php | 75 + .../__tests__/PhutilCsprintfTestCase.php | 96 + .../__tests__/PhutilHgsprintfTestCase.php | 23 + .../__tests__/PhutilPregsprintfTestCase.php | 23 + .../__tests__/PhutilTsprintfTestCase.php | 24 + .../__tests__/PhutilUrisprintfTestCase.php | 19 + src/xsprintf/csprintf.php | 140 + .../XsprintfUnknownConversionException.php | 10 + src/xsprintf/hgsprintf.php | 33 + src/xsprintf/jsprintf.php | 90 + src/xsprintf/ldapsprintf.php | 48 + src/xsprintf/pregsprintf.php | 45 + src/xsprintf/tsprintf.php | 44 + src/xsprintf/urisprintf.php | 50 + src/xsprintf/xsprintf.php | 127 + support/lib/extract-symbols.php | 587 + support/lib/rebuild-map.php | 78 + support/xhpast/Makefile | 77 + support/xhpast/README | 18 + support/xhpast/ast.hpp | 53 + support/xhpast/astnode.hpp | 106 + support/xhpast/build-xhpast.php | 9 + support/xhpast/generate_nodes.php | 164 + support/xhpast/parser.y | 2786 + support/xhpast/parser.yacc.cpp | 7622 ++ support/xhpast/parser.yacc.hpp | 202 + support/xhpast/parser_nodes.php | 127 + support/xhpast/scanner.l | 488 + support/xhpast/scanner.lex.cpp | 27213 +++++++ support/xhpast/scanner.lex.hpp | 731 + support/xhpast/xhpast.cpp | 121 + 499 files changed, 179518 insertions(+), 70 deletions(-) create mode 100644 externals/jsonlint/LICENSE create mode 100644 externals/jsonlint/src/Seld/JsonLint/JsonParser.php create mode 100644 externals/jsonlint/src/Seld/JsonLint/Lexer.php create mode 100644 externals/jsonlint/src/Seld/JsonLint/ParsingException.php create mode 100644 externals/jsonlint/src/Seld/JsonLint/Undefined.php create mode 100644 resources/php/symbol-information.json create mode 100644 resources/ssl/README create mode 100644 resources/ssl/default.pem create mode 100644 scripts/init/init-script.php create mode 100644 src/__tests__/PhutilLibraryTestCase.php create mode 100644 src/channel/PhutilChannel.php create mode 100644 src/channel/PhutilChannelChannel.php create mode 100644 src/channel/PhutilExecChannel.php create mode 100644 src/channel/PhutilJSONProtocolChannel.php create mode 100644 src/channel/PhutilLogFileChannel.php create mode 100644 src/channel/PhutilMetricsChannel.php create mode 100644 src/channel/PhutilPHPObjectProtocolChannel.php create mode 100644 src/channel/PhutilProtocolChannel.php create mode 100644 src/channel/PhutilSocketChannel.php create mode 100644 src/channel/__tests__/PhutilChannelTestCase.php create mode 100644 src/channel/__tests__/PhutilJSONProtocolChannelTestCase.php create mode 100644 src/channel/__tests__/PhutilPHPObjectProtocolChannelTestCase.php create mode 100644 src/conduit/ConduitClient.php create mode 100644 src/conduit/ConduitClientException.php create mode 100644 src/conduit/ConduitFuture.php create mode 100644 src/conduit/__tests__/ConduitClientTestCase.php create mode 100644 src/console/PhutilConsole.php create mode 100644 src/console/PhutilConsoleFormatter.php create mode 100644 src/console/PhutilConsoleMessage.php create mode 100644 src/console/PhutilConsoleMetrics.php create mode 100644 src/console/PhutilConsoleProgressBar.php create mode 100644 src/console/PhutilConsoleServer.php create mode 100644 src/console/PhutilConsoleServerChannel.php create mode 100644 src/console/PhutilConsoleStdinNotInteractiveException.php create mode 100644 src/console/PhutilInteractiveEditor.php create mode 100644 src/console/__tests__/PhutilConsoleWrapTestCase.php create mode 100644 src/console/__tests__/wrap/long.txt create mode 100644 src/console/__tests__/wrap/long.txt.expect create mode 100644 src/console/__tests__/wrap/newlines.txt create mode 100644 src/console/__tests__/wrap/newlines.txt.expect create mode 100644 src/console/__tests__/wrap/plain.txt create mode 100644 src/console/__tests__/wrap/plain.txt.expect create mode 100644 src/console/__tests__/wrap/trailing-space-prompt.txt create mode 100644 src/console/__tests__/wrap/trailing-space-prompt.txt.expect create mode 100644 src/console/__tests__/wrap/utf8.txt create mode 100644 src/console/__tests__/wrap/utf8.txt.expect create mode 100644 src/console/format.php create mode 100644 src/console/view/PhutilConsoleBlock.php create mode 100644 src/console/view/PhutilConsoleError.php create mode 100644 src/console/view/PhutilConsoleInfo.php create mode 100644 src/console/view/PhutilConsoleList.php create mode 100644 src/console/view/PhutilConsoleLogLine.php create mode 100644 src/console/view/PhutilConsoleSkip.php create mode 100644 src/console/view/PhutilConsoleTable.php create mode 100644 src/console/view/PhutilConsoleView.php create mode 100644 src/console/view/PhutilConsoleWarning.php create mode 100644 src/docs/article/aws.diviner create mode 100644 src/docs/article/command_execution.diviner create mode 100644 src/docs/article/core_quick_reference.diviner create mode 100644 src/docs/article/developing_xhpast.diviner create mode 100644 src/docs/article/overview.diviner create mode 100644 src/docs/article/using_futures.diviner create mode 100644 src/docs/book/libphutil.book create mode 100644 src/error/PhutilAggregateException.php create mode 100644 src/error/PhutilErrorHandler.php create mode 100644 src/error/PhutilErrorTrap.php create mode 100644 src/error/PhutilMethodNotImplementedException.php create mode 100644 src/error/PhutilOpaqueEnvelope.php create mode 100644 src/error/PhutilOpaqueEnvelopeKey.php create mode 100644 src/error/PhutilProxyException.php create mode 100644 src/error/__tests__/PhutilErrorHandlerTestCase.php create mode 100644 src/error/__tests__/PhutilOpaqueEnvelopeTestCase.php create mode 100644 src/error/phlog.php create mode 100644 src/events/PhutilEvent.php create mode 100644 src/events/PhutilEventEngine.php create mode 100644 src/events/PhutilEventListener.php create mode 100644 src/events/constant/PhutilEventConstants.php create mode 100644 src/events/constant/PhutilEventType.php create mode 100644 src/exception/PhutilInvalidStateException.php create mode 100644 src/exception/__tests__/PhutilInvalidStateExceptionTestCase.php create mode 100644 src/filesystem/FileFinder.php create mode 100644 src/filesystem/FileList.php create mode 100644 src/filesystem/Filesystem.php create mode 100644 src/filesystem/FilesystemException.php create mode 100644 src/filesystem/PhutilDeferredLog.php create mode 100644 src/filesystem/PhutilDirectoryFixture.php create mode 100644 src/filesystem/PhutilFileLock.php create mode 100644 src/filesystem/PhutilFileTree.php create mode 100644 src/filesystem/PhutilLock.php create mode 100644 src/filesystem/PhutilLockException.php create mode 100644 src/filesystem/PhutilProcessQuery.php create mode 100644 src/filesystem/PhutilProcessRef.php create mode 100644 src/filesystem/TempFile.php create mode 100644 src/filesystem/__tests__/FileFinderTestCase.php create mode 100644 src/filesystem/__tests__/FilesystemTestCase.php create mode 100644 src/filesystem/__tests__/PhutilDeferredLogTestCase.php create mode 100644 src/filesystem/__tests__/PhutilFileLockTestCase.php create mode 100644 src/filesystem/__tests__/PhutilProcessRefTestCase.php create mode 100644 src/filesystem/__tests__/data/.hidden.txt create mode 100644 src/filesystem/__tests__/data/exclude/file.txt create mode 100644 src/filesystem/__tests__/data/exclude/test create mode 100644 src/filesystem/__tests__/data/file.txt create mode 100644 src/filesystem/__tests__/data/include_dir.txt/anotherfile.txt create mode 100644 src/filesystem/__tests__/data/include_dir.txt/subdir.txt/alsoinclude.txt create mode 100644 src/filesystem/__tests__/data/include_dir.txt/subdir.txt/test create mode 100644 src/filesystem/__tests__/data/include_dir.txt/test create mode 100644 src/filesystem/__tests__/data/test create mode 100644 src/filesystem/__tests__/data/test.txt create mode 100644 src/filesystem/binary/PhutilBinaryAnalyzer.php create mode 100644 src/filesystem/binary/PhutilDiffBinaryAnalyzer.php create mode 100644 src/filesystem/binary/PhutilGitBinaryAnalyzer.php create mode 100644 src/filesystem/binary/PhutilMercurialBinaryAnalyzer.php create mode 100644 src/filesystem/binary/PhutilPygmentizeBinaryAnalyzer.php create mode 100644 src/filesystem/binary/PhutilSubversionBinaryAnalyzer.php create mode 100644 src/filesystem/binary/__tests__/PhutilBinaryAnalyzerTestCase.php create mode 100644 src/filesystem/linesofalarge/LinesOfALarge.php create mode 100644 src/filesystem/linesofalarge/LinesOfALargeExecFuture.php create mode 100644 src/filesystem/linesofalarge/LinesOfALargeFile.php create mode 100644 src/filesystem/linesofalarge/__tests__/LinesOfALargeExecFutureTestCase.php create mode 100644 src/filesystem/linesofalarge/__tests__/LinesOfALargeFileTestCase.php create mode 100644 src/future/Future.php create mode 100644 src/future/FutureIterator.php create mode 100644 src/future/FutureProxy.php create mode 100644 src/future/ImmediateFuture.php create mode 100644 src/future/__tests__/FutureIteratorTestCase.php create mode 100644 src/future/asana/PhutilAsanaFuture.php create mode 100644 src/future/aws/PhutilAWSCloudFormationFuture.php create mode 100644 src/future/aws/PhutilAWSCloudWatchFuture.php create mode 100644 src/future/aws/PhutilAWSEC2Future.php create mode 100644 src/future/aws/PhutilAWSException.php create mode 100644 src/future/aws/PhutilAWSFuture.php create mode 100644 src/future/aws/PhutilAWSS3Future.php create mode 100644 src/future/aws/PhutilAWSv4Signature.php create mode 100644 src/future/aws/PhutilCloudWatchMetric.php create mode 100644 src/future/aws/__tests__/PhutilAWSv4SignatureTestCase.php create mode 100644 src/future/aws/management/PhutilAWSManagementWorkflow.php create mode 100644 src/future/aws/management/PhutilAWSS3DeleteManagementWorkflow.php create mode 100644 src/future/aws/management/PhutilAWSS3GetManagementWorkflow.php create mode 100644 src/future/aws/management/PhutilAWSS3ManagementWorkflow.php create mode 100644 src/future/aws/management/PhutilAWSS3PutManagementWorkflow.php create mode 100644 src/future/exec/CommandException.php create mode 100644 src/future/exec/ExecFuture.php create mode 100644 src/future/exec/PhutilBacktraceSignalHandler.php create mode 100644 src/future/exec/PhutilCallbackSignalHandler.php create mode 100644 src/future/exec/PhutilConsoleMetricsSignalHandler.php create mode 100644 src/future/exec/PhutilExecPassthru.php create mode 100644 src/future/exec/PhutilExecutableFuture.php create mode 100644 src/future/exec/PhutilSignalHandler.php create mode 100644 src/future/exec/PhutilSignalRouter.php create mode 100644 src/future/exec/__tests__/ExecFutureTestCase.php create mode 100644 src/future/exec/__tests__/ExecPassthruTestCase.php create mode 100644 src/future/exec/execx.php create mode 100644 src/future/github/PhutilGitHubFuture.php create mode 100644 src/future/github/PhutilGitHubResponse.php create mode 100644 src/future/http/BaseHTTPFuture.php create mode 100644 src/future/http/HTTPFuture.php create mode 100644 src/future/http/HTTPSFuture.php create mode 100644 src/future/http/PhutilHTTPEngineExtension.php create mode 100644 src/future/http/status/HTTPFutureCURLResponseStatus.php create mode 100644 src/future/http/status/HTTPFutureCertificateResponseStatus.php create mode 100644 src/future/http/status/HTTPFutureHTTPResponseStatus.php create mode 100644 src/future/http/status/HTTPFutureParseResponseStatus.php create mode 100644 src/future/http/status/HTTPFutureResponseStatus.php create mode 100644 src/future/http/status/HTTPFutureTransportResponseStatus.php create mode 100644 src/future/oauth/PhutilOAuth1Future.php create mode 100644 src/future/oauth/__tests__/PhutilOAuth1FutureTestCase.php create mode 100644 src/future/paypal/PhutilPayPalAPIFuture.php create mode 100644 src/future/postmark/PhutilPostmarkFuture.php create mode 100644 src/future/slack/PhutilSlackFuture.php create mode 100644 src/future/twitch/PhutilTwitchFuture.php create mode 100644 src/future/wordpress/PhutilWordPressFuture.php create mode 100644 src/init/init-library.php create mode 100644 src/init/lib/PhutilBootloader.php create mode 100644 src/init/lib/PhutilBootloaderException.php create mode 100644 src/init/lib/PhutilLibraryConflictException.php create mode 100644 src/init/lib/PhutilMissingSymbolException.php create mode 100644 src/init/lib/__tests__/PhutilModuleUtilsTestCase.php create mode 100644 src/init/lib/core.php create mode 100644 src/init/lib/moduleutils.php create mode 100644 src/internationalization/PhutilLocale.php create mode 100644 src/internationalization/PhutilNumber.php create mode 100644 src/internationalization/PhutilPerson.php create mode 100644 src/internationalization/PhutilTranslation.php create mode 100644 src/internationalization/PhutilTranslator.php create mode 100644 src/internationalization/__tests__/PhutilLocaleTestCase.php create mode 100644 src/internationalization/__tests__/PhutilPersonTest.php create mode 100644 src/internationalization/__tests__/PhutilPhtTestCase.php create mode 100644 src/internationalization/__tests__/PhutilTranslationTestCase.php create mode 100644 src/internationalization/__tests__/PhutilTranslatorTestCase.php create mode 100644 src/internationalization/locales/PhutilAllCapsEnglishLocale.php create mode 100644 src/internationalization/locales/PhutilBritishEnglishLocale.php create mode 100644 src/internationalization/locales/PhutilCzechLocale.php create mode 100644 src/internationalization/locales/PhutilEmojiLocale.php create mode 100644 src/internationalization/locales/PhutilEnglishCanadaLocale.php create mode 100644 src/internationalization/locales/PhutilFrenchLocale.php create mode 100644 src/internationalization/locales/PhutilGermanLocale.php create mode 100644 src/internationalization/locales/PhutilKoreanLocale.php create mode 100644 src/internationalization/locales/PhutilPirateEnglishLocale.php create mode 100644 src/internationalization/locales/PhutilPortugueseBrazilLocale.php create mode 100644 src/internationalization/locales/PhutilPortuguesePortugalLocale.php create mode 100644 src/internationalization/locales/PhutilRawEnglishLocale.php create mode 100644 src/internationalization/locales/PhutilSimplifiedChineseLocale.php create mode 100644 src/internationalization/locales/PhutilSpanishSpainLocale.php create mode 100644 src/internationalization/locales/PhutilTraditionalChineseLocale.php create mode 100644 src/internationalization/locales/PhutilUSEnglishLocale.php create mode 100644 src/internationalization/locales/PhutilVeryWowEnglishLocale.php create mode 100644 src/internationalization/pht.php create mode 100644 src/internationalization/translation/LibphutilUSEnglishTranslation.php create mode 100644 src/ip/PhutilCIDRBlock.php create mode 100644 src/ip/PhutilCIDRList.php create mode 100644 src/ip/PhutilIPAddress.php create mode 100644 src/ip/PhutilIPv4Address.php create mode 100644 src/ip/PhutilIPv6Address.php create mode 100644 src/ip/__tests__/PhutilIPAddressTestCase.php create mode 100644 src/lexer/PhutilJSONFragmentLexer.php create mode 100644 src/lexer/PhutilJavaFragmentLexer.php create mode 100644 src/lexer/PhutilLexer.php create mode 100644 src/lexer/PhutilPHPFragmentLexer.php create mode 100644 src/lexer/PhutilPythonFragmentLexer.php create mode 100644 src/lexer/PhutilShellLexer.php create mode 100644 src/lexer/PhutilSimpleOptionsLexer.php create mode 100644 src/lexer/PhutilTypeLexer.php create mode 100644 src/lexer/__tests__/PhutilPHPFragmentLexerTestCase.php create mode 100644 src/lexer/__tests__/PhutilShellLexerTestCase.php create mode 100644 src/lexer/__tests__/PhutilSimpleOptionsLexerTestCase.php create mode 100644 src/lexer/__tests__/php/basics.txt create mode 100644 src/lexer/__tests__/php/case-insensitive.txt create mode 100644 src/lexer/__tests__/php/catch.txt create mode 100644 src/lexer/__tests__/php/comments.txt create mode 100644 src/lexer/__tests__/php/extendsimplements.txt create mode 100644 src/lexer/__tests__/php/haltcompiler.txt create mode 100644 src/lexer/__tests__/php/heredocs.txt create mode 100644 src/lexer/__tests__/php/pop-from-php.txt create mode 100644 src/lexer/__tests__/php/symbols.txt create mode 100644 src/lexer/__tests__/php/trailing-backslash-1.txt create mode 100644 src/lexer/__tests__/php/trailing-backslash-2.txt create mode 100644 src/lexer/__tests__/php/trailing-backslash-b.txt create mode 100644 src/lexer/__tests__/shell/basic.txt create mode 100644 src/lexer/__tests__/shell/escape.txt create mode 100644 src/lexer/__tests__/shell/slashes.txt create mode 100644 src/lexer/__tests__/shell/spaces.txt create mode 100644 src/lexer/__tests__/shell/strings.txt create mode 100644 src/lexer/__tests__/shell/unterminated.txt create mode 100644 src/moduleutils/PhutilLibraryMapBuilder.php create mode 100644 src/object/Phobject.php create mode 100644 src/object/__tests__/PhobjectTestCase.php create mode 100644 src/object/__tests__/PhutilTestPhobject.php create mode 100644 src/parser/PhutilBugtraqParser.php create mode 100644 src/parser/PhutilDocblockParser.php create mode 100644 src/parser/PhutilEditorConfig.php create mode 100644 src/parser/PhutilEmailAddress.php create mode 100644 src/parser/PhutilGitURI.php create mode 100644 src/parser/PhutilJSON.php create mode 100644 src/parser/PhutilJSONParser.php create mode 100644 src/parser/PhutilLanguageGuesser.php create mode 100644 src/parser/PhutilParserGenerator.php create mode 100644 src/parser/PhutilQueryStringParser.php create mode 100644 src/parser/PhutilSimpleOptions.php create mode 100644 src/parser/PhutilTypeSpec.php create mode 100644 src/parser/PhutilURI.php create mode 100644 src/parser/__tests__/PhutilBugtraqParserTestCase.php create mode 100644 src/parser/__tests__/PhutilDocblockParserTestCase.php create mode 100644 src/parser/__tests__/PhutilEditorConfigTestCase.php create mode 100644 src/parser/__tests__/PhutilEmailAddressTestCase.php create mode 100644 src/parser/__tests__/PhutilGitURITestCase.php create mode 100644 src/parser/__tests__/PhutilJSONParserTestCase.php create mode 100644 src/parser/__tests__/PhutilJSONTestCase.php create mode 100644 src/parser/__tests__/PhutilLanguageGuesserTestCase.php create mode 100644 src/parser/__tests__/PhutilParserGeneratorTestCase.php create mode 100644 src/parser/__tests__/PhutilQueryStringParserTestCase.php create mode 100644 src/parser/__tests__/PhutilSimpleOptionsTestCase.php create mode 100644 src/parser/__tests__/PhutilTypeSpecTestCase.php create mode 100644 src/parser/__tests__/PhutilURITestCase.php create mode 100644 src/parser/__tests__/docblock/embedded-specials.docblock create mode 100644 src/parser/__tests__/docblock/flag-specials.docblock create mode 100644 src/parser/__tests__/docblock/indented-block.docblock create mode 100644 src/parser/__tests__/docblock/indented-specials.docblock create mode 100644 src/parser/__tests__/docblock/indented-text.docblock create mode 100644 src/parser/__tests__/docblock/linebreak-breaks-specials.docblock create mode 100644 src/parser/__tests__/docblock/mixed-types.docblock create mode 100644 src/parser/__tests__/docblock/multi-specials.docblock create mode 100644 src/parser/__tests__/docblock/multiline-special.docblock create mode 100644 src/parser/__tests__/docblock/specials-with-hyphen.docblock create mode 100644 src/parser/__tests__/docblock/specials.docblock create mode 100644 src/parser/__tests__/editorconfig/.editorconfig create mode 100644 src/parser/__tests__/editorconfig/empty/.editorconfig create mode 100644 src/parser/__tests__/editorconfig/externals/.editorconfig create mode 100644 src/parser/__tests__/editorconfig/subdir/.editorconfig create mode 100644 src/parser/__tests__/json/base64.data create mode 100644 src/parser/__tests__/json/base64.json create mode 100644 src/parser/__tests__/languageguesser/bash.shebang create mode 100644 src/parser/__tests__/languageguesser/console.path create mode 100644 src/parser/__tests__/languageguesser/console.prompt create mode 100644 src/parser/__tests__/languageguesser/diff.git create mode 100644 src/parser/__tests__/languageguesser/diff.udiff create mode 100644 src/parser/__tests__/languageguesser/nothing-useful create mode 100644 src/parser/__tests__/languageguesser/php.shell create mode 100644 src/parser/__tests__/languageguesser/php.shell-env create mode 100644 src/parser/__tests__/languageguesser/php.test create mode 100644 src/parser/__tests__/languageguesser/py.emacs-mode create mode 100644 src/parser/__tests__/languageguesser/sh.shebang create mode 100644 src/parser/aast/api/AASTNode.php create mode 100644 src/parser/aast/api/AASTNodeList.php create mode 100644 src/parser/aast/api/AASTToken.php create mode 100644 src/parser/aast/api/AASTTree.php create mode 100644 src/parser/argument/PhutilArgumentParser.php create mode 100644 src/parser/argument/PhutilArgumentSpecification.php create mode 100644 src/parser/argument/PhutilArgumentSpellingCorrector.php create mode 100644 src/parser/argument/__tests__/PhutilArgumentParserTestCase.php create mode 100644 src/parser/argument/__tests__/PhutilArgumentSpecificationTestCase.php create mode 100644 src/parser/argument/__tests__/PhutilArgumentSpellingCorrectorTestCase.php create mode 100644 src/parser/argument/exception/PhutilArgumentParserException.php create mode 100644 src/parser/argument/exception/PhutilArgumentSpecificationException.php create mode 100644 src/parser/argument/exception/PhutilArgumentUsageException.php create mode 100644 src/parser/argument/workflow/PhutilArgumentWorkflow.php create mode 100644 src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php create mode 100644 src/parser/exception/PhutilINIParserException.php create mode 100644 src/parser/exception/PhutilJSONParserException.php create mode 100644 src/parser/exception/PhutilTypeCheckException.php create mode 100644 src/parser/exception/PhutilTypeExtraParametersException.php create mode 100644 src/parser/exception/PhutilTypeMissingParametersException.php create mode 100644 src/parser/generator/exception/PhutilInvalidRuleParserGeneratorException.php create mode 100644 src/parser/generator/exception/PhutilIrreducibleRuleParserGeneratorException.php create mode 100644 src/parser/generator/exception/PhutilParserGeneratorException.php create mode 100644 src/parser/generator/exception/PhutilUnknownSymbolParserGeneratorException.php create mode 100644 src/parser/generator/exception/PhutilUnreachableRuleParserGeneratorException.php create mode 100644 src/parser/generator/exception/PhutilUnreachableTerminalParserGeneratorException.php create mode 100644 src/parser/html/PhutilDOMNode.php create mode 100644 src/parser/html/PhutilHTMLParser.php create mode 100644 src/parser/html/__tests__/PhutilHTMLParserTestCase.php create mode 100644 src/parser/html/__tests__/data/attributes-basic.txt create mode 100644 src/parser/html/__tests__/data/content-angle.txt create mode 100644 src/parser/html/__tests__/data/content-simple.txt create mode 100644 src/parser/html/__tests__/data/tag-angle.txt create mode 100644 src/parser/html/__tests__/data/tag-mismatch.txt create mode 100644 src/parser/html/__tests__/data/tag-simple.txt create mode 100644 src/parser/html/__tests__/data/tag-table.txt create mode 100644 src/parser/http/PhutilHTTPResponse.php create mode 100644 src/parser/http/PhutilHTTPResponseParser.php create mode 100644 src/parser/http/__tests__/PhutilHTTPResponseParserTestCase.php create mode 100644 src/parser/xhpast/__tests__/PHPASTParserTestCase.php create mode 100644 src/parser/xhpast/__tests__/data/anonymous_class.php.test create mode 100644 src/parser/xhpast/__tests__/data/base-fail-parse.php.test create mode 100644 src/parser/xhpast/__tests__/data/base-fail-syntax.php.test create mode 100644 src/parser/xhpast/__tests__/data/base-pass.php.test create mode 100644 src/parser/xhpast/__tests__/data/call-time-pass-by-ref.php.test create mode 100644 src/parser/xhpast/__tests__/data/namespace.php.test create mode 100644 src/parser/xhpast/__tests__/data/operator-coalesce.php.test create mode 100644 src/parser/xhpast/__tests__/data/operator-spaceship-nonassoc.php.test create mode 100644 src/parser/xhpast/__tests__/data/operator-spaceship.php.test create mode 100644 src/parser/xhpast/__tests__/data/optional-parameter.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-access-on-instanciation-invalid.test create mode 100644 src/parser/xhpast/__tests__/data/php-access-on-instanciation.test create mode 100644 src/parser/xhpast/__tests__/data/php-array-dereference-2.test create mode 100644 src/parser/xhpast/__tests__/data/php-array-dereference-3.test create mode 100644 src/parser/xhpast/__tests__/data/php-array-dereference-4.test create mode 100644 src/parser/xhpast/__tests__/data/php-array-dereference.test create mode 100644 src/parser/xhpast/__tests__/data/php-binary-literal.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-callable-typehint.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-class-expr.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-comments.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-empty-heredoc.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-finally.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-foreach-list.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-heredoc-terminal.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-literal-index.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-literals.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-nested-quotes.test create mode 100644 src/parser/xhpast/__tests__/data/php-only-finally.test create mode 100644 src/parser/xhpast/__tests__/data/php-short-array.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-syntax.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-tags.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-traits.php.test create mode 100644 src/parser/xhpast/__tests__/data/php-try-no-catch-or-finally.test create mode 100644 src/parser/xhpast/__tests__/data/php-yield.php.test create mode 100644 src/parser/xhpast/__tests__/data/return-type.php.test create mode 100644 src/parser/xhpast/__tests__/data/unpack-fail.php.test create mode 100644 src/parser/xhpast/__tests__/data/use.php.test create mode 100644 src/parser/xhpast/__tests__/data/variadic.php.test create mode 100644 src/parser/xhpast/__tests__/data/yyinitdepth.php.test create mode 100644 src/parser/xhpast/api/XHPASTNode.php create mode 100644 src/parser/xhpast/api/XHPASTSyntaxErrorException.php create mode 100644 src/parser/xhpast/api/XHPASTToken.php create mode 100644 src/parser/xhpast/api/XHPASTTree.php create mode 100644 src/parser/xhpast/api/__tests__/XHPASTNodeTestCase.php create mode 100644 src/parser/xhpast/api/__tests__/XHPASTTreeTestCase.php create mode 100644 src/parser/xhpast/api/__tests__/namespace/braces.lint-test create mode 100644 src/parser/xhpast/api/__tests__/namespace/mixed.php.test create mode 100644 src/parser/xhpast/api/__tests__/namespace/namespace.lint-test create mode 100644 src/parser/xhpast/api/__tests__/namespace/no-namespace.lint-test create mode 100644 src/parser/xhpast/bin/PhutilXHPASTBinary.php create mode 100644 src/parser/xhpast/bin/xhpast.exe create mode 100644 src/parser/xhpast/parser_nodes.php create mode 100644 src/parser/xhpast/parser_tokens.php create mode 100644 src/phage/__tests__/PhageAgentTestCase.php create mode 100644 src/phage/action/PhageAction.php create mode 100644 src/phage/action/PhageAgentAction.php create mode 100644 src/phage/action/PhageExecuteAction.php create mode 100644 src/phage/action/PhageLocalAction.php create mode 100644 src/phage/action/PhagePlanAction.php create mode 100644 src/phage/agent/PhagePHPAgent.php create mode 100644 src/phage/bootloader/PhageAgentBootloader.php create mode 100644 src/phage/bootloader/PhagePHPAgentBootloader.php create mode 100644 src/phage/util/PhutilBallOfPHP.php create mode 100644 src/progress/PhutilConsoleProgressSink.php create mode 100644 src/progress/PhutilProgressSink.php create mode 100644 src/readableserializer/PhutilReadableSerializer.php create mode 100644 src/readableserializer/__tests__/PhutilReadableSerializerTestCase.php create mode 100644 src/serviceprofiler/PhutilServiceProfiler.php create mode 100644 src/symbols/PhutilClassMapQuery.php create mode 100644 src/symbols/PhutilSymbolLoader.php create mode 100644 src/utils/AbstractDirectedGraph.php create mode 100644 src/utils/CaseInsensitiveArray.php create mode 100644 src/utils/PhutilArray.php create mode 100644 src/utils/PhutilArrayWithDefaultValue.php create mode 100644 src/utils/PhutilBufferedIterator.php create mode 100644 src/utils/PhutilCallbackFilterIterator.php create mode 100644 src/utils/PhutilChunkedIterator.php create mode 100644 src/utils/PhutilCowsay.php create mode 100644 src/utils/PhutilDirectedScalarGraph.php create mode 100644 src/utils/PhutilEditDistanceMatrix.php create mode 100644 src/utils/PhutilExampleBufferedIterator.php create mode 100644 src/utils/PhutilExecutionEnvironment.php create mode 100644 src/utils/PhutilHashingIterator.php create mode 100644 src/utils/PhutilLunarPhase.php create mode 100644 src/utils/PhutilProxyIterator.php create mode 100644 src/utils/PhutilRope.php create mode 100644 src/utils/PhutilSortVector.php create mode 100644 src/utils/PhutilStreamIterator.php create mode 100644 src/utils/PhutilSystem.php create mode 100644 src/utils/PhutilUTF8StringTruncator.php create mode 100644 src/utils/__tests__/AbstractDirectedGraphTestCase.php create mode 100644 src/utils/__tests__/CaseInsensitiveArrayTestCase.php create mode 100644 src/utils/__tests__/MFilterTestHelper.php create mode 100644 src/utils/__tests__/PhutilArrayTestCase.php create mode 100644 src/utils/__tests__/PhutilBufferedIteratorTestCase.php create mode 100644 src/utils/__tests__/PhutilChunkedIteratorTestCase.php create mode 100644 src/utils/__tests__/PhutilCowsayTestCase.php create mode 100644 src/utils/__tests__/PhutilEditDistanceMatrixTestCase.php create mode 100644 src/utils/__tests__/PhutilHashingIteratorTestCase.php create mode 100644 src/utils/__tests__/PhutilLunarPhaseTestCase.php create mode 100644 src/utils/__tests__/PhutilRopeTestCase.php create mode 100644 src/utils/__tests__/PhutilSystemTestCase.php create mode 100644 src/utils/__tests__/PhutilUTF8TestCase.php create mode 100644 src/utils/__tests__/PhutilUtilsTestCase.php create mode 100644 src/utils/__tests__/TestAbstractDirectedGraph.php create mode 100644 src/utils/__tests__/cowsay/cube.expect create mode 100644 src/utils/__tests__/cowsay/cube.test create mode 100644 src/utils/__tests__/cowsay/cube_perl.expect create mode 100644 src/utils/__tests__/cowsay/cube_perl.test create mode 100644 src/utils/__tests__/hashingiterator/mostlyprime.txt create mode 100644 src/utils/__tests__/memory/meminfo.ubuntu14.txt create mode 100644 src/utils/__tests__/memory/vmstat.yosemite.txt create mode 100644 src/utils/utf8.php create mode 100644 src/utils/utils.php create mode 100644 src/utils/viewutils.php create mode 100644 src/xsprintf/PhutilCommandString.php create mode 100644 src/xsprintf/PhutilTerminalString.php create mode 100644 src/xsprintf/__tests__/PhutilCsprintfTestCase.php create mode 100644 src/xsprintf/__tests__/PhutilHgsprintfTestCase.php create mode 100644 src/xsprintf/__tests__/PhutilPregsprintfTestCase.php create mode 100644 src/xsprintf/__tests__/PhutilTsprintfTestCase.php create mode 100644 src/xsprintf/__tests__/PhutilUrisprintfTestCase.php create mode 100644 src/xsprintf/csprintf.php create mode 100644 src/xsprintf/exception/XsprintfUnknownConversionException.php create mode 100644 src/xsprintf/hgsprintf.php create mode 100644 src/xsprintf/jsprintf.php create mode 100644 src/xsprintf/ldapsprintf.php create mode 100644 src/xsprintf/pregsprintf.php create mode 100644 src/xsprintf/tsprintf.php create mode 100644 src/xsprintf/urisprintf.php create mode 100644 src/xsprintf/xsprintf.php create mode 100755 support/lib/extract-symbols.php create mode 100755 support/lib/rebuild-map.php create mode 100644 support/xhpast/Makefile create mode 100644 support/xhpast/README create mode 100644 support/xhpast/ast.hpp create mode 100644 support/xhpast/astnode.hpp create mode 100755 support/xhpast/build-xhpast.php create mode 100755 support/xhpast/generate_nodes.php create mode 100644 support/xhpast/parser.y create mode 100644 support/xhpast/parser.yacc.cpp create mode 100644 support/xhpast/parser.yacc.hpp create mode 100644 support/xhpast/parser_nodes.php create mode 100644 support/xhpast/scanner.l create mode 100644 support/xhpast/scanner.lex.cpp create mode 100644 support/xhpast/scanner.lex.hpp create mode 100644 support/xhpast/xhpast.cpp diff --git a/.arclint b/.arclint index d6233a0f..7080c039 100644 --- a/.arclint +++ b/.arclint @@ -36,7 +36,19 @@ "exclude": "(^resources/spelling/.*\\.json$)" }, "text": { - "type": "text" + "type": "text", + "exclude": [ + "(^src/(.*/)?__tests__/[^/]+/.*\\.(txt|json|expect))" + ] + }, + "text-without-length": { + "type": "text", + "include": [ + "(^src/(.*/)?__tests__/[^/]+/.*\\.(txt|json|expect))" + ], + "severity": { + "3": "disabled" + } }, "xhpast": { "type": "xhpast", diff --git a/.gitignore b/.gitignore index 824a9e89..53eeb426 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,22 @@ # User extensions /externals/includes/* /src/extensions/* + +# XHPAST +/support/xhpast/*.a +/support/xhpast/*.o +/support/xhpast/parser.yacc.output +/support/xhpast/node_names.hpp +/support/xhpast/xhpast +/support/xhpast/xhpast.exe +/src/parser/xhpast/bin/xhpast + +## NOTE: Don't .gitignore these files! Even though they're build artifacts, we +## want to check them in so users can build xhpast without flex/bison. +# /support/xhpast/parser.yacc.cpp +# /support/xhpast/parser.yacc.hpp +# /support/xhpast/scanner.lex.cpp +# /support/xhpast/scanner.lex.hpp + +# This is an OS X build artifact. +/support/xhpast/xhpast.dSYM diff --git a/externals/jsonlint/LICENSE b/externals/jsonlint/LICENSE new file mode 100644 index 00000000..c2344874 --- /dev/null +++ b/externals/jsonlint/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011 Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/externals/jsonlint/src/Seld/JsonLint/JsonParser.php b/externals/jsonlint/src/Seld/JsonLint/JsonParser.php new file mode 100644 index 00000000..7100abfa --- /dev/null +++ b/externals/jsonlint/src/Seld/JsonLint/JsonParser.php @@ -0,0 +1,488 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Parser class + * + * Example: + * + * $parser = new JsonParser(); + * // returns null if it's valid json, or an error object + * $parser->lint($json); + * // returns parsed json, like json_decode does, but slower, throws exceptions on failure. + * $parser->parse($json); + * + * Ported from https://github.com/zaach/jsonlint + */ +class JsonLintJsonParser +{ + const DETECT_KEY_CONFLICTS = 1; + const ALLOW_DUPLICATE_KEYS = 2; + const PARSE_TO_ASSOC = 4; + + private $lexer; + + private $flags; + private $stack; + private $vstack; // semantic value stack + private $lstack; // location stack + + private $symbols = array( + 'error' => 2, + 'JSONString' => 3, + 'STRING' => 4, + 'JSONNumber' => 5, + 'NUMBER' => 6, + 'JSONNullLiteral' => 7, + 'NULL' => 8, + 'JSONBooleanLiteral' => 9, + 'TRUE' => 10, + 'FALSE' => 11, + 'JSONText' => 12, + 'JSONValue' => 13, + 'EOF' => 14, + 'JSONObject' => 15, + 'JSONArray' => 16, + '{' => 17, + '}' => 18, + 'JSONMemberList' => 19, + 'JSONMember' => 20, + ':' => 21, + ',' => 22, + '[' => 23, + ']' => 24, + 'JSONElementList' => 25, + '$accept' => 0, + '$end' => 1, + ); + + private $terminals_ = array( + 2 => "error", + 4 => "STRING", + 6 => "NUMBER", + 8 => "NULL", + 10 => "TRUE", + 11 => "FALSE", + 14 => "EOF", + 17 => "{", + 18 => "}", + 21 => ":", + 22 => ",", + 23 => "[", + 24 => "]", + ); + + private $productions_ = array( + 0, + array(3, 1), + array(5, 1), + array(7, 1), + array(9, 1), + array(9, 1), + array(12, 2), + array(13, 1), + array(13, 1), + array(13, 1), + array(13, 1), + array(13, 1), + array(13, 1), + array(15, 2), + array(15, 3), + array(20, 3), + array(19, 1), + array(19, 3), + array(16, 2), + array(16, 3), + array(25, 1), + array(25, 3) + ); + + private $table = array(array(3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 12 => 1, 13 => 2, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15)), array( 1 => array(3)), array( 14 => array(1,16)), array( 14 => array(2,7), 18 => array(2,7), 22 => array(2,7), 24 => array(2,7)), array( 14 => array(2,8), 18 => array(2,8), 22 => array(2,8), 24 => array(2,8)), array( 14 => array(2,9), 18 => array(2,9), 22 => array(2,9), 24 => array(2,9)), array( 14 => array(2,10), 18 => array(2,10), 22 => array(2,10), 24 => array(2,10)), array( 14 => array(2,11), 18 => array(2,11), 22 => array(2,11), 24 => array(2,11)), array( 14 => array(2,12), 18 => array(2,12), 22 => array(2,12), 24 => array(2,12)), array( 14 => array(2,3), 18 => array(2,3), 22 => array(2,3), 24 => array(2,3)), array( 14 => array(2,4), 18 => array(2,4), 22 => array(2,4), 24 => array(2,4)), array( 14 => array(2,5), 18 => array(2,5), 22 => array(2,5), 24 => array(2,5)), array( 14 => array(2,1), 18 => array(2,1), 21 => array(2,1), 22 => array(2,1), 24 => array(2,1)), array( 14 => array(2,2), 18 => array(2,2), 22 => array(2,2), 24 => array(2,2)), array( 3 => 20, 4 => array(1,12), 18 => array(1,17), 19 => 18, 20 => 19 ), array( 3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 13 => 23, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15), 24 => array(1,21), 25 => 22 ), array( 1 => array(2,6)), array( 14 => array(2,13), 18 => array(2,13), 22 => array(2,13), 24 => array(2,13)), array( 18 => array(1,24), 22 => array(1,25)), array( 18 => array(2,16), 22 => array(2,16)), array( 21 => array(1,26)), array( 14 => array(2,18), 18 => array(2,18), 22 => array(2,18), 24 => array(2,18)), array( 22 => array(1,28), 24 => array(1,27)), array( 22 => array(2,20), 24 => array(2,20)), array( 14 => array(2,14), 18 => array(2,14), 22 => array(2,14), 24 => array(2,14)), array( 3 => 20, 4 => array(1,12), 20 => 29 ), array( 3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 13 => 30, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15)), array( 14 => array(2,19), 18 => array(2,19), 22 => array(2,19), 24 => array(2,19)), array( 3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 13 => 31, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15)), array( 18 => array(2,17), 22 => array(2,17)), array( 18 => array(2,15), 22 => array(2,15)), array( 22 => array(2,21), 24 => array(2,21)), + ); + + private $defaultActions = array( + 16 => array(2, 6) + ); + + /** + * @param string $input JSON string + * @return null|JsonLintParsingException null if no error is found, a JsonLintParsingException containing all details otherwise + */ + public function lint($input) + { + try { + $this->parse($input); + } catch (JsonLintParsingException $e) { + return $e; + } + } + + /** + * @param string $input JSON string + * @return mixed + * @throws JsonLintParsingException + */ + public function parse($input, $flags = 0) + { + $this->failOnBOM($input); + + $this->flags = $flags; + + $this->stack = array(0); + $this->vstack = array(null); + $this->lstack = array(); + + $yytext = ''; + $yylineno = 0; + $yyleng = 0; + $recovering = 0; + $TERROR = 2; + $EOF = 1; + + $this->lexer = new JsonLintLexer(); + $this->lexer->setInput($input); + + $yyloc = $this->lexer->yylloc; + $this->lstack[] = $yyloc; + + $symbol = null; + $preErrorSymbol = null; + $state = null; + $action = null; + $a = null; + $r = null; + $yyval = new stdClass; + $p = null; + $len = null; + $newState = null; + $expected = null; + $errStr = null; + + while (true) { + // retrieve state number from top of stack + $state = $this->stack[count($this->stack)-1]; + + // use default actions if available + if (isset($this->defaultActions[$state])) { + $action = $this->defaultActions[$state]; + } else { + if ($symbol == null) { + $symbol = $this->lex(); + } + // read action for current state and first input + $action = isset($this->table[$state][$symbol]) ? $this->table[$state][$symbol] : false; + } + + // handle parse error + if (!$action || !$action[0]) { + if (!$recovering) { + // Report error + $expected = array(); + foreach ($this->table[$state] as $p => $ignore) { + if (isset($this->terminals_[$p]) && $p > 2) { + $expected[] = "'" . $this->terminals_[$p] . "'"; + } + } + + $message = null; + if (in_array("'STRING'", $expected) && in_array(substr($this->lexer->match, 0, 1), array('"', "'"))) { + $message = "Invalid string"; + if ("'" === substr($this->lexer->match, 0, 1)) { + $message .= ", it appears you used single quotes instead of double quotes"; + } elseif (preg_match('{".+?(\\\\[^"bfnrt/\\\\u])}', $this->lexer->getUpcomingInput(), $match)) { + $message .= ", it appears you have an unescaped backslash at: ".$match[1]; + } elseif (preg_match('{"(?:[^"]+|\\\\")*$}m', $this->lexer->getUpcomingInput())) { + $message .= ", it appears you forgot to terminate the string, or attempted to write a multiline string which is invalid"; + } + } + + $errStr = 'Parse error on line ' . ($yylineno+1) . ":\n"; + $errStr .= $this->lexer->showPosition() . "\n"; + if ($message) { + $errStr .= $message; + } else { + $errStr .= (count($expected) > 1) ? "Expected one of: " : "Expected: "; + $errStr .= implode(', ', $expected); + } + + if (',' === substr(trim($this->lexer->getPastInput()), -1)) { + $errStr .= " - It appears you have an extra trailing comma"; + } + + $this->parseError($errStr, array( + 'text' => $this->lexer->match, + 'token' => !empty($this->terminals_[$symbol]) ? $this->terminals_[$symbol] : $symbol, + 'line' => $this->lexer->yylineno, + 'loc' => $yyloc, + 'expected' => $expected, + )); + } + + // just recovered from another error + if ($recovering == 3) { + if ($symbol == $EOF) { + throw new JsonLintParsingException($errStr ? $errStr : 'Parsing halted.'); + } + + // discard current lookahead and grab another + $yyleng = $this->lexer->yyleng; + $yytext = $this->lexer->yytext; + $yylineno = $this->lexer->yylineno; + $yyloc = $this->lexer->yylloc; + $symbol = $this->lex(); + } + + // try to recover from error + while (true) { + // check for error recovery rule in this state + if (array_key_exists($TERROR, $this->table[$state])) { + break; + } + if ($state == 0) { + throw new JsonLintParsingException($errStr ? $errStr : 'Parsing halted.'); + } + $this->popStack(1); + $state = $this->stack[count($this->stack)-1]; + } + + $preErrorSymbol = $symbol; // save the lookahead token + $symbol = $TERROR; // insert generic error symbol as new lookahead + $state = $this->stack[count($this->stack)-1]; + $action = isset($this->table[$state][$TERROR]) ? $this->table[$state][$TERROR] : false; + $recovering = 3; // allow 3 real symbols to be shifted before reporting a new error + } + + // this shouldn't happen, unless resolve defaults are off + if (is_array($action[0]) && count($action) > 1) { + throw new JsonLintParsingException('Parse Error: multiple actions possible at state: ' . $state . ', token: ' . $symbol); + } + + switch ($action[0]) { + case 1: // shift + $this->stack[] = $symbol; + $this->vstack[] = $this->lexer->yytext; + $this->lstack[] = $this->lexer->yylloc; + $this->stack[] = $action[1]; // push state + $symbol = null; + if (!$preErrorSymbol) { // normal execution/no error + $yyleng = $this->lexer->yyleng; + $yytext = $this->lexer->yytext; + $yylineno = $this->lexer->yylineno; + $yyloc = $this->lexer->yylloc; + if ($recovering > 0) { + $recovering--; + } + } else { // error just occurred, resume old lookahead f/ before error + $symbol = $preErrorSymbol; + $preErrorSymbol = null; + } + break; + + case 2: // reduce + $len = $this->productions_[$action[1]][1]; + + // perform semantic action + $yyval->token = $this->vstack[count($this->vstack) - $len]; // default to $$ = $1 + // default location, uses first token for firsts, last for lasts + $yyval->store = array( // _$ = store + 'first_line' => $this->lstack[count($this->lstack) - ($len ? $len : 1)]['first_line'], + 'last_line' => $this->lstack[count($this->lstack) - 1]['last_line'], + 'first_column' => $this->lstack[count($this->lstack) - ($len ? $len : 1)]['first_column'], + 'last_column' => $this->lstack[count($this->lstack) - 1]['last_column'], + ); + $r = $this->performAction($yyval, $yytext, $yyleng, $yylineno, $action[1], $this->vstack, $this->lstack); + + if (!$r instanceof JsonLintUndefined) { + return $r; + } + + if ($len) { + $this->popStack($len); + } + + $this->stack[] = $this->productions_[$action[1]][0]; // push nonterminal (reduce) + $this->vstack[] = $yyval->token; + $this->lstack[] = $yyval->store; + $newState = $this->table[$this->stack[count($this->stack)-2]][$this->stack[count($this->stack)-1]]; + $this->stack[] = $newState; + break; + + case 3: // accept + + return true; + } + } + + return true; + } + + protected function parseError($str, $hash) + { + throw new JsonLintParsingException($str, $hash); + } + + // $$ = $tokens // needs to be passed by ref? + // $ = $token + // _$ removed, useless? + private function performAction(stdClass $yyval, $yytext, $yyleng, $yylineno, $yystate, &$tokens) + { + // $0 = $len + $len = count($tokens) - 1; + switch ($yystate) { + case 1: + $yytext = preg_replace_callback('{(?:\\\\["bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4})}', array($this, 'stringInterpolation'), $yytext); + $yyval->token = $yytext; + break; + case 2: + if (strpos($yytext, 'e') !== false || strpos($yytext, 'E') !== false) { + $yyval->token = floatval($yytext); + } else { + $yyval->token = strpos($yytext, '.') === false ? intval($yytext) : floatval($yytext); + } + break; + case 3: + $yyval->token = null; + break; + case 4: + $yyval->token = true; + break; + case 5: + $yyval->token = false; + break; + case 6: + return $yyval->token = $tokens[$len-1]; + case 13: + if ($this->flags & self::PARSE_TO_ASSOC) { + $yyval->token = array(); + } else { + $yyval->token = new stdClass; + } + break; + case 14: + $yyval->token = $tokens[$len-1]; + break; + case 15: + $yyval->token = array($tokens[$len-2], $tokens[$len]); + break; + case 16: + $property = $tokens[$len][0]; + if ($this->flags & self::PARSE_TO_ASSOC) { + $yyval->token = array(); + $yyval->token[$property] = $tokens[$len][1]; + } else { + $yyval->token = new stdClass; + $yyval->token->$property = $tokens[$len][1]; + } + break; + case 17: + if ($this->flags & self::PARSE_TO_ASSOC) { + $yyval->token =& $tokens[$len-2]; + $key = $tokens[$len][0]; + if (($this->flags & self::DETECT_KEY_CONFLICTS) && isset($tokens[$len-2][$key])) { + $errStr = 'Parse error on line ' . ($yylineno+1) . ":\n"; + $errStr .= $this->lexer->showPosition() . "\n"; + $errStr .= "Duplicate key: ".$tokens[$len][0]; + throw new JsonLintParsingException($errStr); + } elseif (($this->flags & self::ALLOW_DUPLICATE_KEYS) && isset($tokens[$len-2][$key])) { + // Forget about it... + } + $tokens[$len-2][$key] = $tokens[$len][1]; + } else { + $yyval->token = $tokens[$len-2]; + $key = $tokens[$len][0]; + if (($this->flags & self::DETECT_KEY_CONFLICTS) && isset($tokens[$len-2]->{$key})) { + $errStr = 'Parse error on line ' . ($yylineno+1) . ":\n"; + $errStr .= $this->lexer->showPosition() . "\n"; + $errStr .= "Duplicate key: ".$tokens[$len][0]; + throw new JsonLintParsingException($errStr); + } elseif (($this->flags & self::ALLOW_DUPLICATE_KEYS) && isset($tokens[$len-2]->{$key})) { + $duplicateCount = 1; + do { + $duplicateKey = $key . '.' . $duplicateCount++; + } while (isset($tokens[$len-2]->$duplicateKey)); + $key = $duplicateKey; + } + $tokens[$len-2]->$key = $tokens[$len][1]; + } + break; + case 18: + $yyval->token = array(); + break; + case 19: + $yyval->token = $tokens[$len-1]; + break; + case 20: + $yyval->token = array($tokens[$len]); + break; + case 21: + $tokens[$len-2][] = $tokens[$len]; + $yyval->token = $tokens[$len-2]; + break; + } + + return new JsonLintUndefined(); + } + + private function stringInterpolation($match) + { + switch ($match[0]) { + case '\\\\': + return '\\'; + case '\"': + return '"'; + case '\b': + return chr(8); + case '\f': + return chr(12); + case '\n': + return "\n"; + case '\r': + return "\r"; + case '\t': + return "\t"; + case '\/': + return "/"; + default: + return html_entity_decode('&#x'.ltrim(substr($match[0], 2), '0').';', 0, 'UTF-8'); + } + } + + private function popStack($n) + { + $this->stack = array_slice($this->stack, 0, - (2 * $n)); + $this->vstack = array_slice($this->vstack, 0, - $n); + $this->lstack = array_slice($this->lstack, 0, - $n); + } + + private function lex() + { + $token = $this->lexer->lex(); + if (!$token) { + $token = 1; + } + // if token isn't its numeric value, convert + if (!is_numeric($token)) { + $token = isset($this->symbols[$token]) ? $this->symbols[$token] : $token; + } + + return $token; + } + + private function failOnBOM($input) + { + // UTF-8 ByteOrderMark sequence + $bom = "\xEF\xBB\xBF"; + + if (substr($input, 0, 3) === $bom) { + $this->parseError("BOM detected, make sure your input does not include a Unicode Byte-Order-Mark", array()); + } + } +} \ No newline at end of file diff --git a/externals/jsonlint/src/Seld/JsonLint/Lexer.php b/externals/jsonlint/src/Seld/JsonLint/Lexer.php new file mode 100644 index 00000000..4197afe1 --- /dev/null +++ b/externals/jsonlint/src/Seld/JsonLint/Lexer.php @@ -0,0 +1,215 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Lexer class + * + * Ported from https://github.com/zaach/jsonlint + */ +class JsonLintLexer +{ + private $EOF = 1; + private $rules = array( + 0 => '/^\s+/', + 1 => '/^-?([0-9]|[1-9][0-9]+)(\.[0-9]+)?([eE][+-]?[0-9]+)?\b/', + 2 => '{^"(?>\\\\["bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\0-\x1f\\\\"]++)*+"}', + 3 => '/^\{/', + 4 => '/^\}/', + 5 => '/^\[/', + 6 => '/^\]/', + 7 => '/^,/', + 8 => '/^:/', + 9 => '/^true\b/', + 10 => '/^false\b/', + 11 => '/^null\b/', + 12 => '/^$/', + 13 => '/^./', + ); + + private $conditions = array( + "INITIAL" => array( + "rules" => array(0,1,2,3,4,5,6,7,8,9,10,11,12,13), + "inclusive" => true, + ), + ); + + private $conditionStack; + private $input; + private $more; + private $done; + private $matched; + + public $match; + public $yylineno; + public $yyleng; + public $yytext; + public $yylloc; + + public function lex() + { + $r = $this->next(); + if (!$r instanceof JsonLintUndefined) { + return $r; + } + + return $this->lex(); + } + + public function setInput($input) + { + $this->input = $input; + $this->more = false; + $this->done = false; + $this->yylineno = $this->yyleng = 0; + $this->yytext = $this->matched = $this->match = ''; + $this->conditionStack = array('INITIAL'); + $this->yylloc = array('first_line' => 1, 'first_column' => 0, 'last_line' => 1, 'last_column' => 0); + + return $this; + } + + public function showPosition() + { + $pre = str_replace("\n", '', $this->getPastInput()); + $c = str_repeat('-', max(0, strlen($pre) - 1)); // new Array(pre.length + 1).join("-"); + + return $pre . str_replace("\n", '', $this->getUpcomingInput()) . "\n" . $c . "^"; + } + + public function getPastInput() + { + $past = substr($this->matched, 0, strlen($this->matched) - strlen($this->match)); + + return (strlen($past) > 20 ? '...' : '') . substr($past, -20); + } + + public function getUpcomingInput() + { + $next = $this->match; + if (strlen($next) < 20) { + $next .= substr($this->input, 0, 20 - strlen($next)); + } + + return substr($next, 0, 20) . (strlen($next) > 20 ? '...' : ''); + } + + protected function parseError($str, $hash) + { + throw new Exception($str); + } + + private function next() + { + if ($this->done) { + return $this->EOF; + } + if (!$this->input) { + $this->done = true; + } + + $token = null; + $match = null; + $col = null; + $lines = null; + + if (!$this->more) { + $this->yytext = ''; + $this->match = ''; + } + + $rules = $this->getCurrentRules(); + $rulesLen = count($rules); + + for ($i=0; $i < $rulesLen; $i++) { + if (preg_match($this->rules[$rules[$i]], $this->input, $match)) { + preg_match_all('/\n.*/', $match[0], $lines); + $lines = $lines[0]; + if ($lines) { + $this->yylineno += count($lines); + } + + $this->yylloc = array( + 'first_line' => $this->yylloc['last_line'], + 'last_line' => $this->yylineno+1, + 'first_column' => $this->yylloc['last_column'], + 'last_column' => $lines ? strlen($lines[count($lines) - 1]) - 1 : $this->yylloc['last_column'] + strlen($match[0]), + ); + $this->yytext .= $match[0]; + $this->match .= $match[0]; + $this->yyleng = strlen($this->yytext); + $this->more = false; + $this->input = substr($this->input, strlen($match[0])); + $this->matched .= $match[0]; + $token = $this->performAction($rules[$i], $this->conditionStack[count($this->conditionStack)-1]); + if ($token) { + return $token; + } + + return new JsonLintUndefined(); + } + } + + if ($this->input === "") { + return $this->EOF; + } + + $this->parseError( + 'Lexical error on line ' . ($this->yylineno+1) . ". Unrecognized text.\n" . $this->showPosition(), + array( + 'text' => "", + 'token' => null, + 'line' => $this->yylineno, + ) + ); + } + + private function getCurrentRules() + { + return $this->conditions[$this->conditionStack[count($this->conditionStack)-1]]['rules']; + } + + private function performAction($avoiding_name_collisions, $YY_START) + { + switch ($avoiding_name_collisions) { + case 0:/* skip whitespace */ + break; + case 1: + return 6; + break; + case 2: + $this->yytext = substr($this->yytext, 1, $this->yyleng-2); + + return 4; + case 3: + return 17; + case 4: + return 18; + case 5: + return 23; + case 6: + return 24; + case 7: + return 22; + case 8: + return 21; + case 9: + return 10; + case 10: + return 11; + case 11: + return 8; + case 12: + return 14; + case 13: + return 'INVALID'; + } + } +} \ No newline at end of file diff --git a/externals/jsonlint/src/Seld/JsonLint/ParsingException.php b/externals/jsonlint/src/Seld/JsonLint/ParsingException.php new file mode 100644 index 00000000..2351cf60 --- /dev/null +++ b/externals/jsonlint/src/Seld/JsonLint/ParsingException.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class JsonLintParsingException extends Exception +{ + protected $details; + + public function __construct($message, $details = array()) + { + $this->details = $details; + parent::__construct($message); + } + + public function getDetails() + { + return $this->details; + } +} diff --git a/externals/jsonlint/src/Seld/JsonLint/Undefined.php b/externals/jsonlint/src/Seld/JsonLint/Undefined.php new file mode 100644 index 00000000..f6aa678e --- /dev/null +++ b/externals/jsonlint/src/Seld/JsonLint/Undefined.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class JsonLintUndefined +{ +} diff --git a/resources/php/symbol-information.json b/resources/php/symbol-information.json new file mode 100644 index 00000000..0432cb7a --- /dev/null +++ b/resources/php/symbol-information.json @@ -0,0 +1,64365 @@ +{ + "@generated": true, + "params": { + "array_keys": [ + "4.0.0", + "4.0.0", + "5.0.0" + ], + "array_slice": [ + "4.0.0", + "4.0.0", + "4.0.0", + "5.0.2" + ], + "assert": [ + "4.0.0", + "5.4.8" + ], + "class_exists": [ + "4.0.0", + "5.0.0" + ], + "clearstatcache": [ + "5.3.0", + "5.3.0" + ], + "copy": [ + "4.0.0", + "4.0.0", + "5.3.0" + ], + "debug_backtrace": [ + "4.3.0", + "5.4.0" + ], + "debug_print_backtrace": [ + "5.0.0", + "5.4.0" + ], + "fgetss": [ + "4.0.0", + "4.0.0", + "5.0.0" + ], + "file": [ + "4.0.0", + "4.0.0", + "5.0.0" + ], + "file_get_contents": [ + "4.3.0", + "4.3.0", + "4.3.0", + "5.1.0", + "5.1.0" + ], + "get_browser": [ + "4.0.0", + "4.3.2" + ], + "getopt": [ + "4.3.0", + "5.3.0" + ], + "gettimeofday": [ + "5.1.0" + ], + "htmlentities": [ + "4.0.0", + "4.0.3", + "4.1.0", + "5.2.3" + ], + "htmlspecialchars": [ + "4.0.0", + "4.0.0", + "4.1.0", + "5.2.3" + ], + "idn_to_ascii": [ + "5.2.4", + "5.2.4", + "5.4.0RC3", + "5.4.0RC3" + ], + "idn_to_utf8": [ + "5.2.4", + "5.2.4", + "5.4.0RC3", + "5.4.0RC3" + ], + "ini_get_all": [ + "4.2.0", + "5.3.0" + ], + "is_a": [ + "4.2.0", + "4.2.0", + "5.3.9" + ], + "jdtojewish": [ + "4.0.0", + "4.3.0", + "5.0.0" + ], + "json_decode": [ + "5.2.0", + "5.2.0", + "5.3.0", + "5.4.0" + ], + "json_encode": [ + "5.2.0", + "5.3.0", + "5.5.0" + ], + "ldap_read": [ + "4.0.0", + "4.0.0", + "4.0.0", + "4.0.0", + "4.0.2", + "4.0.2", + "4.0.2", + "4.0.2" + ], + "ldap_search": [ + "4.0.0", + "4.0.0", + "4.0.0", + "4.0.0", + "4.0.2", + "4.0.2", + "4.0.2", + "4.0.2" + ], + "md5": [ + "4.0.0", + "5.0.0" + ], + "md5_file": [ + "4.2.0", + "5.0.0" + ], + "memory_get_usage": [ + "5.2.0" + ], + "microtime": [ + "5.0.0" + ], + "mkdir": [ + "4.0.0", + "4.0.0", + "5.0.0", + "5.0.0" + ], + "nl2br": [ + "4.0.0", + "5.3.0" + ], + "opendir": [ + "4.0.0", + "5.3.0" + ], + "openssl_sign": [ + "4.0.4", + "4.0.4", + "4.0.4", + "5.0.0" + ], + "parse_url": [ + "4.0.0", + "5.1.2" + ], + "preg_replace": [ + "4.0.0", + "4.0.0", + "4.0.0", + "4.0.1", + "5.1.0" + ], + "preg_replace_callback": [ + "4.0.5", + "4.0.5", + "4.0.5", + "4.0.5", + "5.1.0" + ], + "scandir": [ + "5.0.0", + "5.4.0", + "5.4.0" + ], + "sem_acquire": [ + "4.0.0", + "5.6.1RC1" + ], + "session_regenerate_id": [ + "5.1.0" + ], + "sha1": [ + "4.3.0", + "5.0.0" + ], + "sha1_file": [ + "4.3.0", + "5.0.0" + ], + "sqlite_fetch_column_types": [ + "5.0.0", + "5.0.0", + "5.1.0" + ], + "str_replace": [ + "4.0.0", + "4.0.0", + "4.0.0", + "5.0.0" + ], + "stream_copy_to_stream": [ + "5.0.0", + "5.0.0", + "5.0.0", + "5.1.0" + ], + "stream_get_contents": [ + "5.0.0", + "5.0.0", + "5.1.0" + ], + "substr_count": [ + "4.0.0", + "4.0.0", + "5.1.0", + "5.1.0" + ] + }, + "functions": { + "_": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "__uopz_exit_overload": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "abs": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "acos": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "acosh": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "addcslashes": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "addslashes": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "apc_add": { + "ext.name": "apc", + "ext.min": "3.0.13", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_bin_dump": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_bin_dumpfile": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_bin_load": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_bin_loadfile": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_cache_info": { + "ext.name": "apc", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "apc_cas": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_clear_cache": { + "ext.name": "apc", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "apc_compile_file": { + "ext.name": "apc", + "ext.min": "3.0.13", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_dec": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_define_constants": { + "ext.name": "apc", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_delete": { + "ext.name": "apc", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_delete_file": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_exists": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_fetch": { + "ext.name": "apc", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_inc": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_load_constants": { + "ext.name": "apc", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_sma_info": { + "ext.name": "apc", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "apc_store": { + "ext.name": "apc", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apcu_add": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_bin_dump": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_bin_dumpfile": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_bin_load": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_bin_loadfile": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_cache_info": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_cas": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_clear_cache": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_dec": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_delete": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_enabled": { + "ext.name": "apcu", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_exists": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_fetch": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_inc": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_key_info": { + "ext.name": "apcu", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_sma_info": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_store": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "array_change_key_case": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "array_chunk": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "array_column": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "array_combine": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "array_count_values": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_diff": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "array_diff_assoc": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "array_diff_key": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "array_diff_uassoc": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "array_diff_ukey": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "array_fill": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "array_fill_keys": { + "ext.name": "standard", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "array_filter": { + "ext.name": "standard", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "array_flip": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_intersect": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "array_intersect_assoc": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "array_intersect_key": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "array_intersect_uassoc": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "array_intersect_ukey": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "array_key_exists": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "array_keys": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_map": { + "ext.name": "standard", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "array_merge": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_merge_recursive": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "array_multisort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_pad": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_pop": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_product": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "array_push": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_rand": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_reduce": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "array_replace": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "array_replace_recursive": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "array_reverse": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_search": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "array_shift": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_slice": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_splice": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_sum": { + "ext.name": "standard", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "array_udiff": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "array_udiff_assoc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_udiff_uassoc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_uintersect": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_uintersect_assoc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_uintersect_uassoc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_unique": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "array_unshift": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_values": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_walk": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_walk_recursive": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "arsort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "asin": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "asinh": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "asort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "assert": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "assert_options": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "atan": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "atan2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "atanh": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "base64_decode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "base64_encode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "base_convert": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "basename": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcadd": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bccomp": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcdiv": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcmod": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcmul": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcpow": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcpowmod": { + "ext.name": "bcmath", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "bcscale": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcsqrt": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcsub": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bin2hex": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bind_textdomain_codeset": { + "ext.name": "gettext", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "bindec": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bindtextdomain": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "boolval": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "bson_decode": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "bson_encode": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "bzclose": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzcompress": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzdecompress": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzerrno": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzerror": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzerrstr": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzflush": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzopen": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzread": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzwrite": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "cal_days_in_month": { + "ext.name": "calendar", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "cal_from_jd": { + "ext.name": "calendar", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "cal_info": { + "ext.name": "calendar", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "cal_to_jd": { + "ext.name": "calendar", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "call_user_func": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "call_user_func_array": { + "ext.name": "standard", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "call_user_method": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "call_user_method_array": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ceil": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chdir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "checkdate": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "checkdnsrr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chgrp": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chmod": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chop": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chown": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chroot": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "chunk_split": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "class_alias": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "class_exists": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "class_implements": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "class_parents": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "class_uses": { + "ext.name": "spl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "clearstatcache": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "cli_get_process_title": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "cli_set_process_title": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "closedir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "closelog": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "collator_asort": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_compare": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_get_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_get_error_code": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_get_error_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_get_locale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_get_sort_key": { + "ext.name": "intl", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "collator_get_strength": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_set_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_set_strength": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_sort": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_sort_with_sort_keys": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "compact": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "connection_aborted": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "connection_status": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "connection_timeout": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "4.0.4" + }, + "constant": { + "ext.name": "standard", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "convert_cyr_string": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "convert_uudecode": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "convert_uuencode": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "copy": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "cos": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "cosh": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "count": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "count_chars": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "crc32": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "create_function": { + "ext.name": "Core", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "crypt": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ctype_alnum": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_alpha": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_cntrl": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_digit": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_graph": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_lower": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_print": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_punct": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_space": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_upper": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_xdigit": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "curl_close": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "curl_copy_handle": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_errno": { + "ext.name": "curl", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "curl_error": { + "ext.name": "curl", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "curl_escape": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_exec": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "curl_file_create": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_getinfo": { + "ext.name": "curl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "curl_init": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "curl_multi_add_handle": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_close": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_exec": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_getcontent": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_info_read": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_init": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_remove_handle": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_select": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_setopt": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_multi_strerror": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_pause": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_reset": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_setopt": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "curl_setopt_array": { + "ext.name": "curl", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "curl_share_close": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_share_init": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_share_setopt": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_strerror": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_unescape": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_version": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "current": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "date": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "date_add": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_create": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_create_from_format": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_create_immutable": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "date_create_immutable_from_format": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "date_date_set": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_default_timezone_get": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "date_default_timezone_set": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "date_diff": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_format": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_get_last_errors": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_interval_create_from_date_string": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_interval_format": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_isodate_set": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_modify": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_offset_get": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_parse": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_parse_from_format": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_sub": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_sun_info": { + "ext.name": "date", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "date_sunrise": { + "ext.name": "date", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "date_sunset": { + "ext.name": "date", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "date_time_set": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_timestamp_get": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_timestamp_set": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_timezone_get": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_timezone_set": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "datefmt_create": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_format": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_format_object": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "datefmt_get_calendar": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_calendar_object": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "datefmt_get_datetype": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_error_code": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_error_message": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_locale": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_timetype": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_timezone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "datefmt_get_timezone_id": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_is_lenient": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_localtime": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_parse": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_set_calendar": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_set_lenient": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_set_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_set_timezone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "datefmt_set_timezone_id": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "dcgettext": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dcngettext": { + "ext.name": "gettext", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "debug_backtrace": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "debug_print_backtrace": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "debug_zval_dump": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "decbin": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dechex": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "decoct": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "define": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "define_syslog_variables": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.3.29" + }, + "defined": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "deg2rad": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dgettext": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dirname": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "disk_free_space": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "disk_total_space": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "diskfreespace": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "dl": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dngettext": { + "ext.name": "gettext", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "dns_check_record": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "dns_get_mx": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "dns_get_record": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "dom_import_simplexml": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "doubleval": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "each": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "easter_date": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "easter_days": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "empty": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "enchant_broker_describe": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_dict_exists": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_free": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_free_dict": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_get_dict_path": { + "ext.name": "enchant", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_get_error": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_init": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_list_dicts": { + "ext.name": "enchant", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_request_dict": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_request_pwl_dict": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_set_dict_path": { + "ext.name": "enchant", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_set_ordering": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_add_to_personal": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_add_to_session": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_check": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_describe": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_get_error": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_is_in_session": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_quick_check": { + "ext.name": "enchant", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_store_replacement": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_suggest": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "end": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ereg": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ereg_replace": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "eregi": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "eregi_replace": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "error_get_last": { + "ext.name": "standard", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "error_log": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "error_reporting": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "escapeshellarg": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "escapeshellcmd": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "event_add": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_free": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_loop": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_loopbreak": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_loopexit": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_new": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_priority_init": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_reinit": { + "ext.name": "libevent", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_base_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_disable": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_enable": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_fd_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_free": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_new": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_priority_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_read": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_set_callback": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_timeout_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_watermark_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_write": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_del": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_free": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_new": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_priority_set": { + "ext.name": "libevent", + "ext.min": "0.0.5", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_timer_add": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_timer_del": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_timer_new": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_timer_pending": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_timer_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "exec": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "exif_imagetype": { + "ext.name": "exif", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "exif_read_data": { + "ext.name": "exif", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "exif_tagname": { + "ext.name": "exif", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "exif_thumbnail": { + "ext.name": "exif", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "exp": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "explode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "expm1": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "extension_loaded": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "extract": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ezmlm_hash": { + "ext.name": "standard", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "fclose": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "feof": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fflush": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "fgetc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fgetcsv": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fgets": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fgetss": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "file": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "file_exists": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "file_get_contents": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "file_put_contents": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "fileatime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filectime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filegroup": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fileinode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filemtime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fileowner": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fileperms": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filesize": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filetype": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filter_data": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": "0.10.0", + "php.min": "4.0.0", + "php.max": null + }, + "filter_has_var": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_id": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_input": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_input_array": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_list": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_var": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_var_array": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "finfo_buffer": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "finfo_close": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "finfo_file": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "finfo_open": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "finfo_set_flags": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "floatval": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "flock": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "floor": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "flush": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fmod": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "fnmatch": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "fopen": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "forward_static_call": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "forward_static_call_array": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "fpassthru": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fprintf": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "fputcsv": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "fputs": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fread": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "frenchtojd": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fscanf": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "fseek": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fsockopen": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fstat": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftell": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftok": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ftp_alloc": { + "ext.name": "ftp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ftp_cdup": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_chdir": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_chmod": { + "ext.name": "ftp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ftp_close": { + "ext.name": "ftp", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ftp_connect": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_delete": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_exec": { + "ext.name": "ftp", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "ftp_fget": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_fput": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_get": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_get_option": { + "ext.name": "ftp", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ftp_login": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_mdtm": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_mkdir": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_nb_continue": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_nb_fget": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_nb_fput": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_nb_get": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_nb_put": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_nlist": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_pasv": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_put": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_pwd": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_quit": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_raw": { + "ext.name": "ftp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ftp_rawlist": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_rename": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_rmdir": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_set_option": { + "ext.name": "ftp", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ftp_site": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_size": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_ssl_connect": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_systype": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftruncate": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "func_get_arg": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "func_get_args": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "func_num_args": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "function_exists": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fwrite": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gc_collect_cycles": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "gc_disable": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "gc_enable": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "gc_enabled": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "gd_info": { + "ext.name": "gd", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_asnum_by_name": { + "ext.name": "geoip", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_continent_code_by_name": { + "ext.name": "geoip", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_country_code3_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_country_code_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_country_name_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_database_info": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_db_avail": { + "ext.name": "geoip", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_db_filename": { + "ext.name": "geoip", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_db_get_all_info": { + "ext.name": "geoip", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_domain_by_name": { + "ext.name": "geoip", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_id_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_isp_by_name": { + "ext.name": "geoip", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_netspeedcell_by_name": { + "ext.name": "geoip", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_org_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_record_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_region_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_region_name_by_code": { + "ext.name": "geoip", + "ext.min": "1.0.5", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_setup_custom_directory": { + "ext.name": "geoip", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_time_zone_by_country_and_region": { + "ext.name": "geoip", + "ext.min": "1.0.5", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "get_browser": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_called_class": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "get_cfg_var": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_class": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_class_methods": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_class_vars": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_current_user": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_declared_classes": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_declared_interfaces": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "get_declared_traits": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "get_defined_constants": { + "ext.name": "Core", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "get_defined_functions": { + "ext.name": "Core", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "get_defined_vars": { + "ext.name": "Core", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "get_extension_funcs": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_headers": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "get_html_translation_table": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_include_path": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "get_included_files": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_loaded_extensions": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_magic_quotes_gpc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_magic_quotes_runtime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_meta_tags": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_object_vars": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_parent_class": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_required_files": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_resource_type": { + "ext.name": "Core", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "getcwd": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getdate": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getenv": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gethostbyaddr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gethostbyname": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gethostbynamel": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gethostname": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getimagesize": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getimagesizefromstring": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "getlastmod": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getmxrr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getmygid": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "getmyinode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getmypid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getmyuid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getopt": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "getprotobyname": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getprotobynumber": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getrandmax": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getrusage": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getservbyname": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getservbyport": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gettext": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gettimeofday": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gettype": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "glob": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "gmdate": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gmmktime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gmp_abs": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_add": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_and": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_clrbit": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_cmp": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_com": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_div": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_div_q": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_div_qr": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_div_r": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_divexact": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_export": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "gmp_fact": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_gcd": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_gcdext": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_hamdist": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_import": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "gmp_init": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_intval": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_invert": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_jacobi": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_legendre": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_mod": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_mul": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_neg": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_nextprime": { + "ext.name": "gmp", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "gmp_or": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_perfect_square": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_popcount": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_pow": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_powm": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_prob_prime": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_random": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_random_bits": { + "ext.name": "gmp", + "ext.min": "5.6.3RC1", + "ext.max": null, + "php.min": "5.6.3RC1", + "php.max": null + }, + "gmp_random_range": { + "ext.name": "gmp", + "ext.min": "5.6.3RC1", + "ext.max": null, + "php.min": "5.6.3RC1", + "php.max": null + }, + "gmp_root": { + "ext.name": "gmp", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "gmp_rootrem": { + "ext.name": "gmp", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "gmp_scan0": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_scan1": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_setbit": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_sign": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_sqrt": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_sqrtrem": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_strval": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_sub": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_testbit": { + "ext.name": "gmp", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "gmp_xor": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmstrftime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "grapheme_extract": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_stripos": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_stristr": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_strlen": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_strpos": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_strripos": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_strrpos": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_strstr": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_substr": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "gregoriantojd": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzclose": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzcompress": { + "ext.name": "zlib", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "gzdecode": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "gzdeflate": { + "ext.name": "zlib", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gzencode": { + "ext.name": "zlib", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gzeof": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzfile": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzgetc": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzgets": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzgetss": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzinflate": { + "ext.name": "zlib", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gzopen": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzpassthru": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzputs": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzread": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzrewind": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzseek": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gztell": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzuncompress": { + "ext.name": "zlib", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "gzwrite": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_algos": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_copy": { + "ext.name": "hash", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "hash_equals": { + "ext.name": "hash", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "hash_file": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_final": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_hmac": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_hmac_file": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_init": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_pbkdf2": { + "ext.name": "hash", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "hash_update": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_update_file": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_update_stream": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "header": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "header_register_callback": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "header_remove": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "headers_list": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "headers_sent": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hebrev": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hebrevc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hex2bin": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "hexdec": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "highlight_file": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "highlight_string": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "html_entity_decode": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "htmlentities": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "htmlspecialchars": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "htmlspecialchars_decode": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "http_build_cookie": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_build_query": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "http_build_str": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_build_url": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_cache_etag": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_cache_last_modified": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_chunked_decode": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_date": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_deflate": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_get": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_get_request_body": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_get_request_body_stream": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_get_request_headers": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_head": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_inflate": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_match_etag": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_match_modified": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_match_request_header": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_negotiate": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_negotiate_charset": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_negotiate_content_type": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_negotiate_language": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_parse_cookie": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_parse_headers": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_parse_message": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_parse_params": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_persistent_handles_clean": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_persistent_handles_count": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_persistent_handles_ident": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_post_data": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_post_fields": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_put_data": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_put_file": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_put_stream": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_redirect": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request_body_encode": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request_method_exists": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request_method_name": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request_method_register": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request_method_unregister": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_response_code": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "http_send_content_disposition": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_content_type": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_data": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_file": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_last_modified": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_status": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_stream": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_support": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_throttle": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "hypot": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "iconv": { + "ext.name": "iconv", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "iconv_get_encoding": { + "ext.name": "iconv", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "iconv_mime_decode": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_mime_decode_headers": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_mime_encode": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_set_encoding": { + "ext.name": "iconv", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "iconv_strlen": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_strpos": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_strrpos": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_substr": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "idate": { + "ext.name": "date", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "idn_to_ascii": { + "ext.name": "intl", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "idn_to_utf8": { + "ext.name": "intl", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "igbinary_serialize": { + "ext.name": "igbinary", + "ext.min": "1.1.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "igbinary_unserialize": { + "ext.name": "igbinary", + "ext.min": "1.1.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ignore_user_abort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "image2wbmp": { + "ext.name": "gd", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "image_type_to_extension": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "image_type_to_mime_type": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageaffine": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imageaffinematrixconcat": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imageaffinematrixget": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagealphablending": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imageantialias": { + "ext.name": "gd", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "imagearc": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagechar": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecharup": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorallocate": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorallocatealpha": { + "ext.name": "gd", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "imagecolorat": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorclosest": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorclosestalpha": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecolorclosesthwb": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagecolordeallocate": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorexact": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorexactalpha": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecolormatch": { + "ext.name": "gd", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "imagecolorresolve": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorresolvealpha": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecolorset": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorsforindex": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorstotal": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolortransparent": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageconvolution": { + "ext.name": "gd", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "imagecopy": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecopymerge": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagecopymergegray": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecopyresampled": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecopyresized": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecreate": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecreatefromgd": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagecreatefromgd2": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagecreatefromgd2part": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagecreatefromgif": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecreatefromjpeg": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecreatefrompng": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecreatefromstring": { + "ext.name": "gd", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "imagecreatefromwbmp": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagecreatefromwebp": { + "ext.name": "gd", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "imagecreatefromxbm": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagecreatefromxpm": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagecreatetruecolor": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecrop": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagecropauto": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagedashedline": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagedestroy": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageellipse": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagefill": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagefilledarc": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagefilledellipse": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagefilledpolygon": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagefilledrectangle": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagefilltoborder": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagefilter": { + "ext.name": "gd", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "imageflip": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagefontheight": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagefontwidth": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageftbbox": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagefttext": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagegammacorrect": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagegd": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagegd2": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagegif": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagegrabscreen": { + "ext.name": "gd", + "ext.min": "5.2.2", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "imagegrabwindow": { + "ext.name": "gd", + "ext.min": "5.2.2", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "imageinterlace": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageistruecolor": { + "ext.name": "gd", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "imagejpeg": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagelayereffect": { + "ext.name": "gd", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "imageline": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageloadfont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepalettecopy": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagepalettetotruecolor": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagepng": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepolygon": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsbbox": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsencodefont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsextendfont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsfreefont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsloadfont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsslantfont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepstext": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagerectangle": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagerotate": { + "ext.name": "gd", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "imagesavealpha": { + "ext.name": "gd", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "imagescale": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagesetbrush": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagesetinterpolation": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagesetpixel": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagesetstyle": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagesetthickness": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagesettile": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagestring": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagestringup": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagesx": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagesy": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagetruecolortopalette": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagettfbbox": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagettftext": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagetypes": { + "ext.name": "gd", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "imagewbmp": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagewebp": { + "ext.name": "gd", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "imagexbm": { + "ext.name": "gd", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "imap_8bit": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_alerts": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_append": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_base64": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_binary": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_body": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_bodystruct": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_check": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_clearflag_full": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_close": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_create": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_createmailbox": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_delete": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_deletemailbox": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_errors": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_expunge": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_fetch_overview": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_fetchbody": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_fetchheader": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_fetchmime": { + "ext.name": "imap", + "ext.min": "5.3.6", + "ext.max": null, + "php.min": "5.3.6", + "php.max": null + }, + "imap_fetchstructure": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_fetchtext": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_gc": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "imap_get_quota": { + "ext.name": "imap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "imap_get_quotaroot": { + "ext.name": "imap", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "imap_getacl": { + "ext.name": "imap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "imap_getmailboxes": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_getsubscribed": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_header": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_headerinfo": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_headers": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_last_error": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_list": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_listmailbox": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_listscan": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_listsubscribed": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_lsub": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mail": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mail_compose": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mail_copy": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mail_move": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mailboxmsginfo": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mime_header_decode": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_msgno": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mutf7_to_utf8": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "imap_num_msg": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_num_recent": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_open": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_ping": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_qprint": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_rename": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_renamemailbox": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_reopen": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_rfc822_parse_adrlist": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_rfc822_parse_headers": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_rfc822_write_address": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_savebody": { + "ext.name": "imap", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "imap_scan": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_scanmailbox": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_search": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_set_quota": { + "ext.name": "imap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "imap_setacl": { + "ext.name": "imap", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imap_setflag_full": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_sort": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_status": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_subscribe": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_thread": { + "ext.name": "imap", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imap_timeout": { + "ext.name": "imap", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "imap_uid": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_undelete": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_unsubscribe": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_utf7_decode": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_utf7_encode": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_utf8": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_utf8_to_mutf7": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "implode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "import_request_variables": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": "5.3.29" + }, + "in_array": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "inclued_get_data": { + "ext.name": "inclued", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "inet_ntop": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "inet_pton": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ini_alter": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ini_get": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ini_get_all": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ini_restore": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ini_set": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "input_filters_list": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": "0.10.0", + "php.min": "4.0.0", + "php.max": null + }, + "input_get": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": "0.10.0", + "php.min": "4.0.0", + "php.max": null + }, + "input_get_args": { + "ext.name": "filter", + "ext.min": "0.10.0", + "ext.max": "0.10.0", + "php.min": "5.0.0", + "php.max": null + }, + "input_has_variable": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": "0.10.0", + "php.min": "4.0.0", + "php.max": null + }, + "input_name_to_filter": { + "ext.name": "filter", + "ext.min": "0.9.2", + "ext.max": "0.10.0", + "php.min": "4.0.0", + "php.max": null + }, + "interface_exists": { + "ext.name": "Core", + "ext.min": "5.0.2", + "ext.max": null, + "php.min": "5.0.2", + "php.max": null + }, + "intl_error_name": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "intl_get_error_code": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "intl_get_error_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "intl_is_failure": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "intlcal_add": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_after": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_before": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_clear": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_create_instance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_equals": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_field_difference": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_from_date_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_actual_maximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_actual_minimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_available_locales": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_day_of_week_type": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_error_code": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_error_message": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_first_day_of_week": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_greatest_minimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_keyword_values_for_locale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_least_maximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_locale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_maximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_minimal_days_in_first_week": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_minimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_now": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_repeated_wall_time_option": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_skipped_wall_time_option": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_time_zone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_type": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_weekend_transition": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_in_daylight_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_is_equivalent_to": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_is_lenient": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_is_set": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_is_weekend": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_roll": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_first_day_of_week": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_lenient": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_minimal_days_in_first_week": { + "ext.name": "intl", + "ext.min": "5.5.1", + "ext.max": null, + "php.min": "5.5.1", + "php.max": null + }, + "intlcal_set_repeated_wall_time_option": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_skipped_wall_time_option": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_time_zone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_to_date_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlgregcal_create_instance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlgregcal_get_gregorian_change": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlgregcal_is_leap_year": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlgregcal_set_gregorian_change": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_count_equivalent_ids": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_create_default": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_create_enumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_create_time_zone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_create_time_zone_id_enumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_from_date_time_zone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_canonical_id": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_display_name": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_dst_savings": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_equivalent_id": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_error_code": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_error_message": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_gmt": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_id": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_offset": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_raw_offset": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_region": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_tz_data_version": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_unknown": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_has_same_rules": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_to_date_time_zone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_use_daylight_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intval": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ip2long": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "iptcembed": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "iptcparse": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_a": { + "ext.name": "Core", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "is_array": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_bool": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_callable": { + "ext.name": "standard", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "is_dir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_double": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_executable": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_file": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_finite": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "is_float": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_infinite": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "is_int": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_integer": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_link": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_long": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_nan": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "is_null": { + "ext.name": "standard", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "is_numeric": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_object": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_readable": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_real": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_resource": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_scalar": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "is_soap_fault": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "is_string": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_subclass_of": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_uploaded_file": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "is_writable": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_writeable": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "isset": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "iterator_apply": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "iterator_count": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "iterator_to_array": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "jddayofweek": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdmonthname": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdtofrench": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdtogregorian": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdtojewish": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdtojulian": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdtounix": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jewishtojd": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "join": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jpeg2wbmp": { + "ext.name": "gd", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "jsmin": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "jsmin_last_error": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "jsmin_last_error_msg": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "json_decode": { + "ext.name": "json", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "json_encode": { + "ext.name": "json", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "json_last_error": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "json_last_error_msg": { + "ext.name": "json", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "juliantojd": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "key": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "key_exists": { + "ext.name": "standard", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "krsort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ksort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lcfirst": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lcg_value": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lchgrp": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "lchown": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ldap_add": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_bind": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_close": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_compare": { + "ext.name": "ldap", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "ldap_connect": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_control_paged_result": { + "ext.name": "ldap", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ldap_control_paged_result_response": { + "ext.name": "ldap", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ldap_count_entries": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_delete": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_dn2ufn": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_err2str": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_errno": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_error": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_escape": { + "ext.name": "ldap", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "ldap_explode_dn": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_first_attribute": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_first_entry": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_first_reference": { + "ext.name": "ldap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ldap_free_result": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_get_attributes": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_get_dn": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_get_entries": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_get_option": { + "ext.name": "ldap", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ldap_get_values": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_get_values_len": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_list": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_mod_add": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_mod_del": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_mod_replace": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_modify": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_modify_batch": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "ldap_next_attribute": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_next_entry": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_next_reference": { + "ext.name": "ldap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ldap_parse_reference": { + "ext.name": "ldap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ldap_parse_result": { + "ext.name": "ldap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ldap_read": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_rename": { + "ext.name": "ldap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ldap_sasl_bind": { + "ext.name": "ldap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ldap_search": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_set_option": { + "ext.name": "ldap", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ldap_set_rebind_proc": { + "ext.name": "ldap", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ldap_sort": { + "ext.name": "ldap", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ldap_start_tls": { + "ext.name": "ldap", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ldap_unbind": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "levenshtein": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "libxml_clear_errors": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "libxml_disable_entity_loader": { + "ext.name": "libxml", + "ext.min": "5.2.11", + "ext.max": null, + "php.min": "5.2.11", + "php.max": null + }, + "libxml_get_errors": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "libxml_get_last_error": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "libxml_set_external_entity_loader": { + "ext.name": "libxml", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "libxml_set_streams_context": { + "ext.name": "libxml", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "libxml_use_internal_errors": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "link": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "linkinfo": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "list": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "locale_accept_from_http": { + "ext.name": "intl", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "locale_canonicalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_compose": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_filter_matches": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_all_variants": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_default": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_display_language": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_display_name": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_display_region": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_display_script": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_display_variant": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_keywords": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_primary_language": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_region": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_script": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_lookup": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_parse": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_set_default": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "localeconv": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "localtime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "log": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "log10": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "log1p": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "long2ip": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lstat": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ltrim": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lzf_compress": { + "ext.name": "lzf", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lzf_decompress": { + "ext.name": "lzf", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lzf_optimized_for": { + "ext.name": "lzf", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "magic_quotes_runtime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mail": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mailparse_determine_best_xfer_encoding": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_create": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_extract_part": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_extract_part_file": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_extract_whole_part_file": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_free": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_get_part": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_get_part_data": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_get_structure": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_parse": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_parse_file": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_rfc822_parse_addresses": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_stream_encode": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_test": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_uudecode_all": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "max": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mb_check_encoding": { + "ext.name": "mbstring", + "ext.min": "4.4.3", + "ext.max": null, + "php.min": "4.4.3", + "php.max": null + }, + "mb_convert_case": { + "ext.name": "mbstring", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mb_convert_encoding": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_convert_kana": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_convert_variables": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_decode_mimeheader": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_decode_numericentity": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_detect_encoding": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_detect_order": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_encode_mimeheader": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_encode_numericentity": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_encoding_aliases": { + "ext.name": "mbstring", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "mb_ereg": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_match": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_replace": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_replace_callback": { + "ext.name": "mbstring", + "ext.min": "5.4.1", + "ext.max": null, + "php.min": "5.4.1", + "php.max": null + }, + "mb_ereg_search": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_getpos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_getregs": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_init": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_pos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_regs": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_setpos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_eregi": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_eregi_replace": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_get_info": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_http_input": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_http_output": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_internal_encoding": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_language": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_list_encodings": { + "ext.name": "mbstring", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mb_output_handler": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_parse_str": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_preferred_mime_name": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_regex_encoding": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_regex_set_options": { + "ext.name": "mbstring", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mb_send_mail": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_split": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_strcut": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_strimwidth": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_stripos": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_stristr": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_strlen": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_strpos": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_strrchr": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_strrichr": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_strripos": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_strrpos": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_strstr": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_strtolower": { + "ext.name": "mbstring", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mb_strtoupper": { + "ext.name": "mbstring", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mb_strwidth": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_substitute_character": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_substr": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_substr_count": { + "ext.name": "mbstring", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mbereg": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_match": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_replace": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_getpos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_getregs": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_init": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_pos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_regs": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_setpos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mberegi": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mberegi_replace": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbregex_encoding": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbsplit": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mcrypt_cbc": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_cfb": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_create_iv": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_decrypt": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_ecb": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_enc_get_algorithms_name": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_get_block_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_get_iv_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_get_key_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_get_modes_name": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_get_supported_key_sizes": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_is_block_algorithm": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_is_block_algorithm_mode": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_is_block_mode": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_self_test": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_encrypt": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_generic": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_generic_deinit": { + "ext.name": "mcrypt", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "mcrypt_generic_end": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_generic_init": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_get_block_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_get_cipher_name": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_get_iv_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_get_key_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_list_algorithms": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_list_modes": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_close": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_get_algo_block_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_get_algo_key_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_get_supported_key_sizes": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_is_block_algorithm": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_is_block_algorithm_mode": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_is_block_mode": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_open": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_self_test": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_ofb": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "md5": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "md5_file": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mdecrypt_generic": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "memcache_add": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_add_server": { + "ext.name": "memcache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_append": { + "ext.name": "memcache", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "memcache_cas": { + "ext.name": "memcache", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "memcache_close": { + "ext.name": "memcache", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_connect": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_debug": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_decrement": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_delete": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_flush": { + "ext.name": "memcache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_get": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_get_extended_stats": { + "ext.name": "memcache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_get_server_status": { + "ext.name": "memcache", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_get_stats": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_get_version": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_increment": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_pconnect": { + "ext.name": "memcache", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_prepend": { + "ext.name": "memcache", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "memcache_replace": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_set": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_set_compress_threshold": { + "ext.name": "memcache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_set_failure_callback": { + "ext.name": "memcache", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "memcache_set_server_params": { + "ext.name": "memcache", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memory_get_peak_usage": { + "ext.name": "standard", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "memory_get_usage": { + "ext.name": "standard", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "metaphone": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "method_exists": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mhash": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mhash_count": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mhash_get_block_size": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mhash_get_hash_name": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mhash_keygen_s2k": { + "ext.name": "mhash", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "microtime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mime_content_type": { + "ext.name": "fileinfo", + "ext.min": "1.0.5-dev", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "min": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mkdir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mktime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "money_format": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "move_uploaded_file": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "msg_get_queue": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msg_queue_exists": { + "ext.name": "sysvmsg", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "msg_receive": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msg_remove_queue": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msg_send": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msg_set_queue": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msg_stat_queue": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msgfmt_create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_format": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_format_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_get_error_code": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_get_error_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_get_locale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_get_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_parse": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_parse_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_set_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgpack_pack": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "msgpack_serialize": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "msgpack_unpack": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "msgpack_unserialize": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mssql_bind": { + "ext.name": "mssql", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "mssql_close": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_connect": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_data_seek": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_execute": { + "ext.name": "mssql", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "mssql_fetch_array": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_fetch_assoc": { + "ext.name": "mssql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mssql_fetch_batch": { + "ext.name": "mssql", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "mssql_fetch_field": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_fetch_object": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_fetch_row": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_field_length": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_field_name": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_field_seek": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_field_type": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_free_result": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_free_statement": { + "ext.name": "mssql", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "mssql_get_last_message": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_guid_string": { + "ext.name": "mssql", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "mssql_init": { + "ext.name": "mssql", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "mssql_min_error_severity": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_min_message_severity": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_next_result": { + "ext.name": "mssql", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "mssql_num_fields": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_num_rows": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_pconnect": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_query": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_result": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_rows_affected": { + "ext.name": "mssql", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "mssql_select_db": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mt_getrandmax": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mt_rand": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mt_srand": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_affected_rows": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_client_encoding": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_close": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_connect": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_create_db": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_data_seek": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_db_name": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_db_query": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_dbname": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_drop_db": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_errno": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_error": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_escape_string": { + "ext.name": "mysql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "mysql_fetch_array": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fetch_assoc": { + "ext.name": "mysql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "mysql_fetch_field": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fetch_lengths": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fetch_object": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fetch_row": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_flags": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_len": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_name": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_seek": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_table": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_type": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fieldflags": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fieldlen": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fieldname": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fieldtable": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fieldtype": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_free_result": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_freeresult": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_get_client_info": { + "ext.name": "mysql", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "mysql_get_host_info": { + "ext.name": "mysql", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "mysql_get_proto_info": { + "ext.name": "mysql", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "mysql_get_server_info": { + "ext.name": "mysql", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "mysql_info": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_insert_id": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_list_dbs": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_list_fields": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_list_processes": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_list_tables": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_listdbs": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_listfields": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_listtables": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_num_fields": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_num_rows": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_numfields": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_numrows": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_pconnect": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_ping": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_query": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_real_escape_string": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_result": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_select_db": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_selectdb": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_set_charset": { + "ext.name": "mysql", + "ext.min": "5.2.3", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "mysql_stat": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_table_name": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_tablename": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_thread_id": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_unbuffered_query": { + "ext.name": "mysql", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mysqli_affected_rows": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_autocommit": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_begin_transaction": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "mysqli_bind_param": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_bind_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_change_user": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_character_set_name": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_client_encoding": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_close": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_commit": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_connect": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_connect_errno": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_connect_error": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_data_seek": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_debug": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_disable_reads_from_master": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_disable_rpl_parse": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_dump_debug_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_embedded_server_end": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_embedded_server_start": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_enable_reads_from_master": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_enable_rpl_parse": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_errno": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_error": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_error_list": { + "ext.name": "mysqli", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "mysqli_escape_string": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_execute": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_fetch_all": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_array": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_assoc": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_field": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_field_direct": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_fields": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_lengths": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_object": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_row": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_field_count": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_field_seek": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_field_tell": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_free_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_cache_stats": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_charset": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_client_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_client_stats": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_client_version": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_connection_stats": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_host_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_links_stats": { + "ext.name": "mysqli", + "ext.min": "5.6.0alpha2", + "ext.max": null, + "php.min": "5.6.0alpha2", + "php.max": null + }, + "mysqli_get_metadata": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_get_proto_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_server_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_server_version": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_warnings": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_init": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_insert_id": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_kill": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_master_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_more_results": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_multi_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_next_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_num_fields": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_num_rows": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_options": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_param_count": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_ping": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_poll": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_prepare": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_real_connect": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_real_escape_string": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_real_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_reap_async_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_refresh": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "mysqli_release_savepoint": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "mysqli_report": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_rollback": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_rpl_parse_enabled": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_rpl_probe": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_rpl_query_type": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_savepoint": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "mysqli_select_db": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_send_long_data": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_send_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_set_charset": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_set_local_infile_default": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_set_local_infile_handler": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_set_opt": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_slave_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_sqlstate": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_ssl_set": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stat": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_affected_rows": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_attr_get": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_attr_set": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_bind_param": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_bind_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_close": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_data_seek": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_errno": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_error": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_error_list": { + "ext.name": "mysqli", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "mysqli_stmt_execute": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_fetch": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_field_count": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_free_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_get_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_get_warnings": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_init": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_insert_id": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_more_results": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_next_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_num_rows": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_param_count": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_prepare": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_reset": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_result_metadata": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_send_long_data": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_sqlstate": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_store_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_store_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_thread_id": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_thread_safe": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_use_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_warning_count": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "natcasesort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "natsort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "next": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ngettext": { + "ext.name": "gettext", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "nl2br": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "nl_langinfo": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "normalizer_is_normalized": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "normalizer_normalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "number_format": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "numfmt_create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_format": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_format_currency": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_error_code": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_error_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_locale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_symbol": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_text_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_parse": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_parse_currency": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_set_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_set_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_set_symbol": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_set_text_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "oauth_get_sbs": { + "ext.name": "OAuth", + "ext.min": "0.99.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "oauth_urlencode": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ob_clean": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ob_deflatehandler": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "ob_end_clean": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ob_end_flush": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ob_etaghandler": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "ob_flush": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ob_get_clean": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ob_get_contents": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ob_get_flush": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ob_get_length": { + "ext.name": "standard", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "ob_get_level": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ob_get_status": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ob_gzhandler": { + "ext.name": "zlib", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ob_iconv_handler": { + "ext.name": "iconv", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": "5.3.29" + }, + "ob_implicit_flush": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ob_inflatehandler": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "ob_list_handlers": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ob_start": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ob_tidyhandler": { + "ext.name": "tidy", + "ext.min": "2.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "octdec": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_autocommit": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_binmode": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_close": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_close_all": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_columnprivileges": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_columns": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_commit": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_connect": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_cursor": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_data_source": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_do": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_error": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_errormsg": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_exec": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_execute": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_fetch_array": { + "ext.name": "odbc", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "odbc_fetch_into": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_fetch_object": { + "ext.name": "odbc", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "odbc_fetch_row": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_len": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_name": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_num": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_precision": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_scale": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_type": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_foreignkeys": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_free_result": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_gettypeinfo": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_longreadlen": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_next_result": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_num_fields": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_num_rows": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_pconnect": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_prepare": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_primarykeys": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_procedurecolumns": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_procedures": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_result": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_result_all": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_rollback": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_setoption": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_specialcolumns": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_statistics": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_tableprivileges": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_tables": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "opcache_compile_file": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opcache_get_configuration": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opcache_get_status": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opcache_invalidate": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opcache_is_script_cached": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opcache_reset": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opendir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "openlog": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "openssl_cipher_iv_length": { + "ext.name": "openssl", + "ext.min": "5.3.3", + "ext.max": null, + "php.min": "5.3.3", + "php.max": null + }, + "openssl_csr_export": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_csr_export_to_file": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_csr_get_public_key": { + "ext.name": "openssl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "openssl_csr_get_subject": { + "ext.name": "openssl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "openssl_csr_new": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_csr_sign": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_decrypt": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_dh_compute_key": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_digest": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_encrypt": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_error_string": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_free_key": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_get_cert_locations": { + "ext.name": "openssl", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "openssl_get_cipher_methods": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_get_md_methods": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_get_privatekey": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_get_publickey": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_open": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_pbkdf2": { + "ext.name": "openssl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "openssl_pkcs12_export": { + "ext.name": "openssl", + "ext.min": "5.2.2", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "openssl_pkcs12_export_to_file": { + "ext.name": "openssl", + "ext.min": "5.2.2", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "openssl_pkcs12_read": { + "ext.name": "openssl", + "ext.min": "5.2.2", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "openssl_pkcs7_decrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_pkcs7_encrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_pkcs7_sign": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_pkcs7_verify": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_pkey_export": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_pkey_export_to_file": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_pkey_free": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_pkey_get_details": { + "ext.name": "openssl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "openssl_pkey_get_private": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_pkey_get_public": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_pkey_new": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_private_decrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_private_encrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_public_decrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_public_encrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_random_pseudo_bytes": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_seal": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_sign": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_spki_export": { + "ext.name": "openssl", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "openssl_spki_export_challenge": { + "ext.name": "openssl", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "openssl_spki_new": { + "ext.name": "openssl", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "openssl_spki_verify": { + "ext.name": "openssl", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "openssl_verify": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_x509_check_private_key": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_x509_checkpurpose": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_x509_export": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_x509_export_to_file": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_x509_fingerprint": { + "ext.name": "openssl", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "openssl_x509_free": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_x509_parse": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_x509_read": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "ord": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "output_add_rewrite_var": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "output_reset_rewrite_vars": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pack": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "parse_ini_file": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "parse_ini_string": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "parse_str": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "parse_url": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "passthru": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "password_get_info": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "password_hash": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "password_needs_rehash": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "password_verify": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "pathinfo": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pclose": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pcntl_alarm": { + "ext.name": "pcntl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pcntl_errno": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "pcntl_exec": { + "ext.name": "pcntl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pcntl_fork": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_get_last_error": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "pcntl_getpriority": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "pcntl_setpriority": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "pcntl_signal": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_signal_dispatch": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pcntl_sigprocmask": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pcntl_sigtimedwait": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pcntl_sigwaitinfo": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pcntl_strerror": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "pcntl_wait": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "pcntl_waitpid": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wexitstatus": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wifexited": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wifsignaled": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wifstopped": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wstopsig": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wtermsig": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pdf_activate_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_bookmark": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_launchlink": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_locallink": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_nameddest": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_note": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_path_point": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_pdflink": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_portfolio_file": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_portfolio_folder": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_table_cell": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_textflow": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_thumbnail": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_weblink": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_align": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_arc": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_arcn": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_attach_file": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_dpart": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_glyph": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_glyph_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_mc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_page_ext": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_pattern_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_template": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_template_ext": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_circle": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_circular_arc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_clip": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_font": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_pdi_document": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_closepath": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_closepath_fill_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_closepath_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_concat": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_continue_text": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_convert_to_unicode": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_3dview": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_action": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_annotation": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_bookmark": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_field": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_fieldgroup": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_gstate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_pvf": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_curveto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_define_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_delete": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_delete_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_delete_pvf": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_delete_table": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_delete_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_draw_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_ellipse": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_elliptical_arc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_encoding_set_char": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_dpart": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_glyph": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_mc": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_page_ext": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_template": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_template_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_endpath": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill_graphicsblock": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill_imageblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill_pdfblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill_textblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_findfont": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_table": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_textline": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_apiname": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_buffer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_errmsg": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_errnum": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_pdi_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_pdi_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_string": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_font": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_image": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_matchbox": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_pdi_page": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_pvf": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_table": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_textline": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_initgraphics": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_lineto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_3ddata": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_asset": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_iccprofile": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_makespotcolor": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_mc_point": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_moveto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_new": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_ccitt": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_file": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_image_file": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_pdi_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_pcos_get_number": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_pcos_get_stream": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_pcos_get_string": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_place_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_place_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_poca_delete": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_poca_insert": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_poca_new": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_poca_remove": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_process_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_rect": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_restore": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_resume_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_rotate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_save": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_scale": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_border_color": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_border_dash": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_border_style": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_graphics_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_gstate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_info": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_layer_dependency": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_text_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_text_pos": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setcolor": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setdash": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setdashpattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setflat": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setfont": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setgray": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setgray_fill": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setgray_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setlinecap": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setlinejoin": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setlinewidth": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setmatrix": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setmiterlimit": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setpolydash": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setrgbcolor": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setrgbcolor_fill": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setrgbcolor_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_shading": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_shading_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_shfill": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_show": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_show_boxed": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_show_xy": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_skew": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_stringwidth": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_suspend_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_translate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf16_to_utf32": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf16_to_utf8": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf32_to_utf16": { + "ext.name": "pdflib", + "ext.min": "2.1.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf32_to_utf8": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf8_to_utf16": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf8_to_utf32": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdo_drivers": { + "ext.name": "PDO", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pfsockopen": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_affected_rows": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_cancel_query": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_client_encoding": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_clientencoding": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_close": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_cmdtuples": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_connect": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_connect_poll": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "pg_connection_busy": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_connection_reset": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_connection_status": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_consume_input": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "pg_convert": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_copy_from": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_copy_to": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_dbname": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_delete": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_end_copy": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_errormessage": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_escape_bytea": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_escape_identifier": { + "ext.name": "pgsql", + "ext.min": "5.4.4", + "ext.max": null, + "php.min": "5.4.4", + "php.max": null + }, + "pg_escape_literal": { + "ext.name": "pgsql", + "ext.min": "5.4.4", + "ext.max": null, + "php.min": "5.4.4", + "php.max": null + }, + "pg_escape_string": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_exec": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_execute": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_fetch_all": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_fetch_all_columns": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_fetch_array": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_fetch_assoc": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_fetch_object": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_fetch_result": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fetch_row": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_field_is_null": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_name": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_num": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_prtlen": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_size": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_table": { + "ext.name": "pgsql", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pg_field_type": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_type_oid": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_fieldisnull": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fieldname": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fieldnum": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fieldprtlen": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fieldsize": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fieldtype": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_flush": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "pg_free_result": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_freeresult": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_get_notify": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_get_pid": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_get_result": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_getlastoid": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_host": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_insert": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_last_error": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_last_notice": { + "ext.name": "pgsql", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "pg_last_oid": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_close": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_create": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_export": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_import": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_open": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_read": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_read_all": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_seek": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_tell": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_truncate": { + "ext.name": "pgsql", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "pg_lo_unlink": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_write": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loclose": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_locreate": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loexport": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loimport": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loopen": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loread": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loreadall": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lounlink": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lowrite": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_meta_data": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_num_fields": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_num_rows": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_numfields": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_numrows": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_options": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_parameter_status": { + "ext.name": "pgsql", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "pg_pconnect": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_ping": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_port": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_prepare": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_put_line": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_query": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_query_params": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_result": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_result_error": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_result_error_field": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_result_seek": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_result_status": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_select": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_send_execute": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_send_prepare": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_send_query": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_send_query_params": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_set_client_encoding": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_set_error_verbosity": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_setclientencoding": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_socket": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "pg_trace": { + "ext.name": "pgsql", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "pg_transaction_status": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_tty": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_unescape_bytea": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_untrace": { + "ext.name": "pgsql", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "pg_update": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_version": { + "ext.name": "pgsql", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "php_check_syntax": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.0.4" + }, + "php_egg_logo_guid": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": "5.4.45" + }, + "php_ini_loaded_file": { + "ext.name": "standard", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "php_ini_scanned_files": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "php_logo_guid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.4.45" + }, + "php_real_logo_guid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.4.45" + }, + "php_sapi_name": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "php_strip_whitespace": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "php_uname": { + "ext.name": "standard", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "phpcredits": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "phpinfo": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "phpversion": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pi": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "png2wbmp": { + "ext.name": "gd", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "popen": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pos": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_access": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "posix_ctermid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_errno": { + "ext.name": "posix", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "posix_get_last_error": { + "ext.name": "posix", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "posix_getcwd": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getegid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_geteuid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getgid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getgrgid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getgrnam": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getgroups": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getlogin": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getpgid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getpgrp": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getpid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getppid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getpwnam": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getpwuid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getrlimit": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getsid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getuid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_initgroups": { + "ext.name": "posix", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "posix_isatty": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_kill": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_mkfifo": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_mknod": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "posix_setegid": { + "ext.name": "posix", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "posix_seteuid": { + "ext.name": "posix", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "posix_setgid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_setpgid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_setsid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_setuid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_strerror": { + "ext.name": "posix", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "posix_times": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_ttyname": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_uname": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pow": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_filter": { + "ext.name": "pcre", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "preg_grep": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_last_error": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "preg_match": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_match_all": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_quote": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_replace": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_replace_callback": { + "ext.name": "pcre", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "preg_split": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "prev": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "print_r": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "printf": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "proc_close": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "proc_get_status": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "proc_nice": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "proc_open": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "proc_terminate": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "property_exists": { + "ext.name": "Core", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "putenv": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "quoted_printable_decode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "quoted_printable_encode": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "quotemeta": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rad2deg": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rand": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "random_int": { + "ext.name": "standard", + "ext.min": "7.0.0", + "ext.max": null, + "php.min": "7.0.0", + "php.max": null + }, + "random_bytes": { + "ext.name": "standard", + "ext.min": "7.0.0", + "ext.max": null, + "php.min": "7.0.0", + "php.max": null + }, + "range": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rar_allow_broken_set": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_broken_is": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_close": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_comment_get": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_entry_get": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_list": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_open": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_solid_is": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_wrapper_cache_stats": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rawurldecode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rawurlencode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "read_exif_data": { + "ext.name": "exif", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "readdir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readfile": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readgzfile": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_add_history": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_callback_handler_install": { + "ext.name": "readline", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "readline_callback_handler_remove": { + "ext.name": "readline", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "readline_callback_read_char": { + "ext.name": "readline", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "readline_clear_history": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_completion_function": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_info": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_list_history": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_on_new_line": { + "ext.name": "readline", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "readline_read_history": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_redisplay": { + "ext.name": "readline", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "readline_write_history": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readlink": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "realpath": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "realpath_cache_get": { + "ext.name": "standard", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "realpath_cache_size": { + "ext.name": "standard", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "recode": { + "ext.name": "recode", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "recode_file": { + "ext.name": "recode", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "recode_string": { + "ext.name": "recode", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "register_shutdown_function": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "register_tick_function": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "rename": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "reset": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "resourcebundle_count": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "resourcebundle_create": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "resourcebundle_get": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "resourcebundle_get_error_code": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "resourcebundle_get_error_message": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "resourcebundle_locales": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "restore_error_handler": { + "ext.name": "Core", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "restore_exception_handler": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "restore_include_path": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "rewind": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rewinddir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rmdir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "round": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rsort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rtrim": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "scandir": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sem_acquire": { + "ext.name": "sysvsem", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sem_get": { + "ext.name": "sysvsem", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sem_release": { + "ext.name": "sysvsem", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sem_remove": { + "ext.name": "sysvsem", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "serialize": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_abort": { + "ext.name": "session", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "session_cache_expire": { + "ext.name": "session", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "session_cache_limiter": { + "ext.name": "session", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "session_commit": { + "ext.name": "session", + "ext.min": "4.4.0", + "ext.max": null, + "php.min": "4.4.0", + "php.max": null + }, + "session_decode": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_destroy": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_encode": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_gc": { + "ext.name": "session", + "ext.min": "5.6.0alpha1", + "ext.max": "5.6.0alpha3", + "php.min": "5.6.0alpha1", + "php.max": "5.6.0alpha3" + }, + "session_get_cookie_params": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_id": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_is_registered": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.3.29" + }, + "session_module_name": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_name": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_regenerate_id": { + "ext.name": "session", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "session_register": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.3.29" + }, + "session_register_shutdown": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "session_reset": { + "ext.name": "session", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "session_save_path": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_serializer_name": { + "ext.name": "session", + "ext.min": "5.6.0alpha1", + "ext.max": "5.6.0alpha3", + "php.min": "5.6.0alpha1", + "php.max": "5.6.0alpha3" + }, + "session_set_cookie_params": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_set_save_handler": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_start": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_status": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "session_unregister": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.3.29" + }, + "session_unset": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_write_close": { + "ext.name": "session", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "set_error_handler": { + "ext.name": "Core", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "set_exception_handler": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "set_file_buffer": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "set_include_path": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "set_magic_quotes_runtime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "set_socket_blocking": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "set_time_limit": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "setcookie": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "setlocale": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "setrawcookie": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "settype": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sha1": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "sha1_file": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "shell_exec": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_attach": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_detach": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_get_var": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_has_var": { + "ext.name": "sysvshm", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shm_put_var": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_remove": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_remove_var": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shmop_close": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "shmop_delete": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "shmop_open": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "shmop_read": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "shmop_size": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "shmop_write": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "show_source": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shuffle": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "similar_text": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "simplexml_import_dom": { + "ext.name": "SimpleXML", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "simplexml_load_file": { + "ext.name": "SimpleXML", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "simplexml_load_string": { + "ext.name": "SimpleXML", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sin": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sinh": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "sizeof": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sleep": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmp2_get": { + "ext.name": "snmp", + "ext.min": "4.3.11", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "snmp2_getnext": { + "ext.name": "snmp", + "ext.min": "5.0.4", + "ext.max": null, + "php.min": "5.0.4", + "php.max": null + }, + "snmp2_real_walk": { + "ext.name": "snmp", + "ext.min": "4.3.11", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "snmp2_set": { + "ext.name": "snmp", + "ext.min": "4.3.11", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "snmp2_walk": { + "ext.name": "snmp", + "ext.min": "4.3.11", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "snmp3_get": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp3_getnext": { + "ext.name": "snmp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "snmp3_real_walk": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp3_set": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp3_walk": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp_get_quick_print": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmp_get_valueretrieval": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "snmp_read_mib": { + "ext.name": "snmp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "snmp_set_enum_print": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp_set_oid_numeric_print": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp_set_oid_output_format": { + "ext.name": "snmp", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "snmp_set_quick_print": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmp_set_valueretrieval": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "snmpget": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmpgetnext": { + "ext.name": "snmp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "snmprealwalk": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmpset": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmpwalk": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmpwalkoid": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "socket_accept": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_bind": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_clear_error": { + "ext.name": "sockets", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "socket_close": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_cmsg_space": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "socket_connect": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_create": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_create_listen": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_create_pair": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_get_option": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "socket_get_status": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "socket_getopt": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_getpeername": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_getsockname": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_import_stream": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "socket_last_error": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_listen": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_read": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_recv": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_recvfrom": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_recvmsg": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "socket_select": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_send": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_sendmsg": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "socket_sendto": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_set_block": { + "ext.name": "sockets", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "socket_set_blocking": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "socket_set_nonblock": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_set_option": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "socket_set_timeout": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "socket_setopt": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_shutdown": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_strerror": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_write": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "solr_get_version": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "sort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "soundex": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "spl_autoload": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_autoload_call": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_autoload_extensions": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_autoload_functions": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_autoload_register": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_autoload_unregister": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_classes": { + "ext.name": "spl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "spl_object_hash": { + "ext.name": "spl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "split": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "spliti": { + "ext.name": "ereg", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "sprintf": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sql_regcase": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sqlite_array_query": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_busy_timeout": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_changes": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_close": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_column": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_create_aggregate": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_create_function": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_current": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_error_string": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_escape_string": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_exec": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_factory": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_all": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_array": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_column_types": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_object": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_single": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_string": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_field_name": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_has_more": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_has_prev": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_last_error": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_last_insert_rowid": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_libencoding": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_libversion": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_next": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_num_fields": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_num_rows": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_open": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_popen": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_prev": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_query": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_rewind": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_seek": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_single_query": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_udf_decode_binary": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_udf_encode_binary": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_unbuffered_query": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_valid": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqrt": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "srand": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sscanf": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "ssh2_auth_agent": { + "ext.name": "ssh2", + "ext.min": "0.12", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_auth_hostbased_file": { + "ext.name": "ssh2", + "ext.min": "0.7", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_auth_none": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_auth_password": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_auth_pubkey_file": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_connect": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_exec": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_fetch_stream": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_fingerprint": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_forward_accept": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_forward_listen": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_methods_negotiated": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_poll": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_publickey_add": { + "ext.name": "ssh2", + "ext.min": "0.10", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_publickey_init": { + "ext.name": "ssh2", + "ext.min": "0.10", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_publickey_list": { + "ext.name": "ssh2", + "ext.min": "0.10", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_publickey_remove": { + "ext.name": "ssh2", + "ext.min": "0.10", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_scp_recv": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_scp_send": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_chmod": { + "ext.name": "ssh2", + "ext.min": "0.12", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_lstat": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_mkdir": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_readlink": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_realpath": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_rename": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_rmdir": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_stat": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_symlink": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_unlink": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_shell": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_tunnel": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stat": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stomp_abort": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_ack": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_begin": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_close": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_commit": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_connect": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_connect_error": { + "ext.name": "stomp", + "ext.min": "0.3.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_error": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_get_read_timeout": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_get_session_id": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_has_frame": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_nack": { + "ext.name": "stomp", + "ext.min": "1.0.6", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_read_frame": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_send": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_set_read_timeout": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_subscribe": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_unsubscribe": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_version": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "str_getcsv": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "str_ireplace": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "str_pad": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "str_repeat": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "str_replace": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "str_rot13": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "str_shuffle": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "str_split": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "str_word_count": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "strcasecmp": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strchr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strcmp": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strcoll": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "strcspn": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stream_bucket_append": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_bucket_make_writeable": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_bucket_new": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_bucket_prepend": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_context_create": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_context_get_default": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "stream_context_get_options": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_context_get_params": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stream_context_set_default": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stream_context_set_option": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_context_set_params": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_copy_to_stream": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_filter_append": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_filter_prepend": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_filter_register": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_filter_remove": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "stream_get_contents": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_get_filters": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_get_line": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_get_meta_data": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_get_transports": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_get_wrappers": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_is_local": { + "ext.name": "standard", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "stream_register_wrapper": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_resolve_include_path": { + "ext.name": "standard", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "stream_select": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_set_blocking": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_set_chunk_size": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "stream_set_read_buffer": { + "ext.name": "standard", + "ext.min": "5.3.3", + "ext.max": null, + "php.min": "5.3.3", + "php.max": null + }, + "stream_set_timeout": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_set_write_buffer": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_socket_accept": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_client": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_enable_crypto": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "stream_socket_get_name": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_pair": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "stream_socket_recvfrom": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_sendto": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_server": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_shutdown": { + "ext.name": "standard", + "ext.min": "5.2.1", + "ext.max": null, + "php.min": "5.2.1", + "php.max": null + }, + "stream_supports_lock": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stream_wrapper_register": { + "ext.name": "standard", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "stream_wrapper_restore": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "stream_wrapper_unregister": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "strftime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strip_tags": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stripcslashes": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stripos": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stripslashes": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stristr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strlen": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strnatcasecmp": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strnatcmp": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strncasecmp": { + "ext.name": "Core", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "strncmp": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strpbrk": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "strpos": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strptime": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "strrchr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strrev": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strripos": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "strrpos": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strspn": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strstr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strtok": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strtolower": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strtotime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strtoupper": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strtr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strval": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "substr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "substr_compare": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "substr_count": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "substr_replace": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_add": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_auth_get_parameter": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_auth_set_parameter": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_blame": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_cat": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_checkout": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_cleanup": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_client_version": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_commit": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_config_ensure": { + "ext.name": "svn", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_copy": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_delete": { + "ext.name": "svn", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_diff": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_export": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_abort_txn": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_apply_text": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_begin_txn2": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_change_node_prop": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_check_path": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_contents_changed": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_copy": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_delete": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_dir_entries": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_file_contents": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_file_length": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_is_dir": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_is_file": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_make_dir": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_make_file": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_node_created_rev": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_node_prop": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_props_changed": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_revision_prop": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_revision_root": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_txn_root": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_youngest_rev": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_import": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_info": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_lock": { + "ext.name": "svn", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_log": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_ls": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_mkdir": { + "ext.name": "svn", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_move": { + "ext.name": "svn", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_propget": { + "ext.name": "svn", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_proplist": { + "ext.name": "svn", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_create": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_fs": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_fs_begin_txn_for_commit": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_fs_commit_txn": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_hotcopy": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_open": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_recover": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_resolved": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_revert": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_status": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_switch": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_unlock": { + "ext.name": "svn", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_update": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "symlink": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sys_get_temp_dir": { + "ext.name": "standard", + "ext.min": "5.2.1", + "ext.max": null, + "php.min": "5.2.1", + "php.max": null + }, + "sys_getloadavg": { + "ext.name": "standard", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "syslog": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "system": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "tan": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "tanh": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "tempnam": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "textdomain": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "tidy_access_count": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_clean_repair": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_config_count": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_create": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "0.5.3", + "php.min": "4.3.0", + "php.max": null + }, + "tidy_diagnose": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_error_count": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_body": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_config": { + "ext.name": "tidy", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_error_buffer": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_head": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_html": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_html_ver": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_opt_doc": { + "ext.name": "tidy", + "ext.min": "2.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "tidy_get_output": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_release": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_root": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_status": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_getopt": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_is_xhtml": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_is_xml": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_load_config": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "1.2", + "php.min": "4.3.0", + "php.max": "4.4.9" + }, + "tidy_load_config_enc": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "1.2", + "php.min": "4.3.0", + "php.max": null + }, + "tidy_parse_file": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_parse_string": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_repair_file": { + "ext.name": "tidy", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_repair_string": { + "ext.name": "tidy", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_reset_config": { + "ext.name": "tidy", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "4.4.9" + }, + "tidy_save_config": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "1.2", + "php.min": "4.3.0", + "php.max": "4.4.9" + }, + "tidy_set_encoding": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "1.2", + "php.min": "4.3.0", + "php.max": "4.4.9" + }, + "tidy_setopt": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "1.2", + "php.min": "4.3.0", + "php.max": "4.4.9" + }, + "tidy_warning_count": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "time": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "time_nanosleep": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "time_sleep_until": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_abbreviations_list": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_identifiers_list": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_location_get": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "timezone_name_from_abbr": { + "ext.name": "date", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "timezone_name_get": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_offset_get": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_open": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_transitions_get": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "timezone_version_get": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "tmpfile": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "token_get_all": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "token_name": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "touch": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "trait_exists": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "transliterator_create": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_create_from_rules": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_create_inverse": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_get_error_code": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_get_error_message": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_list_ids": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_transliterate": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "trigger_error": { + "ext.name": "Core", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "trim": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "uasort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ucfirst": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ucwords": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "uksort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "umask": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "uniqid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "unixtojd": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "unlink": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "unpack": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "unregister_tick_function": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "unserialize": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "uopz_backup": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_compose": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_copy": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_delete": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_extend": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_flags": { + "ext.name": "uopz", + "ext.min": "2.0.2", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_function": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_implement": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_overload": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_redefine": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_rename": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_restore": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_undefine": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uploadprogress_get_contents": { + "ext.name": "uploadprogress", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "uploadprogress_get_info": { + "ext.name": "uploadprogress", + "ext.min": "0.3.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "urldecode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "urlencode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "use_soap_error_handler": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "user_error": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "usleep": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "usort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "utf8_decode": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "utf8_encode": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "var_dump": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "var_export": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "version_compare": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "vfprintf": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "vprintf": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "vsprintf": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "wddx_add_vars": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wddx_deserialize": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wddx_packet_end": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wddx_packet_start": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wddx_serialize_value": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wddx_serialize_vars": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wordwrap": { + "ext.name": "standard", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "xcache_clear_cache": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_coredump": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_count": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_coverager_decode": { + "ext.name": "XCache", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xcache_coverager_get": { + "ext.name": "XCache", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xcache_coverager_start": { + "ext.name": "XCache", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xcache_coverager_stop": { + "ext.name": "XCache", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xcache_dasm_file": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_dasm_string": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_dec": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get_data_type": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get_isref": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_get_op_type": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get_opcode": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get_opcode_spec": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_get_refcount": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_get_special_value": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get_type": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_inc": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_info": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_is_autoglobal": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_isset": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_list": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_set": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_unset": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_unset_by_prefix": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xdebug_break": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_call_class": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_call_file": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_call_function": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_call_line": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_clear_aggr_profiling_data": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta6", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_code_coverage_started": { + "ext.name": "xdebug", + "ext.min": "2.3.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "xdebug_debug_zval": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_debug_zval_stdout": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta4", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_disable": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_dump_aggr_profiling_data": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta6", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_dump_function_trace": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": "1.3.2", + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_dump_superglobals": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_enable": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_code_coverage": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_collected_errors": { + "ext.name": "xdebug", + "ext.min": "2.1.0beta1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "xdebug_get_declared_vars": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta5", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_formatted_function_stack": { + "ext.name": "xdebug", + "ext.min": "2.1.0beta1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "xdebug_get_function_count": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_function_stack": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_function_trace": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": "1.3.2", + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_headers": { + "ext.name": "xdebug", + "ext.min": "2.1.0beta1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "xdebug_get_profiler_filename": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta4", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_stack_depth": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_tracefile_name": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_is_enabled": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_memory_usage": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_peak_memory_usage": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_print_function_stack": { + "ext.name": "xdebug", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_set_error_handler": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": "2.0.0beta6", + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_start_code_coverage": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_start_error_collection": { + "ext.name": "xdebug", + "ext.min": "2.1.0beta1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "xdebug_start_trace": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_stop_code_coverage": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_stop_error_collection": { + "ext.name": "xdebug", + "ext.min": "2.1.0beta1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "xdebug_stop_trace": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_time_index": { + "ext.name": "xdebug", + "ext.min": "1.3.0RC1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_var_dump": { + "ext.name": "xdebug", + "ext.min": "1.3.0RC1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xhprof_disable": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xhprof_enable": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xhprof_sample_disable": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xhprof_sample_enable": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xml_error_string": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_get_current_byte_index": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_get_current_column_number": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_get_current_line_number": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_get_error_code": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parse": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parse_into_struct": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parser_create": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parser_create_ns": { + "ext.name": "xml", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "xml_parser_free": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parser_get_option": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parser_set_option": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_character_data_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_default_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_element_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_end_namespace_decl_handler": { + "ext.name": "xml", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "xml_set_external_entity_ref_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_notation_decl_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_object": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_processing_instruction_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_start_namespace_decl_handler": { + "ext.name": "xml", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "xml_set_unparsed_entity_decl_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xmlrpc_decode": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_decode_request": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_encode": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_encode_request": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_get_type": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_is_fault": { + "ext.name": "xmlrpc", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xmlrpc_parse_method_descriptions": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_add_introspection_data": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_call_method": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_create": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_destroy": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_register_introspection_callback": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_register_method": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_set_type": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlwriter_end_attribute": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_cdata": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_comment": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_document": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_dtd": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_dtd_attlist": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_dtd_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_dtd_entity": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_pi": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_flush": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_full_end_element": { + "ext.name": "xmlwriter", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xmlwriter_open_memory": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_open_uri": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_output_memory": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_set_indent": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_set_indent_string": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_attribute": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_attribute_ns": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_cdata": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_comment": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_document": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_dtd": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_dtd_attlist": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_dtd_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_dtd_entity": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_element_ns": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_pi": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_text": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_attribute": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_attribute_ns": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_cdata": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_comment": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_dtd": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_dtd_attlist": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_dtd_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_dtd_entity": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_element_ns": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_pi": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_raw": { + "ext.name": "xmlwriter", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "yaml_emit": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "yaml_emit_file": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "yaml_parse": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "yaml_parse_file": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "yaml_parse_url": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zend_logo_guid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.4.45" + }, + "zend_thread_id": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "zend_version": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "zip_close": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_close": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_compressedsize": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_compressionmethod": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_filesize": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_name": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_open": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_read": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_open": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_read": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zlib_decode": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "zlib_encode": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "zlib_get_coding_type": { + "ext.name": "zlib", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + } + }, + "classes": { + "AMQPChannel": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPChannelException": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPConnection": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPConnectionException": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPEnvelope": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPException": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPExchange": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPExchangeException": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPQueue": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPQueueException": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "APCIterator": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "AppendIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ArrayIterator": { + "ext.name": "spl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ArrayObject": { + "ext.name": "spl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "BadFunctionCallException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "BadMethodCallException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLFile": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CachingIterator": { + "ext.name": "spl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "CallbackFilterIterator": { + "ext.name": "spl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "Closure": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Collator": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "Collectable": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Cond": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "DOMAttr": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMCdataSection": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMCharacterData": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMComment": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMConfiguration": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMDocument": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMDocumentFragment": { + "ext.name": "dom", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "DOMDocumentType": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMDomError": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMElement": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMEntity": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMEntityReference": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMErrorHandler": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMException": { + "ext.name": "dom", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "DOMImplementation": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMImplementationList": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMImplementationSource": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMLocator": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNameList": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNameSpaceNode": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNamedNodeMap": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNode": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNodeList": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNotation": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMProcessingInstruction": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMStringExtend": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMStringList": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMText": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMTypeinfo": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMUserDataHandler": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMXPath": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DateInterval": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "DatePeriod": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "DateTime": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "DateTimeImmutable": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "DateTimeZone": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "Directory": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DirectoryIterator": { + "ext.name": "spl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DomainException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "EmptyIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ErrorException": { + "ext.name": "Core", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Exception": { + "ext.name": "Core", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "FilesystemIterator": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FilterIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Gender\\Gender": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Generator": { + "ext.name": "Core", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "GlobIterator": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "HaruAnnotation": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruDestination": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruDoc": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruEncoder": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruException": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruFont": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruImage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruOutline": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruPage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HttpDeflateStream": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpEncodingException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpHeaderException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpInflateStream": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpInvalidParamException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpMalformedHeadersException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpMessage": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpMessageTypeException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpQueryString": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpQueryStringException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequest": { + "ext.name": "http", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequestDataShare": { + "ext.name": "http", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequestException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequestMethodException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequestPool": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequestPoolException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpResponse": { + "ext.name": "http", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpResponseException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRuntimeException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpSocketException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpUrlException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpUtil": { + "ext.name": "http", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "Imagick": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickDraw": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickDrawException": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickException": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickKernel": { + "ext.name": "imagick", + "ext.min": "3.3.0RC1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickKernelException": { + "ext.name": "imagick", + "ext.min": "3.3.0RC1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickPixel": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickPixelException": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickPixelIterator": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickPixelIteratorException": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "InfiniteIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "IntlBreakIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlCalendar": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlCodePointBreakIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlDateFormatter": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IntlException": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlGregorianCalendar": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlPartsIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlRuleBasedBreakIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "InvalidArgumentException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "IteratorIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LengthException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LibXMLError": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LimitIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Locale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "LogicException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Memcache": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "MemcachePool": { + "ext.name": "memcache", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "Memcached": { + "ext.name": "memcached", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MemcachedException": { + "ext.name": "memcached", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MemcachedServer": { + "ext.name": "memcached", + "ext.min": "2.2.0b1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MessageFormatter": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MessagePack": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MessagePackUnpacker": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "Mongo": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoBinData": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoClient": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoCode": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoCollection": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoCommandCursor": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoConnectionException": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoCursor": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoCursorException": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoCursorTimeoutException": { + "ext.name": "mongo", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoDB": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoDBRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoDate": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoDeleteBatch": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoDuplicateKeyException": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoException": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoExecutionTimeoutException": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoGridFS": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoGridFSCursor": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoGridFSException": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoGridFSFile": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoId": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoInsertBatch": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoInt32": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoInt64": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoLog": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoMaxKey": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoMinKey": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoPool": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoProtocolException": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoRegex": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoResultException": { + "ext.name": "mongo", + "ext.min": "1.3.0RC1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoTimestamp": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoUpdateBatch": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoUtil": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": "0.9.0", + "php.min": "5.0.0", + "php.max": null + }, + "MongoWriteBatch": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoWriteConcernException": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MultipleIterator": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Mutex": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "NoRewindIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Normalizer": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.3.0alpha1", + "php.max": null + }, + "NumberFormatter": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "OAuth": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAuthException": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAuthProvider": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OutOfBoundsException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OutOfRangeException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OverflowException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PDFlib": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PDFlibException": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PDO": { + "ext.name": "PDO", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PDOException": { + "ext.name": "PDO", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PDORow": { + "ext.name": "PDO", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PDOStatement": { + "ext.name": "PDO", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ParentIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Phar": { + "ext.name": "phar", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PharData": { + "ext.name": "phar", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PharException": { + "ext.name": "phar", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PharFileInfo": { + "ext.name": "phar", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "Pool": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "RangeException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "RarArchive": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RarEntry": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RarException": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RecursiveArrayIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "RecursiveCachingIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "RecursiveCallbackFilterIterator": { + "ext.name": "spl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "RecursiveDirectoryIterator": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "RecursiveFilterIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "RecursiveIteratorIterator": { + "ext.name": "spl", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "RecursiveRegexIterator": { + "ext.name": "spl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RecursiveTreeIterator": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Redis": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RedisArray": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RedisException": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "Reflection": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionException": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionExtension": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionFunction": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionFunctionAbstract": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionMethod": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionObject": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionParameter": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionProperty": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionZendExtension": { + "ext.name": "Reflection", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "RegexIterator": { + "ext.name": "spl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ResourceBundle": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "Riak\\Bucket": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\BucketPropertyList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Connection": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Crdt\\Counter": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Crdt\\Input\\GetInput": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Crdt\\Input\\UpdateInput": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\BadArgumentsException": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\CommunicationException": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\ConnectionException": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\NonUniqueException": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\RiakException": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\UnexpectedResponseException": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\UnresolvedConflictException": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\DeleteInput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\GetInput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\GetResolverInput": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\IndexInput": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\Input": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\PutInput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Link": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Functions\\BaseFunction": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Functions\\ErlangFunction": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Functions\\JavascriptFunction": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Input\\BucketInput": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Input\\Input": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Input\\KeyDataListInput": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Input\\KeyListInput": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\MapReduce": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Output\\Output": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Phase\\MapPhase": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Phase\\Phase": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Phase\\ReducePhase": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Object": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\ObjectList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\GetOutput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\IndexOutput": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\IndexResult": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\IndexResultList": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\Output": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\PutOutput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\YoungestSiblingResolver": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\PoolInfo": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\CommitHook": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\CommitHookList": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ModuleFunction": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ReplicationMode\\Disabled": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ReplicationMode\\FullSyncOnly": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ReplicationMode\\RealTimeAndFullSync": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ReplicationMode\\RealTimeOnly": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Query\\IndexQuery": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Search\\Input\\ParameterBag": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Search\\Output\\DocumentOutput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Search\\Output\\Output": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Search\\Search": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\ServerInfo": { + "ext.name": "riak", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "RuntimeException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "SNMP": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SNMPException": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SQLite3": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLite3Result": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLite3Stmt": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLiteDatabase": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLiteException": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLiteResult": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLiteUnbuffered": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SessionHandler": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SimpleXMLElement": { + "ext.name": "SimpleXML", + "ext.min": "5.0.1", + "ext.max": null, + "php.min": "5.0.1", + "php.max": null + }, + "SimpleXMLIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "SoapClient": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SoapFault": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SoapHeader": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SoapParam": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SoapServer": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SoapVar": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SolrClient": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrClientException": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrCollapseFunction": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SolrDisMaxQuery": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SolrDocument": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrDocumentField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrException": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrGenericResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrIllegalArgumentException": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrIllegalOperationException": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrInputDocument": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrMissingMandatoryParameterException": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SolrModifiableParams": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrObject": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrParams": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrPingResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrQueryResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrServerException": { + "ext.name": "solr", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SolrUpdateResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrUtils": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SphinxClient": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SplDoublyLinkedList": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplFileInfo": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "SplFileObject": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "SplFixedArray": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplHeap": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplMaxHeap": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplMinHeap": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplObjectStorage": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "SplPriorityQueue": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplQueue": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplStack": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplTempFileObject": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "Spoofchecker": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "Stomp": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "StompException": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "StompFrame": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "Svn": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SvnNode": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SvnWc": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SvnWcSchedule": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SyncEvent": { + "ext.name": "sync", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SyncMutex": { + "ext.name": "sync", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SyncReaderWriter": { + "ext.name": "sync", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SyncSemaphore": { + "ext.name": "sync", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Thread": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Threaded": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Transliterator": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "UConverter": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "UnderflowException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "UnexpectedValueException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "VarnishAdmin": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VarnishException": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VarnishLog": { + "ext.name": "varnish", + "ext.min": "0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VarnishStat": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Worker": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLDiff\\Base": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLDiff\\DOM": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLDiff\\Exception": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLDiff\\File": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLDiff\\Memory": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLReader": { + "ext.name": "xmlreader", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XMLWriter": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "XSLTProcessor": { + "ext.name": "xsl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "Yac": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ZipArchive": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__PHP_Incomplete_Class": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "finfo": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "http\\Client": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Request": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Response": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Cookie": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Encoding\\Stream": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Encoding\\Stream\\Dechunk": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Encoding\\Stream\\Deflate": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Encoding\\Stream\\Inflate": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Env": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Env\\Request": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Env\\Response": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadConversionException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadHeaderException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadMessageException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadMethodCallException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadQueryStringException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadUrlException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\InvalidArgumentException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\RuntimeException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\UnexpectedValueException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Header": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Header\\Parser": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Message": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Message\\Body": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Message\\Parser": { + "ext.name": "http", + "ext.min": "2.2.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Params": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\QueryString": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Url": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "mimemessage": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysqli": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_driver": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_sql_exception": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_warning": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "parent": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "php_user_filter": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "self": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stackable": { + "ext.name": "pthreads", + "ext.min": "0.0.36", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "static": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stdClass": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "tidy": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidyNode": { + "ext.name": "tidy", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.0.1", + "php.max": null + } + }, + "interfaces": { + "ArrayAccess": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "Countable": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "DateTimeInterface": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "Iterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "IteratorAggregate": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "JsonSerializable": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MongoCursorInterface": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "OuterIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "RecursiveIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Reflector": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "Riak\\MapReduce\\Output\\StreamOutput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\ConflictResolver": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\KeyStreamOutput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ReplicationMode\\ReplicationMode": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SeekableIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Serializable": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "SessionHandlerInterface": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SessionIdInterface": { + "ext.name": "session", + "ext.min": "5.5.1", + "ext.max": null, + "php.min": "5.5.1", + "php.max": null + }, + "SplObserver": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "SplSubject": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Traversable": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "http\\Exception": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "constants": { + "ABDAY_1": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_2": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_3": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_4": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_5": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_6": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_7": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_1": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_10": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_11": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_12": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_2": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_3": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_4": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_5": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_6": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_7": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_8": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_9": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "AF_INET": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "AF_INET6": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "AF_UNIX": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ALT_DIGITS": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "AMQP_AUTOACK": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_AUTODELETE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_DURABLE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_EXCLUSIVE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_EX_TYPE_DIRECT": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_EX_TYPE_FANOUT": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_EX_TYPE_HEADERS": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_EX_TYPE_TOPIC": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_IFEMPTY": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_IFUNUSED": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_IMMEDIATE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_INTERNAL": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_MANDATORY": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_MULTIPLE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_NOLOCAL": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_NOPARAM": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_NOWAIT": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_OS_SOCKET_TIMEOUT_ERRNO": { + "ext.name": "amqp", + "ext.min": "1.0.8", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_PASSIVE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_REQUEUE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AM_STR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "APACHE_MAP": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "APCU_APC_FULL_BC": { + "ext.name": "apcu", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "APC_BIN_VERIFY_CRC32": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_BIN_VERIFY_MD5": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_ALL": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_ATIME": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_CTIME": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_DEVICE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_DTIME": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_FILENAME": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_INODE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_KEY": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_MD5": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_MEM_SIZE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_MTIME": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_NONE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_NUM_HITS": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_REFCOUNT": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_TTL": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_TYPE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_VALUE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_LIST_ACTIVE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_LIST_DELETED": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ARRAY_FILTER_USE_BOTH": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "ARRAY_FILTER_USE_KEY": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "ASSERT_ACTIVE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ASSERT_BAIL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ASSERT_CALLBACK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ASSERT_QUIET_EVAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ASSERT_WARNING": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "BUS_ADRALN": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "BUS_ADRERR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "BUS_OBJERR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CAL_DOW_DAYNO": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_DOW_LONG": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_DOW_SHORT": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_EASTER_ALWAYS_GREGORIAN": { + "ext.name": "calendar", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "CAL_EASTER_ALWAYS_JULIAN": { + "ext.name": "calendar", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "CAL_EASTER_DEFAULT": { + "ext.name": "calendar", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "CAL_EASTER_ROMAN": { + "ext.name": "calendar", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "CAL_FRENCH": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_GREGORIAN": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_JEWISH": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_JEWISH_ADD_ALAFIM": { + "ext.name": "calendar", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "CAL_JEWISH_ADD_ALAFIM_GERESH": { + "ext.name": "calendar", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "CAL_JEWISH_ADD_GERESHAYIM": { + "ext.name": "calendar", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "CAL_JULIAN": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_FRENCH": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_GREGORIAN_LONG": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_GREGORIAN_SHORT": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_JEWISH": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_JULIAN_LONG": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_JULIAN_SHORT": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_NUM_CALS": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CASE_LOWER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CASE_UPPER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CHAR_MAX": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CLD_CONTINUED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CLD_DUMPED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CLD_EXITED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CLD_KILLED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CLD_STOPPED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CLD_TRAPPED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CL_EXPUNGE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CODESET": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "CONNECTION_ABORTED": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CONNECTION_NORMAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CONNECTION_TIMEOUT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "COUNT_NORMAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "COUNT_RECURSIVE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CP_MOVE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CP_UID": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_DOCS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_FULLPAGE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_GENERAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_GROUP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_MODULES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_QA": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_SAPI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CRNCYSTR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "CRYPT_BLOWFISH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CRYPT_EXT_DES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CRYPT_MD5": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CRYPT_SALT_LENGTH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CRYPT_SHA256": { + "ext.name": "standard", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CRYPT_SHA512": { + "ext.name": "standard", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CRYPT_STD_DES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CURLAUTH_ANY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_ANYSAFE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_BASIC": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_DIGEST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_DIGEST_IE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLAUTH_GSSNEGOTIATE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_NONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLAUTH_NTLM": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_ONLY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLCLOSEPOLICY_CALLBACK": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLCLOSEPOLICY_LEAST_RECENTLY_USED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLCLOSEPOLICY_LEAST_TRAFFIC": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLCLOSEPOLICY_OLDEST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLCLOSEPOLICY_SLOWEST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLE_ABORTED_BY_CALLBACK": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_BAD_CALLING_ORDER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_BAD_CONTENT_ENCODING": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_BAD_DOWNLOAD_RESUME": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLE_BAD_FUNCTION_ARGUMENT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_BAD_PASSWORD_ENTERED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_COULDNT_CONNECT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_COULDNT_RESOLVE_HOST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_COULDNT_RESOLVE_PROXY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FAILED_INIT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FILESIZE_EXCEEDED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FILE_COULDNT_READ_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_ACCESS_DENIED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_BAD_DOWNLOAD_RESUME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_CANT_GET_HOST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_CANT_RECONNECT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_GET_SIZE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_RETR_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_SET_ASCII": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_SET_BINARY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_STOR_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_USE_REST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_PARTIAL_FILE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLE_FTP_PORT_FAILED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_QUOTE_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_SSL_FAILED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_USER_PASSWORD_INCORRECT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WEIRD_227_FORMAT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WEIRD_PASS_REPLY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WEIRD_PASV_REPLY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WEIRD_SERVER_REPLY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WEIRD_USER_REPLY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WRITE_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FUNCTION_NOT_FOUND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_GOT_NOTHING": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_HTTP_NOT_FOUND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_HTTP_PORT_FAILED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_HTTP_POST_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_HTTP_RANGE_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_HTTP_RETURNED_ERROR": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLE_LDAP_CANNOT_BIND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_LDAP_INVALID_URL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_LDAP_SEARCH_FAILED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_LIBRARY_NOT_FOUND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_MALFORMAT_USER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_OBSOLETE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_OK": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_OPERATION_TIMEDOUT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLE_OPERATION_TIMEOUTED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_OUT_OF_MEMORY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_PARTIAL_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_READ_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_RECV_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SEND_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SHARE_IN_USE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSH": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLE_SSL_CACERT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_CERTPROBLEM": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_CIPHER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_CONNECT_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_ENGINE_NOTFOUND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_ENGINE_SETFAILED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_PEER_CERTIFICATE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_TELNET_OPTION_SYNTAX": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_TOO_MANY_REDIRECTS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_UNKNOWN_TELNET_OPTION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_UNSUPPORTED_PROTOCOL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_URL_MALFORMAT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_URL_MALFORMAT_USER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_WRITE_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLFTPAUTH_DEFAULT": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLFTPAUTH_SSL": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLFTPAUTH_TLS": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLFTPMETHOD_MULTICWD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLFTPMETHOD_NOCWD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLFTPMETHOD_SINGLECWD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLFTPSSL_ALL": { + "ext.name": "curl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "CURLFTPSSL_CCC_ACTIVE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLFTPSSL_CCC_NONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLFTPSSL_CCC_PASSIVE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLFTPSSL_CONTROL": { + "ext.name": "curl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "CURLFTPSSL_NONE": { + "ext.name": "curl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "CURLFTPSSL_TRY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLGSSAPI_DELEGATION_FLAG": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLGSSAPI_DELEGATION_POLICY_FLAG": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_APPCONNECT_TIME": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_CERTINFO": { + "ext.name": "curl", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CURLINFO_CONDITION_UNMET": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_CONNECT_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_CONTENT_LENGTH_DOWNLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_CONTENT_LENGTH_UPLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_CONTENT_TYPE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_COOKIELIST": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_EFFECTIVE_URL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_FILETIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_FTP_ENTRY_PATH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_HEADER_OUT": { + "ext.name": "curl", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "CURLINFO_HEADER_SIZE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_HTTPAUTH_AVAIL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_HTTP_CODE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_HTTP_CONNECTCODE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_LASTONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_LOCAL_IP": { + "ext.name": "curl", + "ext.min": "5.4.7", + "ext.max": null, + "php.min": "5.4.7", + "php.max": null + }, + "CURLINFO_LOCAL_PORT": { + "ext.name": "curl", + "ext.min": "5.4.7", + "ext.max": null, + "php.min": "5.4.7", + "php.max": null + }, + "CURLINFO_NAMELOOKUP_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_NUM_CONNECTS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_OS_ERRNO": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_PRETRANSFER_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_PRIMARY_IP": { + "ext.name": "curl", + "ext.min": "5.4.7", + "ext.max": null, + "php.min": "5.4.7", + "php.max": null + }, + "CURLINFO_PRIMARY_PORT": { + "ext.name": "curl", + "ext.min": "5.4.7", + "ext.max": null, + "php.min": "5.4.7", + "php.max": null + }, + "CURLINFO_PRIVATE": { + "ext.name": "curl", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "CURLINFO_PROXYAUTH_AVAIL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_REDIRECT_COUNT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_REDIRECT_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_REDIRECT_URL": { + "ext.name": "curl", + "ext.min": "5.3.7", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "CURLINFO_REQUEST_SIZE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_RESPONSE_CODE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_RTSP_CLIENT_CSEQ": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_RTSP_CSEQ_RECV": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_RTSP_SERVER_CSEQ": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_RTSP_SESSION_ID": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_SIZE_DOWNLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_SIZE_UPLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_SPEED_DOWNLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_SPEED_UPLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_SSL_ENGINES": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_SSL_VERIFYRESULT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_STARTTRANSFER_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_TOTAL_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLMOPT_MAXCONNECTS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLMOPT_PIPELINING": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLMSG_DONE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_BAD_EASY_HANDLE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_BAD_HANDLE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_CALL_MULTI_PERFORM": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_INTERNAL_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_OK": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_OUT_OF_MEMORY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_ACCEPTTIMEOUT_MS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_ACCEPT_ENCODING": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_ADDRESS_SCOPE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_APPEND": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_AUTOREFERER": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLOPT_BINARYTRANSFER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_BUFFERSIZE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CAINFO": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CAPATH": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CERTINFO": { + "ext.name": "curl", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CURLOPT_CLOSEPOLICY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLOPT_CONNECTTIMEOUT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CONNECTTIMEOUT_MS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CONNECT_ONLY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_COOKIE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_COOKIEFILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_COOKIEJAR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_COOKIELIST": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_COOKIESESSION": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLOPT_CRLF": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CRLFILE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_CUSTOMREQUEST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_DIRLISTONLY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_DNS_CACHE_TIMEOUT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_DNS_SERVERS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_DNS_USE_GLOBAL_CACHE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_EGDSOCKET": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_ENCODING": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FAILONERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FILETIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FNMATCH_FUNCTION": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_FOLLOWLOCATION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FORBID_REUSE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FRESH_CONNECT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTPAPPEND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTPLISTONLY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTPPORT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTPSSLAUTH": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLOPT_FTP_ACCOUNT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_FTP_ALTERNATIVE_TO_USER": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_FTP_CREATE_MISSING_DIRS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTP_FILEMETHOD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_FTP_RESPONSE_TIMEOUT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_FTP_SKIP_PASV_IP": { + "ext.name": "curl", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CURLOPT_FTP_SSL": { + "ext.name": "curl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "CURLOPT_FTP_SSL_CCC": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_FTP_USE_EPRT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTP_USE_EPSV": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTP_USE_PRET": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_GSSAPI_DELEGATION": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_HEADER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HEADERFUNCTION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTP200ALIASES": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTPAUTH": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTPGET": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTPHEADER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTPPROXYTUNNEL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTP_CONTENT_DECODING": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_HTTP_TRANSFER_DECODING": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_HTTP_VERSION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_IGNORE_CONTENT_LENGTH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_INFILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_INFILESIZE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_INTERFACE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_IPRESOLVE": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_ISSUERCERT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_KEYPASSWD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_KRB4LEVEL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_KRBLEVEL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_LOCALPORT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_LOCALPORTRANGE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_LOW_SPEED_LIMIT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_LOW_SPEED_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_MAIL_AUTH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_MAIL_FROM": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_MAIL_RCPT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_MAXCONNECTS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_MAXFILESIZE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_MAXREDIRS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_MAX_RECV_SPEED_LARGE": { + "ext.name": "curl", + "ext.min": "5.3.7", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "CURLOPT_MAX_SEND_SPEED_LARGE": { + "ext.name": "curl", + "ext.min": "5.3.7", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "CURLOPT_MUTE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_NETRC": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_NETRC_FILE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_NEW_DIRECTORY_PERMS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_NEW_FILE_PERMS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_NOBODY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_NOPROGRESS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_NOPROXY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_NOSIGNAL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PASSWDFUNCTION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PASSWORD": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_PORT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_POST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_POSTFIELDS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_POSTQUOTE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_POSTREDIR": { + "ext.name": "curl", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CURLOPT_PREQUOTE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_PRIVATE": { + "ext.name": "curl", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "CURLOPT_PROGRESSFUNCTION": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_PROTOCOLS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXYAUTH": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXYPASSWORD": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_PROXYPORT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXYTYPE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXYUSERNAME": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_PROXYUSERPWD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXY_TRANSFER_MODE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_PUT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_QUOTE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_RANDOM_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_RANGE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_READDATA": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_READFUNCTION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_REDIR_PROTOCOLS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_REFERER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_RESOLVE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RESUME_FROM": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_RETURNTRANSFER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_RTSP_CLIENT_CSEQ": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RTSP_REQUEST": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RTSP_SERVER_CSEQ": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RTSP_SESSION_ID": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RTSP_STREAM_URI": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RTSP_TRANSPORT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SAFE_UPLOAD": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SHARE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SOCKS5_GSSAPI_NEC": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SOCKS5_GSSAPI_SERVICE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SSH_AUTH_TYPES": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_SSH_HOST_PUBLIC_KEY_MD5": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_SSH_KNOWNHOSTS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SSH_PRIVATE_KEYFILE": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_SSH_PUBLIC_KEYFILE": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_SSLCERT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLCERTPASSWD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLCERTTYPE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLENGINE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLENGINE_DEFAULT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLKEY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLKEYPASSWD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLKEYTYPE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLVERSION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSL_CIPHER_LIST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSL_OPTIONS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SSL_SESSIONID_CACHE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SSL_VERIFYHOST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSL_VERIFYPEER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_STDERR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TCP_KEEPALIVE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TCP_KEEPIDLE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TCP_KEEPINTVL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TCP_NODELAY": { + "ext.name": "curl", + "ext.min": "5.2.1", + "ext.max": null, + "php.min": "5.2.1", + "php.max": null + }, + "CURLOPT_TELNETOPTIONS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TFTP_BLKSIZE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TIMECONDITION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TIMEOUT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TIMEOUT_MS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TIMEVALUE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TLSAUTH_PASSWORD": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TLSAUTH_TYPE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TLSAUTH_USERNAME": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TRANSFERTEXT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TRANSFER_ENCODING": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_UNRESTRICTED_AUTH": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_UPLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_URL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_USERAGENT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_USERNAME": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_USERPWD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_USE_SSL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_VERBOSE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_WILDCARDMATCH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_WRITEFUNCTION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_WRITEHEADER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPAUSE_ALL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPAUSE_CONT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPAUSE_RECV": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPAUSE_RECV_CONT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPAUSE_SEND": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPAUSE_SEND_CONT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_ALL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_DICT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_FTP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_FTPS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_GOPHER": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_HTTP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_HTTPS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_IMAP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_IMAPS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_LDAP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_LDAPS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_POP3": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_POP3S": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMPE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMPS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMPT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMPTE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMPTS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTSP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_SCP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_SFTP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_SMTP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_SMTPS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_TELNET": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_TFTP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROXY_HTTP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROXY_SOCKS4": { + "ext.name": "curl", + "ext.min": "5.2.10", + "ext.max": null, + "php.min": "5.2.10", + "php.max": null + }, + "CURLPROXY_SOCKS4A": { + "ext.name": "curl", + "ext.min": "5.5.23RC1", + "ext.max": null, + "php.min": "5.5.23RC1", + "php.max": null + }, + "CURLPROXY_SOCKS5": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROXY_SOCKS5_HOSTNAME": { + "ext.name": "curl", + "ext.min": "5.5.23RC1", + "ext.max": null, + "php.min": "5.5.23RC1", + "php.max": null + }, + "CURLSHOPT_NONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLSHOPT_SHARE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLSHOPT_UNSHARE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLSSH_AUTH_ANY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLSSH_AUTH_DEFAULT": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSH_AUTH_HOST": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSH_AUTH_KEYBOARD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSH_AUTH_NONE": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSH_AUTH_PASSWORD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSH_AUTH_PUBLICKEY": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSLOPT_ALLOW_BEAST": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLUSESSL_ALL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLUSESSL_CONTROL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLUSESSL_NONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLUSESSL_TRY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLVERSION_NOW": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_FNMATCHFUNC_FAIL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_FNMATCHFUNC_MATCH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_FNMATCHFUNC_NOMATCH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_HTTP_VERSION_1_0": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_HTTP_VERSION_1_1": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_HTTP_VERSION_2_0": { + "ext.name": "curl", + "ext.min": "5.5.24RC1", + "ext.max": null, + "php.min": "5.5.24RC1", + "php.max": null + }, + "CURL_HTTP_VERSION_NONE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_IPRESOLVE_V4": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURL_IPRESOLVE_V6": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURL_IPRESOLVE_WHATEVER": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURL_LOCK_DATA_COOKIE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_LOCK_DATA_DNS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_LOCK_DATA_SSL_SESSION": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_NETRC_IGNORED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_NETRC_OPTIONAL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_NETRC_REQUIRED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_READFUNC_PAUSE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_ANNOUNCE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_DESCRIBE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_GET_PARAMETER": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_OPTIONS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_PAUSE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_PLAY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_RECEIVE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_RECORD": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_SETUP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_SET_PARAMETER": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_TEARDOWN": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_SSLVERSION_DEFAULT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_SSLVERSION_SSLv2": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_SSLVERSION_SSLv3": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_SSLVERSION_TLSv1": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_SSLVERSION_TLSv1_0": { + "ext.name": "curl", + "ext.min": "5.5.19RC1", + "ext.max": null, + "php.min": "5.5.19RC1", + "php.max": null + }, + "CURL_SSLVERSION_TLSv1_1": { + "ext.name": "curl", + "ext.min": "5.5.19RC1", + "ext.max": null, + "php.min": "5.5.19RC1", + "php.max": null + }, + "CURL_SSLVERSION_TLSv1_2": { + "ext.name": "curl", + "ext.min": "5.5.19RC1", + "ext.max": null, + "php.min": "5.5.19RC1", + "php.max": null + }, + "CURL_TIMECOND_IFMODSINCE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_TIMECOND_IFUNMODSINCE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_TIMECOND_LASTMOD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_TIMECOND_NONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_TLSAUTH_SRP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_VERSION_HTTP2": { + "ext.name": "curl", + "ext.min": "5.5.24RC1", + "ext.max": null, + "php.min": "5.5.24RC1", + "php.max": null + }, + "CURL_VERSION_IPV6": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_VERSION_KERBEROS4": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_VERSION_LIBZ": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_VERSION_SSL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_WRITEFUNC_PAUSE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "DATE_ATOM": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_COOKIE": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_ISO8601": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RFC1036": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RFC1123": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RFC2822": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RFC3339": { + "ext.name": "date", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "DATE_RFC822": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RFC850": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RSS": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_W3C": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DAY_1": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_2": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_3": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_4": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_5": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_6": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_7": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DEBUG_BACKTRACE_IGNORE_ARGS": { + "ext.name": "Core", + "ext.min": "5.3.6", + "ext.max": null, + "php.min": "5.3.6", + "php.max": null + }, + "DEBUG_BACKTRACE_PROVIDE_OBJECT": { + "ext.name": "Core", + "ext.min": "5.3.6", + "ext.max": null, + "php.min": "5.3.6", + "php.max": null + }, + "DEFAULT_INCLUDE_PATH": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DIRECTORY_SEPARATOR": { + "ext.name": "standard", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "DNS_A": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_A6": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_AAAA": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_ANY": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_CNAME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_HINFO": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_MX": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_NAPTR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_NS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_PTR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_SOA": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_SRV": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_TXT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DOMSTRING_SIZE_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_HIERARCHY_REQUEST_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INDEX_SIZE_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INUSE_ATTRIBUTE_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INVALID_ACCESS_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INVALID_CHARACTER_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INVALID_MODIFICATION_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INVALID_STATE_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_NAMESPACE_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_NOT_FOUND_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_NOT_SUPPORTED_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_NO_DATA_ALLOWED_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_NO_MODIFICATION_ALLOWED_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_PHP_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_SYNTAX_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_VALIDATION_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_WRONG_DOCUMENT_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "D_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "D_T_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ENC7BIT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENC8BIT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENCBASE64": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENCBINARY": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENCHANT_ISPELL": { + "ext.name": "enchant", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ENCHANT_MYSPELL": { + "ext.name": "enchant", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ENCOTHER": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENCQUOTEDPRINTABLE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENT_COMPAT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENT_DISALLOWED": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ENT_HTML401": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ENT_HTML5": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ENT_IGNORE": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ENT_NOQUOTES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENT_QUOTES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENT_SUBSTITUTE": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ENT_XHTML": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ENT_XML1": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ERA": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ERA_D_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ERA_D_T_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ERA_T_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "EVBUFFER_EOF": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVBUFFER_ERROR": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVBUFFER_READ": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVBUFFER_TIMEOUT": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVBUFFER_WRITE": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVLOOP_NONBLOCK": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVLOOP_ONCE": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EV_PERSIST": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EV_READ": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EV_SIGNAL": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EV_TIMEOUT": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EV_WRITE": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EXIF_USE_MBSTRING": { + "ext.name": "exif", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "EXTR_IF_EXISTS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_OVERWRITE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_PREFIX_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_PREFIX_IF_EXISTS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_PREFIX_INVALID": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_PREFIX_SAME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_REFS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_SKIP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_ALL": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_COMPILE_ERROR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_COMPILE_WARNING": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_CORE_ERROR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_CORE_WARNING": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_DEPRECATED": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "E_ERROR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_NOTICE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_PARSE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_RECOVERABLE_ERROR": { + "ext.name": "Core", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "E_STRICT": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "E_USER_DEPRECATED": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "E_USER_ERROR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_USER_NOTICE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_USER_WARNING": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_WARNING": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FALSE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_COMPRESS": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.2.17" + }, + "FILEINFO_CONTINUE": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_DEVICES": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_MIME": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_MIME_ENCODING": { + "ext.name": "fileinfo", + "ext.min": "1.0.5-dev", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FILEINFO_MIME_TYPE": { + "ext.name": "fileinfo", + "ext.min": "1.0.5-dev", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FILEINFO_NONE": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_PRESERVE_ATIME": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_RAW": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_SYMLINK": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILE_APPEND": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILE_BINARY": { + "ext.name": "standard", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "FILE_IGNORE_NEW_LINES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILE_NO_DEFAULT_CONTEXT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILE_SKIP_EMPTY_LINES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILE_TEXT": { + "ext.name": "standard", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "FILE_USE_INCLUDE_PATH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_CALLBACK": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_DEFAULT": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ALLOW_FRACTION": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ALLOW_HEX": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ALLOW_OCTAL": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ALLOW_SCIENTIFIC": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ALLOW_THOUSAND": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ARRAY": { + "ext.name": "filter", + "ext.min": "0.10.0", + "ext.max": "0.10.0", + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_FLAG_EMPTY_STRING_NULL": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ENCODE_AMP": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ENCODE_HIGH": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ENCODE_LOW": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_HOST_REQUIRED": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_IPV4": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_IPV6": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_NONE": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_NO_ENCODE_QUOTES": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_NO_PRIV_RANGE": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_NO_RES_RANGE": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_PATH_REQUIRED": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_QUERY_REQUIRED": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_SCALAR": { + "ext.name": "filter", + "ext.min": "0.10.0", + "ext.max": "0.10.0", + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_FLAG_SCHEME_REQUIRED": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_STRIP_BACKTICK": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "FILTER_FLAG_STRIP_HIGH": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_STRIP_LOW": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FORCE_ARRAY": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_NULL_ON_FAILURE": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_REQUIRE_ARRAY": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_REQUIRE_SCALAR": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_SANITIZE_ALL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_EMAIL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_ENCODED": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_FULL_SPECIAL_CHARS": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.3.3", + "php.max": null + }, + "FILTER_SANITIZE_MAGIC_QUOTES": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_NUMBER_FLOAT": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_NUMBER_INT": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_SPECIAL_CHARS": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_STRING": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_STRIPPED": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_URL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_UNSAFE_RAW": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_ALL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_BOOLEAN": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_EMAIL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_FLOAT": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_INT": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_IP": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_MAC": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "FILTER_VALIDATE_REGEXP": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_URL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FNM_CASEFOLD": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FNM_NOESCAPE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FNM_PATHNAME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FNM_PERIOD": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FORCE_DEFLATE": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FORCE_GZIP": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FPE_FLTDIV": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_FLTINV": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_FLTOVF": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_FLTRES": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_FLTSUB": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_FLTUND": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_INTDIV": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_INTOVF": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FTP_ASCII": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FTP_AUTORESUME": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "FTP_AUTOSEEK": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "FTP_BINARY": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FTP_FAILED": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "FTP_FINISHED": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "FTP_IMAGE": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FTP_MOREDATA": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "FTP_TEXT": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FTP_TIMEOUT_SEC": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FT_INTERNAL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FT_NOT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FT_PEEK": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FT_PREFETCHTEXT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FT_UID": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GD_BUNDLED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GD_EXTRA_VERSION": { + "ext.name": "gd", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GD_MAJOR_VERSION": { + "ext.name": "gd", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GD_MINOR_VERSION": { + "ext.name": "gd", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GD_RELEASE_VERSION": { + "ext.name": "gd", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GD_VERSION": { + "ext.name": "gd", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GEOIP_ASNUM_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_CABLEDSL_SPEED": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_CITY_EDITION_REV0": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_CITY_EDITION_REV1": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_CORPORATE_SPEED": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_COUNTRY_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_DIALUP_SPEED": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_DOMAIN_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_ISP_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_NETSPEED_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_NETSPEED_EDITION_REV1": { + "ext.name": "geoip", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_ORG_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_PROXY_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_REGION_EDITION_REV0": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_REGION_EDITION_REV1": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_UNKNOWN_SPEED": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GLOB_AVAILABLE_FLAGS": { + "ext.name": "standard", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GLOB_BRACE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_ERR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_MARK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_NOCHECK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_NOESCAPE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_NOSORT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_ONLYDIR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GMP_BIG_ENDIAN": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "GMP_LITTLE_ENDIAN": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "GMP_LSW_FIRST": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "GMP_MPIR_VERSION": { + "ext.name": "gmp", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "GMP_MSW_FIRST": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "GMP_NATIVE_ENDIAN": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "GMP_ROUND_MINUSINF": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "GMP_ROUND_PLUSINF": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "GMP_ROUND_ZERO": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "GMP_VERSION": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "GRAPHEME_EXTR_COUNT": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GRAPHEME_EXTR_MAXBYTES": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GRAPHEME_EXTR_MAXCHARS": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "HASH_HMAC": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "HTML_ENTITIES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "HTML_SPECIALCHARS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "HTTP_AUTH_ANY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_AUTH_BASIC": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_AUTH_DIGEST": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_AUTH_DIGEST_IE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_AUTH_GSSNEG": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_AUTH_NTLM": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_COOKIE_HTTPONLY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_COOKIE_PARSE_RAW": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_COOKIE_SECURE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_LEVEL_DEF": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_LEVEL_MAX": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_LEVEL_MIN": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_STRATEGY_DEF": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_STRATEGY_FILT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_STRATEGY_FIXED": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_STRATEGY_HUFF": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_STRATEGY_RLE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_TYPE_GZIP": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_TYPE_RAW": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_TYPE_ZLIB": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_ENCODING_STREAM_FLUSH_FULL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_ENCODING_STREAM_FLUSH_NONE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_ENCODING_STREAM_FLUSH_SYNC": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_ENCODING": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_HEADER": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_INVALID_PARAM": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_MALFORMED_HEADERS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_MESSAGE_TYPE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_QUERYSTRING": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_REQUEST": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_REQUEST_METHOD": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_REQUEST_POOL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_RESPONSE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_RUNTIME": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_SOCKET": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_URL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_IPRESOLVE_ANY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_IPRESOLVE_V4": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_IPRESOLVE_V6": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_ACL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_BASELINE_CONTROL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_CHECKIN": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_CHECKOUT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_CONNECT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_COPY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_DELETE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_GET": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_HEAD": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_LABEL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_LOCK": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_MERGE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_MKACTIVITY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_MKCOL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_MKWORKSPACE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_MOVE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_OPTIONS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_POST": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_PROPFIND": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_PROPPATCH": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_PUT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_REPORT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_TRACE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_UNCHECKOUT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_UNLOCK": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_UPDATE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_VERSION_CONTROL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_MSG_NONE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_MSG_REQUEST": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_MSG_RESPONSE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PARAMS_ALLOW_COMMA": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PARAMS_ALLOW_FAILURE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PARAMS_DEFAULT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PARAMS_RAISE_ERROR": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_POSTREDIR_301": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_POSTREDIR_302": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_POSTREDIR_ALL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_HTTP": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_HTTP_1_0": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_SOCKS4": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_SOCKS4A": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_SOCKS5": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_SOCKS5_HOSTNAME": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_ARRAY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_BOOL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_FLOAT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_INT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_OBJECT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_STRING": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT_FOUND": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT_PERM": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT_POST": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT_PROXY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT_TEMP": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SSL_VERSION_ANY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SSL_VERSION_SSLv2": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SSL_VERSION_SSLv3": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SSL_VERSION_TLSv1": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT_ENCODINGS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT_EVENTS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT_MAGICMIME": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT_REQUESTS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT_SSLREQUESTS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_FROM_ENV": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_JOIN_PATH": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_JOIN_QUERY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_REPLACE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_ALL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_AUTH": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_FRAGMENT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_PASS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_PATH": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_PORT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_QUERY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_USER": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_VERSION_1_0": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_VERSION_1_1": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_VERSION_ANY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_VERSION_NONE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "ICONV_IMPL": { + "ext.name": "iconv", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ICONV_MIME_DECODE_CONTINUE_ON_ERROR": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ICONV_MIME_DECODE_STRICT": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ICONV_VERSION": { + "ext.name": "iconv", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "IDNA_ALLOW_UNASSIGNED": { + "ext.name": "intl", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_CHECK_BIDI": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_CHECK_CONTEXTJ": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_DEFAULT": { + "ext.name": "intl", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_BIDI": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_CONTEXTJ": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_DISALLOWED": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_DOMAIN_NAME_TOO_LONG": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_EMPTY_LABEL": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_HYPHEN_3_4": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_INVALID_ACE_LABEL": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_LABEL_HAS_DOT": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_LABEL_TOO_LONG": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_LEADING_COMBINING_MARK": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_LEADING_HYPHEN": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_PUNYCODE": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_TRAILING_HYPHEN": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_NONTRANSITIONAL_TO_ASCII": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_NONTRANSITIONAL_TO_UNICODE": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_USE_STD3_RULES": { + "ext.name": "intl", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "ILL_BADSTK": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_COPROC": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_ILLADR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_ILLOPC": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_ILLOPN": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_ILLTRP": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_PRVOPC": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_PRVREG": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAGETYPE_BMP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_COUNT": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAGETYPE_GIF": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_ICO": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAGETYPE_IFF": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JB2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JP2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JPC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JPEG": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JPEG2000": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JPX": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_PNG": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_PSD": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_SWC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_SWF": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_TIFF_II": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_TIFF_MM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_UNKNOWN": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAGETYPE_WBMP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_XBM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAP_CLOSETIMEOUT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAP_GC_ELT": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAP_GC_ENV": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAP_GC_TEXTS": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAP_OPENTIMEOUT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAP_READTIMEOUT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAP_WRITETIMEOUT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_AFFINE_ROTATE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_AFFINE_SCALE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_AFFINE_SHEAR_HORIZONTAL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_AFFINE_SHEAR_VERTICAL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_AFFINE_TRANSLATE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_ARC_CHORD": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_ARC_EDGED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_ARC_NOFILL": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_ARC_PIE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_ARC_ROUNDED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_BELL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BESSEL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BICUBIC": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BICUBIC_FIXED": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BILINEAR_FIXED": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BLACKMAN": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BOX": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BSPLINE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CATMULLROM": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_COLOR_BRUSHED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_COLOR_STYLED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_COLOR_STYLEDBRUSHED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_COLOR_TILED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_COLOR_TRANSPARENT": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_CROP_BLACK": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CROP_DEFAULT": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CROP_SIDES": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CROP_THRESHOLD": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CROP_TRANSPARENT": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CROP_WHITE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_EFFECT_ALPHABLEND": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_EFFECT_NORMAL": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_EFFECT_OVERLAY": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_EFFECT_REPLACE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_BRIGHTNESS": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_COLORIZE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_CONTRAST": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_EDGEDETECT": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_EMBOSS": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_GAUSSIAN_BLUR": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_GRAYSCALE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_MEAN_REMOVAL": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_NEGATE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_PIXELATE": { + "ext.name": "gd", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMG_FILTER_SELECTIVE_BLUR": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_SMOOTH": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FLIP_BOTH": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_FLIP_HORIZONTAL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_FLIP_VERTICAL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_GAUSSIAN": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_GD2_COMPRESSED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_GD2_RAW": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_GENERALIZED_CUBIC": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_GIF": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_HAMMING": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_HANNING": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_HERMITE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_JPEG": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_JPG": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_MITCHELL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_NEAREST_NEIGHBOUR": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_PNG": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_POWER": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_QUADRATIC": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_SINC": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_TRIANGLE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_WBMP": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_WEIGHTED4": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_XPM": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INF": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_CONFIGURATION": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_CREDITS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_ENVIRONMENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_GENERAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_LICENSE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_MODULES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_VARIABLES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INI_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INI_PERDIR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INI_SCANNER_NORMAL": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "INI_SCANNER_RAW": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "INI_SCANNER_TYPED": { + "ext.name": "standard", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "INI_SYSTEM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INI_USER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_COOKIE": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_ENV": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_GET": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_POST": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_REQUEST": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "INPUT_SERVER": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_SESSION": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INTL_ICU_DATA_VERSION": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "INTL_ICU_VERSION": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "INTL_IDNA_VARIANT_2003": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "INTL_IDNA_VARIANT_UTS46": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "INTL_MAX_LOCALE_LEN": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IPPROTO_IP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IPPROTO_IPV6": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IPV6_HOPLIMIT": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_MULTICAST_HOPS": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IPV6_MULTICAST_IF": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IPV6_MULTICAST_LOOP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IPV6_PKTINFO": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_RECVHOPLIMIT": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_RECVPKTINFO": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_RECVTCLASS": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_TCLASS": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_UNICAST_HOPS": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IP_MULTICAST_IF": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IP_MULTICAST_LOOP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IP_MULTICAST_TTL": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "JSMIN_ERROR_NONE": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "JSMIN_ERROR_UNTERMINATED_COMMENT": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "JSMIN_ERROR_UNTERMINATED_REGEX": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "JSMIN_ERROR_UNTERMINATED_STRING": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "JSON_BIGINT_AS_STRING": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "JSON_ERROR_CTRL_CHAR": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_ERROR_DEPTH": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_ERROR_INF_OR_NAN": { + "ext.name": "json", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "JSON_ERROR_NONE": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_ERROR_RECURSION": { + "ext.name": "json", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "JSON_ERROR_STATE_MISMATCH": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_ERROR_SYNTAX": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_ERROR_UNSUPPORTED_TYPE": { + "ext.name": "json", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "JSON_ERROR_UTF8": { + "ext.name": "json", + "ext.min": "5.3.3", + "ext.max": null, + "php.min": "5.3.3", + "php.max": null + }, + "JSON_FORCE_OBJECT": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_HEX_AMP": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_HEX_APOS": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_HEX_QUOT": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_HEX_TAG": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_NUMERIC_CHECK": { + "ext.name": "json", + "ext.min": "5.3.3", + "ext.max": null, + "php.min": "5.3.3", + "php.max": null + }, + "JSON_OBJECT_AS_ARRAY": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "JSON_PARTIAL_OUTPUT_ON_ERROR": { + "ext.name": "json", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "JSON_PRESERVE_ZERO_FRACTION": { + "ext.name": "json", + "ext.min": "5.6.6RC1", + "ext.max": null, + "php.min": "5.6.6RC1", + "php.max": null + }, + "JSON_PRETTY_PRINT": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "JSON_UNESCAPED_SLASHES": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "JSON_UNESCAPED_UNICODE": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "LATT_HASCHILDREN": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_HASNOCHILDREN": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_MARKED": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_NOINFERIORS": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_NOSELECT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_REFERRAL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_UNMARKED": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_COLLATE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_CTYPE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_MESSAGES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_MONETARY": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_NUMERIC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_TIME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_DEREF_ALWAYS": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_DEREF_FINDING": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_DEREF_NEVER": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_DEREF_SEARCHING": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_ESCAPE_DN": { + "ext.name": "ldap", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "LDAP_ESCAPE_FILTER": { + "ext.name": "ldap", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "LDAP_MODIFY_BATCH_ADD": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_ATTRIB": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_MODTYPE": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_REMOVE": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_REMOVE_ALL": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_REPLACE": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_VALUES": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_OPT_CLIENT_CONTROLS": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_DEBUG_LEVEL": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_DEREF": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_DIAGNOSTIC_MESSAGE": { + "ext.name": "ldap", + "ext.min": "5.6.11RC1", + "ext.max": null, + "php.min": "5.6.11RC1", + "php.max": null + }, + "LDAP_OPT_ERROR_NUMBER": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_ERROR_STRING": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_HOST_NAME": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_MATCHED_DN": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_NETWORK_TIMEOUT": { + "ext.name": "ldap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "LDAP_OPT_PROTOCOL_VERSION": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_REFERRALS": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_RESTART": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_SERVER_CONTROLS": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_SIZELIMIT": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_TIMELIMIT": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_TIMEOUT": { + "ext.name": "ldap", + "ext.min": "5.6.14RC1", + "ext.max": null, + "php.min": "5.6.14RC1", + "php.max": null + }, + "LDAP_OPT_X_SASL_AUTHCID": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_X_SASL_AUTHZID": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_X_SASL_MECH": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_X_SASL_REALM": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LIBEXSLT_DOTTED_VERSION": { + "ext.name": "xsl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "LIBEXSLT_VERSION": { + "ext.name": "xsl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "LIBXML_COMPACT": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_DOTTED_VERSION": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_DTDATTR": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_DTDLOAD": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_DTDVALID": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_ERR_ERROR": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_ERR_FATAL": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_ERR_NONE": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_ERR_WARNING": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_HTML_NODEFDTD": { + "ext.name": "libxml", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "LIBXML_HTML_NOIMPLIED": { + "ext.name": "libxml", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "LIBXML_LOADED_VERSION": { + "ext.name": "libxml", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "LIBXML_NOBLANKS": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOCDATA": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOEMPTYTAG": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOENT": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOERROR": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NONET": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOWARNING": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOXMLDECL": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NSCLEAN": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_PARSEHUGE": { + "ext.name": "libxml", + "ext.min": "5.2.12", + "ext.max": null, + "php.min": "5.2.12", + "php.max": null + }, + "LIBXML_PEDANTIC": { + "ext.name": "libxml", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "LIBXML_SCHEMA_CREATE": { + "ext.name": "libxml", + "ext.min": "5.5.2", + "ext.max": null, + "php.min": "5.5.2", + "php.max": null + }, + "LIBXML_VERSION": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_XINCLUDE": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXSLT_DOTTED_VERSION": { + "ext.name": "xsl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "LIBXSLT_VERSION": { + "ext.name": "xsl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "LOCK_EX": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOCK_NB": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOCK_SH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOCK_UN": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_ALERT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_AUTH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_AUTHPRIV": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_CONS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_CRIT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_CRON": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_DAEMON": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_DEBUG": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_EMERG": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_ERR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_INFO": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_KERN": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL0": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL1": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL3": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL4": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL5": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL6": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL7": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LPR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_MAIL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_NDELAY": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_NEWS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_NOTICE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_NOWAIT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_ODELAY": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_PERROR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_PID": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_SYSLOG": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_USER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_UUCP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_WARNING": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MAILPARSE_EXTRACT_OUTPUT": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MAILPARSE_EXTRACT_RETURN": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MAILPARSE_EXTRACT_STREAM": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MB_CASE_LOWER": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MB_CASE_TITLE": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MB_CASE_UPPER": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MB_OVERLOAD_MAIL": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MB_OVERLOAD_REGEX": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MB_OVERLOAD_STRING": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MCAST_BLOCK_SOURCE": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCAST_JOIN_GROUP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCAST_JOIN_SOURCE_GROUP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCAST_LEAVE_GROUP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCAST_LEAVE_SOURCE_GROUP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCAST_UNBLOCK_SOURCE": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCRYPT_3DES": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_ARCFOUR": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_ARCFOUR_IV": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_BLOWFISH": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_CAST_128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_CAST_256": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_CRYPT": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_DECRYPT": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_DES": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_DES_COMPAT": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_DEV_RANDOM": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_DEV_URANDOM": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_ENCRYPT": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_ENIGNA": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_GOST": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_IDEA": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_LOKI97": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MARS": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_CBC": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_CFB": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_ECB": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_NOFB": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_OFB": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_STREAM": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_PANAMA": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RAND": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC2": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC4": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC6": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC6_128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC6_192": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC6_256": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RIJNDAEL_128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RIJNDAEL_192": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RIJNDAEL_256": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SAFER128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SAFER64": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SAFERPLUS": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SERPENT": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SERPENT_128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SERPENT_192": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SERPENT_256": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SKIPJACK": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TEAN": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_THREEWAY": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TRIPLEDES": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TWOFISH": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TWOFISH128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TWOFISH192": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TWOFISH256": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_WAKE": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_XTEA": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MEMCACHE_COMPRESSED": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "MEMCACHE_HAVE_SESSION": { + "ext.name": "memcache", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "MEMCACHE_SERIALIZED": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": "0.2", + "php.min": "4.3.3", + "php.max": null + }, + "MEMCACHE_USER1": { + "ext.name": "memcache", + "ext.min": "3.0.8", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "MEMCACHE_USER2": { + "ext.name": "memcache", + "ext.min": "3.0.8", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "MEMCACHE_USER3": { + "ext.name": "memcache", + "ext.min": "3.0.8", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "MEMCACHE_USER4": { + "ext.name": "memcache", + "ext.min": "3.0.8", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "MHASH_ADLER32": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_CRC32": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_CRC32B": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_FNV132": { + "ext.name": "hash", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MHASH_FNV164": { + "ext.name": "hash", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MHASH_FNV1A32": { + "ext.name": "hash", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MHASH_FNV1A64": { + "ext.name": "hash", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MHASH_GOST": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_HAVAL128": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_HAVAL160": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_HAVAL192": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_HAVAL224": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_HAVAL256": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_JOAAT": { + "ext.name": "hash", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MHASH_MD2": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_MD4": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_MD5": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_RIPEMD128": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_RIPEMD160": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_RIPEMD256": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_RIPEMD320": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SHA1": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SHA224": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SHA256": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SHA384": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SHA512": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SNEFRU128": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SNEFRU256": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_TIGER": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_TIGER128": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_TIGER160": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_WHIRLPOOL": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MONGO_STREAMS": { + "ext.name": "mongo", + "ext.min": "1.4.2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_IO_COMPLETED": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_IO_PROGRESS": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_IO_READ": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_IO_WRITE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_BATCHINSERT": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_CMD_DELETE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_CMD_INSERT": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_CMD_UPDATE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_DELETE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_GETMORE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_INSERT": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_KILLCURSOR": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_QUERY": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_RESPONSE_HEADER": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_UPDATE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_WRITE_BATCH": { + "ext.name": "mongo", + "ext.min": "1.5.0RC1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_WRITE_REPLY": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_TYPE_IO_INIT": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_TYPE_LOG": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_AUTH_MECHANISM_GSSAPI": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_CR": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_X509": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_AUTH_MECHANISM_PLAIN": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_AUTH_MECHANISM_SCRAM_SHA1": { + "ext.name": "mongo", + "ext.min": "1.6.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MONGO_SUPPORTS_SSL": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_STREAMS": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MON_1": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_10": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_11": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_12": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_2": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_3": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_4": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_5": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_6": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_7": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_8": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_9": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MSG_CMSG_CLOEXEC": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_CONFIRM": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_CTRUNC": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_DONTROUTE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MSG_DONTWAIT": { + "ext.name": "sockets", + "ext.min": "5.2.10", + "ext.max": null, + "php.min": "5.2.10", + "php.max": null + }, + "MSG_EAGAIN": { + "ext.name": "sysvmsg", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MSG_ENOMSG": { + "ext.name": "sysvmsg", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MSG_EOF": { + "ext.name": "sockets", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "MSG_EOR": { + "ext.name": "sockets", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "MSG_ERRQUEUE": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_EXCEPT": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MSG_IPC_NOWAIT": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MSG_MORE": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_NOERROR": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MSG_NOSIGNAL": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_OOB": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MSG_PEEK": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MSG_TRUNC": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_WAITALL": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MSG_WAITFORONE": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSSQL_ASSOC": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MSSQL_BOTH": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MSSQL_NUM": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MYSQLI_ASSOC": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_ASYNC": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_AUTO_INCREMENT_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_BINARY_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_BLOB_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_BOTH": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS": { + "ext.name": "mysqli", + "ext.min": "5.6.0RC3", + "ext.max": null, + "php.min": "5.6.0RC3", + "php.max": null + }, + "MYSQLI_CLIENT_COMPRESS": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_FOUND_ROWS": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_IGNORE_SPACE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_INTERACTIVE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_NO_SCHEMA": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_SSL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CURSOR_TYPE_FOR_UPDATE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CURSOR_TYPE_NO_CURSOR": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CURSOR_TYPE_READ_ONLY": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CURSOR_TYPE_SCROLLABLE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_DATA_TRUNCATED": { + "ext.name": "mysqli", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MYSQLI_DEBUG_TRACE_ENABLED": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_ENUM_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_GROUP_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_INIT_COMMAND": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_MULTIPLE_KEY_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_NOT_NULL_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_NO_DATA": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_NO_DEFAULT_VALUE_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_NUM": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_NUM_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_ON_UPDATE_NOW_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS": { + "ext.name": "mysqli", + "ext.min": "5.4.12", + "ext.max": null, + "php.min": "5.4.12", + "php.max": null + }, + "MYSQLI_OPT_CONNECT_TIMEOUT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_OPT_INT_AND_FLOAT_NATIVE": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_OPT_LOCAL_INFILE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_OPT_NET_CMD_BUFFER_SIZE": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_OPT_NET_READ_BUFFER_SIZE": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_OPT_SSL_VERIFY_SERVER_CERT": { + "ext.name": "mysqli", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "MYSQLI_PART_KEY_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_PRI_KEY_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_READ_DEFAULT_FILE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_READ_DEFAULT_GROUP": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_REFRESH_BACKUP_LOG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_GRANT": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_HOSTS": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_LOG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_MASTER": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_SLAVE": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_STATUS": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_TABLES": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_THREADS": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REPORT_ALL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_REPORT_ERROR": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_REPORT_INDEX": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_REPORT_OFF": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_REPORT_STRICT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_RPL_ADMIN": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "MYSQLI_RPL_MASTER": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "MYSQLI_RPL_SLAVE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "MYSQLI_SERVER_PS_OUT_PARAMS": { + "ext.name": "mysqli", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "MYSQLI_SERVER_PUBLIC_KEY": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_SERVER_QUERY_NO_INDEX_USED": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_SERVER_QUERY_WAS_SLOW": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_SET_CHARSET_DIR": { + "ext.name": "mysqli", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "MYSQLI_SET_CHARSET_NAME": { + "ext.name": "mysqli", + "ext.min": "5.2.5", + "ext.max": null, + "php.min": "5.2.5", + "php.max": null + }, + "MYSQLI_SET_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_STMT_ATTR_CURSOR_TYPE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_STMT_ATTR_PREFETCH_ROWS": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_STORE_RESULT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_STORE_RESULT_COPY_DATA": { + "ext.name": "mysqli", + "ext.min": "5.6.0beta2", + "ext.max": null, + "php.min": "5.6.0beta2", + "php.max": null + }, + "MYSQLI_TIMESTAMP_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TRANS_COR_AND_CHAIN": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_COR_AND_NO_CHAIN": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_COR_NO_RELEASE": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_COR_RELEASE": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_START_READ_ONLY": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_START_READ_WRITE": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TYPE_BIT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_BLOB": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_CHAR": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_DATE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_DATETIME": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_DECIMAL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_DOUBLE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_ENUM": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_FLOAT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_GEOMETRY": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_INT24": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_INTERVAL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_LONG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_LONGLONG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_LONG_BLOB": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_MEDIUM_BLOB": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_NEWDATE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_NEWDECIMAL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_NULL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_SET": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_SHORT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_STRING": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_TIME": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_TIMESTAMP": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_TINY": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_TINY_BLOB": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_VAR_STRING": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_YEAR": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_UNIQUE_KEY_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_UNSIGNED_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_USE_RESULT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_ZEROFILL_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQL_ASSOC": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MYSQL_BOTH": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MYSQL_CLIENT_COMPRESS": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MYSQL_CLIENT_IGNORE_SPACE": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MYSQL_CLIENT_INTERACTIVE": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MYSQL_CLIENT_SSL": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MYSQL_NUM": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_1_PI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_2_PI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_2_SQRTPI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_E": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_EULER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_LN10": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_LN2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_LNPI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_LOG10E": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_LOG2E": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_PI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_PI_2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_PI_4": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_SQRT1_2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_SQRT2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_SQRT3": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_SQRTPI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "NAN": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "NIL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "NOEXPR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "NULL": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OAUTH_AUTH_TYPE_AUTHORIZATION": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_AUTH_TYPE_FORM": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_AUTH_TYPE_NONE": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_AUTH_TYPE_URI": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_BAD_NONCE": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_BAD_TIMESTAMP": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_CONSUMER_KEY_REFUSED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_CONSUMER_KEY_UNKNOWN": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_HTTP_METHOD_DELETE": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_HTTP_METHOD_GET": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_HTTP_METHOD_HEAD": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_HTTP_METHOD_POST": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_HTTP_METHOD_PUT": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_INVALID_SIGNATURE": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_OK": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_PARAMETER_ABSENT": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_REQENGINE_CURL": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_REQENGINE_STREAMS": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SIGNATURE_METHOD_REJECTED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SIG_METHOD_HMACSHA1": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SIG_METHOD_HMACSHA256": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SIG_METHOD_PLAINTEXT": { + "ext.name": "OAuth", + "ext.min": "1.2", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SIG_METHOD_RSASHA1": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SSLCHECK_BOTH": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SSLCHECK_HOST": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SSLCHECK_NONE": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SSLCHECK_PEER": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_TOKEN_EXPIRED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_TOKEN_REJECTED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_TOKEN_REVOKED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_TOKEN_USED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_VERIFIER_INVALID": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ODBC_BINMODE_CONVERT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ODBC_BINMODE_PASSTHRU": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ODBC_BINMODE_RETURN": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ODBC_TYPE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OPENSSL_ALGO_DSS1": { + "ext.name": "openssl", + "ext.min": "5.2.8", + "ext.max": null, + "php.min": "5.2.8", + "php.max": null + }, + "OPENSSL_ALGO_MD2": { + "ext.name": "openssl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "OPENSSL_ALGO_MD4": { + "ext.name": "openssl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "OPENSSL_ALGO_MD5": { + "ext.name": "openssl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "OPENSSL_ALGO_RMD160": { + "ext.name": "openssl", + "ext.min": "5.4.8", + "ext.max": null, + "php.min": "5.4.8", + "php.max": null + }, + "OPENSSL_ALGO_SHA1": { + "ext.name": "openssl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "OPENSSL_ALGO_SHA224": { + "ext.name": "openssl", + "ext.min": "5.4.8", + "ext.max": null, + "php.min": "5.4.8", + "php.max": null + }, + "OPENSSL_ALGO_SHA256": { + "ext.name": "openssl", + "ext.min": "5.4.8", + "ext.max": null, + "php.min": "5.4.8", + "php.max": null + }, + "OPENSSL_ALGO_SHA384": { + "ext.name": "openssl", + "ext.min": "5.4.8", + "ext.max": null, + "php.min": "5.4.8", + "php.max": null + }, + "OPENSSL_ALGO_SHA512": { + "ext.name": "openssl", + "ext.min": "5.4.8", + "ext.max": null, + "php.min": "5.4.8", + "php.max": null + }, + "OPENSSL_CIPHER_3DES": { + "ext.name": "openssl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "OPENSSL_CIPHER_AES_128_CBC": { + "ext.name": "openssl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "OPENSSL_CIPHER_AES_192_CBC": { + "ext.name": "openssl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "OPENSSL_CIPHER_AES_256_CBC": { + "ext.name": "openssl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "OPENSSL_CIPHER_DES": { + "ext.name": "openssl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "OPENSSL_CIPHER_RC2_128": { + "ext.name": "openssl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "OPENSSL_CIPHER_RC2_40": { + "ext.name": "openssl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "OPENSSL_CIPHER_RC2_64": { + "ext.name": "openssl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "OPENSSL_DEFAULT_STREAM_CIPHERS": { + "ext.name": "openssl", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "OPENSSL_KEYTYPE_DH": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_KEYTYPE_DSA": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_KEYTYPE_EC": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_KEYTYPE_RSA": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_NO_PADDING": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_PKCS1_OAEP_PADDING": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_PKCS1_PADDING": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_RAW_DATA": { + "ext.name": "openssl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "OPENSSL_SSLV23_PADDING": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_TLSEXT_SERVER_NAME": { + "ext.name": "openssl", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "OPENSSL_VERSION_NUMBER": { + "ext.name": "openssl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "OPENSSL_VERSION_TEXT": { + "ext.name": "openssl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "OPENSSL_ZERO_PADDING": { + "ext.name": "openssl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "OP_ANONYMOUS": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_DEBUG": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_EXPUNGE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_HALFOPEN": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_PROTOTYPE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_READONLY": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_SECURE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_SHORTCACHE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_SILENT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PASSWORD_BCRYPT": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "PASSWORD_BCRYPT_DEFAULT_COST": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "PASSWORD_DEFAULT": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "PATHINFO_BASENAME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PATHINFO_DIRNAME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PATHINFO_EXTENSION": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PATHINFO_FILENAME": { + "ext.name": "standard", + "ext.min": "5.2.0RC1", + "ext.max": null, + "php.min": "5.2.0RC1", + "php.max": null + }, + "PATH_SEPARATOR": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "PCNTL_E2BIG": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EACCES": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EAGAIN": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ECHILD": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EFAULT": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EINTR": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EINVAL": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EIO": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EISDIR": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ELIBBAD": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ELOOP": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EMFILE": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENAMETOOLONG": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENFILE": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENOENT": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENOEXEC": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENOMEM": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENOTDIR": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EPERM": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ESRCH": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ETXTBSY": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCRE_VERSION": { + "ext.name": "pcre", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "PEAR_EXTENSION_DIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PEAR_INSTALL_DIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_ASSOC": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_BAD_RESPONSE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_BOTH": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_COMMAND_OK": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONNECTION_AUTH_OK": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECTION_AWAITING_RESPONSE": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECTION_BAD": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONNECTION_MADE": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECTION_OK": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONNECTION_SETENV": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECTION_SSL_STARTUP": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECTION_STARTED": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECT_ASYNC": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECT_FORCE_NEW": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONV_FORCE_NULL": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONV_IGNORE_DEFAULT": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONV_IGNORE_NOT_NULL": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_COPY_IN": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_COPY_OUT": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_CONTEXT": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_INTERNAL_POSITION": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_INTERNAL_QUERY": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_MESSAGE_DETAIL": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_MESSAGE_HINT": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_MESSAGE_PRIMARY": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_SEVERITY": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_SOURCE_FILE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_SOURCE_FUNCTION": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_SOURCE_LINE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_SQLSTATE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_STATEMENT_POSITION": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DML_ASYNC": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DML_ESCAPE": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_DML_EXEC": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DML_NO_CONV": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DML_STRING": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_EMPTY_QUERY": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_ERRORS_DEFAULT": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_ERRORS_TERSE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_ERRORS_VERBOSE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_FATAL_ERROR": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_LIBPQ_VERSION": { + "ext.name": "pgsql", + "ext.min": "5.4.4", + "ext.max": null, + "php.min": "5.4.4", + "php.max": null + }, + "PGSQL_LIBPQ_VERSION_STR": { + "ext.name": "pgsql", + "ext.min": "5.4.4", + "ext.max": null, + "php.min": "5.4.4", + "php.max": null + }, + "PGSQL_NONFATAL_ERROR": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_NUM": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_POLLING_ACTIVE": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_POLLING_FAILED": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_POLLING_OK": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_POLLING_READING": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_POLLING_WRITING": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_SEEK_CUR": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_SEEK_END": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_SEEK_SET": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_STATUS_LONG": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_STATUS_STRING": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_TRANSACTION_ACTIVE": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PGSQL_TRANSACTION_IDLE": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PGSQL_TRANSACTION_INERROR": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PGSQL_TRANSACTION_INTRANS": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PGSQL_TRANSACTION_UNKNOWN": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PGSQL_TUPLES_OK": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_BINARY": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_BINARY_READ": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "PHP_BINDIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_CONFIG_FILE_PATH": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_CONFIG_FILE_SCAN_DIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_DATADIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_DEBUG": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_EOL": { + "ext.name": "Core", + "ext.min": "4.3.10", + "ext.max": null, + "php.min": "4.3.10", + "php.max": null + }, + "PHP_EXTENSION_DIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_EXTRA_VERSION": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_INT_MAX": { + "ext.name": "Core", + "ext.min": "4.4.0", + "ext.max": null, + "php.min": "4.4.0", + "php.max": null + }, + "PHP_INT_SIZE": { + "ext.name": "Core", + "ext.min": "4.4.0", + "ext.max": null, + "php.min": "4.4.0", + "php.max": null + }, + "PHP_LIBDIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_LOCALSTATEDIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_MAJOR_VERSION": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_MANDIR": { + "ext.name": "Core", + "ext.min": "5.3.7", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "PHP_MAXPATHLEN": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_MINOR_VERSION": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_NORMAL_READ": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "PHP_OS": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_CLEAN": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_CLEANABLE": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_CONT": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_DISABLED": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_END": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_FINAL": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_FLUSH": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_FLUSHABLE": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_REMOVABLE": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_START": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_STARTED": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_STDFLAGS": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_WRITE": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_PREFIX": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "PHP_QUERY_RFC1738": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_QUERY_RFC3986": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_RELEASE_VERSION": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_ROUND_HALF_DOWN": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_ROUND_HALF_EVEN": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_ROUND_HALF_ODD": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_ROUND_HALF_UP": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_SAPI": { + "ext.name": "Core", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "PHP_SESSION_ACTIVE": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_SESSION_DISABLED": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_SESSION_NONE": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_SHLIB_SUFFIX": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_SYSCONFDIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_FRAGMENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_HOST": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_PASS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_PATH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_PORT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_QUERY": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_SCHEME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_USER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_VERSION": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_VERSION_ID": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_WINDOWS_NT_DOMAIN_CONTROLLER": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_NT_SERVER": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_NT_WORKSTATION": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_BUILD": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_MAJOR": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_MINOR": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_PLATFORM": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_PRODUCTTYPE": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_SP_MAJOR": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_SP_MINOR": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_SUITEMASK": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_ZTS": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PKCS7_BINARY": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_DETACHED": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOATTR": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOCERTS": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOCHAIN": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOINTERN": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOSIGS": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOVERIFY": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_TEXT": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PM_STR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "PNG_ALL_FILTERS": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_FILTER_AVG": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_FILTER_NONE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_FILTER_PAETH": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_FILTER_SUB": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_FILTER_UP": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_NO_FILTER": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "POLL_ERR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POLL_HUP": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POLL_IN": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POLL_MSG": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POLL_OUT": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POLL_PRI": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POSIX_F_OK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_R_OK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_S_IFBLK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_S_IFCHR": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_S_IFIFO": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_S_IFREG": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_S_IFSOCK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_W_OK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_X_OK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PREG_BACKTRACK_LIMIT_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PREG_BAD_UTF8_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PREG_BAD_UTF8_OFFSET_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.9", + "ext.max": null, + "php.min": "5.2.9", + "php.max": null + }, + "PREG_GREP_INVERT": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PREG_INTERNAL_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PREG_NO_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PREG_OFFSET_CAPTURE": { + "ext.name": "pcre", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "PREG_PATTERN_ORDER": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PREG_RECURSION_LIMIT_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PREG_SET_ORDER": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PREG_SPLIT_DELIM_CAPTURE": { + "ext.name": "pcre", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "PREG_SPLIT_NO_EMPTY": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PREG_SPLIT_OFFSET_CAPTURE": { + "ext.name": "pcre", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "PRIO_PGRP": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "PRIO_PROCESS": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "PRIO_USER": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "PSFS_ERR_FATAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PSFS_FEED_ME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PSFS_FLAG_FLUSH_CLOSE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PSFS_FLAG_FLUSH_INC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PSFS_FLAG_NORMAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PSFS_PASS_ON": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PTHREADS_ALLOW_GLOBALS": { + "ext.name": "pthreads", + "ext.min": "2.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_ALLOW_HEADERS": { + "ext.name": "pthreads", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_ALL": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_CLASSES": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_COMMENTS": { + "ext.name": "pthreads", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_CONSTANTS": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_FUNCTIONS": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_INCLUDES": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_INI": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_NONE": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "RADIXCHAR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "RAR_HOST_BEOS": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RAR_HOST_MACOS": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RAR_HOST_MSDOS": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RAR_HOST_OS2": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RAR_HOST_UNIX": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RAR_HOST_WIN32": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "READLINE_LIB": { + "ext.name": "readline", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SA_ALL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SA_MESSAGES": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SA_RECENT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SA_UIDNEXT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SA_UIDVALIDITY": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SA_UNSEEN": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SCANDIR_SORT_ASCENDING": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SCANDIR_SORT_DESCENDING": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SCANDIR_SORT_NONE": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SCM_CREDENTIALS": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SCM_RIGHTS": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SEARCHD_ERROR": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SEARCHD_OK": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SEARCHD_RETRY": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SEARCHD_WARNING": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SEEK_CUR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SEEK_END": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SEEK_SET": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SEGV_ACCERR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SEGV_MAPERR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SE_FREE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SE_NOPREFETCH": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SE_UID": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SID": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SIGABRT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGALRM": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGBABY": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGBUS": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGCHLD": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGCLD": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGCONT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGFPE": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGHUP": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGILL": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGINT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGIO": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGIOT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGKILL": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGPIPE": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGPOLL": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGPROF": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGPWR": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGQUIT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGSEGV": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGSTKFLT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGSTOP": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGSYS": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGTERM": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGTRAP": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGTSTP": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGTTIN": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGTTOU": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGURG": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGUSR1": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGUSR2": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGVTALRM": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGWINCH": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGXCPU": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGXFSZ": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIG_BLOCK": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SIG_DFL": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIG_ERR": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIG_IGN": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIG_SETMASK": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SIG_UNBLOCK": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_ASYNCIO": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_KERNEL": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_MESGQ": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_NOINFO": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_QUEUE": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_SIGIO": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_TIMER": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_TKILL": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_USER": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SNMP_BIT_STR": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_COUNTER": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_COUNTER64": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_INTEGER": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_IPADDRESS": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_NULL": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_OBJECT_ID": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_OCTET_STR": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_OID_OUTPUT_FULL": { + "ext.name": "snmp", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "SNMP_OID_OUTPUT_MODULE": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SNMP_OID_OUTPUT_NONE": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SNMP_OID_OUTPUT_NUMERIC": { + "ext.name": "snmp", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "SNMP_OID_OUTPUT_SUFFIX": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SNMP_OID_OUTPUT_UCD": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SNMP_OPAQUE": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_TIMETICKS": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_UINTEGER": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_UNSIGNED": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_VALUE_LIBRARY": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_VALUE_OBJECT": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_VALUE_PLAIN": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SOAP_1_1": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_1_2": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ACTOR_NEXT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ACTOR_NONE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ACTOR_UNLIMATERECEIVER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_AUTHENTICATION_BASIC": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_AUTHENTICATION_DIGEST": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_COMPRESSION_ACCEPT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_COMPRESSION_DEFLATE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_COMPRESSION_GZIP": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_DOCUMENT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ENCODED": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ENC_ARRAY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ENC_OBJECT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_FUNCTIONS_ALL": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_LITERAL": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_PERSISTENCE_REQUEST": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_PERSISTENCE_SESSION": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_RPC": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_SINGLE_ELEMENT_ARRAYS": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_SSL_METHOD_SSLv2": { + "ext.name": "soap", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SOAP_SSL_METHOD_SSLv23": { + "ext.name": "soap", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SOAP_SSL_METHOD_SSLv3": { + "ext.name": "soap", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SOAP_SSL_METHOD_TLS": { + "ext.name": "soap", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SOAP_USE_XSI_ARRAY_TYPE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_WAIT_ONE_WAY_CALLS": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOCKET_E2BIG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EACCES": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EADDRINUSE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EADDRNOTAVAIL": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EADV": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EAFNOSUPPORT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EAGAIN": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EALREADY": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EBADE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBADF": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EBADFD": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBADMSG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBADR": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBADRQC": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBADSLT": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBUSY": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ECHRNG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ECOMM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ECONNABORTED": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ECONNREFUSED": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ECONNRESET": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EDESTADDRREQ": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EDISCON": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EDQUOT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EEXIST": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EFAULT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EHOSTDOWN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EHOSTUNREACH": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EIDRM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EINPROGRESS": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EINTR": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EINVAL": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EIO": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EISCONN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EISDIR": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EISNAM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EL2HLT": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EL2NSYNC": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EL3HLT": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EL3RST": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ELNRNG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ELOOP": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EMEDIUMTYPE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EMFILE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EMLINK": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EMSGSIZE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EMULTIHOP": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENAMETOOLONG": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENETDOWN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENETRESET": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENETUNREACH": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENFILE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOANO": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOBUFS": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENOCSI": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENODATA": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENODEV": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOENT": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOLCK": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOLINK": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOMEDIUM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOMEM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOMSG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENONET": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOPROTOOPT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENOSPC": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOSR": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOSTR": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOSYS": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOTBLK": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOTCONN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENOTDIR": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOTEMPTY": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENOTSOCK": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENOTTY": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOTUNIQ": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENXIO": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EOPNOTSUPP": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EPERM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EPFNOSUPPORT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EPIPE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EPROCLIM": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EPROTO": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EPROTONOSUPPORT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EPROTOTYPE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EREMCHG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EREMOTE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EREMOTEIO": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ERESTART": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EROFS": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ESHUTDOWN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ESOCKTNOSUPPORT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ESPIPE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ESRMNT": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ESTALE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ESTRPIPE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ETIME": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ETIMEDOUT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ETOOMANYREFS": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EUNATCH": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EUSERS": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EWOULDBLOCK": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EXDEV": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EXFULL": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_HOST_NOT_FOUND": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_NOTINITIALISED": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_NO_ADDRESS": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_NO_DATA": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_NO_RECOVERY": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_SYSNOTREADY": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_TRY_AGAIN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_VERNOTSUPPORTED": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCK_DGRAM": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCK_RAW": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCK_RDM": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCK_SEQPACKET": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCK_STREAM": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOLR_EXTENSION_VERSION": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SOLR_MAJOR_VERSION": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SOLR_MINOR_VERSION": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SOLR_PATCH_VERSION": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SOL_SOCKET": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOL_TCP": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOL_UDP": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOMAXCONN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SORTARRIVAL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTCC": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTDATE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTFROM": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTSIZE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTSUBJECT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTTO": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_ASC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_DESC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_FLAG_CASE": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SORT_LOCALE_STRING": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_NATURAL": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SORT_NUMERIC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_REGULAR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_STRING": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SO_BINDTODEVICE": { + "ext.name": "sockets", + "ext.min": "5.4.18", + "ext.max": null, + "php.min": "5.4.18", + "php.max": null + }, + "SO_BROADCAST": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_DEBUG": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_DONTROUTE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_ERROR": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_FREE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SO_KEEPALIVE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_LINGER": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_NOSERVER": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SO_OOBINLINE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_PASSCRED": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SO_RCVBUF": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_RCVLOWAT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_RCVTIMEO": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_REUSEADDR": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_REUSEPORT": { + "ext.name": "sockets", + "ext.min": "5.4.10", + "ext.max": null, + "php.min": "5.4.10", + "php.max": null + }, + "SO_SNDBUF": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_SNDLOWAT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_SNDTIMEO": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_TYPE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SPH_ATTR_BOOL": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_ATTR_FLOAT": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_ATTR_INTEGER": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_ATTR_MULTI": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_ATTR_ORDINAL": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_ATTR_TIMESTAMP": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_FILTER_FLOATRANGE": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_FILTER_RANGE": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_FILTER_VALUES": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_ATTR": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_ATTRPAIR": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_DAY": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_MONTH": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_WEEK": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_YEAR": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_ALL": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_ANY": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_BOOLEAN": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_EXTENDED": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_EXTENDED2": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_FULLSCAN": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_PHRASE": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_RANK_BM25": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_RANK_EXPR": { + "ext.name": "sphinx", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_FIELDMASK": { + "ext.name": "sphinx", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_MATCHANY": { + "ext.name": "sphinx", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_NONE": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_RANK_PROXIMITY": { + "ext.name": "sphinx", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_PROXIMITY_BM25": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_RANK_SPH04": { + "ext.name": "sphinx", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_TOTAL": { + "ext.name": "sphinx", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_WORDCOUNT": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_ATTR_ASC": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_ATTR_DESC": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_EXPR": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_EXTENDED": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_RELEVANCE": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_TIME_SEGMENTS": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SQLBIT": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLCHAR": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLFLT4": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLFLT8": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLFLTN": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLINT1": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLINT2": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLINT4": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLITE3_ASSOC": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_BLOB": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_BOTH": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_FLOAT": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_INTEGER": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_NULL": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_NUM": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_OPEN_CREATE": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_OPEN_READONLY": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_OPEN_READWRITE": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_TEXT": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE_ABORT": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_ASSOC": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_AUTH": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_BOTH": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_BUSY": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_CANTOPEN": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_CONSTRAINT": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_CORRUPT": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_DONE": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_EMPTY": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_ERROR": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_FORMAT": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_FULL": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_INTERNAL": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_INTERRUPT": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_IOERR": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_LOCKED": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_MISMATCH": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_MISUSE": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_NOLFS": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_NOMEM": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_NOTADB": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_NOTFOUND": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_NUM": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_OK": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_PERM": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_PROTOCOL": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_READONLY": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_ROW": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_SCHEMA": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_TOOBIG": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLTEXT": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLVARCHAR": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_BEST_ROWID": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_BIGINT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_BINARY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_BIT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CHAR": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CONCURRENCY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CONCUR_LOCK": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CONCUR_READ_ONLY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CONCUR_ROWVER": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CONCUR_VALUES": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CURSOR_DYNAMIC": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CURSOR_FORWARD_ONLY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CURSOR_KEYSET_DRIVEN": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CURSOR_STATIC": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CURSOR_TYPE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CUR_USE_DRIVER": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CUR_USE_IF_NEEDED": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CUR_USE_ODBC": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_DATE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_DECIMAL": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_DOUBLE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_ENSURE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_FETCH_FIRST": { + "ext.name": "odbc", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SQL_FETCH_NEXT": { + "ext.name": "odbc", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SQL_FLOAT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_INDEX_ALL": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_INDEX_UNIQUE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_INTEGER": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_KEYSET_SIZE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_LONGVARBINARY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_LONGVARCHAR": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_NO_NULLS": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_NULLABLE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_NUMERIC": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_ODBC_CURSORS": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_QUICK": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_REAL": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_ROWVER": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_SCOPE_CURROW": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_SCOPE_SESSION": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_SCOPE_TRANSACTION": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_SMALLINT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TIME": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TIMESTAMP": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TINYINT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TYPE_DATE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TYPE_TIME": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TYPE_TIMESTAMP": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_VARBINARY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_VARCHAR": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_WCHAR": { + "ext.name": "odbc", + "ext.min": "5.4.32RC1", + "ext.max": null, + "php.min": "5.4.32RC1", + "php.max": null + }, + "SQL_WLONGVARCHAR": { + "ext.name": "odbc", + "ext.min": "5.4.32RC1", + "ext.max": null, + "php.min": "5.4.32RC1", + "php.max": null + }, + "SQL_WVARCHAR": { + "ext.name": "odbc", + "ext.min": "5.4.32RC1", + "ext.max": null, + "php.min": "5.4.32RC1", + "php.max": null + }, + "SSH2_DEFAULT_TERMINAL": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_DEFAULT_TERM_HEIGHT": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_DEFAULT_TERM_UNIT": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_DEFAULT_TERM_WIDTH": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_FINGERPRINT_HEX": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_FINGERPRINT_MD5": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_FINGERPRINT_RAW": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_FINGERPRINT_SHA1": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLERR": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLEXT": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLHUP": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLIN": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLNVAL": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLOUT": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLL_CHANNEL_CLOSED": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLL_LISTENER_CLOSED": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLL_SESSION_CLOSED": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_STREAM_STDERR": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_STREAM_STDIO": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_TERM_UNIT_CHARS": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_TERM_UNIT_PIXELS": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STDERR": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "STDIN": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "STDOUT": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "STREAM_BUFFER_FULL": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_BUFFER_LINE": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_BUFFER_NONE": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_CAST_AS_STREAM": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_CAST_FOR_SELECT": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_CLIENT_ASYNC_CONNECT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CLIENT_CONNECT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CLIENT_PERSISTENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_ANY_CLIENT": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_ANY_SERVER": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv23_CLIENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv23_SERVER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv2_CLIENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv2_SERVER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv3_CLIENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv3_SERVER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLS_CLIENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLS_SERVER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_0_SERVER": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_1_SERVER": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_2_SERVER": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_ENFORCE_SAFE_MODE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.3.29" + }, + "STREAM_FILTER_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_FILTER_READ": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_FILTER_WRITE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_IGNORE_URL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_IPPROTO_ICMP": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "STREAM_IPPROTO_IP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_IPPROTO_RAW": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "STREAM_IPPROTO_TCP": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "STREAM_IPPROTO_UDP": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "STREAM_IS_URL": { + "ext.name": "standard", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "STREAM_META_ACCESS": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_META_GROUP": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_META_GROUP_NAME": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_META_OWNER": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_META_OWNER_NAME": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_META_TOUCH": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_MKDIR_RECURSIVE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_MUST_SEEK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_AUTH_REQUIRED": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_AUTH_RESULT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_COMPLETED": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_CONNECT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_FAILURE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_FILE_SIZE_IS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_MIME_TYPE_IS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_PROGRESS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_REDIRECTED": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_RESOLVE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_SEVERITY_ERR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_SEVERITY_INFO": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_SEVERITY_WARN": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_OOB": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_OPTION_BLOCKING": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_OPTION_READ_BUFFER": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_OPTION_READ_TIMEOUT": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_OPTION_WRITE_BUFFER": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_PEEK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_PF_INET": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_PF_INET6": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_PF_UNIX": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_REPORT_ERRORS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SERVER_BIND": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SERVER_LISTEN": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SHUT_RD": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SHUT_RDWR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SHUT_WR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SOCK_DGRAM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SOCK_RAW": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SOCK_RDM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SOCK_SEQPACKET": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SOCK_STREAM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_URL_STAT_LINK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_URL_STAT_QUIET": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_USE_PATH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STR_PAD_BOTH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STR_PAD_LEFT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STR_PAD_RIGHT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ST_SET": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ST_SILENT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ST_UID": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SUNFUNCS_RET_DOUBLE": { + "ext.name": "date", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "SUNFUNCS_RET_STRING": { + "ext.name": "date", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "SUNFUNCS_RET_TIMESTAMP": { + "ext.name": "date", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "SVN_ALL": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_CONFIG": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_CONFIG_DIR": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_DEFAULT_PASSWORD": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_DEFAULT_USERNAME": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_DONT_STORE_PASSWORDS": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_NON_INTERACTIVE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_NO_AUTH_CACHE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_SERVER_GROUP": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_SSL_SERVER_FAILURES": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_DISCOVER_CHANGED_PATHS": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_FS_CONFIG_FS_TYPE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_FS_TYPE_BDB": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_FS_TYPE_FSFS": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NODE_DIR": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NODE_FILE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NODE_NONE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NODE_UNKNOWN": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NON_RECURSIVE": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NO_IGNORE": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_OMIT_MESSAGES": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_PROP_REVISION_AUTHOR": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_PROP_REVISION_DATE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_PROP_REVISION_LOG": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_PROP_REVISION_ORIG_DATE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_BASE": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_COMMITTED": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_HEAD": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_INITIAL": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_PREV": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_UNSPECIFIED": { + "ext.name": "svn", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_SHOW_UPDATES": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_STOP_ON_COPY": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_SCHEDULE_ADD": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_SCHEDULE_DELETE": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_SCHEDULE_NORMAL": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_SCHEDULE_REPLACE": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_ADDED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_CONFLICTED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_DELETED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_EXTERNAL": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_IGNORED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_INCOMPLETE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_MERGED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_MISSING": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_MODIFIED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_NONE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_NORMAL": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_OBSTRUCTED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_REPLACED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_UNVERSIONED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TCP_NODELAY": { + "ext.name": "sockets", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "THOUSEP": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "TIDY_NODETYPE_ASP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_CDATA": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_COMMENT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_DOCTYPE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_END": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_JSTE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_PHP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_PROCINS": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_ROOT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_SECTION": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_START": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_STARTEND": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_TEXT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_XMLDECL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_A": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ABBR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ACRONYM": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ADDRESS": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ALIGN": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_APPLET": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_AREA": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_B": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BASE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BASEFONT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BDO": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BGSOUND": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BIG": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BLINK": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BLOCKQUOTE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BODY": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BUTTON": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_CAPTION": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_CENTER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_CITE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_CODE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_COL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_COLGROUP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_COMMENT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DD": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DEL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DFN": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DIR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DIV": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_EM": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_EMBED": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_FIELDSET": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_FONT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_FORM": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_FRAME": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_FRAMESET": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H1": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H2": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H3": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H4": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H5": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H6": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_HEAD": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_HR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_HTML": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_I": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_IFRAME": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ILAYER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_IMG": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_INPUT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_INS": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ISINDEX": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_KBD": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_KEYGEN": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LABEL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LAYER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LEGEND": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LI": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LINK": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LISTING": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_MAP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_MARQUEE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_MENU": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_META": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_MULTICOL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOBR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOEMBED": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOFRAMES": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOLAYER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOSAVE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOSCRIPT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_OBJECT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_OL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_OPTGROUP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_OPTION": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_P": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_PARAM": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_PLAINTEXT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_PRE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_Q": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RB": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RBC": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RTC": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RUBY": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_S": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SAMP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SCRIPT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SELECT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SERVER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SERVLET": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SMALL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SPACER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SPAN": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_STRIKE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_STRONG": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_STYLE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SUB": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SUP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TABLE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TBODY": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TD": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TEXTAREA": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TFOOT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TH": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_THEAD": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TITLE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_U": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_UL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_UNKNOWN": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_VAR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_WBR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_XMP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TRAP_BRKPT": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "TRAP_TRACE": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "TRUE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEAPPLICATION": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEAUDIO": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEIMAGE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEMESSAGE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEMODEL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEMULTIPART": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEOTHER": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPETEXT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEVIDEO": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "T_ABSTRACT": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_AND_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ARRAY": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ARRAY_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_AS": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_BAD_CHARACTER": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_BOOLEAN_AND": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_BOOLEAN_OR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_BOOL_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_BREAK": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CALLABLE": { + "ext.name": "tokenizer", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "T_CASE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CATCH": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_CHARACTER": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CLASS": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CLASS_C": { + "ext.name": "tokenizer", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "T_CLONE": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_CLOSE_TAG": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_COMMENT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CONCAT_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CONST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CONSTANT_ENCAPSED_STRING": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CONTINUE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CURLY_OPEN": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DEC": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DECLARE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DEFAULT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DIR": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_DIV_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DNUMBER": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DO": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DOC_COMMENT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DOLLAR_OPEN_CURLY_BRACES": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DOUBLE_ARROW": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DOUBLE_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DOUBLE_COLON": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ECHO": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ELLIPSIS": { + "ext.name": "tokenizer", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "T_ELSE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ELSEIF": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_EMPTY": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENCAPSED_AND_WHITESPACE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDDECLARE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDFOR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDFOREACH": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDIF": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDSWITCH": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDWHILE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_END_HEREDOC": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_EVAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_EXIT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_EXTENDS": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_FILE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_FINAL": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_FINALLY": { + "ext.name": "tokenizer", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "T_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "T_FMT_AMPM": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "T_FOR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_FOREACH": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_FUNCTION": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_FUNC_C": { + "ext.name": "tokenizer", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "T_GLOBAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_GOTO": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_HALT_COMPILER": { + "ext.name": "tokenizer", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "T_IF": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IMPLEMENTS": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_INC": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_INCLUDE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_INCLUDE_ONCE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_INLINE_HTML": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_INSTANCEOF": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_INSTEADOF": { + "ext.name": "tokenizer", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "T_INTERFACE": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_INT_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ISSET": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_GREATER_OR_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_IDENTICAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_NOT_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_NOT_IDENTICAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_SMALLER_OR_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LINE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LIST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LNUMBER": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LOGICAL_AND": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LOGICAL_OR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LOGICAL_XOR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_METHOD_C": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_MINUS_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ML_COMMENT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": "4.4.9" + }, + "T_MOD_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_MUL_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_NAMESPACE": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_NEW": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_NS_C": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_NS_SEPARATOR": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_NUM_STRING": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_OBJECT_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_OBJECT_OPERATOR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_OLD_FUNCTION": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": "4.4.9" + }, + "T_OPEN_TAG": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_OPEN_TAG_WITH_ECHO": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_OR_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_PAAMAYIM_NEKUDOTAYIM": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_PLUS_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_POW": { + "ext.name": "tokenizer", + "ext.min": "5.6.0RC1", + "ext.max": null, + "php.min": "5.6.0RC1", + "php.max": null + }, + "T_POW_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "5.6.0RC1", + "ext.max": null, + "php.min": "5.6.0RC1", + "php.max": null + }, + "T_PRINT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_PRIVATE": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_PROTECTED": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_PUBLIC": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_REQUIRE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_REQUIRE_ONCE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_RETURN": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_SL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_SL_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_SR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_SR_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_START_HEREDOC": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_STATIC": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_STRING": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_STRING_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_STRING_VARNAME": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_SWITCH": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_THROW": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_TRAIT": { + "ext.name": "tokenizer", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "T_TRAIT_C": { + "ext.name": "tokenizer", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "T_TRY": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_UNSET": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_UNSET_CAST": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_USE": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_VAR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_VARIABLE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_WHILE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_WHITESPACE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_XOR_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_YIELD": { + "ext.name": "tokenizer", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "ULOC_ACTUAL_LOCALE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ULOC_VALID_LOCALE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "UNKNOWN_TYPE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "UPLOAD_ERR_CANT_WRITE": { + "ext.name": "Core", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "UPLOAD_ERR_EXTENSION": { + "ext.name": "Core", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "UPLOAD_ERR_FORM_SIZE": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "UPLOAD_ERR_INI_SIZE": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "UPLOAD_ERR_NO_FILE": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "UPLOAD_ERR_NO_TMP_DIR": { + "ext.name": "Core", + "ext.min": "4.3.10", + "ext.max": null, + "php.min": "4.3.10", + "php.max": null + }, + "UPLOAD_ERR_OK": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "UPLOAD_ERR_PARTIAL": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "U_AMBIGUOUS_ALIAS_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BAD_VARIABLE_DEFINITION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_ASSIGN_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_ERROR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_HEX_DIGITS_EXPECTED": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_INIT_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_INTERNAL_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_MALFORMED_RULE_TAG": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_MISMATCHED_PAREN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_NEW_LINE_IN_QUOTED_STRING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_RULE_EMPTY_SET": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_RULE_SYNTAX": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_SEMICOLON_EXPECTED": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_UNCLOSED_SET": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_UNDEFINED_VARIABLE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_UNRECOGNIZED_OPTION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_VARIABLE_REDFINITION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BUFFER_OVERFLOW_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_CE_NOT_FOUND_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_COLLATOR_VERSION_MISMATCH": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_DIFFERENT_UCA_VERSION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ENUM_OUT_OF_SYNC_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ERROR_WARNING_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ERROR_WARNING_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_FILE_ACCESS_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_FMT_PARSE_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_FMT_PARSE_ERROR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_ACE_PREFIX_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_CHECK_BIDI_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "U_IDNA_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_ERROR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_LABEL_TOO_LONG_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_PROHIBITED_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_STD3_ASCII_RULES_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_UNASSIGNED_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_VERIFICATION_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_ZERO_LENGTH_LABEL_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_ARGUMENT_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_CHARACTER": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_CHAR_FOUND": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_CHAR_IN_SEGMENT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_ESCAPE_SEQUENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_PAD_POSITION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INDEX_OUTOFBOUNDS_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INTERNAL_PROGRAM_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INTERNAL_TRANSLITERATOR_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_CHAR_FOUND": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_FORMAT_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_FUNCTION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_ID": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_PROPERTY_PATTERN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_RBT_SYNTAX": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_STATE_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_TABLE_FILE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_TABLE_FORMAT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVARIANT_CONVERSION_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_EXPONENTIAL_PATTERN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_PRAGMA": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_RULE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_SET": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_SYMBOL_REFERENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_UNICODE_ESCAPE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_VARIABLE_DEFINITION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_VARIABLE_REFERENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MEMORY_ALLOCATION_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MESSAGE_PARSE_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISMATCHED_SEGMENT_DELIMITERS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISPLACED_ANCHOR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISPLACED_COMPOUND_FILTER": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISPLACED_CURSOR_OFFSET": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISPLACED_QUANTIFIER": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISSING_OPERATOR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISSING_RESOURCE_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISSING_SEGMENT_CLOSE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_ANTE_CONTEXTS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_COMPOUND_FILTERS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_CURSORS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_DECIMAL_SEPARATORS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_DECIMAL_SEPERATORS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_EXPONENTIAL_SYMBOLS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_PAD_SPECIFIERS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_PERCENT_SYMBOLS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_PERMILL_SYMBOLS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_POST_CONTEXTS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_NO_SPACE_AVAILABLE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_NO_WRITE_PERMISSION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_PARSE_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_PARSE_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_PARSE_ERROR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_PATTERN_SYNTAX_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_PRIMARY_TOO_LONG_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_BAD_ESCAPE_SEQUENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_BAD_INTERVAL": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_ERROR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_INTERNAL_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_INVALID_BACK_REF": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_INVALID_FLAG": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_INVALID_STATE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_LOOK_BEHIND_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_MAX_LT_MIN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_MISMATCHED_PAREN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_NUMBER_TOO_BIG": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_PROPERTY_SYNTAX": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_RULE_SYNTAX": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_SET_CONTAINS_STRING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_UNIMPLEMENTED": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_RESOURCE_TYPE_MISMATCH": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_RULE_MASK_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_SAFECLONE_ALLOCATED_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_SORT_KEY_TOO_SHORT_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STANDARD_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STATE_OLD_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STATE_TOO_OLD_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STRINGPREP_CHECK_BIDI_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STRINGPREP_PROHIBITED_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STRINGPREP_UNASSIGNED_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STRING_NOT_TERMINATED_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_TOO_MANY_ALIASES_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_TRAILING_BACKSLASH": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_TRUNCATED_CHAR_FOUND": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNCLOSED_SEGMENT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNDEFINED_SEGMENT_REFERENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNDEFINED_VARIABLE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNEXPECTED_TOKEN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNMATCHED_BRACES": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNQUOTED_SPECIAL": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNSUPPORTED_ATTRIBUTE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNSUPPORTED_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNSUPPORTED_ESCAPE_SEQUENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNSUPPORTED_PROPERTY": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNTERMINATED_QUOTE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_USELESS_COLLATOR_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_USING_DEFAULT_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_USING_FALLBACK_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_VARIABLE_RANGE_EXHAUSTED": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_VARIABLE_RANGE_OVERLAP": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ZERO_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "VARNISH_COMPAT_2": { + "ext.name": "varnish", + "ext.min": "0.9.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_COMPAT_3": { + "ext.name": "varnish", + "ext.min": "0.9.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_COMPAT": { + "ext.name": "varnish", + "ext.min": "0.9.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_HOST": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_IDENT": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_PORT": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_SECRET": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_TIMEOUT": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_AUTH": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_CANT": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_CLOSE": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_COMMS": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_OK": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_PARAM": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_SYNTAX": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_TOOFEW": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_TOOMANY": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_UNIMPL": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_UNKNOWN": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "WNOHANG": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "WSDL_CACHE_BOTH": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "WSDL_CACHE_DISK": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "WSDL_CACHE_MEMORY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "WSDL_CACHE_NONE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "WUNTRACED": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "X509_PURPOSE_ANY": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_CRL_SIGN": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_NS_SSL_SERVER": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_SMIME_ENCRYPT": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_SMIME_SIGN": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_SSL_CLIENT": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_SSL_SERVER": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "XCACHE_MODULES": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XCACHE_VERSION": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD_ARRAY_ELEMENT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD_CHAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD_INTERFACE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD_STRING": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD_TRAIT": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_ADD_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_ADD": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_BW_AND": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_BW_OR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_BW_XOR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_CONCAT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_DIM": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_DIV": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_MOD": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_MUL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_POW": { + "ext.name": "XCache", + "ext.min": "3.2.0", + "ext.max": null, + "php.min": "5.6.0", + "php.max": null + }, + "XC_ASSIGN_REF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_SL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_SR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_SUB": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BEGIN_SILENCE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BIND_TRAITS": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_BOOL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BOOL_NOT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BOOL_XOR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BRK": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BW_AND": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BW_NOT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BW_OR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BW_XOR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CASE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CAST": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CATCH": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CLONE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CONCAT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CONT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DECLARE_CLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DECLARE_CONST": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_DECLARE_FUNCTION": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DECLARE_INHERITED_CLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DECLARE_INHERITED_CLASS_DELAYED": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_DECLARE_LAMBDA_FUNCTION": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_DISCARD_EXCEPTION": { + "ext.name": "XCache", + "ext.min": "3.1.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "XC_DIV": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DO_FCALL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DO_FCALL_BY_NAME": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ECHO": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_END_SILENCE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_EXIT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_EXT_FCALL_BEGIN": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_EXT_FCALL_END": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_EXT_NOP": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_EXT_STMT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FAST_CALL": { + "ext.name": "XCache", + "ext.min": "3.1.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "XC_FAST_RET": { + "ext.name": "XCache", + "ext.min": "3.1.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "XC_FETCH_CLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_CONSTANT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_FUNC_ARG": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_IS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_R": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_RW": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_TMP_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_UNSET": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_W": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_FUNC_ARG": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_IS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_FUNC_ARG": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_IS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_R": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_RW": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_UNSET": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_W": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_R": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_RW": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_UNSET": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_W": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FE_FETCH": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FE_RESET": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FREE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_GENERATOR_RETURN": { + "ext.name": "XCache", + "ext.min": "3.1.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "XC_GOTO": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_HANDLE_EXCEPTION": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INCLUDE_OR_EVAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INIT_ARRAY": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INIT_FCALL_BY_NAME": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INIT_METHOD_CALL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INIT_NS_FCALL_BY_NAME": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_INIT_STATIC_METHOD_CALL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INIT_STRING": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INSTANCEOF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ISSET_ISEMPTY_DIM_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ISSET_ISEMPTY_PROP_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ISSET_ISEMPTY_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_ARRAY": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_BOOL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_CONST": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_CONSTANT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_CONSTANT_ARRAY": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_CV": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_DOUBLE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_EQUAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_IDENTICAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_LONG": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_NOT_EQUAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_NOT_IDENTICAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_NULL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_OBJECT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_RESOURCE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_SMALLER": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_SMALLER_OR_EQUAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_STRING": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_TMP_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_UNICODE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_UNUSED": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMP": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMPNZ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMPNZ_EX": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMPZ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMPZNZ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMPZ_EX": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMP_SET": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_JMP_SET_VAR": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_MOD": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_MUL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_NEW": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_NOP": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_NULL?": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_ARG": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_ASSIGN": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_BIT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_BRK": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_CAST": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_CLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_CONT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_DECLARE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_FCALL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_FCLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_FE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_FETCH": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_IFACE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_INCLUDE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_INIT_FCALL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_ISSET": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_JMPADDR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_OPLINE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_SEND": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_SEND_NOREF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_STD": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_TMP": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_UCLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_UNUSED": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OP_DATA": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_POST_DEC": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_POST_DEC_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_POST_INC": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_POST_INC_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_POW": { + "ext.name": "XCache", + "ext.min": "3.2.0", + "ext.max": null, + "php.min": "5.6.0", + "php.max": null + }, + "XC_PRE_DEC": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_PRE_DEC_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_PRE_INC": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_PRE_INC_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_PRINT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_QM_ASSIGN": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_QM_ASSIGN_VAR": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_RAISE_ABSTRACT_ERROR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_RECV": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_RECV_INIT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_RECV_VARIADIC": { + "ext.name": "XCache", + "ext.min": "3.2.0", + "ext.max": null, + "php.min": "5.6.0", + "php.max": null + }, + "XC_RETURN": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_RETURN_BY_REF": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_SEND_REF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SEND_UNPACK": { + "ext.name": "XCache", + "ext.min": "3.2.0", + "ext.max": null, + "php.min": "5.6.0", + "php.max": null + }, + "XC_SEND_VAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SEND_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SEND_VAR_NO_REF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SEPARATE": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_SIZEOF_TEMP_VARIABLE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SUB": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SWITCH_FREE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_THROW": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_TICKS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_TYPE_PHP": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_TYPE_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_UNDEF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_UNSET_DIM": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_UNSET_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_UNSET_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_USER_OPCODE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_VERIFY_ABSTRACT_CLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_YIELD": { + "ext.name": "XCache", + "ext.min": "3.1.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "XDEBUG_CC_BRANCH_CHECK": { + "ext.name": "xdebug", + "ext.min": "2.3.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XDEBUG_CC_DEAD_CODE": { + "ext.name": "xdebug", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XDEBUG_CC_UNUSED": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XDEBUG_STACK_NO_DESC": { + "ext.name": "xdebug", + "ext.min": "2.3.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XDEBUG_TRACE_APPEND": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XDEBUG_TRACE_COMPUTERIZED": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XDEBUG_TRACE_HTML": { + "ext.name": "xdebug", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XDEBUG_TRACE_NAKED_FILENAME": { + "ext.name": "xdebug", + "ext.min": "2.3.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XHPROF_FLAGS_CPU": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "XHPROF_FLAGS_MEMORY": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "XHPROF_FLAGS_NO_BUILTINS": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "XML_ATTRIBUTE_CDATA": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_DECL_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_ENTITY": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_ENUMERATION": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_ID": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_IDREF": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_IDREFS": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_NMTOKEN": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_NMTOKENS": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_NOTATION": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_CDATA_SECTION_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_COMMENT_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_DOCUMENT_FRAG_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_DOCUMENT_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_DOCUMENT_TYPE_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_DTD_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ELEMENT_DECL_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ELEMENT_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ENTITY_DECL_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ENTITY_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ENTITY_REF_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ERROR_ASYNC_ENTITY": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_BAD_CHAR_REF": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_BINARY_ENTITY_REF": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_DUPLICATE_ATTRIBUTE": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_EXTERNAL_ENTITY_HANDLING": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_INCORRECT_ENCODING": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_INVALID_TOKEN": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_JUNK_AFTER_DOC_ELEMENT": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_MISPLACED_XML_PI": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_NONE": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_NO_ELEMENTS": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_NO_MEMORY": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_PARAM_ENTITY_REF": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_PARTIAL_CHAR": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_RECURSIVE_ENTITY_REF": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_SYNTAX": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_TAG_MISMATCH": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_UNCLOSED_CDATA_SECTION": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_UNCLOSED_TOKEN": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_UNDEFINED_ENTITY": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_UNKNOWN_ENCODING": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_HTML_DOCUMENT_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_LOCAL_NAMESPACE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_NAMESPACE_DECL_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_NOTATION_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_OPTION_CASE_FOLDING": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_OPTION_SKIP_TAGSTART": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_OPTION_SKIP_WHITE": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_OPTION_TARGET_ENCODING": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_PI_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_SAX_IMPL": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_TEXT_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_1999_NAMESPACE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_1999_TIMEINSTANT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ANYTYPE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ANYURI": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ANYXML": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_BASE64BINARY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_BOOLEAN": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_BYTE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_DATE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_DATETIME": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_DECIMAL": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_DOUBLE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_DURATION": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ENTITIES": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ENTITY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_FLOAT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_GDAY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_GMONTH": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_GMONTHDAY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_GYEAR": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_GYEARMONTH": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_HEXBINARY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ID": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_IDREF": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_IDREFS": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_INT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_INTEGER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_LANGUAGE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_LONG": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NAME": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NAMESPACE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NCNAME": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NEGATIVEINTEGER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NMTOKEN": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NMTOKENS": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NONNEGATIVEINTEGER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NONPOSITIVEINTEGER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NORMALIZEDSTRING": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NOTATION": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_POSITIVEINTEGER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_QNAME": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_SHORT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_STRING": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_TIME": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_TOKEN": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_UNSIGNEDBYTE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_UNSIGNEDINT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_UNSIGNEDLONG": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_UNSIGNEDSHORT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSL_CLONE_ALWAYS": { + "ext.name": "xsl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSL_CLONE_AUTO": { + "ext.name": "xsl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSL_CLONE_NEVER": { + "ext.name": "xsl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSL_SECPREF_CREATE_DIRECTORY": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_DEFAULT": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_NONE": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_READ_FILE": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_READ_NETWORK": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_WRITE_FILE": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_WRITE_NETWORK": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "YAC_MAX_KEY_LEN": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAC_MAX_RAW_COMPRESSED_LEN": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAC_MAX_VALUE_RAW_LEN": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAC_SERIALIZER": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAC_VERSION": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_ANY_BREAK": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_ANY_ENCODING": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_ANY_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_BINARY_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_BOOL_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_CRLN_BREAK": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_CR_BREAK": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_DOUBLE_QUOTED_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_FLOAT_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_FOLDED_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_INT_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_LITERAL_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_LN_BREAK": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_MAP_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_MERGE_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_NULL_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_PHP_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_PLAIN_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_SEQ_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_SINGLE_QUOTED_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_STR_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_TIMESTAMP_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_UTF16BE_ENCODING": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_UTF16LE_ENCODING": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_UTF8_ENCODING": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YESEXPR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ZEND_ACC_ABSTRACT": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_CLASS": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_FETCH": { + "ext.name": "uopz", + "ext.min": "2.0.2", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_FINAL": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_INTERFACE": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_PPP_MASK": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_PRIVATE": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_PROTECTED": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_PUBLIC": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_STATIC": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_TRAIT": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ADD_INTERFACE": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ADD_TRAIT": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_DEBUG_BUILD": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ZEND_EXIT": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_FETCH_CLASS": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_INSTANCEOF": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_MULTIBYTE": { + "ext.name": "Core", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": "5.3.29" + }, + "ZEND_NEW": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_THREAD_SAFE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ZEND_THROW": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_CONTINUE": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_DISPATCH": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_DISPATCH_TO": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_ENTER": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_LEAVE": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_RETURN": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZLIB_ENCODING_DEFLATE": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZLIB_ENCODING_GZIP": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZLIB_ENCODING_RAW": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "__CLASS__": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "__COMPILER_HALT_OFFSET__": { + "ext.name": "Core", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__DIR__": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__FILE__": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "__FUNCTION__": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "__LINE__": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "__METHOD__": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__NAMESPACE__": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__TRAIT__": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_ANY": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_BASIC": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_DIGEST": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_DIGEST_IE": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_GSSNEG": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_NTLM": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_SPNEGO": { + "ext.name": "http", + "ext.min": "2.1.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\HTTP_VERSION_1_0": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\HTTP_VERSION_1_1": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\HTTP_VERSION_2_0": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\HTTP_VERSION_ANY": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\IPRESOLVE_ANY": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\IPRESOLVE_V4": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\IPRESOLVE_V6": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\POSTREDIR_301": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\POSTREDIR_302": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\POSTREDIR_303": { + "ext.name": "http", + "ext.min": "2.1.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\POSTREDIR_ALL": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_HTTP": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_HTTP_1_0": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_SOCKS4": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_SOCKS4A": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_SOCKS5": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_SOCKS5_HOSTNAME": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_ANY": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_SSLv2": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_SSLv3": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_TLSv1": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_TLSv1_0": { + "ext.name": "http", + "ext.min": "2.1.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_TLSv1_1": { + "ext.name": "http", + "ext.min": "2.1.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_TLSv1_2": { + "ext.name": "http", + "ext.min": "2.1.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "methods": { + "AMQPChannel": { + "__construct": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "commitTransaction": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getChannelId": { + "ext.name": "amqp", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getConnection": { + "ext.name": "amqp", + "ext.min": "1.4.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrefetchCount": { + "ext.name": "amqp", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrefetchSize": { + "ext.name": "amqp", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isConnected": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "qos": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rollbackTransaction": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPrefetchCount": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPrefetchSize": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "startTransaction": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPChannelException": { + "__construct": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__toString": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCode": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFile": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLine": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessage": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrevious": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTrace": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPConnection": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "connect": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "disconnect": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getHost": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLogin": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPassword": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPort": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getReadTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getVhost": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getWriteTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isConnected": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pconnect": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdisconnect": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "reconnect": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setHost": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setLogin": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPassword": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPort": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setReadTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setVhost": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setWriteTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPConnectionException": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__toString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCode": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFile": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLine": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessage": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrevious": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTrace": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPEnvelope": { + "__construct": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAppId": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getBody": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getContentEncoding": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getContentType": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCorrelationId": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDeliveryMode": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDeliveryTag": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getExchangeName": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getExpiration": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getHeader": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getHeaders": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessageId": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPriority": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getReplyTo": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getRoutingKey": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTimestamp": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getType": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getUserId": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isRedelivery": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPException": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__toString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCode": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFile": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLine": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessage": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrevious": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTrace": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPExchange": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bind": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "declare": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "declareExchange": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getArgument": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getArguments": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getChannel": { + "ext.name": "amqp", + "ext.min": "1.4.0beta2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getConnection": { + "ext.name": "amqp", + "ext.min": "1.4.0beta2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFlags": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getName": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getType": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "publish": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setArgument": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setArguments": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setFlags": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setName": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setType": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPExchangeException": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__toString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCode": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFile": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLine": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessage": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrevious": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTrace": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPQueue": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ack": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bind": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "cancel": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "consume": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "declare": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "declareQueue": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getArgument": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getArguments": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getChannel": { + "ext.name": "amqp", + "ext.min": "1.4.0beta1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getConnection": { + "ext.name": "amqp", + "ext.min": "1.4.0beta2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFlags": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getName": { + "ext.name": "amqp", + "ext.min": "0.3.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "nack": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "purge": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "reject": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setArgument": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setArguments": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setFlags": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setName": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unbind": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPQueueException": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__toString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCode": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFile": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLine": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessage": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrevious": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTrace": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "DateInterval": { + "__construct": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__set_state": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__wakeup": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "createFromDateString": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "format": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "DatePeriod": { + "__construct": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__set_state": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__wakeup": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getDateInterval": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.6.5RC1", + "php.max": null + }, + "getEndDate": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.6.5RC1", + "php.max": null + }, + "getStartDate": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.6.5RC1", + "php.max": null + } + }, + "DateTime": { + "__construct": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__set_state": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__wakeup": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": "5.4.37" + }, + "add": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "createFromFormat": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "createFromImmutable": { + "ext.name": "date", + "ext.min": "5.6.8RC1", + "ext.max": null, + "php.min": "5.6.8RC1", + "php.max": null + }, + "diff": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": "5.4.37" + }, + "format": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": "5.4.37" + }, + "getLastErrors": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getOffset": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": "5.4.37" + }, + "getTimestamp": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": "5.4.37" + }, + "getTimezone": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": "5.4.37" + }, + "modify": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setDate": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setISODate": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setTime": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setTimestamp": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setTimezone": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sub": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "DateTimeImmutable": { + "__construct": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "__set_state": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "add": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createFromFormat": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createFromMutable": { + "ext.name": "date", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "getLastErrors": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "modify": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setDate": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setISODate": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setTime": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setTimestamp": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setTimezone": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "sub": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "DateTimeInterface": { + "__wakeup": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "diff": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "format": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getOffset": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTimestamp": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTimezone": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "DateTimeZone": { + "__construct": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__set_state": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__wakeup": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLocation": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getName": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getOffset": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTransitions": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "listAbbreviations": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "listIdentifiers": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Gender\\Gender": { + "__construct": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__destruct": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": "0.7.0", + "php.min": "5.3.0", + "php.max": null + }, + "connect": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "country": { + "ext.name": "gender", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "get": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isNick": { + "ext.name": "gender", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "similarNames": { + "ext.name": "gender", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "trace": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "HaruAnnotation": { + "setBorderStyle": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setHighlightMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setIcon": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setOpened": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruDestination": { + "setFit": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitB": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitBH": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitBV": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitH": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitR": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitV": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setXYZ": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruDoc": { + "__construct": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "addPage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "addPageLabel": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "createOutline": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentEncoder": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentPage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getEncoder": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getFont": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getInfoAttr": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getPageLayout": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getPageMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getStreamSize": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "insertPage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadJPEG": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadPNG": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadRaw": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadTTC": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadTTF": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadType1": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "output": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "readFromStream": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "resetError": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "resetStream": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "save": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "saveToStream": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setCompressionMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setCurrentEncoder": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setEncryptionMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setInfoAttr": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setInfoDateAttr": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setOpenAction": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setPageLayout": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setPageMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setPagesConfiguration": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setPassword": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setPermission": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useCNSEncodings": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useCNSFonts": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useCNTEncodings": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useCNTFonts": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useJPEncodings": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useJPFonts": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useKREncodings": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useKRFonts": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruEncoder": { + "getByteType": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getType": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getUnicode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getWritingMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruException": { + "__construct": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "__toString": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getFile": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLine": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getMessage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getPrevious": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTrace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruFont": { + "MeasureText": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getAscent": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCapHeight": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getDescent": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getEncodingName": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getFontName": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getUnicodeWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getXHeight": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruImage": { + "addSMask": { + "ext.name": "haru", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getBitsPerComponent": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getColorSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getHeight": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getSize": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setColorMask": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setMaskImage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruOutline": { + "setDestination": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setOpened": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruPage": { + "Concat": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "MeasureText": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "arc": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "beginText": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "circle": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "closePath": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "createDestination": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "createLinkAnnotation": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "createTextAnnotation": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "createURLAnnotation": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "curveTo": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "curveTo2": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "curveTo3": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "drawImage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ellipse": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "endPath": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "endText": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "eoFillStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "eofill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "fill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "fillStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCMYKFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCMYKStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCharSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentFont": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentFontSize": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentPos": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentTextPos": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getDash": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getFillingColorSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getFlatness": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getGMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getGrayFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getGrayStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getHeight": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getHorizontalScaling": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLineCap": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLineJoin": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLineWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getMiterLimit": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getRGBFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getRGBStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getStrokingColorSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextLeading": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextMatrix": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextRenderingMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextRise": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTransMatrix": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getWordSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "lineTo": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "moveTextPos": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "moveTo": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "moveToNextLine": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "rectangle": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setCMYKFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setCMYKStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setCharSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setDash": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFlatness": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFontAndSize": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setGrayFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setGrayStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setHeight": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setHorizontalScaling": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setLineCap": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setLineJoin": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setLineWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setMiterLimit": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setRGBFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setRGBStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setRotate": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setSize": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setSlideShow": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setTextLeading": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setTextMatrix": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setTextRenderingMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setTextRise": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setWordSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setZoom": { + "ext.name": "haru", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "showText": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "showTextNextLine": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "stroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "textOut": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "textRect": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "http\\Env\\Request": { + "getCookie": { + "ext.name": "http", + "ext.min": "2.2.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Env\\Response": { + "setCookie": { + "ext.name": "http", + "ext.min": "2.2.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Header\\Parser": { + "getState": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "parse": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stream": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Message\\Parser": { + "configure": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getAvailableConfiguration": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getAvailableOptions": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Collator": { + "__construct": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "asort": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "compare": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getSortKey": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getStrength": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setStrength": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sort": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sortWithSortKeys": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "IntlBreakIterator": { + "createCharacterInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createCodePointInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createLineInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createSentenceInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTitleInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createWordInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "current": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "first": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "following": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getPartsIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getText": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isBoundary": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "last": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "next": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "preceding": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "previous": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setText": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlCalendar": { + "add": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "after": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "before": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "clear": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "equals": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fieldDifference": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fromDateTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "get": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getActualMaximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getActualMinimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getAvailableLocales": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getDayOfWeekType": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getFirstDayOfWeek": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getGreatestMinimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getKeywordValuesForLocale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getLeastMaximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getMaximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getMinimalDaysInFirstWeek": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getMinimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getNow": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRepeatedWallTimeOption": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getSkippedWallTimeOption": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getType": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getWeekendTransition": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "inDaylightTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isEquivalentTo": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isLenient": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isSet": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isWeekend": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "roll": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "set": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setFirstDayOfWeek": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setLenient": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setMinimalDaysInFirstWeek": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setRepeatedWallTimeOption": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setSkippedWallTimeOption": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "toDateTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlCodePointBreakIterator": { + "getLastCodePoint": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlDateFormatter": { + "__construct": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "create": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "format": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "formatObject": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getCalendar": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getCalendarObject": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getDateType": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getPattern": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getTimeType": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getTimeZone": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getTimeZoneId": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "isLenient": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "localtime": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "parse": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setCalendar": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setLenient": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setPattern": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setTimeZone": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setTimeZoneId": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "IntlGregorianCalendar": { + "__construct": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getGregorianChange": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isLeapYear": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setGregorianChange": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlPartsIterator": { + "getBreakIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlRuleBasedBreakIterator": { + "__construct": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getBinaryRules": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRuleStatus": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRuleStatusVec": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRules": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlTimeZone": { + "countEquivalentIDs": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createDefault": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createEnumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTimeZoneIDEnumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fromDateTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getCanonicalID": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getDSTSavings": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getDisplayName": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getEquivalentID": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getGMT": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getID": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getOffset": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRawOffset": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRegion": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTZDataVersion": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getUnknown": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "hasSameRules": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "toDateTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "useDaylightTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "Locale": { + "acceptFromHttp": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "canonicalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "composeLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "filterMatches": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAllVariants": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDefault": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayLanguage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayName": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayRegion": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayScript": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayVariant": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getKeywords": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrimaryLanguage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getRegion": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getScript": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lookup": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parseLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setDefault": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "MessageFormatter": { + "__construct": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "format": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "formatMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parse": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parseMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Normalizer": { + "isNormalized": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.3.0alpha1", + "php.max": null + }, + "normalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.3.0alpha1", + "php.max": null + } + }, + "NumberFormatter": { + "__construct": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "format": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "formatCurrency": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getSymbol": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTextAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parse": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parseCurrency": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setSymbol": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setTextAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "ResourceBundle": { + "__construct": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "count": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "create": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "get": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getLocales": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "Spoofchecker": { + "__construct": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "areConfusable": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "isSuspicious": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setAllowedLocales": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setChecks": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "Transliterator": { + "create": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "createFromRules": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "createInverse": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "listIDs": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterate": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "UConverter": { + "__construct": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "convert": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fromUCallback": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getAliases": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getAvailable": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getDestinationEncoding": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getDestinationType": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getSourceEncoding": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getSourceType": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getStandards": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getSubstChars": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "reasonText": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setDestinationEncoding": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setSourceEncoding": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setSubstChars": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "toUCallback": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "transcode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "mimemessage": { + "add_child": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "enum_uue": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "extract_body": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "extract_headers": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "extract_uue": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "get_child": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "get_child_count": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "get_parent": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mimemessage": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "remove": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + } + }, + "Mongo": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "forceError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getPoolSize": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getSlave": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getSlaveOkay": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "lastError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "poolDebug": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "prevError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "resetError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setPoolSize": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setSlaveOkay": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "switchSlave": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoBinData": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoClient": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "__get": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "close": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "connect": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "dropDB": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getConnections": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getHosts": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getReadPreference": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getWriteConcern": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "killCursor": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "listDBs": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "selectCollection": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "selectDB": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setReadPreference": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setWriteConcern": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoCode": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoCollection": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__get": { + "ext.name": "mongo", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "aggregate": { + "ext.name": "mongo", + "ext.min": "1.3.0beta2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "aggregateCursor": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "batchInsert": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "count": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "createDBRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "createIndex": { + "ext.name": "mongo", + "ext.min": "1.5.0RC1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "deleteIndex": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "deleteIndexes": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "distinct": { + "ext.name": "mongo", + "ext.min": "1.2.12", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "drop": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ensureIndex": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "find": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "findAndModify": { + "ext.name": "mongo", + "ext.min": "1.3.0beta2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "findOne": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDBRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getIndexInfo": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getReadPreference": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getSlaveOkay": { + "ext.name": "mongo", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getWriteConcern": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "group": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "insert": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "parallelCollectionScan": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "remove": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "save": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setReadPreference": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setSlaveOkay": { + "ext.name": "mongo", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setWriteConcern": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "toIndexString": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "update": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "validate": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoCommandCursor": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "createFromDocument": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoCursor": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "addOption": { + "ext.name": "mongo", + "ext.min": "1.0.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "awaitData": { + "ext.name": "mongo", + "ext.min": "1.2.12", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "count": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "explain": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "fields": { + "ext.name": "mongo", + "ext.min": "1.0.6", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getNext": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "hasNext": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "hint": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "immortal": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "limit": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "maxTimeMS": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "partial": { + "ext.name": "mongo", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "reset": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setFlag": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "skip": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "slaveOkay": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "snapshot": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "sort": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "tailable": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoCursorException": { + "getHost": { + "ext.name": "mongo", + "ext.min": "1.2.5", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoCursorInterface": { + "batchSize": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "dead": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getReadPreference": { + "ext.name": "mongo", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "info": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setReadPreference": { + "ext.name": "mongo", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "timeout": { + "ext.name": "mongo", + "ext.min": "1.6.0RC3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "MongoDB": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__get": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "authenticate": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "command": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "createCollection": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "createDBRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "drop": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "dropCollection": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "execute": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "forceError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getCollectionInfo": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getCollectionNames": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDBRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getGridFS": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getProfilingLevel": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getReadPreference": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getSlaveOkay": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getWriteConcern": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "lastError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "listCollections": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "prevError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "repair": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "resetError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "selectCollection": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setProfilingLevel": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setReadPreference": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setSlaveOkay": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setWriteConcern": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoDBRef": { + "create": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "get": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoDate": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__set_state": { + "ext.name": "mongo", + "ext.min": "1.6.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "toDateTime": { + "ext.name": "mongo", + "ext.min": "1.6.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "MongoDeleteBatch": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoGridFS": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "delete": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "get": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "put": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "storeBytes": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "storeFile": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "storeUpload": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoGridFSCursor": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoGridFSFile": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getBytes": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getFilename": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getResource": { + "ext.name": "mongo", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getSize": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "write": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoId": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__set_state": { + "ext.name": "mongo", + "ext.min": "1.0.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getHostname": { + "ext.name": "mongo", + "ext.min": "1.0.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getInc": { + "ext.name": "mongo", + "ext.min": "1.0.11", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getPID": { + "ext.name": "mongo", + "ext.min": "1.0.11", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getTimestamp": { + "ext.name": "mongo", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "isValid": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoInsertBatch": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoInt32": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoInt64": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoLog": { + "getCallback": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getLevel": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getModule": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setCallback": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setLevel": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setModule": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoPool": { + "getSize": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "info": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setSize": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoRegex": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoResultException": { + "getDocument": { + "ext.name": "mongo", + "ext.min": "1.3.0RC1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getHost": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoTimestamp": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoUpdateBatch": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoWriteBatch": { + "add": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "execute": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getBatchInfo": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getItemCount": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoWriteConcernException": { + "getDocument": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MessagePack": { + "__construct": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "pack": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setOption": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "unpack": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "unpacker": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MessagePackUnpacker": { + "__construct": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__destruct": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "data": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "execute": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "feed": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "reset": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setOption": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "OAuth": { + "__construct": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__destruct": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "disableDebug": { + "ext.name": "OAuth", + "ext.min": "0.99.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "disableRedirects": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "disableSSLChecks": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "enableDebug": { + "ext.name": "OAuth", + "ext.min": "0.99.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "enableRedirects": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "enableSSLChecks": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "fetch": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "generateSignature": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getAccessToken": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getCAPath": { + "ext.name": "OAuth", + "ext.min": "0.99.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getLastResponse": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getLastResponseHeaders": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getLastResponseInfo": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getRequestHeader": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getRequestToken": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setAuthType": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setCAPath": { + "ext.name": "OAuth", + "ext.min": "0.99.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setNonce": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setRSACertificate": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setRequestEngine": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setSSLChecks": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setTimeout": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setTimestamp": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setToken": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setVersion": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "OAuthProvider": { + "__construct": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "addRequiredParameter": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "callTimestampNonceHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "callconsumerHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "calltokenHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "checkOAuthRequest": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "consumerHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "generateToken": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "is2LeggedEndpoint": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "isRequestTokenEndpoint": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "removeRequiredParameter": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "reportProblem": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setParam": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setRequestTokenPath": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timestampNonceHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "tokenHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "PDFlib": { + "__construct": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "activate_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_nameddest": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_path_point": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_portfolio_file": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_portfolio_folder": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_table_cell": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_thumbnail": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "align": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "arc": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "arcn": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_dpart": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_glyph": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_glyph_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_mc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_page_ext": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_pattern_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_template": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_template_ext": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "circle": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "circular_arc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "clip": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_font": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_pdi_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "closepath": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "closepath_fill_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "closepath_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "concat": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "continue_text": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "convert_to_unicode": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_3dview": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_action": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_annotation": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_bookmark": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_field": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_fieldgroup": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_gstate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_pvf": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "curveto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "define_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete_pvf": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete_table": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "draw_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ellipse": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "elliptical_arc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "encoding_set_char": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_dpart": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_glyph": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_mc": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_page_ext": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_template": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_template_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "endpath": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill_graphicsblock": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill_imageblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill_pdfblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill_textblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_table": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_textline": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_apiname": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_buffer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_errmsg": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_errnum": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_pdi_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_pdi_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_string": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_image": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_matchbox": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_pdi_page": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_pvf": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_table": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_textline": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "initgraphics": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lineto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_3ddata": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_asset": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_iccprofile": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "makespotcolor": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mc_point": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "moveto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open_pdi_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pcos_get_number": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pcos_get_stream": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pcos_get_string": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "poca_delete": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "poca_insert": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "poca_new": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "poca_remove": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "process_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rect": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "restore": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "resume_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rotate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "save": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "scale": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_graphics_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_gstate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_info": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_layer_dependency": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_text_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_text_pos": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setcolor": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setdash": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setdashpattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setflat": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setfont": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setlinecap": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setlinejoin": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setlinewidth": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setmatrix": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setmiterlimit": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setpolydash": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "shading": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "shading_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "shfill": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "show": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "show_boxed": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "show_xy": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "skew": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "stringwidth": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "suspend_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "translate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf16_to_utf32": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf16_to_utf8": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf32_to_utf16": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf32_to_utf8": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf8_to_utf16": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf8_to_utf32": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "PDFlibException": { + "get_apiname": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_errmsg": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_errnum": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Collectable": { + "chunk": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "count": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getTerminationInfo": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isGarbage": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRunning": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isTerminated": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isWaiting": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "merge": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "notify": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pop": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "run": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGarbage": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shift": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "synchronized": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Cond": { + "__construct": { + "ext.name": "pthreads", + "ext.min": "0.0.39", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "broadcast": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "create": { + "ext.name": "pthreads", + "ext.min": "0.0.39", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "destroy": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "signal": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Mutex": { + "__construct": { + "ext.name": "pthreads", + "ext.min": "0.0.39", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "create": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "destroy": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "trylock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Pool": { + "__construct": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__destruct": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "collect": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "resize": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shutdown": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "submit": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "submitTo": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Thread": { + "__destruct": { + "ext.name": "pthreads", + "ext.min": "3.0.0", + "ext.max": "3.0.6", + "php.min": "5.3.0", + "php.max": null + }, + "chunk": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "count": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "detach": { + "ext.name": "pthreads", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCount": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCreatorId": { + "ext.name": "pthreads", + "ext.min": "0.0.36", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThread": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThreadId": { + "ext.name": "pthreads", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMax": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPeak": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getTerminationInfo": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getThread": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getThreadId": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "globally": { + "ext.name": "pthreads", + "ext.min": "2.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isBusy": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isJoined": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRunning": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isStarted": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isTerminated": { + "ext.name": "pthreads", + "ext.min": "0.0.44", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isWaiting": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "join": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "kill": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": "3.0.6", + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "merge": { + "ext.name": "pthreads", + "ext.min": "0.0.44", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "notify": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pop": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "run": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shift": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "start": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "synchronized": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Threaded": { + "chunk": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "count": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getTerminationInfo": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRunning": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isTerminated": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isWaiting": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "merge": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "notify": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pop": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "run": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shift": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "synchronized": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Worker": { + "chunk": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "count": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "detach": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCreatorId": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThread": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThreadId": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getStacked": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getTerminationInfo": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getThreadId": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "globally": { + "ext.name": "pthreads", + "ext.min": "2.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isJoined": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRunning": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isShutdown": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isStarted": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isTerminated": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isWaiting": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isWorking": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "join": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "kill": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "merge": { + "ext.name": "pthreads", + "ext.min": "0.0.44", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "notify": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pop": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "run": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shift": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shutdown": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stack": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "start": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "synchronized": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unstack": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "RarArchive": { + "__toString": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getComment": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getEntries": { + "ext.name": "rar", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getEntry": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isBroken": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isSolid": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setAllowBroken": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "RarEntry": { + "__toString": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "extract": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAttr": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCrc": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFileTime": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getHostOs": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMethod": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getName": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPackedSize": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPosition": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getStream": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getUnpackedSize": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getVersion": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isDirectory": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isEncrypted": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "RarException": { + "isUsingExceptions": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setUsingExceptions": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Redis": { + "__construct": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__destruct": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_prefix": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_serialize": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_unserialize": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "append": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "auth": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bgSave": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bgrewriteaof": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bitcount": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bitop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bitpos": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "blPop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "brPop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "brpoplpush": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "clearLastError": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "client": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "config": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "connect": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "dbSize": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "debug": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "decr": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "decrBy": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "del": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "discard": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "dump": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "echo": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "eval": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "evalsha": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "evaluate": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "evaluateSha": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "exec": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "exists": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "expire": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "expireAt": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "flushAll": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "flushDB": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAuth": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getBit": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDBNum": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getHost": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getKeys": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLastError": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMode": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMultiple": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getOption": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPersistentID": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPort": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getRange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getReadTimeout": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getSet": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTimeout": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hDel": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hExists": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hGet": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hGetAll": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hIncrBy": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hIncrByFloat": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hKeys": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hLen": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hMget": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hMset": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hSet": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hSetNx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hVals": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hscan": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "incr": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "incrBy": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "incrByFloat": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isConnected": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "keys": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lGet": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lGetRange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lInsert": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lLen": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lPop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lPush": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lPushx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lRemove": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lSet": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lSize": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lastSave": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lindex": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "listTrim": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lrange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lrem": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ltrim": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mget": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "migrate": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "move": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mset": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msetnx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "multi": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "object": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pconnect": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "persist": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pexpire": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pexpireAt": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pfadd": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pfcount": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pfmerge": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ping": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pipeline": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "popen": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "psetex": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "psubscribe": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pttl": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "publish": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pubsub": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "punsubscribe": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rPop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rPush": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rPushx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "randomKey": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rawCommand": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rename": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "renameKey": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "renameNx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "resetStat": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "restore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rpoplpush": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sAdd": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sContains": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sDiff": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sDiffStore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sGetMembers": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sInter": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sInterStore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sMembers": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sMove": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sPop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sRandMember": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sRemove": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sSize": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sUnion": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sUnionStore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "save": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "scan": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "scard": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "script": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "select": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sendEcho": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setBit": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setOption": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setRange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setTimeout": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setex": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setnx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sismember": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "slaveof": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "slowlog": { + "ext.name": "redis", + "ext.min": "2.2.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sort": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sortAsc": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sortAscAlpha": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sortDesc": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sortDescAlpha": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "srem": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sscan": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "strlen": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "subscribe": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "substr": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "time": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ttl": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "type": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unsubscribe": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unwatch": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "wait": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "watch": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zAdd": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zCard": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zCount": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zDelete": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zDeleteRangeByRank": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zDeleteRangeByScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zIncrBy": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zInter": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRangeByLex": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRangeByScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRank": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRem": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRemRangeByRank": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRemRangeByScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRemove": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRemoveRangeByScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRevRangeByScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRevRank": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zReverseRange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zSize": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zUnion": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zinterstore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zrevrange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zscan": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zunionstore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "RedisArray": { + "__call": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__construct": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_distributor": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_function": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_hosts": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_instance": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_rehash": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_target": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bgsave": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "del": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "discard": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "exec": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "flushall": { + "ext.name": "redis", + "ext.min": "2.2.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "flushdb": { + "ext.name": "redis", + "ext.min": "2.2.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMultiple": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getOption": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "keys": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mget": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mset": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "multi": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ping": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "save": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "select": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setOption": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unwatch": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Reflection": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getModifierNames": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionClass": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getConstant": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getConstants": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getConstructor": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDefaultProperties": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDocComment": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getEndLine": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getExtension": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getExtensionName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getFileName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getInterfaceNames": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getInterfaces": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getMethod": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getMethods": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getModifiers": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getNamespaceName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getParentClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getProperties": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getProperty": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getShortName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getStartLine": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getStaticProperties": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getStaticPropertyValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getTraitAliases": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getTraitNames": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getTraits": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "hasConstant": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "hasMethod": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "hasProperty": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "implementsInterface": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "inNamespace": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isAbstract": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isCloneable": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isFinal": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isInstance": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isInstantiable": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isInterface": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isInternal": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isIterateable": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isSubclassOf": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isTrait": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isUserDefined": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "newInstance": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "newInstanceArgs": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "newInstanceWithoutConstructor": { + "ext.name": "Reflection", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "setStaticPropertyValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionExtension": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClassNames": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClasses": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getConstants": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDependencies": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getFunctions": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getINIEntries": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getVersion": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "info": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPersistent": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isTemporary": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionFunction": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClosure": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "invoke": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "invokeArgs": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDisabled": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionFunctionAbstract": { + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClosureScopeClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClosureThis": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDocComment": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getEndLine": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getExtension": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getExtensionName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getFileName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getNamespaceName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getNumberOfParameters": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getNumberOfRequiredParameters": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getParameters": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getShortName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getStartLine": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getStaticVariables": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "inNamespace": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isClosure": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDeprecated": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isGenerator": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isInternal": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isUserDefined": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isVariadic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "returnsReference": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionMethod": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClosure": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDeclaringClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getModifiers": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getPrototype": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "invoke": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "invokeArgs": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isAbstract": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isConstructor": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDestructor": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isFinal": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPrivate": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isProtected": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPublic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isStatic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setAccessible": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionObject": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionParameter": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "allowsNull": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "canBePassedByValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDeclaringClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDeclaringFunction": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDefaultValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDefaultValueConstantName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getPosition": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isArray": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isCallable": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDefaultValueAvailable": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDefaultValueConstant": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isOptional": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPassedByReference": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isVariadic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionProperty": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDeclaringClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDocComment": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getModifiers": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDefault": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPrivate": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isProtected": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPublic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isStatic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setAccessible": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionZendExtension": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getAuthor": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getCopyright": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getURL": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getVersion": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "Reflector": { + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "Riak\\Bucket": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "counter": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "delete": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "get": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getConflictResolver": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getConnection": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKeyList": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKeyStream": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getName": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPropertyList": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "index": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "indexQuery": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "put": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setConflictResolver": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPropertyList": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\BucketPropertyList": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getAllowMult": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getBackend": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getBigVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCHashKeyFun": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getLastWriteWins": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getLinkFun": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNValue": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getOldVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPostCommitHookList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPreCommitHookList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getRW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getReplicationMode": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getSearchEnabled": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getSmallVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getYoungVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setAllowMult": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBackend": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBigVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setCHashKeyFun": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setLastWriteWins": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setLinkFun": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setNValue": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setOldVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPostCommitHookList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPreCommitHookList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setRW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setReplicationMode": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setSearchEnabled": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setSmallVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setYoungVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Connection": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getBucket": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getHost": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPort": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getServerInfo": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ping": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Crdt\\Counter": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "get": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "increment": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "incrementAndGet": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Crdt\\Input\\GetInput": { + "getBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPR": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getR": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPR": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setR": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Crdt\\Input\\UpdateInput": { + "getDW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Input\\DeleteInput": { + "getDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getRW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setRW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Input\\GetInput": { + "getBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getIfModifiedVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getReturnDeletedVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getReturnHead": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setIfModifiedVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setReturnDeletedVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setReturnHead": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Input\\GetResolverInput": { + "__construct": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getConflictResolver": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Input\\IndexInput": { + "getContinuation": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMaxResults": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setContinuation": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setMaxResults": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Input\\PutInput": { + "getDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getIfNoneMatch": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getIfNotModified": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getReturnBody": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getReturnHead": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setIfNoneMatch": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setIfNotModified": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setReturnBody": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setReturnHead": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Link": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getBucketName": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKey": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getTag": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Functions\\BaseFunction": { + "toArray": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Functions\\ErlangFunction": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Functions\\JavascriptFunction": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "anon": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "named": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Input\\BucketInput": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setIndexFilter": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Input\\Input": { + "getValue": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Input\\KeyDataListInput": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "add": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Input\\KeyListInput": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addArray": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addSingle": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\MapReduce": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addPhase": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "run": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setInput": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "toArray": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "toJson": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Output\\Output": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPhaseNumber": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getValue": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Output\\StreamOutput": { + "receive": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Phase\\MapPhase": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Phase\\Phase": { + "toArray": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Phase\\ReducePhase": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Object": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addIndex": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addLink": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addMetadata": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCharset": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getContent": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getContentEncoding": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getContentType": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getIndexMap": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKey": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getLastModified": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getLastModifiedUSecs": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getLinkList": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMetadataMap": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVClock": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVTag": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isDeleted": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setCharset": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setContent": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setContentEncoding": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setContentType": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setKey": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setVClock": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\ObjectList": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "first": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isEmpty": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "last": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\ConflictResolver": { + "resolve": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\GetOutput": { + "isUnchanged": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\IndexOutput": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getContinuation": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getResultList": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\IndexResult": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKey": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\IndexResultList": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\KeyStreamOutput": { + "process": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\Output": { + "getFirstObject": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKey": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getObject": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getObjectList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "hasObject": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "hasSiblings": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\PoolInfo": { + "getNumActiveConnection": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNumActivePersistentConnection": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNumReconnect": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Property\\CommitHook": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getErlFunction": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getErlModule": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getJsName": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isErlang": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isJavascript": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Property\\CommitHookList": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Property\\ModuleFunction": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getFunction": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getModule": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setFunction": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setModule": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Query\\IndexQuery": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExactValue": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getName": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getRangeValue": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRangeQuery": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setExactValue": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setName": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setRangeValue": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Search\\Input\\ParameterBag": { + "getDefaultField": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getDefaultOperation": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getFieldLimits": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getFilter": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPresort": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getRowLimit": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getSort": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getStartOffset": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDefaultField": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDefaultOperation": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setFieldLimits": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setFilter": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPresort": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setRowLimit": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setSort": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setStartOffset": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Search\\Output\\DocumentOutput": { + "getFields": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Search\\Output\\Output": { + "getDocuments": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMaxScore": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNumFound": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "hasMaxScore": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "hasNumFound": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Search\\Search": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "search": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\ServerInfo": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNode": { + "ext.name": "riak", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getServerVersion": { + "ext.name": "riak", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "SolrClient": { + "__clone": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__sleep": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__wakeup": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addDocument": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addDocuments": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "commit": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteById": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteByIds": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteByQueries": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteByQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getById": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getByIds": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getDebug": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getOptions": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "optimize": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "ping": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "query": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "request": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "rollback": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setResponseWriter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setServlet": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "system": { + "ext.name": "solr", + "ext.min": "1.1.0b", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "threads": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrCollapseFunction": { + "__construct": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__sleep": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__toString": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__wakeup": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getHint": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMax": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMin": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNullPolicy": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getSize": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setHint": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setMax": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setMin": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setNullPolicy": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setSize": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "SolrDisMaxQuery": { + "__construct": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addBigramPhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addBoostQuery": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addPhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addQueryField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addTrigramPhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addUserField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeBigramPhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeBoostQuery": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removePhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeQueryField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeTrigramPhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeUserField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBigramPhraseFields": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBigramPhraseSlop": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBoostFunction": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBoostQuery": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setMinimumMatch": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPhraseFields": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPhraseSlop": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setQueryAlt": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setQueryPhraseSlop": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setTieBreaker": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setTrigramPhraseFields": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setTrigramPhraseSlop": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setUserFields": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "useDisMaxQueryParser": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "useEDisMaxQueryParser": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "SolrDocument": { + "__clone": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__get": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__isset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__set": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__unset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "clear": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "fieldExists": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFieldCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFieldNames": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getInputDocument": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "merge": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "reset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "sort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "toArray": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrDocumentField": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrException": { + "getInternalInfo": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrGenericResponse": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrInputDocument": { + "__clone": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__sleep": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__wakeup": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "clear": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "fieldExists": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFieldBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFieldCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFieldNames": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "merge": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "reset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFieldBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "sort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "toArray": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrModifiableParams": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrObject": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getPropertyNames": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrParams": { + "__clone": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__toString": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "add": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addParam": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "get": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getParam": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getParams": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getPreparedParams": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "set": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setParam": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "toString": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrPingResponse": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrQuery": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addExpandFilterQuery": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addExpandSortField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addFacetDateField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addFacetDateOther": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addFacetField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addFacetQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addFilterQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addGroupField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addGroupFunction": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addGroupQuery": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addGroupSortField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addHighlightField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addMltField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addMltQueryField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addSortField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addStatsFacet": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addStatsField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "collapse": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExpand": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExpandFilterQueries": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExpandQuery": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExpandRows": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExpandSortFields": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getFacet": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateEnd": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateGap": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateHardEnd": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateOther": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateStart": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetLimit": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetMethod": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetMinCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetMissing": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetOffset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetPrefix": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetQueries": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetSort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFilterQueries": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getGroup": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupCachePercent": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupFacet": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupFields": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupFormat": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupFunctions": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupLimit": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupMain": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupNGroups": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupOffset": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupQueries": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupSortFields": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupTruncate": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getHighlight": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightAlternateField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightFormatter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightFragmenter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightFragsize": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightHighlightMultiTerm": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightMaxAlternateFieldLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightMaxAnalyzedChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightMergeContiguous": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightRegexMaxAnalyzedChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightRegexPattern": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightRegexSlop": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightRequireFieldMatch": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightSimplePost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightSimplePre": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightSnippets": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightUsePhraseHighlighter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMlt": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMaxNumQueryTerms": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMaxNumTokens": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMaxWordLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMinDocFrequency": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMinTermFrequency": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMinWordLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltQueryFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRows": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getSortFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getStart": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getStats": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getStatsFacets": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getStatsFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTerms": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsIncludeLowerBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsIncludeUpperBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsLimit": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsLowerBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsMaxCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsMinCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsPrefix": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsReturnRaw": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsSort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsUpperBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTimeAllowed": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeExpandFilterQuery": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeExpandSortField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeFacetDateField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeFacetDateOther": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeFacetField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeFacetQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeFilterQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeHighlightField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeMltField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeMltQueryField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeSortField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeStatsFacet": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeStatsField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setEchoHandler": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setEchoParams": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setExpand": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setExpandQuery": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setExpandRows": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setExplainOther": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacet": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetDateEnd": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetDateGap": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetDateHardEnd": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetDateStart": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetEnumCacheMinDefaultFrequency": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetLimit": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetMethod": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetMinCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetMissing": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetOffset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetPrefix": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetSort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setGroup": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupCachePercent": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupFacet": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupFormat": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupLimit": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupMain": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupNGroups": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupOffset": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupTruncate": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setHighlight": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightAlternateField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightFormatter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightFragmenter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightFragsize": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightHighlightMultiTerm": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightMaxAlternateFieldLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightMaxAnalyzedChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightMergeContiguous": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightRegexMaxAnalyzedChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightRegexPattern": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightRegexSlop": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightRequireFieldMatch": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightSimplePost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightSimplePre": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightSnippets": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightUsePhraseHighlighter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMlt": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMaxNumQueryTerms": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMaxNumTokens": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMaxWordLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMinDocFrequency": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMinTermFrequency": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMinWordLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setOmitHeader": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setRows": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setShowDebugInfo": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setStart": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setStats": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTerms": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsIncludeLowerBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsIncludeUpperBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsLimit": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsLowerBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsMaxCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsMinCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsPrefix": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsReturnRaw": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsSort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsUpperBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTimeAllowed": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrQueryResponse": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrResponse": { + "getArrayResponse": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getDigestedResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHttpStatus": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHttpStatusMessage": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRawRequest": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRawRequestHeaders": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRawResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRawResponseHeaders": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRequestUrl": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setParseMode": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "success": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrUpdateResponse": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrUtils": { + "digestJsonResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "digestXmlResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "escapeQueryChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getSolrVersion": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "queryPhrase": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SphinxClient": { + "__construct": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "__sleep": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "__wakeup": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "addQuery": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "buildExcerpts": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "buildKeywords": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "close": { + "ext.name": "sphinx", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "escapeString": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLastError": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLastWarning": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "open": { + "ext.name": "sphinx", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "query": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "resetFilters": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "resetGroupBy": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "runQueries": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setArrayResult": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setConnectTimeout": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFieldWeights": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFilter": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFilterFloatRange": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFilterRange": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setGeoAnchor": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setGroupBy": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setGroupDistinct": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setIDRange": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setIndexWeights": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setLimits": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setMatchMode": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setMaxQueryTime": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setOverride": { + "ext.name": "sphinx", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "setRankingMode": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setRetries": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setSelect": { + "ext.name": "sphinx", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "setServer": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setSortMode": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "status": { + "ext.name": "sphinx", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "updateAttributes": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "Directory": { + "close": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "read": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rewind": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + } + }, + "php_user_filter": { + "filter": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "onClose": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "onCreate": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "Stomp": { + "__construct": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "__destruct": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "abort": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "ack": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "begin": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "commit": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "error": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "getReadTimeout": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "getSessionId": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "hasFrame": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "nack": { + "ext.name": "stomp", + "ext.min": "1.0.6", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "readFrame": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "send": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "setReadTimeout": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "subscribe": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "unsubscribe": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + } + }, + "StompException": { + "getDetails": { + "ext.name": "stomp", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + } + }, + "StompFrame": { + "__construct": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + } + }, + "VarnishAdmin": { + "__construct": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "auth": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ban": { + "ext.name": "varnish", + "ext.min": "0.6", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "banUrl": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "clearPanic": { + "ext.name": "varnish", + "ext.min": "0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "connect": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "disconnect": { + "ext.name": "varnish", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPanic": { + "ext.name": "varnish", + "ext.min": "0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getParams": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVclList": { + "ext.name": "varnish", + "ext.min": "0.9.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRunning": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setCompat": { + "ext.name": "varnish", + "ext.min": "0.9.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setHost": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setIdent": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setParam": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPort": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setSecret": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setTimeout": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "start": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stop": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "vclUse": { + "ext.name": "varnish", + "ext.min": "0.9.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "VarnishLog": { + "__construct": { + "ext.name": "varnish", + "ext.min": "0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "VarnishStat": { + "__construct": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "XMLDiff\\Base": { + "__construct": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "diff": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "merge": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Yac": { + "add": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "dump": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "flush": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "ZipArchive": { + "addEmptyDir": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "addFile": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "addFromString": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "addGlob": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "addPattern": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "deleteIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "deleteName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "extractTo": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getArchiveComment": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCommentIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCommentName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getExternalAttributesIndex": { + "ext.name": "zip", + "ext.min": "1.12.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getExternalAttributesName": { + "ext.name": "zip", + "ext.min": "1.12.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFromIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFromName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getNameIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getStatusString": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getStream": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locateName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "renameIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "renameName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setArchiveComment": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setCommentIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setCommentName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setCompressionIndex": { + "ext.name": "zip", + "ext.min": "1.13.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setCompressionName": { + "ext.name": "zip", + "ext.min": "1.13.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setExternalAttributesIndex": { + "ext.name": "zip", + "ext.min": "1.12.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setExternalAttributesName": { + "ext.name": "zip", + "ext.min": "1.12.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPassword": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "statIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "statName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unchangeAll": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unchangeArchive": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unchangeIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unchangeName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + } + }, + "static_methods": { + "DateInterval": { + "__set_state": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "createFromDateString": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "DatePeriod": { + "__set_state": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "DateTime": { + "__set_state": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "createFromFormat": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "createFromImmutable": { + "ext.name": "date", + "ext.min": "5.6.8RC1", + "ext.max": null, + "php.min": "5.6.8RC1", + "php.max": null + }, + "getLastErrors": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "DateTimeImmutable": { + "__set_state": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createFromFormat": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createFromMutable": { + "ext.name": "date", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "getLastErrors": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "DateTimeZone": { + "__set_state": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "listAbbreviations": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "listIdentifiers": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "http\\Env\\Request": { + "getCookie": { + "ext.name": "http", + "ext.min": "2.2.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Env\\Response": { + "setCookie": { + "ext.name": "http", + "ext.min": "2.2.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Header\\Parser": { + "getState": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "parse": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stream": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Message\\Parser": { + "configure": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getAvailableConfiguration": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getAvailableOptions": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Collator": { + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "IntlBreakIterator": { + "createCharacterInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createCodePointInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createLineInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createSentenceInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTitleInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createWordInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlCalendar": { + "createInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fromDateTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getAvailableLocales": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getKeywordValuesForLocale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getNow": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlDateFormatter": { + "create": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "formatObject": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "IntlTimeZone": { + "countEquivalentIDs": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createDefault": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createEnumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTimeZoneIDEnumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fromDateTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getCanonicalID": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getEquivalentID": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getGMT": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRegion": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTZDataVersion": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getUnknown": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "Locale": { + "acceptFromHttp": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "canonicalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "composeLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "filterMatches": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAllVariants": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDefault": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayLanguage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayName": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayRegion": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayScript": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayVariant": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getKeywords": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrimaryLanguage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getRegion": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getScript": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lookup": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parseLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setDefault": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "MessageFormatter": { + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "formatMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parseMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Normalizer": { + "isNormalized": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.3.0alpha1", + "php.max": null + }, + "normalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.3.0alpha1", + "php.max": null + } + }, + "NumberFormatter": { + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "ResourceBundle": { + "create": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getLocales": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "Transliterator": { + "create": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "createFromRules": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "listIDs": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "UConverter": { + "getAliases": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getAvailable": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getStandards": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "reasonText": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "transcode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "Mongo": { + "getPoolSize": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "poolDebug": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setPoolSize": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoClient": { + "getConnections": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "killCursor": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoCollection": { + "toIndexString": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoCommandCursor": { + "createFromDocument": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoDBRef": { + "create": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "get": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoDate": { + "__set_state": { + "ext.name": "mongo", + "ext.min": "1.6.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "MongoId": { + "__set_state": { + "ext.name": "mongo", + "ext.min": "1.0.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getHostname": { + "ext.name": "mongo", + "ext.min": "1.0.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "isValid": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoLog": { + "getCallback": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getLevel": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getModule": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setCallback": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setLevel": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setModule": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoPool": { + "getSize": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "info": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setSize": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "OAuthProvider": { + "generateToken": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "reportProblem": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "Collectable": { + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Cond": { + "broadcast": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "create": { + "ext.name": "pthreads", + "ext.min": "0.0.39", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "destroy": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "signal": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Mutex": { + "create": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "destroy": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "trylock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Thread": { + "__destruct": { + "ext.name": "pthreads", + "ext.min": "3.0.0", + "ext.max": "3.0.6", + "php.min": "5.3.0", + "php.max": null + }, + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThread": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThreadId": { + "ext.name": "pthreads", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "globally": { + "ext.name": "pthreads", + "ext.min": "2.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Threaded": { + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Worker": { + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThread": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThreadId": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "globally": { + "ext.name": "pthreads", + "ext.min": "2.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "RarArchive": { + "open": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "RarException": { + "isUsingExceptions": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setUsingExceptions": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Reflection": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getModifierNames": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionClass": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionExtension": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionFunction": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionMethod": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionParameter": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionProperty": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionZendExtension": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "Reflector": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Functions\\JavascriptFunction": { + "anon": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "named": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\PoolInfo": { + "getNumActiveConnection": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNumActivePersistentConnection": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNumReconnect": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "SolrUtils": { + "digestJsonResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "digestXmlResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "escapeQueryChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getSolrVersion": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "queryPhrase": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + } + }, + "functions_windows": { + "apache_child_terminate": false, + "chroot": false, + "getrusage": false, + "imagecreatefromxpm": false, + "lchgrp": false, + "lchown": false, + "nl_langinfo": false, + "strptime": false, + "sys_getloadavg": false, + "checkdnsrr": "5.3.0", + "dns_get_record": "5.3.0", + "fnmatch": "5.3.0", + "getmxrr": "5.3.0", + "getopt": "5.3.0", + "imagecolorclosesthwb": "5.3.0", + "inet_ntop": "5.3.0", + "inet_pton": "5.3.0", + "link": "5.3.0", + "linkinfo": "5.3.0", + "readlink": "5.3.0", + "socket_create_pair": "5.3.0", + "stream_socket_pair": "5.3.0", + "symlink": "5.3.0", + "time_nanosleep": "5.3.0", + "time_sleep_until": "5.3.0" + } +} diff --git a/resources/ssl/README b/resources/ssl/README new file mode 100644 index 00000000..4d5057f5 --- /dev/null +++ b/resources/ssl/README @@ -0,0 +1,45 @@ +This document describes how to set Certificate Authority information. +Usually, you need to do this only if you're using a self-signed certificate. + + +OSX after Yosemite +================== + +If you're using a version of Mac OSX after Yosemite, you can not configure +certificates from the command line. All libphutil and arcanist options +related to CA configuration are ignored. + +Instead, you need to add them to the system keychain. The easiest way to do this +is to visit the site in Safari and choose to permanently accept the certificate. + +You can also use `security add-trusted-cert` from the command line. + + +All Other Systems +================= + +If "curl.cainfo" is not set (or you are using PHP older than 5.3.7, where the +option was introduced), libphutil uses the "default.pem" certificate authority +bundle when making HTTPS requests with cURL. This bundle is extracted from +Mozilla's certificates by cURL: + + http://curl.haxx.se/docs/caextract.html + +If you want to use a different CA bundle (for example, because you use +self-signed certificates), set "curl.cainfo" if you're using PHP 5.3.7 or newer, +or create a file (or symlink) in this directory named "custom.pem". + +If "custom.pem" is present, that file will be used instead of "default.pem". + +If you receive errors using your "custom.pem" file, you can test it directly +with `curl` by running a command like this: + + curl -v --cacert path/to/your/custom.pem https://phabricator.example.com/ + +Replace "path/to/your/custom.pem" with the path to your "custom.pem" file, +and replace "https://phabricator.example.com" with the real URL of your +Phabricator install. + +The initial lines of output from `curl` should give you information about the +SSL handshake and certificate verification, which may be helpful in resolving +the issue. diff --git a/resources/ssl/default.pem b/resources/ssl/default.pem new file mode 100644 index 00000000..76adf834 --- /dev/null +++ b/resources/ssl/default.pem @@ -0,0 +1,3893 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Wed Jan 20 04:12:04 2016 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.25. +## SHA1: 0ab47e2f41518f8d223eab517cb799e5b071231e +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +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 +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +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 +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2007 +================================================= +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X +DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl +a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N +YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv +KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya +KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT +rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC +AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s +Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO +Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb +BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK +poRq0Tl9 +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +PSCProcert +========== +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk +ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ +MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz +dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl +cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw +IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw +MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w +DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD +ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp +Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC +wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA +3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh +RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO +EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 +0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU +td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw +Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp +r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ +AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz +Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId +xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp +ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH +EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h +Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k +ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG +9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG +MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG +LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 +ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy +YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o +dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq +T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN +g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q +uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 +n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn +FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo +5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq +3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 +poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y +eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +China Internet Network Information Center EV Certificates Root +============================================================== +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D +aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg +Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG +A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM +PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl +cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y +jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV +98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H +klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 +KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC +7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD +glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 +0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM +7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 +5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= +-----END CERTIFICATE----- + +Swisscom Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +5OfNeOI5wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- + +Swisscom Root EV CA 2 +===================== +-----BEGIN CERTIFICATE----- +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 +l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- + +CA Disig Root R1 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy +3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 +u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 +m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk +CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa +YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 +vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL +LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX +ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is +XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ +04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B +LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM +CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb +VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 +YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS +ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix +lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N +UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ +a7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +WoSign +====== +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ +BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO +CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX +2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 +KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR ++ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez +EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk +lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 +8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY +yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R +8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq +T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj +y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC +2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes +5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ +EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh +mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx +kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi +kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +WoSign China +============ +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv +geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD +VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k +8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 +uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 +dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 +Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy +b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc +76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m ++Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 +yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX +GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA +A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY +r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 +j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A +kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 +qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y +jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB +ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv +T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO +kI26oQ== +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +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 +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz +0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j +Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn +RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O ++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq +/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE +Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM +lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 +yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ +eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW +FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ +7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ +Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM +8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi +FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi +yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c +J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw +sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl +OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV +MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF +JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G3 +================================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y +olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t +x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy +EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K +Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur +mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 +1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp +07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo +FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE +41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu +yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq +KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 +v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA +8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b +8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r +mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq +1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI +JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV +tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= +-----END CERTIFICATE----- + +Staat der Nederlanden EV Root CA +================================ +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M +MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl +cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk +SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW +O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r +0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 +Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV +XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr +08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV +0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd +74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx +fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa +ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu +c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq +5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN +b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN +f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi +5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 +WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK +DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy +eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 +========================================================= +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg +RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw +ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w +SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE +n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp +ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537 +jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m +ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP +9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV +4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH +HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo +BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl +lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 +B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 +========================================================= +-----BEGIN CERTIFICATE----- +MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5 +MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL +BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf +aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm +aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a +2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED +wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb +HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV ++DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT +9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R +fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy +o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW +hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1 +O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw== +-----END CERTIFICATE----- + +Certinomis - Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg +LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx +EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD +ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos +P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo +d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap +z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 +8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x +RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE +6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t +FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV +PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH +i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj +YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I +6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV +WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw +Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX +lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ +y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 +Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng +DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi +I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM +cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr +hkIGuUE= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +Certification Authority of WoSign G2 +==================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx +CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai +XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du +W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9 +5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK +v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI +hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY +P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3 +TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu ++sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+ +7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= +-----END CERTIFICATE----- + +CA WoSign ECC Root +================== +-----BEGIN CERTIFICATE----- +MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD +TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v +dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK +ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU +t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw +QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R +MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0 +Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu +a/GRspBl9JrmkO5K +-----END CERTIFICATE----- diff --git a/scripts/__init_script__.php b/scripts/__init_script__.php index 377b1b4c..f6cdcc31 100644 --- a/scripts/__init_script__.php +++ b/scripts/__init_script__.php @@ -1,58 +1,3 @@ setLocale(PhutilLocale::loadLocale('en_US')) - ->setTranslations(PhutilTranslation::getTranslationMapForLocale('en_US')); +require_once dirname(dirname(__FILE__)).'/scripts/init/init-script.php'; diff --git a/scripts/arcanist.php b/scripts/arcanist.php index b950dbbf..df2a573d 100755 --- a/scripts/arcanist.php +++ b/scripts/arcanist.php @@ -81,7 +81,6 @@ try { csprintf('%Ls', $original_argv)); $libraries = array( - 'phutil', 'arcanist', ); @@ -621,7 +620,7 @@ function arcanist_load_libraries( $error = null; try { - phutil_load_library($location); + require_once $location.'/__phutil_library_init__.php'; } catch (PhutilBootloaderException $ex) { $error = pht( "Failed to load phutil library at location '%s'. This library ". diff --git a/scripts/init/init-script.php b/scripts/init/init-script.php new file mode 100644 index 00000000..3609a178 --- /dev/null +++ b/scripts/init/init-script.php @@ -0,0 +1,100 @@ + 0) { + ob_end_clean(); + } + + error_reporting(E_ALL | E_STRICT); + + $config_map = array( + // Always display script errors. Without this, they may not appear, which is + // unhelpful when users encounter a problem. On the web this is a security + // concern because you don't want to expose errors to clients, but in a + // script context we always want to show errors. + 'display_errors' => true, + + // Send script error messages to the server's `error_log` setting. + 'log_errors' => true, + + // Set the error log to the default, so errors go to stderr. Without this + // errors may end up in some log, and users may not know where the log is + // or check it. + 'error_log' => null, + + // XDebug raises a fatal error if the call stack gets too deep, but the + // default setting is 100, which we may exceed legitimately with module + // includes (and in other cases, like recursive filesystem operations + // applied to 100+ levels of directory nesting). Stop it from triggering: + // we explicitly limit recursive algorithms which should be limited. + // + // After Feb 2014, XDebug interprets a value of 0 to mean "do not allow any + // function calls". Previously, 0 effectively disabled this check. For + // context, see T5027. + 'xdebug.max_nesting_level' => PHP_INT_MAX, + + // Don't limit memory, doing so just generally just prevents us from + // processing large inputs without many tangible benefits. + 'memory_limit' => -1, + + // See T13296. On macOS under PHP 7.3.x, PCRE currently segfaults after + // "fork()" if "pcre.jit" is enabled. + 'pcre.jit' => 0, + ); + + foreach ($config_map as $config_key => $config_value) { + ini_set($config_key, $config_value); + } + + if (!ini_get('date.timezone')) { + // If the timezone isn't set, PHP issues a warning whenever you try to parse + // a date (like those from Git or Mercurial logs), even if the date contains + // timezone information (like "PST" or "-0700") which makes the + // environmental timezone setting is completely irrelevant. We never rely on + // the system timezone setting in any capacity, so prevent PHP from flipping + // out by setting it to a safe default (UTC) if it isn't set to some other + // value. + date_default_timezone_set('UTC'); + } + + // Adjust `include_path`. + ini_set('include_path', implode(PATH_SEPARATOR, array( + dirname(dirname(__FILE__)).'/externals/includes', + ini_get('include_path'), + ))); + + // Disable the insanely dangerous XML entity loader by default. + if (function_exists('libxml_disable_entity_loader')) { + libxml_disable_entity_loader(true); + } + + $root = dirname(dirname(dirname(__FILE__))); + require_once $root.'/src/init/init-library.php'; + + PhutilErrorHandler::initialize(); + $router = PhutilSignalRouter::initialize(); + + $handler = new PhutilBacktraceSignalHandler(); + $router->installHandler('phutil.backtrace', $handler); + + $handler = new PhutilConsoleMetricsSignalHandler(); + $router->installHandler('phutil.winch', $handler); +} + +__phutil_init_script__(); diff --git a/src/__phutil_library_init__.php b/src/__phutil_library_init__.php index c5168d8d..44d51b82 100644 --- a/src/__phutil_library_init__.php +++ b/src/__phutil_library_init__.php @@ -1,3 +1,3 @@ 2, 'class' => array( + 'AASTNode' => 'parser/aast/api/AASTNode.php', + 'AASTNodeList' => 'parser/aast/api/AASTNodeList.php', + 'AASTToken' => 'parser/aast/api/AASTToken.php', + 'AASTTree' => 'parser/aast/api/AASTTree.php', + 'AbstractDirectedGraph' => 'utils/AbstractDirectedGraph.php', + 'AbstractDirectedGraphTestCase' => 'utils/__tests__/AbstractDirectedGraphTestCase.php', 'ArcanistAbstractMethodBodyXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistAbstractMethodBodyXHPASTLinterRule.php', 'ArcanistAbstractMethodBodyXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistAbstractMethodBodyXHPASTLinterRuleTestCase.php', 'ArcanistAbstractPrivateMethodXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistAbstractPrivateMethodXHPASTLinterRule.php', @@ -418,22 +424,466 @@ phutil_register_library_map(array( 'ArcanistXMLLinter' => 'lint/linter/ArcanistXMLLinter.php', 'ArcanistXMLLinterTestCase' => 'lint/linter/__tests__/ArcanistXMLLinterTestCase.php', 'ArcanistXUnitTestResultParser' => 'unit/parser/ArcanistXUnitTestResultParser.php', + 'BaseHTTPFuture' => 'future/http/BaseHTTPFuture.php', 'CSharpToolsTestEngine' => 'unit/engine/CSharpToolsTestEngine.php', + 'CaseInsensitiveArray' => 'utils/CaseInsensitiveArray.php', + 'CaseInsensitiveArrayTestCase' => 'utils/__tests__/CaseInsensitiveArrayTestCase.php', + 'CommandException' => 'future/exec/CommandException.php', + 'ConduitClient' => 'conduit/ConduitClient.php', + 'ConduitClientException' => 'conduit/ConduitClientException.php', + 'ConduitClientTestCase' => 'conduit/__tests__/ConduitClientTestCase.php', + 'ConduitFuture' => 'conduit/ConduitFuture.php', + 'ExecFuture' => 'future/exec/ExecFuture.php', + 'ExecFutureTestCase' => 'future/exec/__tests__/ExecFutureTestCase.php', + 'ExecPassthruTestCase' => 'future/exec/__tests__/ExecPassthruTestCase.php', + 'FileFinder' => 'filesystem/FileFinder.php', + 'FileFinderTestCase' => 'filesystem/__tests__/FileFinderTestCase.php', + 'FileList' => 'filesystem/FileList.php', + 'Filesystem' => 'filesystem/Filesystem.php', + 'FilesystemException' => 'filesystem/FilesystemException.php', + 'FilesystemTestCase' => 'filesystem/__tests__/FilesystemTestCase.php', + 'Future' => 'future/Future.php', + 'FutureIterator' => 'future/FutureIterator.php', + 'FutureIteratorTestCase' => 'future/__tests__/FutureIteratorTestCase.php', + 'FutureProxy' => 'future/FutureProxy.php', + 'HTTPFuture' => 'future/http/HTTPFuture.php', + 'HTTPFutureCURLResponseStatus' => 'future/http/status/HTTPFutureCURLResponseStatus.php', + 'HTTPFutureCertificateResponseStatus' => 'future/http/status/HTTPFutureCertificateResponseStatus.php', + 'HTTPFutureHTTPResponseStatus' => 'future/http/status/HTTPFutureHTTPResponseStatus.php', + 'HTTPFutureParseResponseStatus' => 'future/http/status/HTTPFutureParseResponseStatus.php', + 'HTTPFutureResponseStatus' => 'future/http/status/HTTPFutureResponseStatus.php', + 'HTTPFutureTransportResponseStatus' => 'future/http/status/HTTPFutureTransportResponseStatus.php', + 'HTTPSFuture' => 'future/http/HTTPSFuture.php', + 'ImmediateFuture' => 'future/ImmediateFuture.php', + 'LibphutilUSEnglishTranslation' => 'internationalization/translation/LibphutilUSEnglishTranslation.php', + 'LinesOfALarge' => 'filesystem/linesofalarge/LinesOfALarge.php', + 'LinesOfALargeExecFuture' => 'filesystem/linesofalarge/LinesOfALargeExecFuture.php', + 'LinesOfALargeExecFutureTestCase' => 'filesystem/linesofalarge/__tests__/LinesOfALargeExecFutureTestCase.php', + 'LinesOfALargeFile' => 'filesystem/linesofalarge/LinesOfALargeFile.php', + 'LinesOfALargeFileTestCase' => 'filesystem/linesofalarge/__tests__/LinesOfALargeFileTestCase.php', + 'MFilterTestHelper' => 'utils/__tests__/MFilterTestHelper.php', 'NoseTestEngine' => 'unit/engine/NoseTestEngine.php', + 'PHPASTParserTestCase' => 'parser/xhpast/__tests__/PHPASTParserTestCase.php', + 'PhageAction' => 'phage/action/PhageAction.php', + 'PhageAgentAction' => 'phage/action/PhageAgentAction.php', + 'PhageAgentBootloader' => 'phage/bootloader/PhageAgentBootloader.php', + 'PhageAgentTestCase' => 'phage/__tests__/PhageAgentTestCase.php', + 'PhageExecuteAction' => 'phage/action/PhageExecuteAction.php', + 'PhageLocalAction' => 'phage/action/PhageLocalAction.php', + 'PhagePHPAgent' => 'phage/agent/PhagePHPAgent.php', + 'PhagePHPAgentBootloader' => 'phage/bootloader/PhagePHPAgentBootloader.php', + 'PhagePlanAction' => 'phage/action/PhagePlanAction.php', + 'Phobject' => 'object/Phobject.php', + 'PhobjectTestCase' => 'object/__tests__/PhobjectTestCase.php', 'PhpunitTestEngine' => 'unit/engine/PhpunitTestEngine.php', 'PhpunitTestEngineTestCase' => 'unit/engine/__tests__/PhpunitTestEngineTestCase.php', + 'PhutilAWSCloudFormationFuture' => 'future/aws/PhutilAWSCloudFormationFuture.php', + 'PhutilAWSCloudWatchFuture' => 'future/aws/PhutilAWSCloudWatchFuture.php', + 'PhutilAWSEC2Future' => 'future/aws/PhutilAWSEC2Future.php', + 'PhutilAWSException' => 'future/aws/PhutilAWSException.php', + 'PhutilAWSFuture' => 'future/aws/PhutilAWSFuture.php', + 'PhutilAWSManagementWorkflow' => 'future/aws/management/PhutilAWSManagementWorkflow.php', + 'PhutilAWSS3DeleteManagementWorkflow' => 'future/aws/management/PhutilAWSS3DeleteManagementWorkflow.php', + 'PhutilAWSS3Future' => 'future/aws/PhutilAWSS3Future.php', + 'PhutilAWSS3GetManagementWorkflow' => 'future/aws/management/PhutilAWSS3GetManagementWorkflow.php', + 'PhutilAWSS3ManagementWorkflow' => 'future/aws/management/PhutilAWSS3ManagementWorkflow.php', + 'PhutilAWSS3PutManagementWorkflow' => 'future/aws/management/PhutilAWSS3PutManagementWorkflow.php', + 'PhutilAWSv4Signature' => 'future/aws/PhutilAWSv4Signature.php', + 'PhutilAWSv4SignatureTestCase' => 'future/aws/__tests__/PhutilAWSv4SignatureTestCase.php', + 'PhutilAggregateException' => 'error/PhutilAggregateException.php', + 'PhutilAllCapsEnglishLocale' => 'internationalization/locales/PhutilAllCapsEnglishLocale.php', + 'PhutilArgumentParser' => 'parser/argument/PhutilArgumentParser.php', + 'PhutilArgumentParserException' => 'parser/argument/exception/PhutilArgumentParserException.php', + 'PhutilArgumentParserTestCase' => 'parser/argument/__tests__/PhutilArgumentParserTestCase.php', + 'PhutilArgumentSpecification' => 'parser/argument/PhutilArgumentSpecification.php', + 'PhutilArgumentSpecificationException' => 'parser/argument/exception/PhutilArgumentSpecificationException.php', + 'PhutilArgumentSpecificationTestCase' => 'parser/argument/__tests__/PhutilArgumentSpecificationTestCase.php', + 'PhutilArgumentSpellingCorrector' => 'parser/argument/PhutilArgumentSpellingCorrector.php', + 'PhutilArgumentSpellingCorrectorTestCase' => 'parser/argument/__tests__/PhutilArgumentSpellingCorrectorTestCase.php', + 'PhutilArgumentUsageException' => 'parser/argument/exception/PhutilArgumentUsageException.php', + 'PhutilArgumentWorkflow' => 'parser/argument/workflow/PhutilArgumentWorkflow.php', + 'PhutilArray' => 'utils/PhutilArray.php', + 'PhutilArrayTestCase' => 'utils/__tests__/PhutilArrayTestCase.php', + 'PhutilArrayWithDefaultValue' => 'utils/PhutilArrayWithDefaultValue.php', + 'PhutilAsanaFuture' => 'future/asana/PhutilAsanaFuture.php', + 'PhutilBacktraceSignalHandler' => 'future/exec/PhutilBacktraceSignalHandler.php', + 'PhutilBallOfPHP' => 'phage/util/PhutilBallOfPHP.php', + 'PhutilBinaryAnalyzer' => 'filesystem/binary/PhutilBinaryAnalyzer.php', + 'PhutilBinaryAnalyzerTestCase' => 'filesystem/binary/__tests__/PhutilBinaryAnalyzerTestCase.php', + 'PhutilBootloader' => 'init/lib/PhutilBootloader.php', + 'PhutilBootloaderException' => 'init/lib/PhutilBootloaderException.php', + 'PhutilBritishEnglishLocale' => 'internationalization/locales/PhutilBritishEnglishLocale.php', + 'PhutilBufferedIterator' => 'utils/PhutilBufferedIterator.php', + 'PhutilBufferedIteratorTestCase' => 'utils/__tests__/PhutilBufferedIteratorTestCase.php', + 'PhutilBugtraqParser' => 'parser/PhutilBugtraqParser.php', + 'PhutilBugtraqParserTestCase' => 'parser/__tests__/PhutilBugtraqParserTestCase.php', + 'PhutilCIDRBlock' => 'ip/PhutilCIDRBlock.php', + 'PhutilCIDRList' => 'ip/PhutilCIDRList.php', + 'PhutilCallbackFilterIterator' => 'utils/PhutilCallbackFilterIterator.php', + 'PhutilCallbackSignalHandler' => 'future/exec/PhutilCallbackSignalHandler.php', + 'PhutilChannel' => 'channel/PhutilChannel.php', + 'PhutilChannelChannel' => 'channel/PhutilChannelChannel.php', + 'PhutilChannelTestCase' => 'channel/__tests__/PhutilChannelTestCase.php', + 'PhutilChunkedIterator' => 'utils/PhutilChunkedIterator.php', + 'PhutilChunkedIteratorTestCase' => 'utils/__tests__/PhutilChunkedIteratorTestCase.php', + 'PhutilClassMapQuery' => 'symbols/PhutilClassMapQuery.php', + 'PhutilCloudWatchMetric' => 'future/aws/PhutilCloudWatchMetric.php', + 'PhutilCommandString' => 'xsprintf/PhutilCommandString.php', + 'PhutilConsole' => 'console/PhutilConsole.php', + 'PhutilConsoleBlock' => 'console/view/PhutilConsoleBlock.php', + 'PhutilConsoleError' => 'console/view/PhutilConsoleError.php', + 'PhutilConsoleFormatter' => 'console/PhutilConsoleFormatter.php', + 'PhutilConsoleInfo' => 'console/view/PhutilConsoleInfo.php', + 'PhutilConsoleList' => 'console/view/PhutilConsoleList.php', + 'PhutilConsoleLogLine' => 'console/view/PhutilConsoleLogLine.php', + 'PhutilConsoleMessage' => 'console/PhutilConsoleMessage.php', + 'PhutilConsoleMetrics' => 'console/PhutilConsoleMetrics.php', + 'PhutilConsoleMetricsSignalHandler' => 'future/exec/PhutilConsoleMetricsSignalHandler.php', + 'PhutilConsoleProgressBar' => 'console/PhutilConsoleProgressBar.php', + 'PhutilConsoleProgressSink' => 'progress/PhutilConsoleProgressSink.php', + 'PhutilConsoleServer' => 'console/PhutilConsoleServer.php', + 'PhutilConsoleServerChannel' => 'console/PhutilConsoleServerChannel.php', + 'PhutilConsoleSkip' => 'console/view/PhutilConsoleSkip.php', + 'PhutilConsoleStdinNotInteractiveException' => 'console/PhutilConsoleStdinNotInteractiveException.php', + 'PhutilConsoleTable' => 'console/view/PhutilConsoleTable.php', + 'PhutilConsoleView' => 'console/view/PhutilConsoleView.php', + 'PhutilConsoleWarning' => 'console/view/PhutilConsoleWarning.php', + 'PhutilConsoleWrapTestCase' => 'console/__tests__/PhutilConsoleWrapTestCase.php', + 'PhutilCowsay' => 'utils/PhutilCowsay.php', + 'PhutilCowsayTestCase' => 'utils/__tests__/PhutilCowsayTestCase.php', + 'PhutilCsprintfTestCase' => 'xsprintf/__tests__/PhutilCsprintfTestCase.php', + 'PhutilCzechLocale' => 'internationalization/locales/PhutilCzechLocale.php', + 'PhutilDOMNode' => 'parser/html/PhutilDOMNode.php', + 'PhutilDeferredLog' => 'filesystem/PhutilDeferredLog.php', + 'PhutilDeferredLogTestCase' => 'filesystem/__tests__/PhutilDeferredLogTestCase.php', + 'PhutilDiffBinaryAnalyzer' => 'filesystem/binary/PhutilDiffBinaryAnalyzer.php', + 'PhutilDirectedScalarGraph' => 'utils/PhutilDirectedScalarGraph.php', + 'PhutilDirectoryFixture' => 'filesystem/PhutilDirectoryFixture.php', + 'PhutilDocblockParser' => 'parser/PhutilDocblockParser.php', + 'PhutilDocblockParserTestCase' => 'parser/__tests__/PhutilDocblockParserTestCase.php', + 'PhutilEditDistanceMatrix' => 'utils/PhutilEditDistanceMatrix.php', + 'PhutilEditDistanceMatrixTestCase' => 'utils/__tests__/PhutilEditDistanceMatrixTestCase.php', + 'PhutilEditorConfig' => 'parser/PhutilEditorConfig.php', + 'PhutilEditorConfigTestCase' => 'parser/__tests__/PhutilEditorConfigTestCase.php', + 'PhutilEmailAddress' => 'parser/PhutilEmailAddress.php', + 'PhutilEmailAddressTestCase' => 'parser/__tests__/PhutilEmailAddressTestCase.php', + 'PhutilEmojiLocale' => 'internationalization/locales/PhutilEmojiLocale.php', + 'PhutilEnglishCanadaLocale' => 'internationalization/locales/PhutilEnglishCanadaLocale.php', + 'PhutilErrorHandler' => 'error/PhutilErrorHandler.php', + 'PhutilErrorHandlerTestCase' => 'error/__tests__/PhutilErrorHandlerTestCase.php', + 'PhutilErrorTrap' => 'error/PhutilErrorTrap.php', + 'PhutilEvent' => 'events/PhutilEvent.php', + 'PhutilEventConstants' => 'events/constant/PhutilEventConstants.php', + 'PhutilEventEngine' => 'events/PhutilEventEngine.php', + 'PhutilEventListener' => 'events/PhutilEventListener.php', + 'PhutilEventType' => 'events/constant/PhutilEventType.php', + 'PhutilExampleBufferedIterator' => 'utils/PhutilExampleBufferedIterator.php', + 'PhutilExecChannel' => 'channel/PhutilExecChannel.php', + 'PhutilExecPassthru' => 'future/exec/PhutilExecPassthru.php', + 'PhutilExecutableFuture' => 'future/exec/PhutilExecutableFuture.php', + 'PhutilExecutionEnvironment' => 'utils/PhutilExecutionEnvironment.php', + 'PhutilFileLock' => 'filesystem/PhutilFileLock.php', + 'PhutilFileLockTestCase' => 'filesystem/__tests__/PhutilFileLockTestCase.php', + 'PhutilFileTree' => 'filesystem/PhutilFileTree.php', + 'PhutilFrenchLocale' => 'internationalization/locales/PhutilFrenchLocale.php', + 'PhutilGermanLocale' => 'internationalization/locales/PhutilGermanLocale.php', + 'PhutilGitBinaryAnalyzer' => 'filesystem/binary/PhutilGitBinaryAnalyzer.php', + 'PhutilGitHubFuture' => 'future/github/PhutilGitHubFuture.php', + 'PhutilGitHubResponse' => 'future/github/PhutilGitHubResponse.php', + 'PhutilGitURI' => 'parser/PhutilGitURI.php', + 'PhutilGitURITestCase' => 'parser/__tests__/PhutilGitURITestCase.php', + 'PhutilHTMLParser' => 'parser/html/PhutilHTMLParser.php', + 'PhutilHTMLParserTestCase' => 'parser/html/__tests__/PhutilHTMLParserTestCase.php', + 'PhutilHTTPEngineExtension' => 'future/http/PhutilHTTPEngineExtension.php', + 'PhutilHTTPResponse' => 'parser/http/PhutilHTTPResponse.php', + 'PhutilHTTPResponseParser' => 'parser/http/PhutilHTTPResponseParser.php', + 'PhutilHTTPResponseParserTestCase' => 'parser/http/__tests__/PhutilHTTPResponseParserTestCase.php', + 'PhutilHashingIterator' => 'utils/PhutilHashingIterator.php', + 'PhutilHashingIteratorTestCase' => 'utils/__tests__/PhutilHashingIteratorTestCase.php', + 'PhutilHelpArgumentWorkflow' => 'parser/argument/workflow/PhutilHelpArgumentWorkflow.php', + 'PhutilHgsprintfTestCase' => 'xsprintf/__tests__/PhutilHgsprintfTestCase.php', + 'PhutilINIParserException' => 'parser/exception/PhutilINIParserException.php', + 'PhutilIPAddress' => 'ip/PhutilIPAddress.php', + 'PhutilIPAddressTestCase' => 'ip/__tests__/PhutilIPAddressTestCase.php', + 'PhutilIPv4Address' => 'ip/PhutilIPv4Address.php', + 'PhutilIPv6Address' => 'ip/PhutilIPv6Address.php', + 'PhutilInteractiveEditor' => 'console/PhutilInteractiveEditor.php', + 'PhutilInvalidRuleParserGeneratorException' => 'parser/generator/exception/PhutilInvalidRuleParserGeneratorException.php', + 'PhutilInvalidStateException' => 'exception/PhutilInvalidStateException.php', + 'PhutilInvalidStateExceptionTestCase' => 'exception/__tests__/PhutilInvalidStateExceptionTestCase.php', + 'PhutilIrreducibleRuleParserGeneratorException' => 'parser/generator/exception/PhutilIrreducibleRuleParserGeneratorException.php', + 'PhutilJSON' => 'parser/PhutilJSON.php', + 'PhutilJSONFragmentLexer' => 'lexer/PhutilJSONFragmentLexer.php', + 'PhutilJSONParser' => 'parser/PhutilJSONParser.php', + 'PhutilJSONParserException' => 'parser/exception/PhutilJSONParserException.php', + 'PhutilJSONParserTestCase' => 'parser/__tests__/PhutilJSONParserTestCase.php', + 'PhutilJSONProtocolChannel' => 'channel/PhutilJSONProtocolChannel.php', + 'PhutilJSONProtocolChannelTestCase' => 'channel/__tests__/PhutilJSONProtocolChannelTestCase.php', + 'PhutilJSONTestCase' => 'parser/__tests__/PhutilJSONTestCase.php', + 'PhutilJavaFragmentLexer' => 'lexer/PhutilJavaFragmentLexer.php', + 'PhutilKoreanLocale' => 'internationalization/locales/PhutilKoreanLocale.php', + 'PhutilLanguageGuesser' => 'parser/PhutilLanguageGuesser.php', + 'PhutilLanguageGuesserTestCase' => 'parser/__tests__/PhutilLanguageGuesserTestCase.php', + 'PhutilLexer' => 'lexer/PhutilLexer.php', + 'PhutilLibraryConflictException' => 'init/lib/PhutilLibraryConflictException.php', + 'PhutilLibraryMapBuilder' => 'moduleutils/PhutilLibraryMapBuilder.php', + 'PhutilLibraryTestCase' => '__tests__/PhutilLibraryTestCase.php', + 'PhutilLocale' => 'internationalization/PhutilLocale.php', + 'PhutilLocaleTestCase' => 'internationalization/__tests__/PhutilLocaleTestCase.php', + 'PhutilLock' => 'filesystem/PhutilLock.php', + 'PhutilLockException' => 'filesystem/PhutilLockException.php', + 'PhutilLogFileChannel' => 'channel/PhutilLogFileChannel.php', + 'PhutilLunarPhase' => 'utils/PhutilLunarPhase.php', + 'PhutilLunarPhaseTestCase' => 'utils/__tests__/PhutilLunarPhaseTestCase.php', + 'PhutilMercurialBinaryAnalyzer' => 'filesystem/binary/PhutilMercurialBinaryAnalyzer.php', + 'PhutilMethodNotImplementedException' => 'error/PhutilMethodNotImplementedException.php', + 'PhutilMetricsChannel' => 'channel/PhutilMetricsChannel.php', + 'PhutilMissingSymbolException' => 'init/lib/PhutilMissingSymbolException.php', + 'PhutilModuleUtilsTestCase' => 'init/lib/__tests__/PhutilModuleUtilsTestCase.php', + 'PhutilNumber' => 'internationalization/PhutilNumber.php', + 'PhutilOAuth1Future' => 'future/oauth/PhutilOAuth1Future.php', + 'PhutilOAuth1FutureTestCase' => 'future/oauth/__tests__/PhutilOAuth1FutureTestCase.php', + 'PhutilOpaqueEnvelope' => 'error/PhutilOpaqueEnvelope.php', + 'PhutilOpaqueEnvelopeKey' => 'error/PhutilOpaqueEnvelopeKey.php', + 'PhutilOpaqueEnvelopeTestCase' => 'error/__tests__/PhutilOpaqueEnvelopeTestCase.php', + 'PhutilPHPFragmentLexer' => 'lexer/PhutilPHPFragmentLexer.php', + 'PhutilPHPFragmentLexerTestCase' => 'lexer/__tests__/PhutilPHPFragmentLexerTestCase.php', + 'PhutilPHPObjectProtocolChannel' => 'channel/PhutilPHPObjectProtocolChannel.php', + 'PhutilPHPObjectProtocolChannelTestCase' => 'channel/__tests__/PhutilPHPObjectProtocolChannelTestCase.php', + 'PhutilParserGenerator' => 'parser/PhutilParserGenerator.php', + 'PhutilParserGeneratorException' => 'parser/generator/exception/PhutilParserGeneratorException.php', + 'PhutilParserGeneratorTestCase' => 'parser/__tests__/PhutilParserGeneratorTestCase.php', + 'PhutilPayPalAPIFuture' => 'future/paypal/PhutilPayPalAPIFuture.php', + 'PhutilPerson' => 'internationalization/PhutilPerson.php', + 'PhutilPersonTest' => 'internationalization/__tests__/PhutilPersonTest.php', + 'PhutilPhtTestCase' => 'internationalization/__tests__/PhutilPhtTestCase.php', + 'PhutilPirateEnglishLocale' => 'internationalization/locales/PhutilPirateEnglishLocale.php', + 'PhutilPortugueseBrazilLocale' => 'internationalization/locales/PhutilPortugueseBrazilLocale.php', + 'PhutilPortuguesePortugalLocale' => 'internationalization/locales/PhutilPortuguesePortugalLocale.php', + 'PhutilPostmarkFuture' => 'future/postmark/PhutilPostmarkFuture.php', + 'PhutilPregsprintfTestCase' => 'xsprintf/__tests__/PhutilPregsprintfTestCase.php', + 'PhutilProcessQuery' => 'filesystem/PhutilProcessQuery.php', + 'PhutilProcessRef' => 'filesystem/PhutilProcessRef.php', + 'PhutilProcessRefTestCase' => 'filesystem/__tests__/PhutilProcessRefTestCase.php', + 'PhutilProgressSink' => 'progress/PhutilProgressSink.php', + 'PhutilProtocolChannel' => 'channel/PhutilProtocolChannel.php', + 'PhutilProxyException' => 'error/PhutilProxyException.php', + 'PhutilProxyIterator' => 'utils/PhutilProxyIterator.php', + 'PhutilPygmentizeBinaryAnalyzer' => 'filesystem/binary/PhutilPygmentizeBinaryAnalyzer.php', + 'PhutilPythonFragmentLexer' => 'lexer/PhutilPythonFragmentLexer.php', + 'PhutilQueryStringParser' => 'parser/PhutilQueryStringParser.php', + 'PhutilQueryStringParserTestCase' => 'parser/__tests__/PhutilQueryStringParserTestCase.php', + 'PhutilRawEnglishLocale' => 'internationalization/locales/PhutilRawEnglishLocale.php', + 'PhutilReadableSerializer' => 'readableserializer/PhutilReadableSerializer.php', + 'PhutilReadableSerializerTestCase' => 'readableserializer/__tests__/PhutilReadableSerializerTestCase.php', + 'PhutilRope' => 'utils/PhutilRope.php', + 'PhutilRopeTestCase' => 'utils/__tests__/PhutilRopeTestCase.php', + 'PhutilServiceProfiler' => 'serviceprofiler/PhutilServiceProfiler.php', + 'PhutilShellLexer' => 'lexer/PhutilShellLexer.php', + 'PhutilShellLexerTestCase' => 'lexer/__tests__/PhutilShellLexerTestCase.php', + 'PhutilSignalHandler' => 'future/exec/PhutilSignalHandler.php', + 'PhutilSignalRouter' => 'future/exec/PhutilSignalRouter.php', + 'PhutilSimpleOptions' => 'parser/PhutilSimpleOptions.php', + 'PhutilSimpleOptionsLexer' => 'lexer/PhutilSimpleOptionsLexer.php', + 'PhutilSimpleOptionsLexerTestCase' => 'lexer/__tests__/PhutilSimpleOptionsLexerTestCase.php', + 'PhutilSimpleOptionsTestCase' => 'parser/__tests__/PhutilSimpleOptionsTestCase.php', + 'PhutilSimplifiedChineseLocale' => 'internationalization/locales/PhutilSimplifiedChineseLocale.php', + 'PhutilSlackFuture' => 'future/slack/PhutilSlackFuture.php', + 'PhutilSocketChannel' => 'channel/PhutilSocketChannel.php', + 'PhutilSortVector' => 'utils/PhutilSortVector.php', + 'PhutilSpanishSpainLocale' => 'internationalization/locales/PhutilSpanishSpainLocale.php', + 'PhutilStreamIterator' => 'utils/PhutilStreamIterator.php', + 'PhutilSubversionBinaryAnalyzer' => 'filesystem/binary/PhutilSubversionBinaryAnalyzer.php', + 'PhutilSymbolLoader' => 'symbols/PhutilSymbolLoader.php', + 'PhutilSystem' => 'utils/PhutilSystem.php', + 'PhutilSystemTestCase' => 'utils/__tests__/PhutilSystemTestCase.php', + 'PhutilTerminalString' => 'xsprintf/PhutilTerminalString.php', 'PhutilTestCase' => 'unit/engine/phutil/PhutilTestCase.php', 'PhutilTestCaseTestCase' => 'unit/engine/phutil/testcase/PhutilTestCaseTestCase.php', + 'PhutilTestPhobject' => 'object/__tests__/PhutilTestPhobject.php', 'PhutilTestSkippedException' => 'unit/engine/phutil/testcase/PhutilTestSkippedException.php', 'PhutilTestTerminatedException' => 'unit/engine/phutil/testcase/PhutilTestTerminatedException.php', + 'PhutilTraditionalChineseLocale' => 'internationalization/locales/PhutilTraditionalChineseLocale.php', + 'PhutilTranslation' => 'internationalization/PhutilTranslation.php', + 'PhutilTranslationTestCase' => 'internationalization/__tests__/PhutilTranslationTestCase.php', + 'PhutilTranslator' => 'internationalization/PhutilTranslator.php', + 'PhutilTranslatorTestCase' => 'internationalization/__tests__/PhutilTranslatorTestCase.php', + 'PhutilTsprintfTestCase' => 'xsprintf/__tests__/PhutilTsprintfTestCase.php', + 'PhutilTwitchFuture' => 'future/twitch/PhutilTwitchFuture.php', + 'PhutilTypeCheckException' => 'parser/exception/PhutilTypeCheckException.php', + 'PhutilTypeExtraParametersException' => 'parser/exception/PhutilTypeExtraParametersException.php', + 'PhutilTypeLexer' => 'lexer/PhutilTypeLexer.php', + 'PhutilTypeMissingParametersException' => 'parser/exception/PhutilTypeMissingParametersException.php', + 'PhutilTypeSpec' => 'parser/PhutilTypeSpec.php', + 'PhutilTypeSpecTestCase' => 'parser/__tests__/PhutilTypeSpecTestCase.php', + 'PhutilURI' => 'parser/PhutilURI.php', + 'PhutilURITestCase' => 'parser/__tests__/PhutilURITestCase.php', + 'PhutilUSEnglishLocale' => 'internationalization/locales/PhutilUSEnglishLocale.php', + 'PhutilUTF8StringTruncator' => 'utils/PhutilUTF8StringTruncator.php', + 'PhutilUTF8TestCase' => 'utils/__tests__/PhutilUTF8TestCase.php', 'PhutilUnitTestEngine' => 'unit/engine/PhutilUnitTestEngine.php', 'PhutilUnitTestEngineTestCase' => 'unit/engine/__tests__/PhutilUnitTestEngineTestCase.php', + 'PhutilUnknownSymbolParserGeneratorException' => 'parser/generator/exception/PhutilUnknownSymbolParserGeneratorException.php', + 'PhutilUnreachableRuleParserGeneratorException' => 'parser/generator/exception/PhutilUnreachableRuleParserGeneratorException.php', + 'PhutilUnreachableTerminalParserGeneratorException' => 'parser/generator/exception/PhutilUnreachableTerminalParserGeneratorException.php', + 'PhutilUrisprintfTestCase' => 'xsprintf/__tests__/PhutilUrisprintfTestCase.php', + 'PhutilUtilsTestCase' => 'utils/__tests__/PhutilUtilsTestCase.php', + 'PhutilVeryWowEnglishLocale' => 'internationalization/locales/PhutilVeryWowEnglishLocale.php', + 'PhutilWordPressFuture' => 'future/wordpress/PhutilWordPressFuture.php', + 'PhutilXHPASTBinary' => 'parser/xhpast/bin/PhutilXHPASTBinary.php', 'PytestTestEngine' => 'unit/engine/PytestTestEngine.php', + 'TempFile' => 'filesystem/TempFile.php', + 'TestAbstractDirectedGraph' => 'utils/__tests__/TestAbstractDirectedGraph.php', + 'XHPASTNode' => 'parser/xhpast/api/XHPASTNode.php', + 'XHPASTNodeTestCase' => 'parser/xhpast/api/__tests__/XHPASTNodeTestCase.php', + 'XHPASTSyntaxErrorException' => 'parser/xhpast/api/XHPASTSyntaxErrorException.php', + 'XHPASTToken' => 'parser/xhpast/api/XHPASTToken.php', + 'XHPASTTree' => 'parser/xhpast/api/XHPASTTree.php', + 'XHPASTTreeTestCase' => 'parser/xhpast/api/__tests__/XHPASTTreeTestCase.php', 'XUnitTestEngine' => 'unit/engine/XUnitTestEngine.php', 'XUnitTestResultParserTestCase' => 'unit/parser/__tests__/XUnitTestResultParserTestCase.php', + 'XsprintfUnknownConversionException' => 'xsprintf/exception/XsprintfUnknownConversionException.php', + ), + 'function' => array( + '__phutil_autoload' => 'init/init-library.php', + 'array_fuse' => 'utils/utils.php', + 'array_interleave' => 'utils/utils.php', + 'array_mergev' => 'utils/utils.php', + 'array_select_keys' => 'utils/utils.php', + 'assert_instances_of' => 'utils/utils.php', + 'assert_same_keys' => 'utils/utils.php', + 'assert_stringlike' => 'utils/utils.php', + 'coalesce' => 'utils/utils.php', + 'csprintf' => 'xsprintf/csprintf.php', + 'exec_manual' => 'future/exec/execx.php', + 'execx' => 'future/exec/execx.php', + 'head' => 'utils/utils.php', + 'head_key' => 'utils/utils.php', + 'hgsprintf' => 'xsprintf/hgsprintf.php', + 'id' => 'utils/utils.php', + 'idx' => 'utils/utils.php', + 'idxv' => 'utils/utils.php', + 'ifilter' => 'utils/utils.php', + 'igroup' => 'utils/utils.php', + 'ipull' => 'utils/utils.php', + 'isort' => 'utils/utils.php', + 'jsprintf' => 'xsprintf/jsprintf.php', + 'last' => 'utils/utils.php', + 'last_key' => 'utils/utils.php', + 'ldap_sprintf' => 'xsprintf/ldapsprintf.php', + 'mfilter' => 'utils/utils.php', + 'mgroup' => 'utils/utils.php', + 'mpull' => 'utils/utils.php', + 'msort' => 'utils/utils.php', + 'msortv' => 'utils/utils.php', + 'newv' => 'utils/utils.php', + 'nonempty' => 'utils/utils.php', + 'phlog' => 'error/phlog.php', + 'pht' => 'internationalization/pht.php', + 'phutil_build_http_querystring' => 'utils/utils.php', + 'phutil_build_http_querystring_from_pairs' => 'utils/utils.php', + 'phutil_censor_credentials' => 'utils/utils.php', + 'phutil_console_confirm' => 'console/format.php', + 'phutil_console_format' => 'console/format.php', + 'phutil_console_get_terminal_width' => 'console/format.php', + 'phutil_console_prompt' => 'console/format.php', + 'phutil_console_require_tty' => 'console/format.php', + 'phutil_console_select' => 'console/format.php', + 'phutil_console_wrap' => 'console/format.php', + 'phutil_count' => 'internationalization/pht.php', + 'phutil_date_format' => 'utils/viewutils.php', + 'phutil_decode_mime_header' => 'utils/utils.php', + 'phutil_deprecated' => 'init/lib/moduleutils.php', + 'phutil_describe_type' => 'utils/utils.php', + 'phutil_error_listener_example' => 'error/phlog.php', + 'phutil_escape_uri' => 'utils/utils.php', + 'phutil_escape_uri_path_component' => 'utils/utils.php', + 'phutil_fnmatch' => 'utils/utils.php', + 'phutil_format_bytes' => 'utils/viewutils.php', + 'phutil_format_relative_time' => 'utils/viewutils.php', + 'phutil_format_relative_time_detailed' => 'utils/viewutils.php', + 'phutil_format_units_generic' => 'utils/viewutils.php', + 'phutil_fwrite_nonblocking_stream' => 'utils/utils.php', + 'phutil_get_current_library_name' => 'init/lib/moduleutils.php', + 'phutil_get_library_name_for_root' => 'init/lib/moduleutils.php', + 'phutil_get_library_root' => 'init/lib/moduleutils.php', + 'phutil_get_library_root_for_path' => 'init/lib/moduleutils.php', + 'phutil_get_signal_name' => 'future/exec/execx.php', + 'phutil_get_system_locale' => 'utils/utf8.php', + 'phutil_hashes_are_identical' => 'utils/utils.php', + 'phutil_http_parameter_pair' => 'utils/utils.php', + 'phutil_ini_decode' => 'utils/utils.php', + 'phutil_is_hiphop_runtime' => 'utils/utils.php', + 'phutil_is_natural_list' => 'utils/utils.php', + 'phutil_is_system_locale_available' => 'utils/utf8.php', + 'phutil_is_utf8' => 'utils/utf8.php', + 'phutil_is_utf8_slowly' => 'utils/utf8.php', + 'phutil_is_utf8_with_only_bmp_characters' => 'utils/utf8.php', + 'phutil_is_windows' => 'utils/utils.php', + 'phutil_json_decode' => 'utils/utils.php', + 'phutil_json_encode' => 'utils/utils.php', + 'phutil_load_library' => 'init/lib/moduleutils.php', + 'phutil_loggable_string' => 'utils/utils.php', + 'phutil_microseconds_since' => 'utils/utils.php', + 'phutil_parse_bytes' => 'utils/viewutils.php', + 'phutil_passthru' => 'future/exec/execx.php', + 'phutil_person' => 'internationalization/pht.php', + 'phutil_register_library' => 'init/lib/core.php', + 'phutil_register_library_map' => 'init/lib/core.php', + 'phutil_set_system_locale' => 'utils/utf8.php', + 'phutil_split_lines' => 'utils/utils.php', + 'phutil_string_cast' => 'utils/utils.php', + 'phutil_unescape_uri_path_component' => 'utils/utils.php', + 'phutil_units' => 'utils/utils.php', + 'phutil_utf8_console_strlen' => 'utils/utf8.php', + 'phutil_utf8_convert' => 'utils/utf8.php', + 'phutil_utf8_encode_codepoint' => 'utils/utf8.php', + 'phutil_utf8_hard_wrap' => 'utils/utf8.php', + 'phutil_utf8_hard_wrap_html' => 'utils/utf8.php', + 'phutil_utf8_is_cjk' => 'utils/utf8.php', + 'phutil_utf8_is_combining_character' => 'utils/utf8.php', + 'phutil_utf8_strlen' => 'utils/utf8.php', + 'phutil_utf8_strtolower' => 'utils/utf8.php', + 'phutil_utf8_strtoupper' => 'utils/utf8.php', + 'phutil_utf8_strtr' => 'utils/utf8.php', + 'phutil_utf8_ucwords' => 'utils/utf8.php', + 'phutil_utf8ize' => 'utils/utf8.php', + 'phutil_utf8v' => 'utils/utf8.php', + 'phutil_utf8v_codepoints' => 'utils/utf8.php', + 'phutil_utf8v_combine_characters' => 'utils/utf8.php', + 'phutil_utf8v_combined' => 'utils/utf8.php', + 'phutil_validate_json' => 'utils/utils.php', + 'phutil_var_export' => 'utils/utils.php', + 'ppull' => 'utils/utils.php', + 'pregsprintf' => 'xsprintf/pregsprintf.php', + 'tsprintf' => 'xsprintf/tsprintf.php', + 'urisprintf' => 'xsprintf/urisprintf.php', + 'vcsprintf' => 'xsprintf/csprintf.php', + 'vjsprintf' => 'xsprintf/jsprintf.php', + 'vurisprintf' => 'xsprintf/urisprintf.php', + 'xhp_parser_node_constants' => 'parser/xhpast/parser_nodes.php', + 'xhpast_parser_token_constants' => 'parser/xhpast/parser_tokens.php', + 'xsprintf' => 'xsprintf/xsprintf.php', + 'xsprintf_callback_example' => 'xsprintf/xsprintf.php', + 'xsprintf_command' => 'xsprintf/csprintf.php', + 'xsprintf_javascript' => 'xsprintf/jsprintf.php', + 'xsprintf_ldap' => 'xsprintf/ldapsprintf.php', + 'xsprintf_mercurial' => 'xsprintf/hgsprintf.php', + 'xsprintf_regex' => 'xsprintf/pregsprintf.php', + 'xsprintf_terminal' => 'xsprintf/tsprintf.php', + 'xsprintf_uri' => 'xsprintf/urisprintf.php', ), - 'function' => array(), 'xmap' => array( + 'AASTNode' => 'Phobject', + 'AASTNodeList' => array( + 'Phobject', + 'Countable', + 'Iterator', + ), + 'AASTToken' => 'Phobject', + 'AASTTree' => 'Phobject', + 'AbstractDirectedGraph' => 'Phobject', + 'AbstractDirectedGraphTestCase' => 'PhutilTestCase', 'ArcanistAbstractMethodBodyXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistAbstractMethodBodyXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistAbstractPrivateMethodXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', @@ -843,18 +1293,350 @@ phutil_register_library_map(array( 'ArcanistXMLLinter' => 'ArcanistLinter', 'ArcanistXMLLinterTestCase' => 'ArcanistLinterTestCase', 'ArcanistXUnitTestResultParser' => 'Phobject', + 'BaseHTTPFuture' => 'Future', 'CSharpToolsTestEngine' => 'XUnitTestEngine', + 'CaseInsensitiveArray' => 'PhutilArray', + 'CaseInsensitiveArrayTestCase' => 'PhutilTestCase', + 'CommandException' => 'Exception', + 'ConduitClient' => 'Phobject', + 'ConduitClientException' => 'Exception', + 'ConduitClientTestCase' => 'PhutilTestCase', + 'ConduitFuture' => 'FutureProxy', + 'ExecFuture' => 'PhutilExecutableFuture', + 'ExecFutureTestCase' => 'PhutilTestCase', + 'ExecPassthruTestCase' => 'PhutilTestCase', + 'FileFinder' => 'Phobject', + 'FileFinderTestCase' => 'PhutilTestCase', + 'FileList' => 'Phobject', + 'Filesystem' => 'Phobject', + 'FilesystemException' => 'Exception', + 'FilesystemTestCase' => 'PhutilTestCase', + 'Future' => 'Phobject', + 'FutureIterator' => array( + 'Phobject', + 'Iterator', + ), + 'FutureIteratorTestCase' => 'PhutilTestCase', + 'FutureProxy' => 'Future', + 'HTTPFuture' => 'BaseHTTPFuture', + 'HTTPFutureCURLResponseStatus' => 'HTTPFutureResponseStatus', + 'HTTPFutureCertificateResponseStatus' => 'HTTPFutureResponseStatus', + 'HTTPFutureHTTPResponseStatus' => 'HTTPFutureResponseStatus', + 'HTTPFutureParseResponseStatus' => 'HTTPFutureResponseStatus', + 'HTTPFutureResponseStatus' => 'Exception', + 'HTTPFutureTransportResponseStatus' => 'HTTPFutureResponseStatus', + 'HTTPSFuture' => 'BaseHTTPFuture', + 'ImmediateFuture' => 'Future', + 'LibphutilUSEnglishTranslation' => 'PhutilTranslation', + 'LinesOfALarge' => array( + 'Phobject', + 'Iterator', + ), + 'LinesOfALargeExecFuture' => 'LinesOfALarge', + 'LinesOfALargeExecFutureTestCase' => 'PhutilTestCase', + 'LinesOfALargeFile' => 'LinesOfALarge', + 'LinesOfALargeFileTestCase' => 'PhutilTestCase', + 'MFilterTestHelper' => 'Phobject', 'NoseTestEngine' => 'ArcanistUnitTestEngine', + 'PHPASTParserTestCase' => 'PhutilTestCase', + 'PhageAction' => 'Phobject', + 'PhageAgentAction' => 'PhageAction', + 'PhageAgentBootloader' => 'Phobject', + 'PhageAgentTestCase' => 'PhutilTestCase', + 'PhageExecuteAction' => 'PhageAction', + 'PhageLocalAction' => 'PhageAgentAction', + 'PhagePHPAgent' => 'Phobject', + 'PhagePHPAgentBootloader' => 'PhageAgentBootloader', + 'PhagePlanAction' => 'PhageAction', + 'Phobject' => 'Iterator', + 'PhobjectTestCase' => 'PhutilTestCase', 'PhpunitTestEngine' => 'ArcanistUnitTestEngine', 'PhpunitTestEngineTestCase' => 'PhutilTestCase', + 'PhutilAWSCloudFormationFuture' => 'PhutilAWSFuture', + 'PhutilAWSCloudWatchFuture' => 'PhutilAWSFuture', + 'PhutilAWSEC2Future' => 'PhutilAWSFuture', + 'PhutilAWSException' => 'Exception', + 'PhutilAWSFuture' => 'FutureProxy', + 'PhutilAWSManagementWorkflow' => 'PhutilArgumentWorkflow', + 'PhutilAWSS3DeleteManagementWorkflow' => 'PhutilAWSS3ManagementWorkflow', + 'PhutilAWSS3Future' => 'PhutilAWSFuture', + 'PhutilAWSS3GetManagementWorkflow' => 'PhutilAWSS3ManagementWorkflow', + 'PhutilAWSS3ManagementWorkflow' => 'PhutilAWSManagementWorkflow', + 'PhutilAWSS3PutManagementWorkflow' => 'PhutilAWSS3ManagementWorkflow', + 'PhutilAWSv4Signature' => 'Phobject', + 'PhutilAWSv4SignatureTestCase' => 'PhutilTestCase', + 'PhutilAggregateException' => 'Exception', + 'PhutilAllCapsEnglishLocale' => 'PhutilLocale', + 'PhutilArgumentParser' => 'Phobject', + 'PhutilArgumentParserException' => 'Exception', + 'PhutilArgumentParserTestCase' => 'PhutilTestCase', + 'PhutilArgumentSpecification' => 'Phobject', + 'PhutilArgumentSpecificationException' => 'PhutilArgumentParserException', + 'PhutilArgumentSpecificationTestCase' => 'PhutilTestCase', + 'PhutilArgumentSpellingCorrector' => 'Phobject', + 'PhutilArgumentSpellingCorrectorTestCase' => 'PhutilTestCase', + 'PhutilArgumentUsageException' => 'PhutilArgumentParserException', + 'PhutilArgumentWorkflow' => 'Phobject', + 'PhutilArray' => array( + 'Phobject', + 'Countable', + 'ArrayAccess', + 'Iterator', + ), + 'PhutilArrayTestCase' => 'PhutilTestCase', + 'PhutilArrayWithDefaultValue' => 'PhutilArray', + 'PhutilAsanaFuture' => 'FutureProxy', + 'PhutilBacktraceSignalHandler' => 'PhutilSignalHandler', + 'PhutilBallOfPHP' => 'Phobject', + 'PhutilBinaryAnalyzer' => 'Phobject', + 'PhutilBinaryAnalyzerTestCase' => 'PhutilTestCase', + 'PhutilBootloaderException' => 'Exception', + 'PhutilBritishEnglishLocale' => 'PhutilLocale', + 'PhutilBufferedIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilBufferedIteratorTestCase' => 'PhutilTestCase', + 'PhutilBugtraqParser' => 'Phobject', + 'PhutilBugtraqParserTestCase' => 'PhutilTestCase', + 'PhutilCIDRBlock' => 'Phobject', + 'PhutilCIDRList' => 'Phobject', + 'PhutilCallbackFilterIterator' => 'FilterIterator', + 'PhutilCallbackSignalHandler' => 'PhutilSignalHandler', + 'PhutilChannel' => 'Phobject', + 'PhutilChannelChannel' => 'PhutilChannel', + 'PhutilChannelTestCase' => 'PhutilTestCase', + 'PhutilChunkedIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilChunkedIteratorTestCase' => 'PhutilTestCase', + 'PhutilClassMapQuery' => 'Phobject', + 'PhutilCloudWatchMetric' => 'Phobject', + 'PhutilCommandString' => 'Phobject', + 'PhutilConsole' => 'Phobject', + 'PhutilConsoleBlock' => 'PhutilConsoleView', + 'PhutilConsoleError' => 'PhutilConsoleLogLine', + 'PhutilConsoleFormatter' => 'Phobject', + 'PhutilConsoleInfo' => 'PhutilConsoleLogLine', + 'PhutilConsoleList' => 'PhutilConsoleView', + 'PhutilConsoleLogLine' => 'PhutilConsoleView', + 'PhutilConsoleMessage' => 'Phobject', + 'PhutilConsoleMetrics' => 'Phobject', + 'PhutilConsoleMetricsSignalHandler' => 'PhutilSignalHandler', + 'PhutilConsoleProgressBar' => 'Phobject', + 'PhutilConsoleProgressSink' => 'PhutilProgressSink', + 'PhutilConsoleServer' => 'Phobject', + 'PhutilConsoleServerChannel' => 'PhutilChannelChannel', + 'PhutilConsoleSkip' => 'PhutilConsoleLogLine', + 'PhutilConsoleStdinNotInteractiveException' => 'Exception', + 'PhutilConsoleTable' => 'PhutilConsoleView', + 'PhutilConsoleView' => 'Phobject', + 'PhutilConsoleWarning' => 'PhutilConsoleLogLine', + 'PhutilConsoleWrapTestCase' => 'PhutilTestCase', + 'PhutilCowsay' => 'Phobject', + 'PhutilCowsayTestCase' => 'PhutilTestCase', + 'PhutilCsprintfTestCase' => 'PhutilTestCase', + 'PhutilCzechLocale' => 'PhutilLocale', + 'PhutilDOMNode' => 'Phobject', + 'PhutilDeferredLog' => 'Phobject', + 'PhutilDeferredLogTestCase' => 'PhutilTestCase', + 'PhutilDiffBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilDirectedScalarGraph' => 'AbstractDirectedGraph', + 'PhutilDirectoryFixture' => 'Phobject', + 'PhutilDocblockParser' => 'Phobject', + 'PhutilDocblockParserTestCase' => 'PhutilTestCase', + 'PhutilEditDistanceMatrix' => 'Phobject', + 'PhutilEditDistanceMatrixTestCase' => 'PhutilTestCase', + 'PhutilEditorConfig' => 'Phobject', + 'PhutilEditorConfigTestCase' => 'PhutilTestCase', + 'PhutilEmailAddress' => 'Phobject', + 'PhutilEmailAddressTestCase' => 'PhutilTestCase', + 'PhutilEmojiLocale' => 'PhutilLocale', + 'PhutilEnglishCanadaLocale' => 'PhutilLocale', + 'PhutilErrorHandler' => 'Phobject', + 'PhutilErrorHandlerTestCase' => 'PhutilTestCase', + 'PhutilErrorTrap' => 'Phobject', + 'PhutilEvent' => 'Phobject', + 'PhutilEventConstants' => 'Phobject', + 'PhutilEventEngine' => 'Phobject', + 'PhutilEventListener' => 'Phobject', + 'PhutilEventType' => 'PhutilEventConstants', + 'PhutilExampleBufferedIterator' => 'PhutilBufferedIterator', + 'PhutilExecChannel' => 'PhutilChannel', + 'PhutilExecPassthru' => 'PhutilExecutableFuture', + 'PhutilExecutableFuture' => 'Future', + 'PhutilExecutionEnvironment' => 'Phobject', + 'PhutilFileLock' => 'PhutilLock', + 'PhutilFileLockTestCase' => 'PhutilTestCase', + 'PhutilFileTree' => 'Phobject', + 'PhutilFrenchLocale' => 'PhutilLocale', + 'PhutilGermanLocale' => 'PhutilLocale', + 'PhutilGitBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilGitHubFuture' => 'FutureProxy', + 'PhutilGitHubResponse' => 'Phobject', + 'PhutilGitURI' => 'Phobject', + 'PhutilGitURITestCase' => 'PhutilTestCase', + 'PhutilHTMLParser' => 'Phobject', + 'PhutilHTMLParserTestCase' => 'PhutilTestCase', + 'PhutilHTTPEngineExtension' => 'Phobject', + 'PhutilHTTPResponse' => 'Phobject', + 'PhutilHTTPResponseParser' => 'Phobject', + 'PhutilHTTPResponseParserTestCase' => 'PhutilTestCase', + 'PhutilHashingIterator' => array( + 'PhutilProxyIterator', + 'Iterator', + ), + 'PhutilHashingIteratorTestCase' => 'PhutilTestCase', + 'PhutilHelpArgumentWorkflow' => 'PhutilArgumentWorkflow', + 'PhutilHgsprintfTestCase' => 'PhutilTestCase', + 'PhutilINIParserException' => 'Exception', + 'PhutilIPAddress' => 'Phobject', + 'PhutilIPAddressTestCase' => 'PhutilTestCase', + 'PhutilIPv4Address' => 'PhutilIPAddress', + 'PhutilIPv6Address' => 'PhutilIPAddress', + 'PhutilInteractiveEditor' => 'Phobject', + 'PhutilInvalidRuleParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilInvalidStateException' => 'Exception', + 'PhutilInvalidStateExceptionTestCase' => 'PhutilTestCase', + 'PhutilIrreducibleRuleParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilJSON' => 'Phobject', + 'PhutilJSONFragmentLexer' => 'PhutilLexer', + 'PhutilJSONParser' => 'Phobject', + 'PhutilJSONParserException' => 'Exception', + 'PhutilJSONParserTestCase' => 'PhutilTestCase', + 'PhutilJSONProtocolChannel' => 'PhutilProtocolChannel', + 'PhutilJSONProtocolChannelTestCase' => 'PhutilTestCase', + 'PhutilJSONTestCase' => 'PhutilTestCase', + 'PhutilJavaFragmentLexer' => 'PhutilLexer', + 'PhutilKoreanLocale' => 'PhutilLocale', + 'PhutilLanguageGuesser' => 'Phobject', + 'PhutilLanguageGuesserTestCase' => 'PhutilTestCase', + 'PhutilLexer' => 'Phobject', + 'PhutilLibraryConflictException' => 'Exception', + 'PhutilLibraryMapBuilder' => 'Phobject', + 'PhutilLibraryTestCase' => 'PhutilTestCase', + 'PhutilLocale' => 'Phobject', + 'PhutilLocaleTestCase' => 'PhutilTestCase', + 'PhutilLock' => 'Phobject', + 'PhutilLockException' => 'Exception', + 'PhutilLogFileChannel' => 'PhutilChannelChannel', + 'PhutilLunarPhase' => 'Phobject', + 'PhutilLunarPhaseTestCase' => 'PhutilTestCase', + 'PhutilMercurialBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilMethodNotImplementedException' => 'Exception', + 'PhutilMetricsChannel' => 'PhutilChannelChannel', + 'PhutilMissingSymbolException' => 'Exception', + 'PhutilModuleUtilsTestCase' => 'PhutilTestCase', + 'PhutilNumber' => 'Phobject', + 'PhutilOAuth1Future' => 'FutureProxy', + 'PhutilOAuth1FutureTestCase' => 'PhutilTestCase', + 'PhutilOpaqueEnvelope' => 'Phobject', + 'PhutilOpaqueEnvelopeKey' => 'Phobject', + 'PhutilOpaqueEnvelopeTestCase' => 'PhutilTestCase', + 'PhutilPHPFragmentLexer' => 'PhutilLexer', + 'PhutilPHPFragmentLexerTestCase' => 'PhutilTestCase', + 'PhutilPHPObjectProtocolChannel' => 'PhutilProtocolChannel', + 'PhutilPHPObjectProtocolChannelTestCase' => 'PhutilTestCase', + 'PhutilParserGenerator' => 'Phobject', + 'PhutilParserGeneratorException' => 'Exception', + 'PhutilParserGeneratorTestCase' => 'PhutilTestCase', + 'PhutilPayPalAPIFuture' => 'FutureProxy', + 'PhutilPersonTest' => array( + 'Phobject', + 'PhutilPerson', + ), + 'PhutilPhtTestCase' => 'PhutilTestCase', + 'PhutilPirateEnglishLocale' => 'PhutilLocale', + 'PhutilPortugueseBrazilLocale' => 'PhutilLocale', + 'PhutilPortuguesePortugalLocale' => 'PhutilLocale', + 'PhutilPostmarkFuture' => 'FutureProxy', + 'PhutilPregsprintfTestCase' => 'PhutilTestCase', + 'PhutilProcessQuery' => 'Phobject', + 'PhutilProcessRef' => 'Phobject', + 'PhutilProcessRefTestCase' => 'PhutilTestCase', + 'PhutilProgressSink' => 'Phobject', + 'PhutilProtocolChannel' => 'PhutilChannelChannel', + 'PhutilProxyException' => 'Exception', + 'PhutilProxyIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilPygmentizeBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilPythonFragmentLexer' => 'PhutilLexer', + 'PhutilQueryStringParser' => 'Phobject', + 'PhutilQueryStringParserTestCase' => 'PhutilTestCase', + 'PhutilRawEnglishLocale' => 'PhutilLocale', + 'PhutilReadableSerializer' => 'Phobject', + 'PhutilReadableSerializerTestCase' => 'PhutilTestCase', + 'PhutilRope' => 'Phobject', + 'PhutilRopeTestCase' => 'PhutilTestCase', + 'PhutilServiceProfiler' => 'Phobject', + 'PhutilShellLexer' => 'PhutilLexer', + 'PhutilShellLexerTestCase' => 'PhutilTestCase', + 'PhutilSignalHandler' => 'Phobject', + 'PhutilSignalRouter' => 'Phobject', + 'PhutilSimpleOptions' => 'Phobject', + 'PhutilSimpleOptionsLexer' => 'PhutilLexer', + 'PhutilSimpleOptionsLexerTestCase' => 'PhutilTestCase', + 'PhutilSimpleOptionsTestCase' => 'PhutilTestCase', + 'PhutilSimplifiedChineseLocale' => 'PhutilLocale', + 'PhutilSlackFuture' => 'FutureProxy', + 'PhutilSocketChannel' => 'PhutilChannel', + 'PhutilSortVector' => 'Phobject', + 'PhutilSpanishSpainLocale' => 'PhutilLocale', + 'PhutilStreamIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilSubversionBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilSystem' => 'Phobject', + 'PhutilSystemTestCase' => 'PhutilTestCase', + 'PhutilTerminalString' => 'Phobject', 'PhutilTestCase' => 'Phobject', 'PhutilTestCaseTestCase' => 'PhutilTestCase', + 'PhutilTestPhobject' => 'Phobject', 'PhutilTestSkippedException' => 'Exception', 'PhutilTestTerminatedException' => 'Exception', + 'PhutilTraditionalChineseLocale' => 'PhutilLocale', + 'PhutilTranslation' => 'Phobject', + 'PhutilTranslationTestCase' => 'PhutilTestCase', + 'PhutilTranslator' => 'Phobject', + 'PhutilTranslatorTestCase' => 'PhutilTestCase', + 'PhutilTsprintfTestCase' => 'PhutilTestCase', + 'PhutilTwitchFuture' => 'FutureProxy', + 'PhutilTypeCheckException' => 'Exception', + 'PhutilTypeExtraParametersException' => 'Exception', + 'PhutilTypeLexer' => 'PhutilLexer', + 'PhutilTypeMissingParametersException' => 'Exception', + 'PhutilTypeSpec' => 'Phobject', + 'PhutilTypeSpecTestCase' => 'PhutilTestCase', + 'PhutilURI' => 'Phobject', + 'PhutilURITestCase' => 'PhutilTestCase', + 'PhutilUSEnglishLocale' => 'PhutilLocale', + 'PhutilUTF8StringTruncator' => 'Phobject', + 'PhutilUTF8TestCase' => 'PhutilTestCase', 'PhutilUnitTestEngine' => 'ArcanistUnitTestEngine', 'PhutilUnitTestEngineTestCase' => 'PhutilTestCase', + 'PhutilUnknownSymbolParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilUnreachableRuleParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilUnreachableTerminalParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilUrisprintfTestCase' => 'PhutilTestCase', + 'PhutilUtilsTestCase' => 'PhutilTestCase', + 'PhutilVeryWowEnglishLocale' => 'PhutilLocale', + 'PhutilWordPressFuture' => 'FutureProxy', + 'PhutilXHPASTBinary' => 'Phobject', 'PytestTestEngine' => 'ArcanistUnitTestEngine', + 'TempFile' => 'Phobject', + 'TestAbstractDirectedGraph' => 'AbstractDirectedGraph', + 'XHPASTNode' => 'AASTNode', + 'XHPASTNodeTestCase' => 'PhutilTestCase', + 'XHPASTSyntaxErrorException' => 'Exception', + 'XHPASTToken' => 'AASTToken', + 'XHPASTTree' => 'AASTTree', + 'XHPASTTreeTestCase' => 'PhutilTestCase', 'XUnitTestEngine' => 'ArcanistUnitTestEngine', 'XUnitTestResultParserTestCase' => 'PhutilTestCase', + 'XsprintfUnknownConversionException' => 'InvalidArgumentException', ), )); diff --git a/src/__tests__/PhutilLibraryTestCase.php b/src/__tests__/PhutilLibraryTestCase.php new file mode 100644 index 00000000..0e5c6261 --- /dev/null +++ b/src/__tests__/PhutilLibraryTestCase.php @@ -0,0 +1,191 @@ +setLibrary($this->getLibraryName()) + ->selectAndLoadSymbols(); + $this->assertTrue(true); + } + + /** + * This is more of an acceptance test case instead of a unit test. It verifies + * that all the library map is up-to-date. + */ + public function testLibraryMap() { + $root = $this->getLibraryRoot(); + $library = phutil_get_library_name_for_root($root); + + $new_library_map = id(new PhutilLibraryMapBuilder($root)) + ->buildMap(); + + $bootloader = PhutilBootloader::getInstance(); + $old_library_map = $bootloader->getLibraryMapWithoutExtensions($library); + unset($old_library_map[PhutilLibraryMapBuilder::LIBRARY_MAP_VERSION_KEY]); + + $identical = ($new_library_map === $old_library_map); + if (!$identical) { + $differences = $this->getMapDifferences( + $old_library_map, + $new_library_map); + sort($differences); + } else { + $differences = array(); + } + + $this->assertTrue( + $identical, + pht( + "The library map is out of date. Rebuild it with `%s`.\n". + "These entries differ: %s.", + 'arc liberate', + implode(', ', $differences))); + } + + + private function getMapDifferences($old, $new) { + $changed = array(); + + $all = $old + $new; + foreach ($all as $key => $value) { + $old_exists = array_key_exists($key, $old); + $new_exists = array_key_exists($key, $new); + + // One map has it and the other does not, so mark it as changed. + if ($old_exists != $new_exists) { + $changed[] = $key; + continue; + } + + $oldv = idx($old, $key); + $newv = idx($new, $key); + if ($oldv === $newv) { + continue; + } + + if (is_array($oldv) && is_array($newv)) { + $child_changed = $this->getMapDifferences($oldv, $newv); + foreach ($child_changed as $child) { + $changed[] = $key.'.'.$child; + } + } else { + $changed[] = $key; + } + } + + return $changed; + } + + + /** + * This is more of an acceptance test case instead of a unit test. It verifies + * that methods in subclasses have the same visibility as the method in the + * parent class. + */ + public function testMethodVisibility() { + $symbols = id(new PhutilSymbolLoader()) + ->setLibrary($this->getLibraryName()) + ->selectSymbolsWithoutLoading(); + + $classes = array(); + foreach ($symbols as $symbol) { + if ($symbol['type'] == 'class') { + $classes[$symbol['name']] = new ReflectionClass($symbol['name']); + } + } + + $failures = array(); + + foreach ($classes as $class_name => $class) { + $parents = array(); + $parent = $class; + while ($parent = $parent->getParentClass()) { + $parents[] = $parent; + } + + $interfaces = $class->getInterfaces(); + + foreach ($class->getMethods() as $method) { + $method_name = $method->getName(); + + foreach (array_merge($parents, $interfaces) as $extends) { + if ($extends->hasMethod($method_name)) { + $xmethod = $extends->getMethod($method_name); + + if (!$this->compareVisibility($xmethod, $method)) { + $failures[] = pht( + 'Class "%s" implements method "%s" with the wrong visibility. '. + 'The method has visibility "%s", but it is defined in parent '. + '"%s" with visibility "%s". In Phabricator, a method which '. + 'overrides another must always have the same visibility.', + $class_name, + $method_name, + $this->getVisibility($method), + $extends->getName(), + $this->getVisibility($xmethod)); + } + + // We found a declaration somewhere, so stop looking. + break; + } + } + } + } + + $this->assertTrue( + empty($failures), + "\n\n".implode("\n\n", $failures)); + } + + /** + * Get the name of the library currently being tested. + */ + protected function getLibraryName() { + return phutil_get_library_name_for_root($this->getLibraryRoot()); + } + + /** + * Get the root directory for the library currently being tested. + */ + protected function getLibraryRoot() { + $caller = id(new ReflectionClass($this))->getFileName(); + return phutil_get_library_root_for_path($caller); + } + + private function compareVisibility( + ReflectionMethod $parent_method, + ReflectionMethod $method) { + + static $bitmask; + + if ($bitmask === null) { + $bitmask = ReflectionMethod::IS_PUBLIC; + $bitmask += ReflectionMethod::IS_PROTECTED; + $bitmask += ReflectionMethod::IS_PRIVATE; + } + + $parent_modifiers = $parent_method->getModifiers(); + $modifiers = $method->getModifiers(); + return !(($parent_modifiers ^ $modifiers) & $bitmask); + } + + private function getVisibility(ReflectionMethod $method) { + if ($method->isPrivate()) { + return 'private'; + } else if ($method->isProtected()) { + return 'protected'; + } else { + return 'public'; + } + } + +} diff --git a/src/channel/PhutilChannel.php b/src/channel/PhutilChannel.php new file mode 100644 index 00000000..65ea544b --- /dev/null +++ b/src/channel/PhutilChannel.php @@ -0,0 +1,426 @@ +obuf = new PhutilRope(); + } + + +/* -( Reading and Writing )------------------------------------------------ */ + + + /** + * Read from the channel. A channel defines the format of data that is read + * from it, so this method may return strings, objects, or anything else. + * + * The default implementation returns bytes. + * + * @return wild Data from the channel, normally bytes. + * + * @task io + */ + public function read() { + $result = $this->ibuf; + $this->ibuf = ''; + return $result; + } + + + /** + * Write to the channel. A channel defines what data format it accepts, + * so this method may take strings, objects, or anything else. + * + * The default implementation accepts bytes. + * + * @param wild Data to write to the channel, normally bytes. + * @return this + * + * @task io + */ + public function write($bytes) { + if (!is_scalar($bytes)) { + throw new Exception( + pht( + '%s may only write strings!', + __METHOD__.'()')); + } + + $this->obuf->append($bytes); + return $this; + } + + +/* -( Waiting for Activity )----------------------------------------------- */ + + + /** + * Wait for any activity on a list of channels. Convenience wrapper around + * @{method:waitForActivity}. + * + * @param list A list of channels to wait for. + * @param dict Options, see above. + * @return void + * + * @task wait + */ + public static function waitForAny(array $channels, array $options = array()) { + return self::waitForActivity($channels, $channels, $options); + } + + + /** + * Wait (using select()) for channels to become ready for reads or writes. + * This method blocks until some channel is ready to be updated. + * + * It does not provide a way to determine which channels are ready to be + * updated. The expectation is that you'll just update every channel. This + * might change eventually. + * + * Available options are: + * + * - 'read' (list) Additional streams to select for read. + * - 'write' (list) Additional streams to select for write. + * - 'except' (list) Additional streams to select for except. + * - 'timeout' (float) Select timeout, defaults to 1. + * + * NOTE: Extra streams must be //streams//, not //sockets//, because this + * method uses `stream_select()`, not `socket_select()`. + * + * @param list List of channels to wait for reads on. + * @param list List of channels to wait for writes on. + * @return void + * + * @task wait + */ + public static function waitForActivity( + array $reads, + array $writes, + array $options = array()) { + + assert_instances_of($reads, __CLASS__); + assert_instances_of($writes, __CLASS__); + + $read = idx($options, 'read', array()); + $write = idx($options, 'write', array()); + $except = idx($options, 'except', array()); + $wait = idx($options, 'timeout', 1); + + // TODO: It would be nice to just be able to categorically reject these as + // unselectable. + foreach (array($reads, $writes) as $channels) { + foreach ($channels as $channel) { + $r_sockets = $channel->getReadSockets(); + $w_sockets = $channel->getWriteSockets(); + + // If any channel has no read sockets and no write sockets, assume it + // isn't selectable and return immediately (effectively degrading to a + // busy wait). + + if (!$r_sockets && !$w_sockets) { + return false; + } + } + } + + foreach ($reads as $channel) { + // If any of the read channels have data in read buffers, return + // immediately. If we don't, we risk running select() on a bunch of + // sockets which won't become readable because the data the application + // expects is already in a read buffer. + + if (!$channel->isReadBufferEmpty()) { + return; + } + + $r_sockets = $channel->getReadSockets(); + foreach ($r_sockets as $socket) { + $read[] = $socket; + $except[] = $socket; + } + } + + foreach ($writes as $channel) { + if ($channel->isWriteBufferEmpty()) { + // If the channel's write buffer is empty, don't select the write + // sockets, since they're writable immediately. + $w_sockets = array(); + } else { + $w_sockets = $channel->getWriteSockets(); + } + + foreach ($w_sockets as $socket) { + $write[] = $socket; + $except[] = $socket; + } + } + + if (!$read && !$write && !$except) { + return false; + } + + $wait_sec = (int)$wait; + $wait_usec = 1000000 * ($wait - $wait_sec); + + @stream_select($read, $write, $except, $wait_sec, $wait_usec); + } + + +/* -( Responding to Activity )--------------------------------------------- */ + + + /** + * Updates the channel, filling input buffers and flushing output buffers. + * Returns false if the channel has closed. + * + * @return bool True if the channel is still open. + * + * @task update + */ + public function update() { + $maximum_read = PHP_INT_MAX; + if ($this->readBufferSize !== null) { + $maximum_read = ($this->readBufferSize - strlen($this->ibuf)); + } + + while ($maximum_read > 0) { + $in = $this->readBytes($maximum_read); + if (!strlen($in)) { + // Reading is blocked for now. + break; + } + $this->ibuf .= $in; + $maximum_read -= strlen($in); + } + + while ($this->obuf->getByteLength()) { + $len = $this->writeBytes($this->obuf->getAnyPrefix()); + if (!$len) { + // Writing is blocked for now. + break; + } + $this->obuf->removeBytesFromHead($len); + } + + return $this->isOpen(); + } + + +/* -( Channel Implementation )--------------------------------------------- */ + + + /** + * Set a channel name. This is primarily intended to allow you to debug + * channel code more easily, by naming channels something meaningful. + * + * @param string Channel name. + * @return this + * + * @task impl + */ + public function setName($name) { + $this->name = $name; + return $this; + } + + + /** + * Get the channel name, as set by @{method:setName}. + * + * @return string Name of the channel. + * + * @task impl + */ + public function getName() { + return coalesce($this->name, get_class($this)); + } + + + /** + * Test if the channel is open: active, can be read from and written to, etc. + * + * @return bool True if the channel is open. + * + * @task impl + */ + abstract public function isOpen(); + + + /** + * Close the channel for writing. + * + * @return void + * @task impl + */ + abstract public function closeWriteChannel(); + + /** + * Test if the channel is open for reading. + * + * @return bool True if the channel is open for reading. + * + * @task impl + */ + public function isOpenForReading() { + return $this->isOpen(); + } + + + /** + * Test if the channel is open for writing. + * + * @return bool True if the channel is open for writing. + * + * @task impl + */ + public function isOpenForWriting() { + return $this->isOpen(); + } + + + /** + * Read from the channel's underlying I/O. + * + * @param int Maximum number of bytes to read. + * @return string Bytes, if available. + * + * @task impl + */ + abstract protected function readBytes($length); + + + /** + * Write to the channel's underlying I/O. + * + * @param string Bytes to write. + * @return int Number of bytes written. + * + * @task impl + */ + abstract protected function writeBytes($bytes); + + + /** + * Get sockets to select for reading. + * + * @return list Read sockets. + * + * @task impl + */ + protected function getReadSockets() { + return array(); + } + + + /** + * Get sockets to select for writing. + * + * @return list Write sockets. + * + * @task impl + */ + protected function getWriteSockets() { + return array(); + } + + + /** + * Set the maximum size of the channel's read buffer. Reads will artificially + * block once the buffer reaches this size until the in-process buffer is + * consumed. + * + * @param int|null Maximum read buffer size, or `null` for a limitless buffer. + * @return this + * @task impl + */ + public function setReadBufferSize($size) { + $this->readBufferSize = $size; + return $this; + } + + + /** + * Test state of the read buffer. + * + * @return bool True if the read buffer is empty. + * + * @task impl + */ + public function isReadBufferEmpty() { + return (strlen($this->ibuf) == 0); + } + + + /** + * Test state of the write buffer. + * + * @return bool True if the write buffer is empty. + * + * @task impl + */ + public function isWriteBufferEmpty() { + return !$this->getWriteBufferSize(); + } + + + /** + * Get the number of bytes we're currently waiting to write. + * + * @return int Number of waiting bytes. + * + * @task impl + */ + public function getWriteBufferSize() { + return $this->obuf->getByteLength(); + } + + + /** + * Wait for any buffered writes to complete. This is a blocking call. When + * the call returns, the write buffer will be empty. + * + * @task impl + */ + public function flush() { + while (!$this->isWriteBufferEmpty()) { + self::waitForAny(array($this)); + if (!$this->update()) { + throw new Exception(pht('Channel closed while flushing output!')); + } + } + return $this; + } + +} diff --git a/src/channel/PhutilChannelChannel.php b/src/channel/PhutilChannelChannel.php new file mode 100644 index 00000000..1ab99e30 --- /dev/null +++ b/src/channel/PhutilChannelChannel.php @@ -0,0 +1,112 @@ +channel = $channel; + $this->didConstruct(); + } + + protected function didConstruct() { + // Hook for subclasses. + } + + public function read() { + return $this->channel->read(); + } + + public function write($message) { + $this->channel->write($message); + return $this; + } + + public function update() { + return $this->channel->update(); + } + + public function isOpen() { + return $this->channel->isOpen(); + } + + public function closeWriteChannel() { + return $this->channel->closeWriteChannel(); + } + + public function isOpenForReading() { + return $this->channel->isOpenForReading(); + } + + public function isOpenForWriting() { + return $this->channel->isOpenForWriting(); + } + + protected function readBytes($length) { + $this->throwOnRawByteOperations(); + } + + protected function writeBytes($bytes) { + $this->throwOnRawByteOperations(); + } + + protected function getReadSockets() { + return $this->channel->getReadSockets(); + } + + protected function getWriteSockets() { + return $this->channel->getWriteSockets(); + } + + public function setReadBufferSize($size) { + $this->channel->setReadBufferSize($size); + return $this; + } + + public function isReadBufferEmpty() { + return $this->channel->isReadBufferEmpty(); + } + + public function isWriteBufferEmpty() { + return $this->channel->isWriteBufferEmpty(); + } + + public function getWriteBufferSize() { + return $this->channel->getWriteBufferSize(); + } + + public function flush() { + $this->channel->flush(); + return $this; + } + + protected function getUnderlyingChannel() { + return $this->channel; + } + + private function throwOnRawByteOperations() { + + // NOTE: You should only be able to end up here if you subclass this class + // and implement your subclass incorrectly, since the byte methods are + // protected. + + throw new Exception( + pht( + 'Do not call %s or %s directly on a %s. Instead, call %s or %s.', + 'readBytes()', + 'writeBytes()', + __CLASS__, + 'read()', + 'write()')); + } + +} diff --git a/src/channel/PhutilExecChannel.php b/src/channel/PhutilExecChannel.php new file mode 100644 index 00000000..0d4e722b --- /dev/null +++ b/src/channel/PhutilExecChannel.php @@ -0,0 +1,173 @@ +write("GET / HTTP/1.0\n\n"); + * while (true) { + * echo $channel->read(); + * + * PhutilChannel::waitForAny(array($channel)); + * if (!$channel->update()) { + * // Break out of the loop when the channel closes. + * break; + * } + * } + * + * This script makes an HTTP request to "example.com". This example is heavily + * contrived. In most cases, @{class:ExecFuture} and other futures constructs + * offer a much easier way to solve problems which involve system commands, and + * @{class:HTTPFuture} and other HTTP constructs offer a much easier way to + * solve problems which involve HTTP. + * + * @{class:PhutilExecChannel} is generally useful only when a program acts like + * a server but performs I/O on stdin/stdout, and you need to act like a client + * or interact with the program at the same time as you manage traditional + * socket connections. Examples are Mercurial operating in "cmdserve" mode, git + * operating in "receive-pack" mode, etc. It is unlikely that any reasonable + * use of this class is concise enough to make a short example out of, so you + * get a contrived one instead. + * + * See also @{class:PhutilSocketChannel}, for a similar channel that uses + * sockets for I/O. + * + * Since @{class:ExecFuture} already supports buffered I/O and socket selection, + * the implementation of this class is fairly straightforward. + * + * @task construct Construction + */ +final class PhutilExecChannel extends PhutilChannel { + + private $future; + private $stderrHandler; + + +/* -( Construction )------------------------------------------------------- */ + + + /** + * Construct an exec channel from a @{class:ExecFuture}. The future should + * **NOT** have been started yet (e.g., with `isReady()` or `start()`), + * because @{class:ExecFuture} closes stdin by default when futures start. + * If stdin has been closed, you will be unable to write on the channel. + * + * @param ExecFuture Future to use as an underlying I/O source. + * @task construct + */ + public function __construct(ExecFuture $future) { + parent::__construct(); + + // Make an empty write to keep the stdin pipe open. By default, futures + // close this pipe when they start. + $future->write('', $keep_pipe = true); + + // Start the future so that reads and writes work immediately. + $future->isReady(); + + $this->future = $future; + } + + public function __destruct() { + if (!$this->future->isReady()) { + $this->future->resolveKill(); + } + } + + public function update() { + $this->future->isReady(); + return parent::update(); + } + + public function isOpen() { + return !$this->future->isReady(); + } + + protected function readBytes($length) { + list($stdout, $stderr) = $this->future->read(); + $this->future->discardBuffers(); + + if (strlen($stderr)) { + if ($this->stderrHandler) { + call_user_func($this->stderrHandler, $this, $stderr); + } else { + throw new Exception( + pht('Unexpected output to stderr on exec channel: %s', $stderr)); + } + } + + return $stdout; + } + + public function write($bytes) { + $this->future->write($bytes, $keep_pipe = true); + } + + public function closeWriteChannel() { + $this->future->write('', $keep_pipe = false); + } + + protected function writeBytes($bytes) { + throw new Exception(pht('%s can not write bytes directly!', 'ExecFuture')); + } + + protected function getReadSockets() { + return $this->future->getReadSockets(); + } + + protected function getWriteSockets() { + return $this->future->getWriteSockets(); + } + + public function isReadBufferEmpty() { + // Check both the channel and future read buffers, since either could have + // data. + return parent::isReadBufferEmpty() && $this->future->isReadBufferEmpty(); + } + + public function setReadBufferSize($size) { + // NOTE: We may end up using 2x the buffer size here, one inside + // ExecFuture and one inside the Channel. We could tune this eventually, but + // it should be fine for now. + parent::setReadBufferSize($size); + $this->future->setReadBufferSize($size); + return $this; + } + + public function isWriteBufferEmpty() { + return $this->future->isWriteBufferEmpty(); + } + + public function getWriteBufferSize() { + return $this->future->getWriteBufferSize(); + } + + /** + * If the wrapped @{class:ExecFuture} outputs data to stderr, we normally + * throw an exception. Instead, you can provide a callback handler that will + * be invoked and passed the data. It should have this signature: + * + * function f(PhutilExecChannel $channel, $stderr) { + * // ... + * } + * + * The `$channel` will be this channel object, and `$stderr` will be a string + * with bytes received over stderr. + * + * You can set a handler which does nothing to effectively ignore and discard + * any output on stderr. + * + * @param callable Handler to invoke when stderr data is received. + * @return this + */ + public function setStderrHandler($handler) { + $this->stderrHandler = $handler; + return $this; + } + +} diff --git a/src/channel/PhutilJSONProtocolChannel.php b/src/channel/PhutilJSONProtocolChannel.php new file mode 100644 index 00000000..30d2a58e --- /dev/null +++ b/src/channel/PhutilJSONProtocolChannel.php @@ -0,0 +1,94 @@ + + * + * ...where is an 8-character, zero-padded integer written as a string. + * For example, this is a valid message: + * + * 00000015{"key":"value"} + * + * @task protocol + */ + protected function encodeMessage($message) { + $message = json_encode($message); + $len = sprintf( + '%0'.self::SIZE_LENGTH.'.'.self::SIZE_LENGTH.'d', + strlen($message)); + return "{$len}{$message}"; + } + + + /** + * Decode a message received from the other end of the channel. Messages are + * decoded as associative arrays. + * + * @task protocol + */ + protected function decodeStream($data) { + $this->buf .= $data; + + $objects = array(); + while (strlen($this->buf) >= $this->byteLengthOfNextChunk) { + switch ($this->mode) { + case self::MODE_LENGTH: + $len = substr($this->buf, 0, self::SIZE_LENGTH); + $this->buf = substr($this->buf, self::SIZE_LENGTH); + + $this->mode = self::MODE_OBJECT; + $this->byteLengthOfNextChunk = (int)$len; + break; + case self::MODE_OBJECT: + $data = substr($this->buf, 0, $this->byteLengthOfNextChunk); + $this->buf = substr($this->buf, $this->byteLengthOfNextChunk); + + try { + $objects[] = phutil_json_decode($data); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Failed to decode JSON object.'), + $ex); + } + + $this->mode = self::MODE_LENGTH; + $this->byteLengthOfNextChunk = self::SIZE_LENGTH; + break; + } + } + + return $objects; + } + +} diff --git a/src/channel/PhutilLogFileChannel.php b/src/channel/PhutilLogFileChannel.php new file mode 100644 index 00000000..ecc9cc17 --- /dev/null +++ b/src/channel/PhutilLogFileChannel.php @@ -0,0 +1,41 @@ +logfile = fopen($path, 'a'); + $this->log('--- '.getmypid().' ---'); + return $this; + } + + public function read() { + $buffer = parent::read(); + + if (strlen($buffer)) { + $this->log('>>> '.phutil_loggable_string($buffer)); + } + + return $buffer; + } + + public function write($message) { + if (strlen($message)) { + $this->log('<<< '.phutil_loggable_string($message)); + } + + return parent::write($message); + } + + private function log($message) { + if ($this->logfile) { + fwrite($this->logfile, $message."\n"); + } + } + +} diff --git a/src/channel/PhutilMetricsChannel.php b/src/channel/PhutilMetricsChannel.php new file mode 100644 index 00000000..083e1d1a --- /dev/null +++ b/src/channel/PhutilMetricsChannel.php @@ -0,0 +1,85 @@ +bytesWritten; + } + + /** + * Get the number of bytes that have been read from the channel. This excludes + * any bytes which have been received but not actually read by anything, and + * thus may underreport compared to actual activity on the wire. + * + * @return int Bytes read. + * @task metrics + */ + public function getBytesRead() { + return $this->bytesRead; + } + + + /** + * Get the elapsed wall time since this channel opened. + * + * @return float Wall time, in seconds. + * @task metrics + */ + public function getWallTime() { + return microtime(true) - $this->startTime; + } + + +/* -( Implementation )----------------------------------------------------- */ + + + /** + * @task impl + */ + protected function didConstruct() { + $this->startTime = microtime(true); + } + + + /** + * @task impl + */ + public function read() { + $buffer = parent::read(); + $this->bytesRead += strlen($buffer); + return $buffer; + } + + + /** + * @task impl + */ + public function write($message) { + $this->bytesWritten += strlen($message); + return parent::write($message); + } + +} diff --git a/src/channel/PhutilPHPObjectProtocolChannel.php b/src/channel/PhutilPHPObjectProtocolChannel.php new file mode 100644 index 00000000..d83d1747 --- /dev/null +++ b/src/channel/PhutilPHPObjectProtocolChannel.php @@ -0,0 +1,90 @@ + + * + * ...where is a 4-byte unsigned big-endian integer. + * + * @task protocol + */ + protected function encodeMessage($message) { + $message = serialize($message); + $len = pack('N', strlen($message)); + return "{$len}{$message}"; + } + + + /** + * Decode a message received from the other end of the channel. + * + * @task protocol + */ + protected function decodeStream($data) { + $this->buf .= $data; + + $objects = array(); + while (strlen($this->buf) >= $this->byteLengthOfNextChunk) { + switch ($this->mode) { + case self::MODE_LENGTH: + $len = substr($this->buf, 0, self::SIZE_LENGTH); + $this->buf = substr($this->buf, self::SIZE_LENGTH); + + $this->mode = self::MODE_OBJECT; + $this->byteLengthOfNextChunk = head(unpack('N', $len)); + break; + case self::MODE_OBJECT: + $data = substr($this->buf, 0, $this->byteLengthOfNextChunk); + $this->buf = substr($this->buf, $this->byteLengthOfNextChunk); + + $obj = @unserialize($data); + if ($obj === false) { + throw new Exception(pht('Failed to unserialize object: %s', $data)); + } else { + $objects[] = $obj; + } + + $this->mode = self::MODE_LENGTH; + $this->byteLengthOfNextChunk = self::SIZE_LENGTH; + break; + } + } + + return $objects; + } + +} diff --git a/src/channel/PhutilProtocolChannel.php b/src/channel/PhutilProtocolChannel.php new file mode 100644 index 00000000..2e018fd8 --- /dev/null +++ b/src/channel/PhutilProtocolChannel.php @@ -0,0 +1,139 @@ +decodeStream($data); + foreach ($messages as $message) { + $this->addMessage($message); + } + } + + if (!$this->messages) { + return null; + } + + return array_shift($this->messages); + } + + + /** + * Write a message to the channel. + * + * @param wild Some message. + * @return this + * + * @task io + */ + public function write($message) { + $bytes = $this->encodeMessage($message); + return parent::write($bytes); + } + + + /** + * Add a message to the queue. While you normally do not need to do this, + * you can use it to inject out-of-band messages. + * + * @param wild Some message. + * @return this + * + * @task io + */ + public function addMessage($message) { + $this->messages[] = $message; + return $this; + } + + +/* -( Protocol Implementation )-------------------------------------------- */ + + + /** + * Encode a message for transmission. + * + * @param wild Some message. + * @return string The message serialized into a wire format for + * transmission. + * + * @task protocol + */ + abstract protected function encodeMessage($message); + + + /** + * Decode bytes from the underlying channel into zero or more complete + * messages. The messages should be returned. + * + * This method is called as data is available. It will receive incoming + * data only once, and must buffer any data which represents only part of + * a message. Once a complete message is received, it can return the message + * and discard that part of the buffer. + * + * Generally, a protocol channel should maintain a read buffer, implement + * a parser in this method, and store parser state on the object to be able + * to process incoming data in small chunks. + * + * @param string One or more bytes from the underlying channel. + * @return list Zero or more parsed messages. + * + * @task protocol + */ + abstract protected function decodeStream($data); + + +/* -( Waiting for Activity )----------------------------------------------- */ + + + /** + * Wait for a message, blocking until one is available. + * + * @return wild A message. + * + * @task wait + */ + public function waitForMessage() { + while (true) { + $is_open = $this->update(); + $message = $this->read(); + if ($message !== null) { + return $message; + } + + if (!$is_open) { + break; + } + + self::waitForAny(array($this)); + } + + throw new Exception(pht('Channel closed while waiting for message!')); + } + +} diff --git a/src/channel/PhutilSocketChannel.php b/src/channel/PhutilSocketChannel.php new file mode 100644 index 00000000..4bd2a47a --- /dev/null +++ b/src/channel/PhutilSocketChannel.php @@ -0,0 +1,192 @@ +readSocket = $read_socket; + if ($write_socket) { + $this->writeSocket = $write_socket; + } else { + $this->writeSocket = $read_socket; + $this->isSingleSocket = true; + } + } + + public function __destruct() { + $this->closeSockets(); + } + + + /** + * Creates a pair of socket channels that are connected to each other. This + * is mostly useful for writing unit tests of, e.g., protocol channels. + * + * list($x, $y) = PhutilSocketChannel::newChannelPair(); + * + * @task construct + */ + public static function newChannelPair() { + $sockets = null; + + $domain = phutil_is_windows() ? STREAM_PF_INET : STREAM_PF_UNIX; + $pair = stream_socket_pair($domain, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP); + if (!$pair) { + throw new Exception(pht('%s failed!', 'stream_socket_pair()')); + } + + $x = new PhutilSocketChannel($pair[0]); + $y = new PhutilSocketChannel($pair[1]); + + return array($x, $y); + } + + public function isOpen() { + return ($this->isOpenForReading() || $this->isOpenForWriting()); + } + + public function isOpenForReading() { + return (bool)$this->readSocket; + } + + public function isOpenForWriting() { + return (bool)$this->writeSocket; + } + + protected function readBytes($length) { + $socket = $this->readSocket; + if (!$socket) { + return ''; + } + + $data = @fread($socket, min($length, 64 * 1024)); + + if ($data === false) { + $this->closeReadSocket(); + $data = ''; + } + + // NOTE: fread() continues returning empty string after the socket is + // closed, we need to check for EOF explicitly. + if ($data === '') { + if (feof($socket)) { + $this->closeReadSocket(); + } + } + + return $data; + } + + protected function writeBytes($bytes) { + $socket = $this->writeSocket; + if (!$socket) { + return 0; + } + + $len = phutil_fwrite_nonblocking_stream($socket, $bytes); + if ($len === false) { + $this->closeWriteSocket(); + return 0; + } + return $len; + } + + protected function getReadSockets() { + if ($this->readSocket) { + return array($this->readSocket); + } + return array(); + } + + protected function getWriteSockets() { + if ($this->writeSocket) { + return array($this->writeSocket); + } else { + return array(); + } + } + + private function closeReadSocket() { + $this->closeOneSocket($this->readSocket); + $this->readSocket = null; + if ($this->isSingleSocket) { + $this->writeSocket = null; + } + } + + private function closeWriteSocket() { + $this->closeOneSocket($this->writeSocket); + $this->writeSocket = null; + if ($this->isSingleSocket) { + $this->readSocket = null; + } + } + + public function closeWriteChannel() { + $this->closeWriteSocket(); + } + + private function closeOneSocket($socket) { + if (!$socket) { + return; + } + // We should also stream_socket_shutdown() here but HHVM throws errors + // with it (for example 'Unexpected object type PlainFile'). We depend + // just on fclose() until it is fixed. + @fclose($socket); + } + + private function closeSockets() { + $this->closeReadSocket(); + $this->closeWriteSocket(); + } + +} diff --git a/src/channel/__tests__/PhutilChannelTestCase.php b/src/channel/__tests__/PhutilChannelTestCase.php new file mode 100644 index 00000000..3b7ccbab --- /dev/null +++ b/src/channel/__tests__/PhutilChannelTestCase.php @@ -0,0 +1,45 @@ +write($str_len_8); + while (true) { + $x->update(); + $y->update(); + $read = $y->read(); + if (strlen($read)) { + break; + } + } + + // We expect to read the entire message. + $this->assertEqual($str_len_8, $read); + + + // Again, with a read buffer limit. + + $y->setReadBufferSize(4); + $x->write($str_len_8); + + while (true) { + $x->update(); + $y->update(); + $read = $y->read(); + if (strlen($read)) { + break; + } + } + + // We expect to see only the first 4 bytes of the message. + $this->assertEqual($str_len_4, $read); + } + +} diff --git a/src/channel/__tests__/PhutilJSONProtocolChannelTestCase.php b/src/channel/__tests__/PhutilJSONProtocolChannelTestCase.php new file mode 100644 index 00000000..3bd0c124 --- /dev/null +++ b/src/channel/__tests__/PhutilJSONProtocolChannelTestCase.php @@ -0,0 +1,26 @@ + mt_rand(), + 'list' => array(1, 2, 3), + 'null' => null, + ); + + $xp->write($dict); + $xp->flush(); + $result = $yp->waitForMessage(); + + $this->assertEqual( + $dict, + $result, + pht('Values are identical.')); + } + +} diff --git a/src/channel/__tests__/PhutilPHPObjectProtocolChannelTestCase.php b/src/channel/__tests__/PhutilPHPObjectProtocolChannelTestCase.php new file mode 100644 index 00000000..c9373918 --- /dev/null +++ b/src/channel/__tests__/PhutilPHPObjectProtocolChannelTestCase.php @@ -0,0 +1,66 @@ + mt_rand(), + ); + + $xp->write($object); + $xp->flush(); + $result = $yp->waitForMessage(); + + $this->assertTrue( + (array)$object === (array)$result, + pht('Values are identical.')); + + $this->assertFalse( + $object === $result, + pht('Objects are not the same.')); + } + + public function testCloseSocketWriteChannel() { + list($x, $y) = PhutilSocketChannel::newChannelPair(); + $xp = new PhutilPHPObjectProtocolChannel($x); + $yp = new PhutilPHPObjectProtocolChannel($y); + + $yp->closeWriteChannel(); + $yp->update(); + + // NOTE: This test is more broad than the implementation needs to be. A + // better test would be to verify that this throws an exception: + // + // $xp->waitForMessage(); + // + // However, if the test breaks, that method will hang forever instead of + // returning, which would be hard to diagnose. Since the current + // implementation shuts down the entire channel, just test for that. + + $this->assertFalse($xp->update(), pht('Expected channel to close.')); + } + + public function testCloseExecWriteChannel() { + $future = new ExecFuture('cat'); + + // If this test breaks, we want to explode, not hang forever. + $future->setTimeout(5); + + $exec_channel = new PhutilExecChannel($future); + $exec_channel->write('quack'); + $exec_channel->closeWriteChannel(); + + // If `closeWriteChannel()` did what it is supposed to, this will just + // echo "quack" and exit with no error code. If the channel did not close, + // this will time out after 5 seconds and throw. + $future->resolvex(); + + $this->assertTrue(true); + } + + +} diff --git a/src/conduit/ConduitClient.php b/src/conduit/ConduitClient.php new file mode 100644 index 00000000..065a42ab --- /dev/null +++ b/src/conduit/ConduitClient.php @@ -0,0 +1,395 @@ +connectionID; + } + + public function __construct($uri) { + $this->uri = new PhutilURI($uri); + if (!strlen($this->uri->getDomain())) { + throw new Exception( + pht("Conduit URI '%s' must include a valid host.", $uri)); + } + $this->host = $this->uri->getDomain(); + } + + /** + * Override the domain specified in the service URI and provide a specific + * host identity. + * + * This can be used to connect to a specific node in a cluster environment. + */ + public function setHost($host) { + $this->host = $host; + return $this; + } + + public function getHost() { + return $this->host; + } + + public function setConduitToken($conduit_token) { + $this->conduitToken = $conduit_token; + return $this; + } + + public function getConduitToken() { + return $this->conduitToken; + } + + public function setOAuthToken($oauth_token) { + $this->oauthToken = $oauth_token; + return $this; + } + + public function callMethodSynchronous($method, array $params) { + return $this->callMethod($method, $params)->resolve(); + } + + public function didReceiveResponse($method, $data) { + if ($method == 'conduit.connect') { + $this->sessionKey = idx($data, 'sessionKey'); + $this->connectionID = idx($data, 'connectionID'); + } + return $data; + } + + public function setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + public function setSigningKeys( + $public_key, + PhutilOpaqueEnvelope $private_key) { + + $this->publicKey = $public_key; + $this->privateKey = $private_key; + return $this; + } + + public function callMethod($method, array $params) { + + $meta = array(); + + if ($this->sessionKey) { + $meta['sessionKey'] = $this->sessionKey; + } + + if ($this->connectionID) { + $meta['connectionID'] = $this->connectionID; + } + + if ($method == 'conduit.connect') { + $certificate = idx($params, 'certificate'); + if ($certificate) { + $token = time(); + $params['authToken'] = $token; + $params['authSignature'] = sha1($token.$certificate); + } + unset($params['certificate']); + } + + if ($this->privateKey && $this->publicKey) { + $meta['auth.type'] = self::AUTH_ASYMMETRIC; + $meta['auth.key'] = $this->publicKey; + $meta['auth.host'] = $this->getHostStringForSignature(); + + $signature = $this->signRequest($method, $params, $meta); + $meta['auth.signature'] = $signature; + } + + if ($this->conduitToken) { + $meta['token'] = $this->conduitToken; + } + + if ($this->oauthToken) { + $meta['access_token'] = $this->oauthToken; + } + + if ($meta) { + $params['__conduit__'] = $meta; + } + + $uri = id(clone $this->uri)->setPath('/api/'.$method); + + $data = array( + 'params' => json_encode($params), + 'output' => 'json', + + // This is a hint to Phabricator that the client expects a Conduit + // response. It is not necessary, but provides better error messages in + // some cases. + '__conduit__' => true, + ); + + // Always use the cURL-based HTTPSFuture, for proxy support and other + // protocol edge cases that HTTPFuture does not support. + $core_future = new HTTPSFuture($uri, $data); + $core_future->addHeader('Host', $this->getHostStringForHeader()); + + $core_future->setMethod('POST'); + $core_future->setTimeout($this->timeout); + + if ($this->username !== null) { + $core_future->setHTTPBasicAuthCredentials( + $this->username, + $this->password); + } + + return id(new ConduitFuture($core_future)) + ->setClient($this, $method); + } + + public function setBasicAuthCredentials($username, $password) { + $this->username = $username; + $this->password = new PhutilOpaqueEnvelope($password); + return $this; + } + + private function getHostStringForHeader() { + return $this->newHostString(false); + } + + private function getHostStringForSignature() { + return $this->newHostString(true); + } + + /** + * Build a string describing the host for this request. + * + * This method builds strings in two modes: with explicit ports for request + * signing (which always include the port number) and with implicit ports + * for use in the "Host:" header of requests (which omit the port number if + * the port is the same as the default port for the protocol). + * + * This implicit port behavior is similar to what browsers do, so it is less + * likely to get us into trouble with webserver configurations. + * + * @param bool True to include the port explicitly. + * @return string String describing the host for the request. + */ + private function newHostString($with_explicit_port) { + $host = $this->getHost(); + + $uri = new PhutilURI($this->uri); + $protocol = $uri->getProtocol(); + $port = $uri->getPort(); + + $implicit_ports = array( + 'https' => 443, + ); + $default_port = 80; + + $implicit_port = idx($implicit_ports, $protocol, $default_port); + + if ($with_explicit_port) { + if (!$port) { + $port = $implicit_port; + } + } else { + if ($port == $implicit_port) { + $port = null; + } + } + + if (!$port) { + $result = $host; + } else { + $result = $host.':'.$port; + } + + return $result; + } + + private function signRequest( + $method, + array $params, + array $meta) { + + $input = self::encodeRequestDataForSignature( + $method, + $params, + $meta); + + $signature = null; + $result = openssl_sign( + $input, + $signature, + $this->privateKey->openEnvelope()); + if (!$result) { + throw new Exception( + pht('Unable to sign Conduit request with signing key.')); + } + + return self::SIGNATURE_CONSIGN_1.base64_encode($signature); + } + + public static function verifySignature( + $method, + array $params, + array $meta, + $openssl_public_key) { + + $auth_type = idx($meta, 'auth.type'); + switch ($auth_type) { + case self::AUTH_ASYMMETRIC: + break; + default: + throw new Exception( + pht( + 'Unable to verify request signature, specified "%s" '. + '("%s") is unknown.', + 'auth.type', + $auth_type)); + } + + $public_key = idx($meta, 'auth.key'); + if (!strlen($public_key)) { + throw new Exception( + pht( + 'Unable to verify request signature, no "%s" present in '. + 'request protocol information.', + 'auth.key')); + } + + $signature = idx($meta, 'auth.signature'); + if (!strlen($signature)) { + throw new Exception( + pht( + 'Unable to verify request signature, no "%s" present '. + 'in request protocol information.', + 'auth.signature')); + } + + $prefix = self::SIGNATURE_CONSIGN_1; + if (strncmp($signature, $prefix, strlen($prefix)) !== 0) { + throw new Exception( + pht( + 'Unable to verify request signature, signature format is not '. + 'known.')); + } + $signature = substr($signature, strlen($prefix)); + + $input = self::encodeRequestDataForSignature( + $method, + $params, + $meta); + + $signature = base64_decode($signature); + + $trap = new PhutilErrorTrap(); + $result = @openssl_verify( + $input, + $signature, + $openssl_public_key); + $err = $trap->getErrorsAsString(); + $trap->destroy(); + + if ($result === 1) { + // Signature is good. + return true; + } else if ($result === 0) { + // Signature is bad. + throw new Exception( + pht( + 'Request signature verification failed: signature is not correct.')); + } else { + // Some kind of error. + if (strlen($err)) { + throw new Exception( + pht( + 'OpenSSL encountered an error verifying the request signature: %s', + $err)); + } else { + throw new Exception( + pht( + 'OpenSSL encountered an unknown error verifying the request: %s', + $err)); + } + } + } + + private static function encodeRequestDataForSignature( + $method, + array $params, + array $meta) { + + unset($meta['auth.signature']); + + $structure = array( + 'method' => $method, + 'protocol' => $meta, + 'parameters' => $params, + ); + + return self::encodeRawDataForSignature($structure); + } + + public static function encodeRawDataForSignature($data) { + $out = array(); + + if (is_array($data)) { + if (phutil_is_natural_list($data)) { + $out[] = 'A'; + $out[] = count($data); + $out[] = ':'; + foreach ($data as $value) { + $out[] = self::encodeRawDataForSignature($value); + } + } else { + ksort($data); + $out[] = 'O'; + $out[] = count($data); + $out[] = ':'; + foreach ($data as $key => $value) { + $out[] = self::encodeRawDataForSignature($key); + $out[] = self::encodeRawDataForSignature($value); + } + } + } else if (is_string($data)) { + $out[] = 'S'; + $out[] = strlen($data); + $out[] = ':'; + $out[] = $data; + } else if (is_int($data)) { + $out[] = 'I'; + $out[] = strlen((string)$data); + $out[] = ':'; + $out[] = (string)$data; + } else if (is_null($data)) { + $out[] = 'N'; + $out[] = ':'; + } else if ($data === true) { + $out[] = 'B1:'; + } else if ($data === false) { + $out[] = 'B0:'; + } else { + throw new Exception( + pht( + 'Unexpected data type in request data: %s.', + gettype($data))); + } + + return implode('', $out); + } + +} diff --git a/src/conduit/ConduitClientException.php b/src/conduit/ConduitClientException.php new file mode 100644 index 00000000..87d93c88 --- /dev/null +++ b/src/conduit/ConduitClientException.php @@ -0,0 +1,16 @@ +errorCode = $code; + } + + public function getErrorCode() { + return $this->errorCode; + } + +} diff --git a/src/conduit/ConduitFuture.php b/src/conduit/ConduitFuture.php new file mode 100644 index 00000000..f6c192b6 --- /dev/null +++ b/src/conduit/ConduitFuture.php @@ -0,0 +1,76 @@ +client = $client; + $this->conduitMethod = $method; + return $this; + } + + public function isReady() { + if ($this->profilerCallID === null) { + $profiler = PhutilServiceProfiler::getInstance(); + + $this->profilerCallID = $profiler->beginServiceCall( + array( + 'type' => 'conduit', + 'method' => $this->conduitMethod, + 'size' => $this->getProxiedFuture()->getHTTPRequestByteLength(), + )); + } + + return parent::isReady(); + } + + protected function didReceiveResult($result) { + if ($this->profilerCallID !== null) { + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall( + $this->profilerCallID, + array()); + } + + list($status, $body, $headers) = $result; + if ($status->isError()) { + throw $status; + } + + $raw = $body; + + $shield = 'for(;;);'; + if (!strncmp($raw, $shield, strlen($shield))) { + $raw = substr($raw, strlen($shield)); + } + + $data = null; + try { + $data = phutil_json_decode($raw); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht( + 'Host returned HTTP/200, but invalid JSON data in response to '. + 'a Conduit method call.'), + $ex); + } + + if ($data['error_code']) { + throw new ConduitClientException( + $data['error_code'], + $data['error_info']); + } + + $result = $data['result']; + + $result = $this->client->didReceiveResponse( + $this->conduitMethod, + $result); + + return $result; + } + +} diff --git a/src/conduit/__tests__/ConduitClientTestCase.php b/src/conduit/__tests__/ConduitClientTestCase.php new file mode 100644 index 00000000..1a0d3100 --- /dev/null +++ b/src/conduit/__tests__/ConduitClientTestCase.php @@ -0,0 +1,34 @@ + array( + 'nothing' => null, + 'emptystring' => '', + ), + 'empty' => array( + ), + 'list' => array( + 15, + 'quack', + true, + false, + ), + 'a' => array( + 'key' => 'value', + 'key2' => 'value2', + ), + ); + + $expect = + 'O4:S1:aO2:S3:keyS5:valueS4:key2S6:value2S5:emptyA0:S4:listA4:I2:15'. + 'S5:quackB1:B0:S1:zO2:S11:emptystringS0:S7:nothingN:'; + + $this->assertEqual( + $expect, + ConduitClient::encodeRawDataForSignature($input)); + } + +} diff --git a/src/console/PhutilConsole.php b/src/console/PhutilConsole.php new file mode 100644 index 00000000..5d646f7c --- /dev/null +++ b/src/console/PhutilConsole.php @@ -0,0 +1,295 @@ +disabledTypes = new PhutilArrayWithDefaultValue(); + } + + + /** + * Get the current console. If there's no active console, a new local console + * is created (see @{method:newLocalConsole} for details). You can change the + * active console with @{method:setConsole}. + * + * @return PhutilConsole Active console. + * @task construct + */ + public static function getConsole() { + if (empty(self::$console)) { + self::setConsole(self::newLocalConsole()); + } + return self::$console; + } + + + /** + * Set the active console. + * + * @param PhutilConsole + * @return void + * @task construct + */ + public static function setConsole(PhutilConsole $console) { + self::$console = $console; + } + + + /** + * Create a new console attached to stdin/stdout/stderr of this process. + * This is how consoles normally work -- for instance, writing output with + * @{method:writeOut} prints directly to stdout. If you don't create a + * console explicitly, a new local console is created for you. + * + * @return PhutilConsole A new console which operates on the pipes of this + * process. + * @task construct + */ + public static function newLocalConsole() { + return self::newConsoleForServer(new PhutilConsoleServer()); + } + + + public static function newConsoleForServer(PhutilConsoleServer $server) { + $console = new PhutilConsole(); + $console->server = $server; + return $console; + } + + + public static function newRemoteConsole() { + $io_channel = new PhutilSocketChannel( + fopen('php://stdin', 'r'), + fopen('php://stdout', 'w')); + $protocol_channel = new PhutilPHPObjectProtocolChannel($io_channel); + + $console = new PhutilConsole(); + $console->channel = $protocol_channel; + + return $console; + } + + +/* -( Interfacing with the User )------------------------------------------ */ + + + public function confirm($prompt, $default = false) { + $message = id(new PhutilConsoleMessage()) + ->setType(PhutilConsoleMessage::TYPE_CONFIRM) + ->setData( + array( + 'prompt' => $prompt, + 'default' => $default, + )); + + $this->writeMessage($message); + $response = $this->waitForMessage(); + + return $response->getData(); + } + + public function prompt($prompt, $history = '') { + $message = id(new PhutilConsoleMessage()) + ->setType(PhutilConsoleMessage::TYPE_PROMPT) + ->setData( + array( + 'prompt' => $prompt, + 'history' => $history, + )); + + $this->writeMessage($message); + $response = $this->waitForMessage(); + + return $response->getData(); + } + + public function sendMessage($data) { + $message = id(new PhutilConsoleMessage())->setData($data); + return $this->writeMessage($message); + } + + public function writeOut($pattern /* , ... */) { + $args = func_get_args(); + return $this->writeTextMessage(PhutilConsoleMessage::TYPE_OUT, $args); + } + + public function writeErr($pattern /* , ... */) { + $args = func_get_args(); + return $this->writeTextMessage(PhutilConsoleMessage::TYPE_ERR, $args); + } + + public function writeLog($pattern /* , ... */) { + $args = func_get_args(); + return $this->writeTextMessage(PhutilConsoleMessage::TYPE_LOG, $args); + } + + public function beginRedirectOut() { + // We need as small buffer as possible. 0 means infinite, 1 means 4096 in + // PHP < 5.4.0. + ob_start(array($this, 'redirectOutCallback'), 2); + $this->flushing = true; + } + + public function endRedirectOut() { + $this->flushing = false; + ob_end_flush(); + } + + +/* -( Internals )---------------------------------------------------------- */ + + // Must be public because it is called from output buffering. + public function redirectOutCallback($string) { + if (strlen($string)) { + $this->flushing = false; + $this->writeOut('%s', $string); + $this->flushing = true; + } + return ''; + } + + private function writeTextMessage($type, array $argv) { + + $message = id(new PhutilConsoleMessage()) + ->setType($type) + ->setData($argv); + + $this->writeMessage($message); + + return $this; + } + + private function writeMessage(PhutilConsoleMessage $message) { + if ($this->disabledTypes[$message->getType()]) { + return $this; + } + + if ($this->flushing) { + ob_flush(); + } + if ($this->channel) { + $this->channel->write($message); + $this->channel->flush(); + } else { + $response = $this->server->handleMessage($message); + if ($response) { + $this->messages[] = $response; + } + } + return $this; + } + + private function waitForMessage() { + if ($this->channel) { + $message = $this->channel->waitForMessage(); + } else if ($this->messages) { + $message = array_shift($this->messages); + } else { + throw new Exception( + pht( + '%s called with no messages!', + __FUNCTION__.'()')); + } + + return $message; + } + + public function getServer() { + return $this->server; + } + + private function disableMessageType($type) { + $this->disabledTypes[$type] += 1; + return $this; + } + + private function enableMessageType($type) { + if ($this->disabledTypes[$type] == 0) { + throw new Exception(pht("Message type '%s' is already enabled!", $type)); + } + $this->disabledTypes[$type] -= 1; + return $this; + } + + public function disableOut() { + return $this->disableMessageType(PhutilConsoleMessage::TYPE_OUT); + } + + public function enableOut() { + return $this->enableMessageType(PhutilConsoleMessage::TYPE_OUT); + } + + public function isLogEnabled() { + $message = id(new PhutilConsoleMessage()) + ->setType(PhutilConsoleMessage::TYPE_ENABLED) + ->setData( + array( + 'which' => PhutilConsoleMessage::TYPE_LOG, + )); + + $this->writeMessage($message); + $response = $this->waitForMessage(); + + return $response->getData(); + } + + public function isErrATTY() { + $message = id(new PhutilConsoleMessage()) + ->setType(PhutilConsoleMessage::TYPE_TTY) + ->setData( + array( + 'which' => PhutilConsoleMessage::TYPE_ERR, + )); + + $this->writeMessage($message); + $response = $this->waitForMessage(); + + return $response->getData(); + } + + public function getErrCols() { + $message = id(new PhutilConsoleMessage()) + ->setType(PhutilConsoleMessage::TYPE_COLS) + ->setData( + array( + 'which' => PhutilConsoleMessage::TYPE_ERR, + )); + + $this->writeMessage($message); + $response = $this->waitForMessage(); + + return $response->getData(); + } + + +} diff --git a/src/console/PhutilConsoleFormatter.php b/src/console/PhutilConsoleFormatter.php new file mode 100644 index 00000000..d380c961 --- /dev/null +++ b/src/console/PhutilConsoleFormatter.php @@ -0,0 +1,98 @@ + 0, + 'red' => 1, + 'green' => 2, + 'yellow' => 3, + 'blue' => 4, + 'magenta' => 5, + 'cyan' => 6, + 'white' => 7, + 'default' => 9, + ); + + private static $disableANSI; + + public static function disableANSI($disable) { + self::$disableANSI = $disable; + } + + public static function getDisableANSI() { + if (self::$disableANSI === null) { + $term = phutil_utf8_strtolower(getenv('TERM')); + // ansicon enables ANSI support on Windows + if (!$term && getenv('ANSICON')) { + $term = 'ansi'; + } + + if (phutil_is_windows() && $term !== 'cygwin' && $term !== 'ansi') { + self::$disableANSI = true; + } else if (!defined('STDOUT')) { + self::$disableANSI = true; + } else if (function_exists('posix_isatty') && !posix_isatty(STDOUT)) { + self::$disableANSI = true; + } else { + self::$disableANSI = false; + } + } + return self::$disableANSI; + } + + public static function formatString($format /* ... */) { + $args = func_get_args(); + $args[0] = self::interpretFormat($args[0]); + return call_user_func_array('sprintf', $args); + } + + public static function replaceColorCode($matches) { + $codes = self::$colorCodes; + $offset = 30 + $codes[$matches[2]]; + $default = 39; + if ($matches[1] == 'bg') { + $offset += 10; + $default += 10; + } + + return chr(27).'['.$offset.'m'.$matches[3].chr(27).'['.$default.'m'; + } + + public static function interpretFormat($format) { + $colors = implode('|', array_keys(self::$colorCodes)); + + // Sequence should be preceded by start-of-string or non-backslash + // escaping. + $bold_re = '/(?(.*)@sU', + '\3', + $format); + } else { + $esc = chr(27); + $bold = $esc.'[1m'.'\\1'.$esc.'[m'; + $underline = $esc.'[4m'.'\\1'.$esc.'[m'; + $invert = $esc.'[7m'.'\\1'.$esc.'[m'; + + $format = preg_replace($bold_re, $bold, $format); + $format = preg_replace($underline_re, $underline, $format); + $format = preg_replace($invert_re, $invert, $format); + $format = preg_replace_callback( + '@<(fg|bg):('.$colors.')>(.*)@sU', + array(__CLASS__, 'replaceColorCode'), + $format); + } + + // Remove backslash escaping + return preg_replace('/\\\\(\*\*.*\*\*|__.*__|##.*##)/sU', '\1', $format); + } + +} diff --git a/src/console/PhutilConsoleMessage.php b/src/console/PhutilConsoleMessage.php new file mode 100644 index 00000000..21debd0e --- /dev/null +++ b/src/console/PhutilConsoleMessage.php @@ -0,0 +1,39 @@ +data = $data; + return $this; + } + + public function getData() { + return $this->data; + } + + public function setType($type) { + $this->type = $type; + return $this; + } + + public function getType() { + return $this->type; + } + +} diff --git a/src/console/PhutilConsoleMetrics.php b/src/console/PhutilConsoleMetrics.php new file mode 100644 index 00000000..6cd30ed7 --- /dev/null +++ b/src/console/PhutilConsoleMetrics.php @@ -0,0 +1,65 @@ +width = false; + + return $this; + } + + public function getTerminalWidth() { + if ($this->width === false) { + $this->width = $this->computeTerminalWidth(); + } + + return $this->width; + } + + private function computeTerminalWidth() { + if (phutil_is_windows()) { + // TODO: Figure out how to do this on Windows. + return null; + } + + $tmp = new TempFile(); + + // NOTE: We can't just execute this because it won't be connected to a TTY + // if we do. + $err = id(new PhutilExecPassthru('tput cols > %s', $tmp)) + ->resolve(); + $stdout = Filesystem::readFile($tmp); + unset($tmp); + + if ($err) { + return null; + } + + $width = (int)trim($stdout); + if ($width > 0) { + return $width; + } + + return null; + } +} diff --git a/src/console/PhutilConsoleProgressBar.php b/src/console/PhutilConsoleProgressBar.php new file mode 100644 index 00000000..17ac2339 --- /dev/null +++ b/src/console/PhutilConsoleProgressBar.php @@ -0,0 +1,179 @@ +setTotal(count($stuff)); + * + * // As you complete the work, update the progress bar. + * foreach ($stuff as $thing) { + * do_stuff($thing); + * $bar->update(1); + * } + * + * // When complete, mark the work done to clear the bar. + * $bar->done(); + * + * The progress bar attempts to account for various special cases, notably: + * + * - If stderr is not a TTY, the bar will not be drawn (for example, if + * it is being piped to a log file). + * - If the Phutil log output is enabled (usually because `--trace` was + * specified), the bar will not be drawn. + * - The bar will be resized to the width of the console if possible. + * + */ +final class PhutilConsoleProgressBar extends Phobject { + + private $work; + private $done; + private $drawn; + private $console; + private $finished; + private $lastUpdate; + private $quiet = false; + + public function setConsole(PhutilConsole $console) { + $this->console = $console; + return $this; + } + + private function getConsole() { + if ($this->console) { + return $this->console; + } + return PhutilConsole::getConsole(); + } + + public function setTotal($work) { + $this->work = $work; + $this->redraw(); + return $this; + } + + public function setQuiet($quiet) { + $this->quiet = $quiet; + return $this; + } + + public function update($work) { + $this->done += $work; + $this->redraw(); + return $this; + } + + private function redraw() { + if ($this->lastUpdate + 0.1 > microtime(true)) { + // We redrew the bar very recently; skip this update. + return $this; + } + + return $this->draw(); + } + + + /** + * Explicitly redraw the bar. + * + * Normally, the progress bar is automatically redrawn periodically, but + * you may want to force it to draw. + * + * For example, we force a draw after pre-filling the bar when resuming + * large file uploads in `arc upload`. Otherwise, the bar may sit at 0% + * until the first chunk completes. + */ + public function draw() { + if ($this->quiet) { + return; + } + + if ($this->finished) { + return; + } + + if (!$this->work) { + // There's no work to be done, so don't draw the bar. + return; + } + + $console = $this->getConsole(); + if ($console->isErrATTY() === false) { + return; + } + + if ($console->isLogEnabled()) { + return; + } + + // Width of the stuff other than the progress bar itself. + $chrome_width = strlen('[] 100.0% '); + + $char_width = $this->getWidth(); + if ($char_width < $chrome_width) { + return; + } + + $this->lastUpdate = microtime(true); + + if (!$this->drawn) { + $this->drawn = true; + } + + $percent = $this->done / $this->work; + + $max_width = $char_width - $chrome_width; + $bar_width = $percent * $max_width; + $bar_int = floor($bar_width); + $bar_frac = $bar_width - $bar_int; + + $frac_map = array( + '', + '-', + '~', + ); + $frac_char = $frac_map[floor($bar_frac * count($frac_map))]; + + $pattern = "[%-{$max_width}.{$max_width}s] % 5s%%"; + $out = sprintf( + $pattern, + str_repeat('=', $bar_int).$frac_char, + sprintf('%.1f', 100 * $percent)); + + $this->eraseLine(); + $console->writeErr('%s', $out); + + return $this; + } + + public function done($clean_exit = true) { + $console = $this->getConsole(); + if ($this->drawn) { + $this->eraseLine(); + if ($clean_exit) { + $console->writeErr("%s\n", pht('Done.')); + } + } + $this->finished = true; + } + + private function eraseLine() { + $string = str_repeat(' ', $this->getWidth()); + + $console = $this->getConsole(); + $console->writeErr("\r%s\r", $string); + } + + private function getWidth() { + $console = $this->getConsole(); + $width = $console->getErrCols(); + return min(nonempty($width, 78), 78); + } + + public function __destruct() { + $this->done($clean_exit = false); + } + +} diff --git a/src/console/PhutilConsoleServer.php b/src/console/PhutilConsoleServer.php new file mode 100644 index 00000000..8ef10026 --- /dev/null +++ b/src/console/PhutilConsoleServer.php @@ -0,0 +1,158 @@ +getData(); + $type = $message->getType(); + + switch ($type) { + + case PhutilConsoleMessage::TYPE_CONFIRM: + $ok = phutil_console_confirm($data['prompt'], !$data['default']); + return $this->buildMessage( + PhutilConsoleMessage::TYPE_INPUT, + $ok); + + case PhutilConsoleMessage::TYPE_PROMPT: + $response = phutil_console_prompt( + $data['prompt'], + idx($data, 'history')); + return $this->buildMessage( + PhutilConsoleMessage::TYPE_INPUT, + $response); + + case PhutilConsoleMessage::TYPE_OUT: + $this->writeText(STDOUT, $data); + return null; + + case PhutilConsoleMessage::TYPE_ERR: + $this->writeText(STDERR, $data); + return null; + + case PhutilConsoleMessage::TYPE_LOG: + if ($this->enableLog) { + $this->writeText(STDERR, $data); + } + return null; + + case PhutilConsoleMessage::TYPE_ENABLED: + switch ($data['which']) { + case PhutilConsoleMessage::TYPE_LOG: + $enabled = $this->enableLog; + break; + default: + $enabled = true; + break; + } + return $this->buildMessage( + PhutilConsoleMessage::TYPE_IS_ENABLED, + $enabled); + + case PhutilConsoleMessage::TYPE_TTY: + case PhutilConsoleMessage::TYPE_COLS: + switch ($data['which']) { + case PhutilConsoleMessage::TYPE_OUT: + $which = STDOUT; + break; + case PhutilConsoleMessage::TYPE_ERR: + $which = STDERR; + break; + } + switch ($type) { + case PhutilConsoleMessage::TYPE_TTY: + if (function_exists('posix_isatty')) { + $is_a_tty = posix_isatty($which); + } else { + $is_a_tty = null; + } + return $this->buildMessage( + PhutilConsoleMessage::TYPE_IS_TTY, + $is_a_tty); + case PhutilConsoleMessage::TYPE_COLS: + // TODO: This is an approximation which might not be perfectly + // accurate. + $width = phutil_console_get_terminal_width(); + return $this->buildMessage( + PhutilConsoleMessage::TYPE_COL_WIDTH, + $width); + } + break; + + default: + if ($this->handler) { + return call_user_func($this->handler, $message); + } else { + throw new Exception( + pht( + "Received unknown console message of type '%s'.", + $type)); + } + + } + } + + /** + * Set handler called for unknown messages. + * + * @param callable Signature: (PhutilConsoleMessage $message). + */ + public function setHandler($callback) { + $this->handler = $callback; + return $this; + } + + private function buildMessage($type, $data) { + $response = new PhutilConsoleMessage(); + $response->setType($type); + $response->setData($data); + return $response; + } + + public function addExecFutureClient(ExecFuture $future) { + $io_channel = new PhutilExecChannel($future); + $protocol_channel = new PhutilPHPObjectProtocolChannel($io_channel); + $server_channel = new PhutilConsoleServerChannel($protocol_channel); + $io_channel->setStderrHandler(array($server_channel, 'didReceiveStderr')); + return $this->addClient($server_channel); + } + + public function addClient(PhutilConsoleServerChannel $channel) { + $this->clients[] = $channel; + return $this; + } + + public function setEnableLog($enable) { + $this->enableLog = $enable; + return $this; + } + + public function run() { + while ($this->clients) { + PhutilChannel::waitForAny($this->clients); + foreach ($this->clients as $key => $client) { + if (!$client->update()) { + // If the client has exited, remove it from the list of clients. + // We still need to process any remaining buffered I/O. + unset($this->clients[$key]); + } + while ($message = $client->read()) { + $response = $this->handleMessage($message); + if ($response) { + $client->write($response); + } + } + } + } + } + + private function writeText($where, array $argv) { + $text = call_user_func_array('phutil_console_format', $argv); + fprintf($where, '%s', $text); + } + +} diff --git a/src/console/PhutilConsoleServerChannel.php b/src/console/PhutilConsoleServerChannel.php new file mode 100644 index 00000000..3bcb3290 --- /dev/null +++ b/src/console/PhutilConsoleServerChannel.php @@ -0,0 +1,12 @@ +setType(PhutilConsoleMessage::TYPE_ERR) + ->setData(array('%s', $stderr)); + $this->getUnderlyingChannel()->addMessage($message); + } + +} diff --git a/src/console/PhutilConsoleStdinNotInteractiveException.php b/src/console/PhutilConsoleStdinNotInteractiveException.php new file mode 100644 index 00000000..5e300b30 --- /dev/null +++ b/src/console/PhutilConsoleStdinNotInteractiveException.php @@ -0,0 +1,18 @@ +setName('shopping_list') + * ->setLineOffset(15) + * ->editInteractively(); + * + * This will launch the user's $EDITOR to edit the specified '$document', and + * return their changes into '$result'. + * + * @task create Creating a New Editor + * @task edit Editing Interactively + * @task config Configuring Options + */ +final class PhutilInteractiveEditor extends Phobject { + + private $name = ''; + private $content = ''; + private $offset = 0; + private $preferred; + private $fallback; + + +/* -( Creating a New Editor )---------------------------------------------- */ + + + /** + * Constructs an interactive editor, using the text of a document. + * + * @param string Document text. + * @return $this + * + * @task create + */ + public function __construct($content) { + $this->setContent($content); + } + + +/* -( Editing Interactively )----------------------------------------------- */ + + + /** + * Launch an editor and edit the content. The edited content will be + * returned. + * + * @return string Edited content. + * @throws Exception The editor exited abnormally or something untoward + * occurred. + * + * @task edit + */ + public function editInteractively() { + $name = $this->getName(); + $content = $this->getContent(); + + if (phutil_is_windows()) { + $content = str_replace("\n", "\r\n", $content); + } + + $tmp = Filesystem::createTemporaryDirectory('edit.'); + $path = $tmp.DIRECTORY_SEPARATOR.$name; + + try { + Filesystem::writeFile($path, $content); + } catch (Exception $ex) { + Filesystem::remove($tmp); + throw $ex; + } + + $editor = $this->getEditor(); + $offset = $this->getLineOffset(); + + $err = $this->invokeEditor($editor, $path, $offset); + + if ($err) { + // See T13297. On macOS, "vi" and "vim" may exit with errors even though + // the edit succeeded. If the binary is "vi" or "vim" and we get an exit + // code, we perform an additional test on the binary. + $vi_binaries = array( + 'vi' => true, + 'vim' => true, + ); + + $binary = basename($editor); + if (isset($vi_binaries[$binary])) { + // This runs "Q" (an invalid command), then "q" (a valid command, + // meaning "quit"). Vim binaries with behavior that makes them poor + // interactive editors will exit "1". + list($diagnostic_err) = exec_manual('%R +Q +q', $binary); + + // If we get an error back, the binary is badly behaved. Ignore the + // original error and assume it's not meaningful, since it just + // indicates the user made a typo in a command when editing + // interactively, which is routine and unconcerning. + if ($diagnostic_err) { + $err = 0; + } + } + } + + if ($err) { + Filesystem::remove($tmp); + throw new Exception(pht('Editor exited with an error code (#%d).', $err)); + } + + try { + $result = Filesystem::readFile($path); + Filesystem::remove($tmp); + } catch (Exception $ex) { + Filesystem::remove($tmp); + throw $ex; + } + + if (phutil_is_windows()) { + $result = str_replace("\r\n", "\n", $result); + } + + $this->setContent($result); + + return $this->getContent(); + } + + private function invokeEditor($editor, $path, $offset) { + // NOTE: Popular Windows editors like Notepad++ and GitPad do not support + // line offsets, so just ignore the offset feature on Windows. We rarely + // use it anyway. + + $offset_flag = ''; + if ($offset && !phutil_is_windows()) { + $offset = (int)$offset; + if (preg_match('/^mate/', $editor)) { + $offset_flag = csprintf('-l %d', $offset); + } else { + $offset_flag = csprintf('+%d', $offset); + } + } + + $cmd = csprintf( + '%C %C %s', + $editor, + $offset_flag, + $path); + + return phutil_passthru('%C', $cmd); + } + + +/* -( Configuring Options )------------------------------------------------- */ + + + /** + * Set the line offset where the cursor should be positioned when the editor + * opens. By default, the cursor will be positioned at the start of the + * content. + * + * @param int Line number where the cursor should be positioned. + * @return $this + * + * @task config + */ + public function setLineOffset($offset) { + $this->offset = (int)$offset; + return $this; + } + + + /** + * Get the current line offset. See setLineOffset(). + * + * @return int Current line offset. + * + * @task config + */ + public function getLineOffset() { + return $this->offset; + } + + + /** + * Set the document name. Depending on the editor, this may be exposed to + * the user and can give them a sense of what they're editing. + * + * @param string Document name. + * @return $this + * + * @task config + */ + public function setName($name) { + $name = preg_replace('/[^A-Z0-9._-]+/i', '', $name); + $this->name = $name; + return $this; + } + + + /** + * Get the current document name. See @{method:setName} for details. + * + * @return string Current document name. + * + * @task config + */ + public function getName() { + if (!strlen($this->name)) { + return 'untitled'; + } + return $this->name; + } + + + /** + * Set the text content to be edited. + * + * @param string New content. + * @return $this + * + * @task config + */ + public function setContent($content) { + $this->content = $content; + return $this; + } + + + /** + * Retrieve the current content. + * + * @return string + * + * @task config + */ + public function getContent() { + return $this->content; + } + + + /** + * Set the fallback editor program to be used if the env variable $EDITOR + * is not available and there is no `editor` binary in PATH. + * + * @param string Command-line editing program (e.g. 'emacs', 'vi') + * @return $this + * + * @task config + */ + public function setFallbackEditor($editor) { + $this->fallback = $editor; + return $this; + } + + + /** + * Set the preferred editor program. If set, this will override all other + * sources of editor configuration, like $EDITOR. + * + * @param string Command-line editing program (e.g. 'emacs', 'vi') + * @return $this + * + * @task config + */ + public function setPreferredEditor($editor) { + $this->preferred = $editor; + return $this; + } + + + /** + * Get the name of the editor program to use. The value of the environmental + * variable $EDITOR will be used if available; otherwise, the `editor` binary + * if present; otherwise the best editor will be selected. + * + * @return string Command-line editing program. + * + * @task config + */ + public function getEditor() { + if ($this->preferred) { + return $this->preferred; + } + + $editor = getenv('EDITOR'); + if ($editor) { + return $editor; + } + + if ($this->fallback) { + return $this->fallback; + } + + $candidates = array('editor', 'nano', 'sensible-editor', 'vi'); + + foreach ($candidates as $cmd) { + if (Filesystem::binaryExists($cmd)) { + return $cmd; + } + } + + throw new Exception( + pht( + 'Unable to launch an interactive text editor. Set the %s '. + 'environment variable to an appropriate editor.', + 'EDITOR')); + } + +} diff --git a/src/console/__tests__/PhutilConsoleWrapTestCase.php b/src/console/__tests__/PhutilConsoleWrapTestCase.php new file mode 100644 index 00000000..98297da4 --- /dev/null +++ b/src/console/__tests__/PhutilConsoleWrapTestCase.php @@ -0,0 +1,48 @@ +assertEqual( + Filesystem::readFile($dir.$file.'.expect'), + phutil_console_wrap(Filesystem::readFile($dir.$file)), + $file); + } + } + } + + public function testConsoleWrap() { + $this->assertEqual( + phutil_console_format( + "** %s ** abc abc abc abc abc abc abc abc abc abc ". + "abc abc abc abc abc abc abc\nabc abc abc abc abc abc abc abc abc ". + "abc abc!", + pht('ERROR')), + phutil_console_wrap( + phutil_console_format( + '** %s ** abc abc abc abc abc abc abc abc abc abc '. + 'abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc '. + 'abc abc!', + pht('ERROR'))), + pht('ANSI escape sequences should not contribute toward wrap width.')); + } + + public function testWrapIndent() { + $turtles = <<assertEqual( + $turtles, + phutil_console_wrap( + rtrim(str_repeat('turtle ', 20)), + $indent = 20)); + } + +} diff --git a/src/console/__tests__/wrap/long.txt b/src/console/__tests__/wrap/long.txt new file mode 100644 index 00000000..e3052232 --- /dev/null +++ b/src/console/__tests__/wrap/long.txt @@ -0,0 +1 @@ +Say MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM every day. diff --git a/src/console/__tests__/wrap/long.txt.expect b/src/console/__tests__/wrap/long.txt.expect new file mode 100644 index 00000000..ecd42dbc --- /dev/null +++ b/src/console/__tests__/wrap/long.txt.expect @@ -0,0 +1,3 @@ +Say +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +every day. diff --git a/src/console/__tests__/wrap/newlines.txt b/src/console/__tests__/wrap/newlines.txt new file mode 100644 index 00000000..a05d75c6 --- /dev/null +++ b/src/console/__tests__/wrap/newlines.txt @@ -0,0 +1,10 @@ +Curabitur gravida lectus odio, nec dictum sapien. +Donec condimentum purus at est aliquam lobortis. +Sed facilisis justo a purus interdum at venenatis eros laoreet. +Quisque ac odio vitae erat congue elementum. +Etiam semper venenatis massa vitae faucibus. +Praesent eget eros tortor. +Vestibulum in pharetra massa. +Integer risus justo, malesuada auctor feugiat venenatis, viverra iaculis est. +Praesent a tortor et dui tempus egestas. +Sed lacinia diam id velit tincidunt sagittis. diff --git a/src/console/__tests__/wrap/newlines.txt.expect b/src/console/__tests__/wrap/newlines.txt.expect new file mode 100644 index 00000000..a05d75c6 --- /dev/null +++ b/src/console/__tests__/wrap/newlines.txt.expect @@ -0,0 +1,10 @@ +Curabitur gravida lectus odio, nec dictum sapien. +Donec condimentum purus at est aliquam lobortis. +Sed facilisis justo a purus interdum at venenatis eros laoreet. +Quisque ac odio vitae erat congue elementum. +Etiam semper venenatis massa vitae faucibus. +Praesent eget eros tortor. +Vestibulum in pharetra massa. +Integer risus justo, malesuada auctor feugiat venenatis, viverra iaculis est. +Praesent a tortor et dui tempus egestas. +Sed lacinia diam id velit tincidunt sagittis. diff --git a/src/console/__tests__/wrap/plain.txt b/src/console/__tests__/wrap/plain.txt new file mode 100644 index 00000000..9d4677a5 --- /dev/null +++ b/src/console/__tests__/wrap/plain.txt @@ -0,0 +1 @@ +Morbi auctor commodo libero, vel interdum leo commodo nec. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum dictum pretium lorem ac commodo. Vivamus ullamcorper neque et velit interdum ornare. Fusce adipiscing metus non sem porttitor scelerisque. Aliquam mattis sem non tortor semper eget fermentum libero faucibus. Nam vulputate mauris at nunc bibendum mollis. Aliquam mattis rutrum turpis a fringilla. Mauris quis nulla eget nunc mollis pharetra id sit amet arcu. Nam ut urna in ligula facilisis scelerisque in nec massa. Morbi posuere, turpis in bibendum fringilla, augue felis gravida est, vitae convallis quam nunc at tellus. diff --git a/src/console/__tests__/wrap/plain.txt.expect b/src/console/__tests__/wrap/plain.txt.expect new file mode 100644 index 00000000..3938db8e --- /dev/null +++ b/src/console/__tests__/wrap/plain.txt.expect @@ -0,0 +1,9 @@ +Morbi auctor commodo libero, vel interdum leo commodo nec. Cum sociis natoque +penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum +dictum pretium lorem ac commodo. Vivamus ullamcorper neque et velit interdum +ornare. Fusce adipiscing metus non sem porttitor scelerisque. Aliquam mattis +sem non tortor semper eget fermentum libero faucibus. Nam vulputate mauris at +nunc bibendum mollis. Aliquam mattis rutrum turpis a fringilla. Mauris quis +nulla eget nunc mollis pharetra id sit amet arcu. Nam ut urna in ligula +facilisis scelerisque in nec massa. Morbi posuere, turpis in bibendum +fringilla, augue felis gravida est, vitae convallis quam nunc at tellus. diff --git a/src/console/__tests__/wrap/trailing-space-prompt.txt b/src/console/__tests__/wrap/trailing-space-prompt.txt new file mode 100644 index 00000000..8677ea84 --- /dev/null +++ b/src/console/__tests__/wrap/trailing-space-prompt.txt @@ -0,0 +1 @@ +Do you want to do stuff? [y/N] diff --git a/src/console/__tests__/wrap/trailing-space-prompt.txt.expect b/src/console/__tests__/wrap/trailing-space-prompt.txt.expect new file mode 100644 index 00000000..8677ea84 --- /dev/null +++ b/src/console/__tests__/wrap/trailing-space-prompt.txt.expect @@ -0,0 +1 @@ +Do you want to do stuff? [y/N] diff --git a/src/console/__tests__/wrap/utf8.txt b/src/console/__tests__/wrap/utf8.txt new file mode 100644 index 00000000..731d1557 --- /dev/null +++ b/src/console/__tests__/wrap/utf8.txt @@ -0,0 +1 @@ +☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ diff --git a/src/console/__tests__/wrap/utf8.txt.expect b/src/console/__tests__/wrap/utf8.txt.expect new file mode 100644 index 00000000..182cf5e3 --- /dev/null +++ b/src/console/__tests__/wrap/utf8.txt.expect @@ -0,0 +1,2 @@ +☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ +☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ diff --git a/src/console/format.php b/src/console/format.php new file mode 100644 index 00000000..a4fa98d5 --- /dev/null +++ b/src/console/format.php @@ -0,0 +1,209 @@ += $min && $selection <= $max) { + return $selection; + } + } + } while (true); +} + +function phutil_console_prompt($prompt, $history = '') { + echo "\n\n"; + $prompt = phutil_console_wrap($prompt.' ', 4); + + try { + phutil_console_require_tty(); + } catch (PhutilConsoleStdinNotInteractiveException $ex) { + // Throw after echoing the prompt so the user has some idea what happened. + echo $prompt; + throw $ex; + } + + // `escapeshellarg` makes double quotes in the command below disappear on + // Windows, which breaks prompts when using history. See T6348 + $use_history = !phutil_is_windows(); + if ($history == '') { + $use_history = false; + } else { + // Test if bash is available by seeing if it can run `true`. + list($err) = exec_manual('bash -c %s', 'true'); + if ($err) { + $use_history = false; + } + } + + if (!$use_history) { + echo $prompt; + $response = fgets(STDIN); + } else { + // There's around 0% chance that readline() is available directly in PHP, + // so we're using bash/read/history instead. + $command = csprintf( + 'bash -c %s', + csprintf( + 'history -r %s 2>/dev/null; '. + 'read -e -p %s; '. + 'echo "$REPLY"; '. + 'history -s "$REPLY" 2>/dev/null; '. + 'history -w %s 2>/dev/null', + $history, + $prompt, + $history)); + + // execx() doesn't work with input, phutil_passthru() doesn't return output. + $response = shell_exec($command); + } + + return rtrim($response, "\r\n"); +} + + +/** + * Soft wrap text for display on a console, respecting UTF8 character boundaries + * and ANSI color escape sequences. + * + * @param string Text to wrap. + * @param int Optional indent level. + * @param bool True to also indent the first line. + * @return string Wrapped text. + */ +function phutil_console_wrap($text, $indent = 0, $with_prefix = true) { + $lines = array(); + + $width = (78 - $indent); + $esc = chr(27); + + $break_pos = null; + $len_after_break = 0; + $line_len = 0; + + $line = array(); + $lines = array(); + + $vector = phutil_utf8v($text); + $vector_len = count($vector); + for ($ii = 0; $ii < $vector_len; $ii++) { + $chr = $vector[$ii]; + + // If this is an ANSI escape sequence for a color code, just consume it + // without counting it toward the character limit. This prevents lines + // with bold/color on them from wrapping too early. + if ($chr == $esc) { + for ($ii; $ii < $vector_len; $ii++) { + $line[] = $vector[$ii]; + if ($vector[$ii] == 'm') { + break; + } + } + continue; + } + + $line[] = $chr; + + ++$line_len; + ++$len_after_break; + + if ($line_len > $width) { + if ($break_pos !== null) { + $slice = array_slice($line, 0, $break_pos); + while (count($slice) && end($slice) == ' ') { + array_pop($slice); + } + $slice[] = "\n"; + $lines[] = $slice; + $line = array_slice($line, $break_pos); + + $line_len = $len_after_break; + $len_after_break = 0; + $break_pos = null; + } + } + + if ($chr == ' ') { + $break_pos = count($line); + $len_after_break = 0; + } + + if ($chr == "\n") { + $lines[] = $line; + $line = array(); + + $len_after_break = 0; + $line_len = 0; + $break_pos = null; + } + } + + if ($line) { + if ($line) { + $lines[] = $line; + } + } + + $pre = null; + if ($indent) { + $pre = str_repeat(' ', $indent); + } + + foreach ($lines as $idx => $line) { + if ($idx == 0 && !$with_prefix) { + $prefix = null; + } else { + $prefix = $pre; + } + + $lines[$idx] = $prefix.implode('', $line); + } + + return implode('', $lines); +} + + +function phutil_console_require_tty() { + if (function_exists('posix_isatty') && !posix_isatty(STDIN)) { + throw new PhutilConsoleStdinNotInteractiveException(); + } +} + + +/** + * Determine the width of the terminal, if possible. Returns `null` on failure. + * + * @return int|null Terminal width in characters, or null on failure. + */ +function phutil_console_get_terminal_width() { + return PhutilConsoleMetrics::getDefaultConsole() + ->getTerminalWidth(); +} diff --git a/src/console/view/PhutilConsoleBlock.php b/src/console/view/PhutilConsoleBlock.php new file mode 100644 index 00000000..ae60270b --- /dev/null +++ b/src/console/view/PhutilConsoleBlock.php @@ -0,0 +1,48 @@ +items[] = array( + 'type' => 'paragraph', + 'item' => $item, + ); + return $this; + } + + public function addList(PhutilConsoleList $list) { + $this->items[] = array( + 'type' => 'list', + 'item' => $list, + ); + return $this; + } + + protected function drawView() { + $output = array(); + + foreach ($this->items as $spec) { + $type = $spec['type']; + $item = $spec['item']; + + switch ($type) { + case 'paragraph': + $item = array( + tsprintf('%s', $item)->applyWrap(), + "\n", + ); + break; + case 'list': + $item = $item; + break; + } + + $output[] = $item; + } + + return $this->drawLines($output); + } + +} diff --git a/src/console/view/PhutilConsoleError.php b/src/console/view/PhutilConsoleError.php new file mode 100644 index 00000000..7daa899e --- /dev/null +++ b/src/console/view/PhutilConsoleError.php @@ -0,0 +1,10 @@ +items[] = $item; + return $this; + } + + public function addItems(array $items) { + foreach ($items as $item) { + $this->addItem($item); + } + return $this; + } + + public function getItems() { + return $this->items; + } + + public function setBullet($bullet) { + $this->bullet = $bullet; + return $this; + } + + public function getBullet() { + return $this->bullet; + } + + public function setWrap($wrap) { + $this->wrap = $wrap; + return $this; + } + + protected function drawView() { + $indent_depth = 6; + $indent_string = str_repeat(' ', $indent_depth); + + if ($this->bullet !== null) { + $bullet = $this->bullet.' '; + $indent_depth = $indent_depth + phutil_utf8_console_strlen($bullet); + } else { + $bullet = ''; + } + + $output = array(); + foreach ($this->getItems() as $item) { + if ($this->wrap) { + $item = tsprintf('%s', $item) + ->applyIndent($indent_depth, false); + } + + $output[] = $indent_string.$bullet.$item; + } + + return $this->drawLines($output); + } + +} diff --git a/src/console/view/PhutilConsoleLogLine.php b/src/console/view/PhutilConsoleLogLine.php new file mode 100644 index 00000000..cdbd42a1 --- /dev/null +++ b/src/console/view/PhutilConsoleLogLine.php @@ -0,0 +1,24 @@ +kind = $kind; + $this->message = $message; + } + + protected function drawView() { + $color = $this->getLogLineColor(); + + return tsprintf( + "** %s ** %s\n", + $this->kind, + $this->message); + } + +} diff --git a/src/console/view/PhutilConsoleSkip.php b/src/console/view/PhutilConsoleSkip.php new file mode 100644 index 00000000..b2593133 --- /dev/null +++ b/src/console/view/PhutilConsoleSkip.php @@ -0,0 +1,10 @@ +addColumn('id', array('title' => 'ID', 'align' => 'right')) + * ->addColumn('name', array('title' => 'Username', 'align' => 'center')) + * ->addColumn('email', array('title' => 'Email Address')) + * + * ->addRow(array( + * 'id' => 12345, + * 'name' => 'alicoln', + * 'email' => 'abraham@lincoln.com', + * )) + * ->addRow(array( + * 'id' => 99999999, + * 'name' => 'jbloggs', + * 'email' => 'joe@bloggs.com', + * )) + * + * ->setBorders(true) + * ->draw(); + */ +final class PhutilConsoleTable extends PhutilConsoleView { + + private $columns = array(); + private $data = array(); + private $widths = array(); + private $borders = false; + private $padding = 1; + private $showHeader = true; + + const ALIGN_LEFT = 'left'; + const ALIGN_CENTER = 'center'; + const ALIGN_RIGHT = 'right'; + + +/* -( Configuration )------------------------------------------------------ */ + + + public function setBorders($borders) { + $this->borders = $borders; + return $this; + } + + public function setPadding($padding) { + $this->padding = $padding; + return $this; + } + + public function setShowHeader($show_header) { + $this->showHeader = $show_header; + return $this; + } + + +/* -( Data )--------------------------------------------------------------- */ + + public function addColumn($key, array $column) { + PhutilTypeSpec::checkMap($column, array( + 'title' => 'string', + 'align' => 'optional string', + )); + $this->columns[$key] = $column; + return $this; + } + + public function addColumns(array $columns) { + foreach ($columns as $key => $column) { + $this->addColumn($key, $column); + } + return $this; + } + + public function addRow(array $data) { + $this->data[] = $data; + + foreach ($data as $key => $value) { + $this->widths[$key] = max( + idx($this->widths, $key, 0), + phutil_utf8_console_strlen($value)); + } + + return $this; + } + + +/* -( Drawing )------------------------------------------------------------ */ + + protected function drawView() { + return $this->drawLines( + array_merge( + $this->getHeader(), + $this->getBody(), + $this->getFooter())); + } + + private function getHeader() { + $output = array(); + + if ($this->borders) { + $output[] = $this->formatSeparator('='); + } + + if (!$this->showHeader) { + return $output; + } + + $columns = array(); + foreach ($this->columns as $key => $column) { + $title = tsprintf('**%s**', $column['title']); + + if ($this->shouldAddSpacing($key, $column)) { + $title = $this->alignString( + $title, + $this->getWidth($key), + idx($column, 'align', self::ALIGN_LEFT)); + } + + $columns[] = $title; + } + + $output[] = $this->formatRow($columns); + + if ($this->borders) { + $output[] = $this->formatSeparator('='); + } + + return $output; + } + + private function getBody() { + $output = array(); + + foreach ($this->data as $data) { + $columns = array(); + + foreach ($this->columns as $key => $column) { + if (!$this->shouldAddSpacing($key, $column)) { + $columns[] = idx($data, $key, ''); + } else { + $columns[] = $this->alignString( + idx($data, $key, ''), + $this->getWidth($key), + idx($column, 'align', self::ALIGN_LEFT)); + } + } + + $output[] = $this->formatRow($columns); + } + + return $output; + } + + private function getFooter() { + $output = array(); + + if ($this->borders) { + $columns = array(); + + foreach ($this->getColumns() as $column) { + $columns[] = str_repeat('=', $this->getWidth($column)); + } + + $output[] = array( + '+', + $this->implode('+', $columns), + '+', + ); + } + + return $output; + } + + +/* -( Internals )---------------------------------------------------------- */ + + /** + * Returns if the specified column should have spacing added. + * + * @return bool + */ + private function shouldAddSpacing($key, $column) { + if (!$this->borders) { + if (last_key($this->columns) === $key) { + if (idx($column, 'align', self::ALIGN_LEFT) === self::ALIGN_LEFT) { + // Don't add extra spaces to this column since it's the last column, + // left aligned, and we're not showing borders. This prevents + // unnecessary empty lines from appearing when the extra spaces + // wrap around the terminal. + return false; + } + } + } + + return true; + } + + /** + * Returns the column IDs. + * + * @return list + */ + protected function getColumns() { + return array_keys($this->columns); + } + + /** + * Get the width of a specific column, including padding. + * + * @param string + * @return int + */ + protected function getWidth($key) { + $width = max( + idx($this->widths, $key), + phutil_utf8_console_strlen( + idx(idx($this->columns, $key, array()), 'title', ''))); + + return $width + 2 * $this->padding; + } + + protected function alignString($string, $width, $align) { + $num_padding = $width - + (2 * $this->padding) - phutil_utf8_console_strlen($string); + + switch ($align) { + case self::ALIGN_LEFT: + $num_left_padding = 0; + $num_right_padding = $num_padding; + break; + + case self::ALIGN_CENTER: + $num_left_padding = (int)($num_padding / 2); + $num_right_padding = $num_padding - $num_left_padding; + break; + + case self::ALIGN_RIGHT: + $num_left_padding = $num_padding; + $num_right_padding = 0; + break; + } + + $left_padding = str_repeat(' ', $num_left_padding); + $right_padding = str_repeat(' ', $num_right_padding); + + return array( + $left_padding, + $string, + $right_padding, + ); + } + + /** + * Format cells into an entire row. + * + * @param list + * @return string + */ + protected function formatRow(array $columns) { + $padding = str_repeat(' ', $this->padding); + + if ($this->borders) { + $separator = $padding.'|'.$padding; + return array( + '|'.$padding, + $this->implode($separator, $columns), + $padding.'|', + ); + } else { + return $this->implode($padding, $columns); + } + } + + protected function formatSeparator($string) { + $columns = array(); + + if ($this->borders) { + $separator = '+'; + } else { + $separator = ''; + } + + foreach ($this->getColumns() as $column) { + $columns[] = str_repeat($string, $this->getWidth($column)); + } + + return array( + $separator, + $this->implode($separator, $columns), + $separator, + ); + } + +} diff --git a/src/console/view/PhutilConsoleView.php b/src/console/view/PhutilConsoleView.php new file mode 100644 index 00000000..85f5b8f9 --- /dev/null +++ b/src/console/view/PhutilConsoleView.php @@ -0,0 +1,112 @@ +console = $console; + return $this; + } + + final public function getConsole() { + if ($this->console) { + return $this->console; + } + return PhutilConsole::getConsole(); + } + + + /** + * Draw a view to the console. + * + * @return this + * @task draw + */ + final public function draw() { + $string = $this->drawConsoleString(); + + $console = $this->getConsole(); + $console->writeOut('%s', $string); + + return $this; + } + + + /** + * Draw a view to a string and return it. + * + * @return string Console-printable string. + * @task draw + */ + final public function drawConsoleString() { + $view = $this->drawView(); + $parts = $this->reduceView($view); + + $out = array(); + foreach ($parts as $part) { + $out[] = PhutilTerminalString::escapeStringValue($part, true); + } + + return implode('', $out); + } + + + /** + * Reduce a view to a list of simple, unnested parts. + * + * @param wild Any drawable view. + * @return list List of unnested drawables. + * @task draw + */ + private function reduceView($view) { + if ($view instanceof PhutilConsoleView) { + $view = $view->drawView(); + return $this->reduceView($view); + } + + if (is_array($view)) { + $parts = array(); + foreach ($view as $item) { + foreach ($this->reduceView($item) as $part) { + $parts[] = $part; + } + } + return $parts; + } + + return array($view); + } + +/* -( Drawing Utilities )-------------------------------------------------- */ + + + /** + * @param list List of views, one per line. + * @return wild Each view rendered on a separate line. + */ + final protected function drawLines(array $parts) { + $result = array(); + foreach ($parts as $part) { + if ($part !== null) { + $result[] = $part; + $result[] = "\n"; + } + } + + return $result; + } + + final protected function implode($separator, array $items) { + $result = array(); + foreach ($items as $item) { + $result[] = $item; + $result[] = $separator; + } + array_pop($result); + return $result; + } + +} diff --git a/src/console/view/PhutilConsoleWarning.php b/src/console/view/PhutilConsoleWarning.php new file mode 100644 index 00000000..d6994b5c --- /dev/null +++ b/src/console/view/PhutilConsoleWarning.php @@ -0,0 +1,10 @@ +resolvex(); + +@{class:ExecFuture} is a @{class:Future}, and can be used with constructs like +@{class:FutureIterator} to achieve and manage parallelism. See +@{article:Using Futures} for general information on how to use futures in +libphutil. + +In addition to futures-based parallelism, you can set a timeout on an +@{class:ExecFuture}, which will kill the command if it takes longer than the +specified number of seconds to execute: + + $future->setTimeout(30); + +If the command runs longer than the timeout, the process will be killed and the +future will resolve with a failure code (`ExecFuture::TIMED_OUT_EXIT_CODE`). + +You can also write to the stdin of a process by using the +@{method:ExecFuture::write} method. + + $future = new ExecFuture('bc'); + $future->write('2+2'); + list($stdout) = $future->resolvex(); + +See @{class:ExecFuture} for complete capability documentation. diff --git a/src/docs/article/core_quick_reference.diviner b/src/docs/article/core_quick_reference.diviner new file mode 100644 index 00000000..9f14e2bf --- /dev/null +++ b/src/docs/article/core_quick_reference.diviner @@ -0,0 +1,45 @@ +@title Core Utilities Quick Reference +@group util + +Summary of libphutil core utilities. + += Overview = + +This document provides a brief overview of the libphutil core utilities. + += Language Capabilities = + +Functions @{function:id}, @{function:head} and @{function:newv} address +language grammar and implementation limitations. + +You can efficiently merge a vector of arrays with @{function:array_mergev}. + +Functions @{function:head}, @{function:last}, @{function:head_key} and +@{function:last_key} let you access the first or last elements of an array +without raising warnings. + +You can combine an array with itself safely with @{function:array_fuse}. + += Default Value Selection = + +Functions @{function:idx}, @{function:nonempty} and @{function:coalesce} help +you to select default values when keys or parameters are missing or empty. + += Array and Object Manipulation = + +Functions @{function:ipull}, @{function:igroup}, @{function:isort} and +@{function:ifilter} (**i** stands for **index**) simplify common data +manipulations applied to lists of arrays. + +Functions @{function:mpull}, @{function:mgroup}, @{function:msort} and +@{function:mfilter} (**m** stands for **method**) provide the same capabilities +for lists of objects. + +@{function:array_select_keys} allows you to choose or reorder keys from a +dictionary. + += Lunar Phases = + +@{class:PhutilLunarPhase} calculates lunar phases, allowing you to harden an +application against threats from werewolves, werebears, and other +werecreatures. diff --git a/src/docs/article/developing_xhpast.diviner b/src/docs/article/developing_xhpast.diviner new file mode 100644 index 00000000..119cdedc --- /dev/null +++ b/src/docs/article/developing_xhpast.diviner @@ -0,0 +1,17 @@ +@title Developing XHPAST +@group xhpast + +Instructions for developing XHPAST. + += XHPAST Development Builds = + +To develop XHPAST, you need to install flex and bison. These install out of +most package systems, with the caveat that you need flex 2.3.35 (which is NEWER +than flex 2.3.4) and some package systems don't have it yet. If this is the +case for you, you can grab the source here: + + http://flex.sourceforge.net/ + +When building, run `make scanner parser all` instead of `make` to build the +entire toolchain. By default the scanner and parser are not rebuild, to avoid +requiring normal users to install flex and bison. diff --git a/src/docs/article/overview.diviner b/src/docs/article/overview.diviner new file mode 100644 index 00000000..2933b8db --- /dev/null +++ b/src/docs/article/overview.diviner @@ -0,0 +1,57 @@ +@title libphutil Overview +@group overview + +This document provides a high-level introduction to libphutil. + += Overview = + +**libphutil** (pronounced as "lib-futile", like the English word //futile//) is +a collection of PHP utility classes and functions. Most code in the library is +general-purpose, and makes it easier to build applications in PHP. + +libphutil is principally the shared library for +[[ http://www.phabricator.org | Phabricator ]] and its CLI **Arcanist**, but is +suitable for inclusion in other projects. In particular, some of the classes +provided in this library vastly improve the state of common operations in PHP, +like executing system commands. + +libphutil is developed and maintained by +[[ http://www.phacility.com/ | Phacility ]]. Some of the code in this library +was originally developed at Facebook, and parts of it appear in the core +libraries for . + += Loading libphutil = + +To include libphutil in another project, include the +`src/__phutil_library_init__.php` file: + + require_once 'path/to/libphutil/src/__phutil_library_init__.php'; + +This loads global functions and registers an autoload function with +`spl_autoload_register()`, so you can also use classes. + += Major Components = + +Some of the major components of libphutil are: + + - **Core Utilities**: a collection of useful functions like @{function:ipull} + which simplify common data manipulation; + - **Filesystem**: classes like @{class:Filesystem} which provide a strict API + for filesystem access and throw exceptions on failure, making it easier to + write robust code which interacts with files; + - **Command Execution**: libphutil provides a powerful system command + primitive in @{class:ExecFuture} which makes it far easier to write + command-line scripts which execute system commands + (see @{article:Command Execution}); + - **@{function:xsprintf}**: allows you to define `sprintf()`-style functions + which use custom conversions; and + - **Library System**: an introspectable, inventoried system for organizing + PHP code and managing dependencies, supported by static analysis. + += Extending and Contributing = + +Information on extending and contributing to libphutil is available in the +Phabricator documentation: + + - To get started as a contributor, see @{article@phabcontrib:Contributor + Introduction}. diff --git a/src/docs/article/using_futures.diviner b/src/docs/article/using_futures.diviner new file mode 100644 index 00000000..5df44461 --- /dev/null +++ b/src/docs/article/using_futures.diviner @@ -0,0 +1,90 @@ +@title Using Futures +@group future + +Overview of how futures work in libphutil. + + += Overview = + +Futures (also called "Promises") are objects which represent the result of some +pending computation (like executing a command or making a request to another +server), but don't actually hold that result until the computation finishes. +They are used to simplify parallel programming, since you can pass the future +around as a representation for the real result while the real result is being +computed in the background. When the object is asked to return the actual +result, it blocks until the result is available. + +libphutil provides a number of future-based APIs, as they strike a good balance +between ease of use and power for many of the domains where PHP is a reasonable +language choice. + +Each type of future is used to do a different type of computation (for instance, +@{class:ExecFuture} executes system commands while @{class:HTTPFuture} executes +HTTP requests), but all of them behave in a basically similar way and can be +manipulated with the same top-level constructs. + + += Basics = + +You create a future by instantiating the relevant class and ask it to return the +result by calling `resolve()`: + + $gzip_future = new ExecFuture('gzip %s', $some_file); + $gzip_future->start(); + + // The future is now executing in the background, and you can continue + // doing computation in this process by putting code here. + + list($err, $stdout, $stderr) = $gzip_future->resolve(); + +When you call `resolve()`, the future blocks until the result is ready. You +can test if a future's result is ready by calling `isReady()`: + + $is_ready = $gzip_future->isReady(); + +Being "ready" indicates that the future's computation has completed and it will +not need to block when you call `resolve()`. + +Note that when you instantiate a future, it does not immediately initiate +computation. You must call `start()`, `isReady()` or `resolve()` to +activate it. If you simply call `resolve()` it will start, block until it is +complete, and then return the result, acting in a completely synchronous way. + +See @{article:Command Execution} for more detailed documentation on how to +execute system commands with libphutil. + + += Managing Multiple Futures = + +Commonly, you may have many similar tasks you wish to parallelize: instead of +compressing one file, you want to compress several files. You can use the +@{class:FutureIterator} class to manage multiple futures. + + $futures = array(); + foreach ($files as $file) { + $futures[$file] = new ExecFuture("gzip %s", $file); + } + foreach (new FutureIterator($futures) as $file => $future) { + list($err, $stdout, $stderr) = $future->resolve(); + if (!$err) { + echo "Compressed {$file}...\n"; + } else { + echo "Failed to compress {$file}!\n"; + } + } + +@{class:FutureIterator} takes a list of futures and runs them in parallel, +**returning them in the order they resolve, NOT the original list order**. This +allows your program to begin any follow-up computation as quickly as possible: +if the slowest future in the list happens to be the first one, you can finish +processing all the other futures while waiting for it. + +You can also limit how many futures you want to run at once. For instance, to +process no more than 4 files simultaneously: + + foreach (id(new FutureIterator($futures))->limit(4) as $file => $future) { + // ... + } + +Consult the @{class:FutureIterator} documentation for detailed information on +class capabilities. diff --git a/src/docs/book/libphutil.book b/src/docs/book/libphutil.book new file mode 100644 index 00000000..c37b91a4 --- /dev/null +++ b/src/docs/book/libphutil.book @@ -0,0 +1,87 @@ +{ + "name": "libphutil", + "title": "libphutil Technical Documentation", + "short": "libphutil Tech Docs", + "preface": "Technical documentation for developers using libphutil.", + "root": "../../../", + "uri.source": + "https://secure.phabricator.com/diffusion/PHU/browse/master/%f$%l", + "rules": { + "(\\.diviner$)": "DivinerArticleAtomizer", + "(\\.php$)": "DivinerPHPAtomizer" + }, + "exclude": [ + "(^externals/)", + "(^resources/)", + "(^scripts/)", + "(^support/)" + ], + "groups": { + "overview": { + "name": "libphutil Overview" + }, + "aphront": { + "name": "Aphront", + "include": "(^src/aphront/)" + }, + "auth": { + "name": "Authentication", + "include": "(^src/auth/)" + }, + "conduit": { + "name": "Conduit", + "include": "(^src/conduit/)" + }, + "console": { + "name": "Console", + "include": "(^src/console/)" + }, + "daemon": { + "name": "Daemons", + "include": "(^src/daemon/)" + }, + "error": { + "name": "Errors", + "include": "(^src/error/)" + }, + "filesystem": { + "name": "Filesystem", + "include": "(^src/filesystem/)" + }, + "future": { + "name": "Futures", + "include": "(^src/future/)" + }, + "internationalization": { + "name": "Internationalization", + "include": "(^src/internationalization/)" + }, + "lexer": { + "name": "Lexers", + "include": "(^src/lexer/)" + }, + "library": { + "name": "libphutil Library System", + "include": "(^src/moduleutils/)" + }, + "parser": { + "name": "Parsers", + "include": "(^src/parser/)" + }, + "phage": { + "name": "Phage", + "include": "(^src/phage/)" + }, + "remarkup": { + "name": "Remarkup", + "include": "(^src/markup/)" + }, + "utf8": { + "name": "Handling Unicode and UTF-8" + }, + "util": { + "name": "Core Utilities", + "include": "(^src/utils/)" + } + } +} diff --git a/src/error/PhutilAggregateException.php b/src/error/PhutilAggregateException.php new file mode 100644 index 00000000..c76b7437 --- /dev/null +++ b/src/error/PhutilAggregateException.php @@ -0,0 +1,55 @@ +doSomething(); + * $success = true; + * break; + * } catch (Exception $ex) { + * $exceptions[get_class($engine)] = $ex; + * } + * } + * + * if (!$success) { + * throw new PhutilAggregateException("All engines failed:", $exceptions); + * } + * + * @concrete-extensible + */ +class PhutilAggregateException extends Exception { + + private $exceptions = array(); + + public function __construct($message, array $other_exceptions) { + // We don't call assert_instances_of($other_exceptions, 'Exception') to not + // throw another exception in this exception. + + $this->exceptions = $other_exceptions; + + $full_message = array(); + $full_message[] = $message; + foreach ($other_exceptions as $key => $exception) { + $ex_message = + (is_string($key) ? $key.': ' : ''). + get_class($exception).': '. + $exception->getMessage(); + $ex_message = ' - '.str_replace("\n", "\n ", $ex_message); + + $full_message[] = $ex_message; + } + + parent::__construct(implode("\n", $full_message), count($other_exceptions)); + } + + public function getExceptions() { + return $this->exceptions; + } + +} diff --git a/src/error/PhutilErrorHandler.php b/src/error/PhutilErrorHandler.php new file mode 100644 index 00000000..ca3a3667 --- /dev/null +++ b/src/error/PhutilErrorHandler.php @@ -0,0 +1,595 @@ +getPrevious(); + } + if (method_exists($ex, 'getPreviousException')) { + return $ex->getPreviousException(); + } + return null; + } + + + /** + * Find the most deeply nested exception from a possibly-nested exception. + * + * @param Exception|Throwable A possibly-nested exception. + * @return Exception|Throwable Deepest exception in the nest. + * @task exutil + */ + public static function getRootException($ex) { + $root = $ex; + while (self::getPreviousException($root)) { + $root = self::getPreviousException($root); + } + return $root; + } + + +/* -( Trapping Errors )---------------------------------------------------- */ + + + /** + * Adds an error trap. Normally you should not invoke this directly; + * @{class:PhutilErrorTrap} registers itself on construction. + * + * @param PhutilErrorTrap Trap to add. + * @return void + * @task trap + */ + public static function addErrorTrap(PhutilErrorTrap $trap) { + $key = $trap->getTrapKey(); + self::$traps[$key] = $trap; + } + + + /** + * Removes an error trap. Normally you should not invoke this directly; + * @{class:PhutilErrorTrap} deregisters itself on destruction. + * + * @param PhutilErrorTrap Trap to remove. + * @return void + * @task trap + */ + public static function removeErrorTrap(PhutilErrorTrap $trap) { + $key = $trap->getTrapKey(); + unset(self::$traps[$key]); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Determine if PhutilErrorHandler has been initialized. + * + * @return bool True if initialized. + * @task internal + */ + public static function hasInitialized() { + return self::$initialized; + } + + + /** + * Handles PHP errors and dispatches them forward. This is a callback for + * ##set_error_handler()##. You should not call this function directly; use + * @{function:phlog} to print debugging messages or ##trigger_error()## to + * trigger PHP errors. + * + * This handler converts E_RECOVERABLE_ERROR messages from violated typehints + * into @{class:InvalidArgumentException}s. + * + * This handler converts other E_RECOVERABLE_ERRORs into + * @{class:RuntimeException}s. + * + * This handler converts E_NOTICE messages from uses of undefined variables + * into @{class:RuntimeException}s. + * + * @param int Error code. + * @param string Error message. + * @param string File where the error occurred. + * @param int Line on which the error occurred. + * @param wild Error context information. + * @return void + * @task internal + */ + public static function handleError($num, $str, $file, $line, $ctx) { + + foreach (self::$traps as $trap) { + $trap->addError($num, $str, $file, $line, $ctx); + } + + if ((error_reporting() & $num) == 0) { + // Respect the use of "@" to silence warnings: if this error was + // emitted from a context where "@" was in effect, the + // value returned by error_reporting() will be 0. This is the + // recommended way to check for this, see set_error_handler() docs + // on php.net. + return false; + } + + // Convert typehint failures into exceptions. + if (preg_match('/^Argument (\d+) passed to (\S+) must be/', $str)) { + throw new InvalidArgumentException($str); + } + + // Convert other E_RECOVERABLE_ERRORs into generic runtime exceptions. + if ($num == E_RECOVERABLE_ERROR) { + throw new RuntimeException($str); + } + + // Convert uses of undefined variables into exceptions. + if (preg_match('/^Undefined variable: /', $str)) { + throw new RuntimeException($str); + } + + // Convert uses of undefined properties into exceptions. + if (preg_match('/^Undefined property: /', $str)) { + throw new RuntimeException($str); + } + + // Convert undefined constants into exceptions. Usually this means there + // is a missing `$` and the program is horribly broken. + if (preg_match('/^Use of undefined constant /', $str)) { + throw new RuntimeException($str); + } + + $trace = debug_backtrace(); + array_shift($trace); + self::dispatchErrorMessage( + self::ERROR, + $str, + array( + 'file' => $file, + 'line' => $line, + 'context' => $ctx, + 'error_code' => $num, + 'trace' => $trace, + )); + } + + /** + * Handles PHP exceptions and dispatches them forward. This is a callback for + * ##set_exception_handler()##. You should not call this function directly; + * to print exceptions, pass the exception object to @{function:phlog}. + * + * @param Exception|Throwable Uncaught exception object. + * @return void + * @task internal + */ + public static function handleException($ex) { + self::dispatchErrorMessage( + self::EXCEPTION, + $ex, + array( + 'file' => $ex->getFile(), + 'line' => $ex->getLine(), + 'trace' => self::getExceptionTrace($ex), + 'catch_trace' => debug_backtrace(), + )); + + // Normally, PHP exits with code 255 after an uncaught exception is thrown. + // However, if we install an exception handler (as we have here), it exits + // with code 0 instead. Script execution terminates after this function + // exits in either case, so exit explicitly with the correct exit code. + exit(255); + } + + + /** + * Output a stacktrace to the PHP error log. + * + * @param trace A stacktrace, e.g. from debug_backtrace(); + * @return void + * @task internal + */ + public static function outputStacktrace($trace) { + $lines = explode("\n", self::formatStacktrace($trace)); + foreach ($lines as $line) { + error_log($line); + } + } + + + /** + * Format a stacktrace for output. + * + * @param trace A stacktrace, e.g. from debug_backtrace(); + * @return string Human-readable trace. + * @task internal + */ + public static function formatStacktrace($trace) { + $result = array(); + + $libinfo = self::getLibraryVersions(); + if ($libinfo) { + foreach ($libinfo as $key => $dict) { + $info = array(); + foreach ($dict as $dkey => $dval) { + $info[] = $dkey.'='.$dval; + } + $libinfo[$key] = $key.'('.implode(', ', $info).')'; + } + $result[] = implode(', ', $libinfo); + } + + foreach ($trace as $key => $entry) { + $line = ' #'.$key.' '; + if (!empty($entry['xid'])) { + if ($entry['xid'] != 1) { + $line .= '<#'.$entry['xid'].'> '; + } + } + if (isset($entry['class'])) { + $line .= $entry['class'].'::'; + } + $line .= idx($entry, 'function', ''); + + if (isset($entry['args'])) { + $args = array(); + foreach ($entry['args'] as $arg) { + + // NOTE: Print out object types, not values. Values sometimes contain + // sensitive information and are usually not particularly helpful + // for debugging. + + $type = (gettype($arg) == 'object') + ? get_class($arg) + : gettype($arg); + $args[] = $type; + } + $line .= '('.implode(', ', $args).')'; + } + + if (isset($entry['file'])) { + $file = self::adjustFilePath($entry['file']); + $line .= ' called at ['.$file.':'.$entry['line'].']'; + } + + $result[] = $line; + } + return implode("\n", $result); + } + + + /** + * All different types of error messages come here before they are + * dispatched to the listener; this method also prints them to the PHP error + * log. + * + * @param const Event type constant. + * @param wild Event value. + * @param dict Event metadata. + * @return void + * @task internal + */ + public static function dispatchErrorMessage($event, $value, $metadata) { + $timestamp = strftime('%Y-%m-%d %H:%M:%S'); + + switch ($event) { + case self::ERROR: + $default_message = sprintf( + '[%s] ERROR %d: %s at [%s:%d]', + $timestamp, + $metadata['error_code'], + $value, + $metadata['file'], + $metadata['line']); + + $metadata['default_message'] = $default_message; + error_log($default_message); + self::outputStacktrace($metadata['trace']); + break; + case self::EXCEPTION: + $messages = array(); + $current = $value; + do { + $messages[] = '('.get_class($current).') '.$current->getMessage(); + } while ($current = self::getPreviousException($current)); + $messages = implode(' {>} ', $messages); + + if (strlen($messages) > 4096) { + $messages = substr($messages, 0, 4096).'...'; + } + + $default_message = sprintf( + '[%s] EXCEPTION: %s at [%s:%d]', + $timestamp, + $messages, + self::adjustFilePath(self::getRootException($value)->getFile()), + self::getRootException($value)->getLine()); + + $metadata['default_message'] = $default_message; + error_log($default_message); + self::outputStacktrace($metadata['trace']); + break; + case self::PHLOG: + $default_message = sprintf( + '[%s] PHLOG: %s at [%s:%d]', + $timestamp, + PhutilReadableSerializer::printShort($value), + $metadata['file'], + $metadata['line']); + + $metadata['default_message'] = $default_message; + error_log($default_message); + break; + case self::DEPRECATED: + $default_message = sprintf( + '[%s] DEPRECATED: %s is deprecated; %s', + $timestamp, + $value, + $metadata['why']); + + $metadata['default_message'] = $default_message; + error_log($default_message); + break; + default: + error_log(pht('Unknown event %s', $event)); + break; + } + + if (self::$errorListener) { + static $handling_error; + if ($handling_error) { + error_log( + 'Error handler was reentered, some errors were not passed to the '. + 'listener.'); + return; + } + $handling_error = true; + call_user_func(self::$errorListener, $event, $value, $metadata); + $handling_error = false; + } + } + + public static function adjustFilePath($path) { + // Compute known library locations so we can emit relative paths if the + // file resides inside a known library. This is a little cleaner to read, + // and limits the number of false positives we get about full path + // disclosure via HackerOne. + + $bootloader = PhutilBootloader::getInstance(); + $libraries = $bootloader->getAllLibraries(); + $roots = array(); + foreach ($libraries as $library) { + $root = $bootloader->getLibraryRoot($library); + // For these libraries, the effective root is one level up. + switch ($library) { + case 'arcanist': + case 'phabricator': + $root = dirname($root); + break; + } + + if (!strncmp($root, $path, strlen($root))) { + return '<'.$library.'>'.substr($path, strlen($root)); + } + } + + return $path; + } + + public static function getLibraryVersions() { + $libinfo = array(); + + $bootloader = PhutilBootloader::getInstance(); + foreach ($bootloader->getAllLibraries() as $library) { + $root = phutil_get_library_root($library); + $try_paths = array( + $root, + dirname($root), + ); + $libinfo[$library] = array(); + + $get_refs = array('master'); + foreach ($try_paths as $try_path) { + // Try to read what the HEAD of the repository is pointed at. This is + // normally the name of a branch ("ref"). + $try_file = $try_path.'/.git/HEAD'; + if (@file_exists($try_file)) { + $head = @file_get_contents($try_file); + $matches = null; + if (preg_match('(^ref: refs/heads/(.*)$)', trim($head), $matches)) { + $libinfo[$library]['head'] = trim($matches[1]); + $get_refs[] = trim($matches[1]); + } else { + $libinfo[$library]['head'] = trim($head); + } + break; + } + } + + // Try to read which commit relevant branch heads are at. + foreach (array_unique($get_refs) as $ref) { + foreach ($try_paths as $try_path) { + $try_file = $try_path.'/.git/refs/heads/'.$ref; + if (@file_exists($try_file)) { + $hash = @file_get_contents($try_file); + if ($hash) { + $libinfo[$library]['ref.'.$ref] = substr(trim($hash), 0, 12); + break; + } + } + } + } + + // Look for extension files. + $custom = @scandir($root.'/extensions/'); + if ($custom) { + $count = 0; + foreach ($custom as $custom_path) { + if (preg_match('/\.php$/', $custom_path)) { + $count++; + } + } + if ($count) { + $libinfo[$library]['custom'] = $count; + } + } + } + + ksort($libinfo); + + return $libinfo; + } + + /** + * Get a full trace across all proxied and aggregated exceptions. + * + * This attempts to build a set of stack frames which completely represent + * all of the places an exception came from, even if it came from multiple + * origins and has been aggregated or proxied. + * + * @param Exception|Throwable Exception to retrieve a trace for. + * @return list List of stack frames. + */ + public static function getExceptionTrace($ex) { + $id = 1; + + // Keep track of discovered exceptions which we need to build traces for. + $stack = array( + array($id, $ex), + ); + + $frames = array(); + while ($info = array_shift($stack)) { + list($xid, $ex) = $info; + + // We're going from top-level exception down in bredth-first order, but + // want to build a trace in approximately standard order (deepest part of + // the call stack to most shallow) so we need to reverse each list of + // frames and then reverse everything at the end. + + $ex_frames = array_reverse($ex->getTrace()); + $ex_frames = array_values($ex_frames); + $last_key = (count($ex_frames) - 1); + foreach ($ex_frames as $frame_key => $frame) { + $frame['xid'] = $xid; + + // If this is a child/previous exception and we're on the deepest frame + // and missing file/line data, fill it in from the exception itself. + if ($xid > 1 && ($frame_key == $last_key)) { + if (empty($frame['file'])) { + $frame['file'] = $ex->getFile(); + $frame['line'] = $ex->getLine(); + } + } + + // Since the exceptions are likely to share the most shallow frames, + // try to add those to the trace only once. + if (isset($frame['file']) && isset($frame['line'])) { + $signature = $frame['file'].':'.$frame['line']; + if (empty($frames[$signature])) { + $frames[$signature] = $frame; + } + } else { + $frames[] = $frame; + } + } + + // If this is a proxy exception, add the proxied exception. + $prev = self::getPreviousException($ex); + if ($prev) { + $stack[] = array(++$id, $prev); + } + + // If this is an aggregate exception, add the child exceptions. + if ($ex instanceof PhutilAggregateException) { + foreach ($ex->getExceptions() as $child) { + $stack[] = array(++$id, $child); + } + } + } + + return array_values(array_reverse($frames)); + } + +} diff --git a/src/error/PhutilErrorTrap.php b/src/error/PhutilErrorTrap.php new file mode 100644 index 00000000..94d291d0 --- /dev/null +++ b/src/error/PhutilErrorTrap.php @@ -0,0 +1,83 @@ +getErrorsAsString(); + * $trap->destroy(); + * + * if (!$res) { + * throw new Exception('proc_open() failed: '.$err); + * } + * + * IMPORTANT: You must explicitly destroy traps because they register + * themselves with @{class:PhutilErrorHandler}, and thus will not be destroyed + * when `unset()`. + * + * Some notes on traps: + * + * - Traps catch all errors, including those silenced by `@`. + * - Traps do not prevent errors from reaching other standard handlers. You + * can use `@` to keep errors out of the logs while still trapping them. + * - Traps capture all errors until they are explicitly destroyed. This means + * that you should not create long-lived traps, or they may consume + * unbounded amounts of memory to hold the error log. + */ +final class PhutilErrorTrap extends Phobject { + + private $destroyed; + private $errors = array(); + + public function addError($num, $str, $file, $line, $ctx) { + $this->errors[] = array( + 'num' => $num, + 'str' => $str, + 'file' => $file, + 'line' => $line, + 'ctx' => $ctx, + ); + return $this; + } + + public function getErrorsAsString() { + $out = array(); + foreach ($this->errors as $error) { + $out[] = $error['str']; + } + return implode("\n", $out); + } + + public function destroy() { + if (!$this->destroyed) { + PhutilErrorHandler::removeErrorTrap($this); + $this->errors = array(); + $this->destroyed = true; + } + } + + public function getTrapKey() { + return spl_object_hash($this); + } + + public function __construct() { + PhutilErrorHandler::addErrorTrap($this); + } + + public function __toString() { + return $this->getErrorsAsString(); + } + +} diff --git a/src/error/PhutilMethodNotImplementedException.php b/src/error/PhutilMethodNotImplementedException.php new file mode 100644 index 00000000..2970e34d --- /dev/null +++ b/src/error/PhutilMethodNotImplementedException.php @@ -0,0 +1,34 @@ +openEnvelope(); + * + * Any time you're passing sensitive data into a stack, you should obscure it + * with an envelope to prevent it leaking if something goes wrong. + * + * The key for the envelope is stored elsewhere, in + * @{class:PhutilOpaqueEnvelopeKey}. This prevents it from appearing in + * any sort of logs related to the envelope, even if the logger is very + * aggressive. + * + * @task envelope Using Opaque Envelopes + * @task internal Internals + */ +final class PhutilOpaqueEnvelope extends Phobject { + + private $value; + + +/* -( Using Opaque Envelopes )--------------------------------------------- */ + + + /** + * @task envelope + */ + public function __construct($string) { + $this->value = $this->mask($string, PhutilOpaqueEnvelopeKey::getKey()); + } + + + /** + * @task envelope + */ + public function openEnvelope() { + return $this->mask($this->value, PhutilOpaqueEnvelopeKey::getKey()); + } + + + /** + * @task envelope + */ + public function __toString() { + return pht(''); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * @task internal + */ + private function mask($string, $noise) { + $result = ''; + for ($ii = 0; $ii < strlen($string); $ii++) { + $s = $string[$ii]; + $n = $noise[$ii % strlen($noise)]; + + $result .= chr(ord($s) ^ ord($n)); + } + return $result; + } + +} diff --git a/src/error/PhutilOpaqueEnvelopeKey.php b/src/error/PhutilOpaqueEnvelopeKey.php new file mode 100644 index 00000000..ea01ee4e --- /dev/null +++ b/src/error/PhutilOpaqueEnvelopeKey.php @@ -0,0 +1,45 @@ + + } + + + /** + * @task internal + */ + public static function getKey() { + if (self::$key === null) { + // NOTE: We're using a weak random source because cryptographic levels + // of security aren't terribly important here and it allows us to use + // envelopes on systems which don't have a strong random source. Notably, + // this lets us make it to the readability check for `/dev/urandom` in + // Phabricator on systems where we can't read it. + self::$key = ''; + for ($ii = 0; $ii < 8; $ii++) { + self::$key .= md5(mt_rand(), $raw_output = true); + } + } + return self::$key; + } + +} diff --git a/src/error/PhutilProxyException.php b/src/error/PhutilProxyException.php new file mode 100644 index 00000000..4f477ae8 --- /dev/null +++ b/src/error/PhutilProxyException.php @@ -0,0 +1,37 @@ +previousException = $previous; + + // This may be an "Exception" or a "Throwable". The "__construct()" method + // for the Exception is documented as taking an Exception, not a Throwable. + // Although passing a Throwable appears to work in PHP 7.3, don't risk it. + $is_exception = ($previous instanceof Exception); + + if (version_compare(PHP_VERSION, '5.3.0', '>=') && $is_exception) { + parent::__construct($message, $code, $previous); + } else { + parent::__construct($message, $code); + } + } + + public function getPreviousException() { + // NOTE: This can not be named "getPrevious()" because that method is final + // after PHP 5.3. Similarly, the property can not be named "previous" + // because HPHP declares a property with the same name and "protected" + // visibility. + return $this->previousException; + } + +} diff --git a/src/error/__tests__/PhutilErrorHandlerTestCase.php b/src/error/__tests__/PhutilErrorHandlerTestCase.php new file mode 100644 index 00000000..760f410a --- /dev/null +++ b/src/error/__tests__/PhutilErrorHandlerTestCase.php @@ -0,0 +1,39 @@ +assertEqual($a, $b->getPrevious()); + $this->assertEqual($a, PhutilErrorHandler::getRootException($b)); + $this->assertEqual($a, PhutilErrorHandler::getPreviousException($b)); + + $this->assertEqual($a, PhutilErrorHandler::getRootException($c)); + $this->assertEqual($b, PhutilErrorHandler::getPreviousException($c)); + } + + public function testSilenceHandler() { + // Errors should normally be logged. + $this->assertTrue(strlen($this->emitError()) > 0); + + // The "@" operator should silence errors. + $this->assertTrue(@strlen($this->emitError()) === 0); + } + + private function emitError() { + $temporary_log = new TempFile(); + + $old_log = ini_get('error_log'); + ini_set('error_log', (string)$temporary_log); + + trigger_error(pht('(A synthetic error emitted during a unit test.)')); + + ini_set('error_log', $old_log); + return Filesystem::readFile($temporary_log); + } + + +} diff --git a/src/error/__tests__/PhutilOpaqueEnvelopeTestCase.php b/src/error/__tests__/PhutilOpaqueEnvelopeTestCase.php new file mode 100644 index 00000000..2f6c06b2 --- /dev/null +++ b/src/error/__tests__/PhutilOpaqueEnvelopeTestCase.php @@ -0,0 +1,47 @@ +assertFalse(strpos(var_export($envelope, true), $secret)); + + $this->assertFalse(strpos(print_r($envelope, true), $secret)); + + ob_start(); + var_dump($envelope); + $dump = ob_get_clean(); + + $this->assertFalse(strpos($dump, $secret)); + + try { + $this->throwTrace($envelope); + } catch (Exception $ex) { + $trace = $ex->getTrace(); + $this->assertFalse(strpos(print_r($trace, true), $secret)); + } + + $backtrace = $this->getBacktrace($envelope); + $this->assertFalse(strpos(print_r($backtrace, true), $secret)); + + $this->assertEqual($secret, $envelope->openEnvelope()); + } + + private function throwTrace($v) { + throw new Exception('!'); + } + + private function getBacktrace($v) { + return debug_backtrace(); + } + +} diff --git a/src/error/phlog.php b/src/error/phlog.php new file mode 100644 index 00000000..105e0740 --- /dev/null +++ b/src/error/phlog.php @@ -0,0 +1,68 @@ + $trace[0]['file'], + 'line' => $trace[0]['line'], + 'trace' => $trace, + ); + + foreach (func_get_args() as $event) { + $data = $metadata; + if (($event instanceof Exception) || ($event instanceof Throwable)) { + $type = PhutilErrorHandler::EXCEPTION; + // If this is an exception, proxy it and generate a composite trace which + // shows both where the phlog() was called and where the exception was + // originally thrown from. + $proxy = new PhutilProxyException('', $event); + $trace = PhutilErrorHandler::getExceptionTrace($proxy); + $data['trace'] = $trace; + } else { + $type = PhutilErrorHandler::PHLOG; + } + + PhutilErrorHandler::dispatchErrorMessage($type, $event, $data); + } + + return $value; +} + +/** + * Example @{class:PhutilErrorHandler} error listener callback. When you call + * `PhutilErrorHandler::setErrorListener()`, you must pass a callback function + * with the same signature as this one. + * + * NOTE: @{class:PhutilErrorHandler} handles writing messages to the error + * log, so you only need to provide a listener if you have some other console + * (like Phabricator's DarkConsole) which you //also// want to send errors to. + * + * NOTE: You will receive errors which were silenced with the `@` operator. If + * you don't want to display these, test for `@` being in effect by checking if + * `error_reporting() === 0` before displaying the error. + * + * @param const A PhutilErrorHandler constant, like PhutilErrorHandler::ERROR, + * which indicates the event type (e.g. error, exception, + * user message). + * @param wild The event value, like the Exception object for an exception + * event, an error string for an error event, or some user object + * for user messages. + * @param dict A dictionary of metadata about the event. The keys 'file', + * 'line' and 'trace' are always available. Other keys may be + * present, depending on the event type. + * @return void + */ +function phutil_error_listener_example($event, $value, array $metadata) { + throw new Exception(pht('This is just an example function!')); +} diff --git a/src/events/PhutilEvent.php b/src/events/PhutilEvent.php new file mode 100644 index 00000000..9297b201 --- /dev/null +++ b/src/events/PhutilEvent.php @@ -0,0 +1,39 @@ +type = $type; + $this->data = $data; + } + + public function getType() { + return $this->type; + } + + public function getValue($key, $default = null) { + return idx($this->data, $key, $default); + } + + public function setValue($key, $value) { + $this->data[$key] = $value; + return $this; + } + + public function stop() { + $this->stop = true; + return $this; + } + + public function isStopped() { + return $this->stop; + } + +} diff --git a/src/events/PhutilEventEngine.php b/src/events/PhutilEventEngine.php new file mode 100644 index 00000000..8c822103 --- /dev/null +++ b/src/events/PhutilEventEngine.php @@ -0,0 +1,75 @@ + + } + + public static function getInstance() { + if (!self::$instance) { + self::$instance = new PhutilEventEngine(); + } + return self::$instance; + } + + public function addListener(PhutilEventListener $listener, $type) { + $this->listeners[$type][] = $listener; + return $this; + } + + /** + * Get all the objects currently listening to any event. + */ + public function getAllListeners() { + $listeners = array_mergev($this->listeners); + $listeners = mpull($listeners, null, 'getListenerID'); + return $listeners; + } + + public static function dispatchEvent(PhutilEvent $event) { + $instance = self::getInstance(); + + $listeners = idx($instance->listeners, $event->getType(), array()); + $global_listeners = idx( + $instance->listeners, + PhutilEventType::TYPE_ALL, + array()); + + // Merge and deduplicate listeners (we want to send the event to each + // listener only once, even if it satisfies multiple criteria for the + // event). + $listeners = array_merge($listeners, $global_listeners); + $listeners = mpull($listeners, null, 'getListenerID'); + + $profiler = PhutilServiceProfiler::getInstance(); + $profiler_id = $profiler->beginServiceCall( + array( + 'type' => 'event', + 'kind' => $event->getType(), + 'count' => count($listeners), + )); + + $caught = null; + try { + foreach ($listeners as $listener) { + if ($event->isStopped()) { + // Do this first so if someone tries to dispatch a stopped event it + // doesn't go anywhere. Silly but less surprising. + break; + } + $listener->handleEvent($event); + } + } catch (Exception $ex) { + $profiler->endServiceCall($profiler_id, array()); + throw $ex; + } + + $profiler->endServiceCall($profiler_id, array()); + } + +} diff --git a/src/events/PhutilEventListener.php b/src/events/PhutilEventListener.php new file mode 100644 index 00000000..e4925e50 --- /dev/null +++ b/src/events/PhutilEventListener.php @@ -0,0 +1,37 @@ + + } + + abstract public function register(); + abstract public function handleEvent(PhutilEvent $event); + + final public function listen($type) { + $engine = PhutilEventEngine::getInstance(); + $engine->addListener($this, $type); + } + + + /** + * Return a scalar ID unique to this listener. This is used to deduplicate + * listeners which match events on multiple rules, so they are invoked only + * once. + * + * @return int A scalar unique to this object instance. + */ + final public function getListenerID() { + if (!$this->listenerID) { + $this->listenerID = self::$nextListenerID; + self::$nextListenerID++; + } + return $this->listenerID; + } + + +} diff --git a/src/events/constant/PhutilEventConstants.php b/src/events/constant/PhutilEventConstants.php new file mode 100644 index 00000000..ede347fb --- /dev/null +++ b/src/events/constant/PhutilEventConstants.php @@ -0,0 +1,3 @@ +callee = $callee; + $this->function = $function; + + parent::__construct( + pht( + 'Call %s before calling %s!', + $this->function.'()', + $this->callee.'()')); + } + + public function getCallee() { + return $this->callee; + } + + public function getFunction() { + return $this->function; + } +} diff --git a/src/exception/__tests__/PhutilInvalidStateExceptionTestCase.php b/src/exception/__tests__/PhutilInvalidStateExceptionTestCase.php new file mode 100644 index 00000000..6c94487d --- /dev/null +++ b/src/exception/__tests__/PhutilInvalidStateExceptionTestCase.php @@ -0,0 +1,17 @@ +assertEqual( + __FUNCTION__, + $ex->getCallee()); + $this->assertEqual( + 'someMethod', + $ex->getFunction()); + } + } +} diff --git a/src/filesystem/FileFinder.php b/src/filesystem/FileFinder.php new file mode 100644 index 00000000..6b1dbbb4 --- /dev/null +++ b/src/filesystem/FileFinder.php @@ -0,0 +1,365 @@ +withType('f') + * ->withSuffix('php') + * ->find(); + * + * @task create Creating a File Query + * @task config Configuring File Queries + * @task exec Executing the File Query + * @task internal Internal + */ +final class FileFinder extends Phobject { + + private $root; + private $exclude = array(); + private $paths = array(); + private $name = array(); + private $suffix = array(); + private $nameGlobs = array(); + private $type; + private $generateChecksums = false; + private $followSymlinks; + private $forceMode; + + /** + * Create a new FileFinder. + * + * @param string Root directory to find files beneath. + * @return this + * @task create + */ + public function __construct($root) { + $this->root = rtrim($root, '/'); + } + + /** + * @task config + */ + public function excludePath($path) { + $this->exclude[] = $path; + return $this; + } + + /** + * @task config + */ + public function withName($name) { + $this->name[] = $name; + return $this; + } + + /** + * @task config + */ + public function withSuffix($suffix) { + $this->suffix[] = $suffix; + return $this; + } + + /** + * @task config + */ + public function withPath($path) { + $this->paths[] = $path; + return $this; + } + + /** + * @task config + */ + public function withType($type) { + $this->type = $type; + return $this; + } + + /** + * @task config + */ + public function withFollowSymlinks($follow) { + $this->followSymlinks = $follow; + return $this; + } + + /** + * @task config + */ + public function setGenerateChecksums($generate) { + $this->generateChecksums = $generate; + return $this; + } + + public function getGenerateChecksums() { + return $this->generateChecksums; + } + + public function withNameGlob($pattern) { + $this->nameGlobs[] = $pattern; + return $this; + } + + /** + * @task config + * @param string Either "php", "shell", or the empty string. + */ + public function setForceMode($mode) { + $this->forceMode = $mode; + return $this; + } + + /** + * @task internal + */ + public function validateFile($file) { + + if ($this->name) { + $matches = false; + foreach ($this->name as $curr_name) { + if (basename($file) === $curr_name) { + $matches = true; + break; + } + } + + if (!$matches) { + return false; + } + } + + if ($this->nameGlobs) { + $name = basename($file); + + $matches = false; + foreach ($this->nameGlobs as $glob) { + $glob = addcslashes($glob, '\\'); + if (fnmatch($glob, $name)) { + $matches = true; + break; + } + } + + if (!$matches) { + return false; + } + } + + if ($this->suffix) { + $matches = false; + foreach ($this->suffix as $suffix) { + $suffix = addcslashes($suffix, '\\?*'); + $suffix = '*.'.$suffix; + if (fnmatch($suffix, $file)) { + $matches = true; + break; + } + } + + if (!$matches) { + return false; + } + } + + if ($this->paths) { + $matches = false; + foreach ($this->paths as $path) { + if (fnmatch($path, $this->root.'/'.$file)) { + $matches = true; + break; + } + } + + if (!$matches) { + return false; + } + } + + $fullpath = $this->root.'/'.ltrim($file, '/'); + if (($this->type == 'f' && is_dir($fullpath)) + || ($this->type == 'd' && !is_dir($fullpath))) { + return false; + } + + return true; + } + + /** + * @task internal + */ + private function getFiles($dir) { + $found = Filesystem::listDirectory($this->root.'/'.$dir, true); + $files = array(); + if (strlen($dir) > 0) { + $dir = rtrim($dir, '/').'/'; + } + foreach ($found as $filename) { + // Only exclude files whose names match relative to the root. + if ($dir == '') { + $matches = true; + foreach ($this->exclude as $exclude_path) { + if (fnmatch(ltrim($exclude_path, './'), $dir.$filename)) { + $matches = false; + break; + } + } + if (!$matches) { + continue; + } + } + + if ($this->validateFile($dir.$filename)) { + $files[] = $dir.$filename; + } + + if (is_dir($this->root.'/'.$dir.$filename)) { + foreach ($this->getFiles($dir.$filename) as $file) { + $files[] = $file; + } + } + } + return $files; + } + + /** + * @task exec + */ + public function find() { + + $files = array(); + + if (!is_dir($this->root) || !is_readable($this->root)) { + throw new Exception( + pht( + "Invalid %s root directory specified ('%s'). Root directory ". + "must be a directory, be readable, and be specified with an ". + "absolute path.", + __CLASS__, + $this->root)); + } + + if ($this->forceMode == 'shell') { + $php_mode = false; + } else if ($this->forceMode == 'php') { + $php_mode = true; + } else { + $php_mode = (phutil_is_windows() || !Filesystem::binaryExists('find')); + } + + if ($php_mode) { + $files = $this->getFiles(''); + } else { + $args = array(); + $command = array(); + + $command[] = 'find'; + if ($this->followSymlinks) { + $command[] = '-L'; + } + $command[] = '.'; + + if ($this->exclude) { + $command[] = $this->generateList('path', $this->exclude).' -prune'; + $command[] = '-o'; + } + + if ($this->type) { + $command[] = '-type %s'; + $args[] = $this->type; + } + + if ($this->name) { + $command[] = $this->generateList('name', $this->name, 'name'); + } + + if ($this->suffix) { + $command[] = $this->generateList('name', $this->suffix, 'suffix'); + } + + if ($this->paths) { + $command[] = $this->generateList('path', $this->paths); + } + + if ($this->nameGlobs) { + $command[] = $this->generateList('name', $this->nameGlobs); + } + + $command[] = '-print0'; + + array_unshift($args, implode(' ', $command)); + list($stdout) = newv('ExecFuture', $args) + ->setCWD($this->root) + ->resolvex(); + + $stdout = trim($stdout); + if (!strlen($stdout)) { + return array(); + } + + $files = explode("\0", $stdout); + + // On OSX/BSD, find prepends a './' to each file. + foreach ($files as $key => $file) { + // When matching directories, we can get "." back in the result set, + // but this isn't an interesting result. + if ($file == '.') { + unset($files[$key]); + continue; + } + + if (substr($files[$key], 0, 2) == './') { + $files[$key] = substr($files[$key], 2); + } + } + } + + if (!$this->generateChecksums) { + return $files; + } else { + $map = array(); + foreach ($files as $line) { + $fullpath = $this->root.'/'.ltrim($line, '/'); + if (is_dir($fullpath)) { + $map[$line] = null; + } else { + $map[$line] = md5_file($fullpath); + } + } + return $map; + } + } + + /** + * @task internal + */ + private function generateList( + $flag, + array $items, + $mode = 'glob') { + + foreach ($items as $key => $item) { + // If the mode is not "glob" mode, we're going to escape glob characters + // in the pattern. Otherwise, we escape only backslashes. + if ($mode === 'glob') { + $item = addcslashes($item, '\\'); + } else { + $item = addcslashes($item, '\\*?'); + } + + if ($mode === 'suffix') { + $item = '*.'.$item; + } + + $item = (string)csprintf('%s %s', '-'.$flag, $item); + + $items[$key] = $item; + } + + $items = implode(' -o ', $items); + return '"(" '.$items.' ")"'; + } +} diff --git a/src/filesystem/FileList.php b/src/filesystem/FileList.php new file mode 100644 index 00000000..656c92de --- /dev/null +++ b/src/filesystem/FileList.php @@ -0,0 +1,92 @@ +contains($file)) { + * do_something_to_this($file); + * } + * } + * + * This sort of construction will allow the user to type "src" in order + * to indicate 'all relevant files underneath "src/"'. + * + * @task create Creating a File List + * @task test Testing File Lists + */ +final class FileList extends Phobject { + + private $files = array(); + private $dirs = array(); + + /** + * Build a new FileList from an array of paths, e.g. from $argv. + * + * @param list List of relative or absolute file paths. + * @return this + * @task create + */ + public function __construct($paths) { + foreach ($paths as $path) { + $path = Filesystem::resolvePath($path); + if (is_dir($path)) { + $path = rtrim($path, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + $this->dirs[$path] = true; + } + $this->files[] = $path; + } + } + + + /** + * Determine if a path is one of the paths in the list. Note that an empty + * file list is considered to contain every file. + * + * @param string Relative or absolute system file path. + * @param bool If true, consider the path to be contained in the list if + * the list contains a parent directory. If false, require + * that the path be part of the list explicitly. + * @return bool If true, the file is in the list. + * @task test + */ + public function contains($path, $allow_parent_directory = true) { + + if ($this->isEmpty()) { + return true; + } + + $path = Filesystem::resolvePath($path); + if (is_dir($path)) { + $path .= DIRECTORY_SEPARATOR; + } + + foreach ($this->files as $file) { + if ($file == $path) { + return true; + } + if ($allow_parent_directory) { + $len = strlen($file); + if (isset($this->dirs[$file]) && !strncmp($file, $path, $len)) { + return true; + } + } + } + return false; + } + + + /** + * Check if the file list is empty -- that is, it contains no files. + * + * @return bool If true, the list is empty. + * @task test + */ + public function isEmpty() { + return !$this->files; + } + +} diff --git a/src/filesystem/Filesystem.php b/src/filesystem/Filesystem.php new file mode 100644 index 00000000..a88ed12a --- /dev/null +++ b/src/filesystem/Filesystem.php @@ -0,0 +1,1248 @@ +> 3]; + } + + return $result; + } + + + /** + * Generate a random integer value in a given range. + * + * This method uses less-entropic random sources under older versions of PHP. + * + * @param int Minimum value, inclusive. + * @param int Maximum value, inclusive. + */ + public static function readRandomInteger($min, $max) { + if (!is_int($min)) { + throw new Exception(pht('Minimum value must be an integer.')); + } + + if (!is_int($max)) { + throw new Exception(pht('Maximum value must be an integer.')); + } + + if ($min > $max) { + throw new Exception( + pht( + 'Minimum ("%d") must not be greater than maximum ("%d").', + $min, + $max)); + } + + // Under PHP 7.2.0 and newer, we can just use "random_int()". This function + // is intended to generate cryptographically usable entropy. + if (function_exists('random_int')) { + return random_int($min, $max); + } + + // We could find a stronger source for this, but correctly converting raw + // bytes to an integer range without biases is fairly hard and it seems + // like we're more likely to get that wrong than suffer a PRNG prediction + // issue by falling back to "mt_rand()". + + if (($max - $min) > mt_getrandmax()) { + throw new Exception( + pht('mt_rand() range is smaller than the requested range.')); + } + + $result = mt_rand($min, $max); + if (!is_int($result)) { + throw new Exception(pht('Bad return value from mt_rand().')); + } + + return $result; + } + + + /** + * Identify the MIME type of a file. This returns only the MIME type (like + * text/plain), not the encoding (like charset=utf-8). + * + * @param string Path to the file to examine. + * @param string Optional default mime type to return if the file's mime + * type can not be identified. + * @return string File mime type. + * + * @task file + * + * @phutil-external-symbol function mime_content_type + * @phutil-external-symbol function finfo_open + * @phutil-external-symbol function finfo_file + */ + public static function getMimeType( + $path, + $default = 'application/octet-stream') { + + $path = self::resolvePath($path); + + self::assertExists($path); + self::assertIsFile($path); + self::assertReadable($path); + + $mime_type = null; + + // Fileinfo is the best approach since it doesn't rely on `file`, but + // it isn't builtin for older versions of PHP. + + if (function_exists('finfo_open')) { + $finfo = finfo_open(FILEINFO_MIME); + if ($finfo) { + $result = finfo_file($finfo, $path); + if ($result !== false) { + $mime_type = $result; + } + } + } + + // If we failed Fileinfo, try `file`. This works well but not all systems + // have the binary. + + if ($mime_type === null) { + list($err, $stdout) = exec_manual( + 'file --brief --mime %s', + $path); + if (!$err) { + $mime_type = trim($stdout); + } + } + + // If we didn't get anywhere, try the deprecated mime_content_type() + // function. + + if ($mime_type === null) { + if (function_exists('mime_content_type')) { + $result = mime_content_type($path); + if ($result !== false) { + $mime_type = $result; + } + } + } + + // If we come back with an encoding, strip it off. + if (strpos($mime_type, ';') !== false) { + list($type, $encoding) = explode(';', $mime_type, 2); + $mime_type = $type; + } + + if ($mime_type === null) { + $mime_type = $default; + } + + return $mime_type; + } + + +/* -( Directories )-------------------------------------------------------- */ + + + /** + * Create a directory in a manner similar to mkdir(), but throw detailed + * exceptions on failure. + * + * @param string Path to directory. The parent directory must exist and + * be writable. + * @param int Permission umask. Note that umask is in octal, so you + * should specify it as, e.g., `0777', not `777'. + * @param boolean Recursively create directories. Default to false. + * @return string Path to the created directory. + * + * @task directory + */ + public static function createDirectory( + $path, + $umask = 0755, + $recursive = false) { + + $path = self::resolvePath($path); + + if (is_dir($path)) { + if ($umask) { + self::changePermissions($path, $umask); + } + return $path; + } + + $dir = dirname($path); + if ($recursive && !file_exists($dir)) { + // Note: We could do this with the recursive third parameter of mkdir(), + // but then we loose the helpful FilesystemExceptions we normally get. + self::createDirectory($dir, $umask, true); + } + + self::assertIsDirectory($dir); + self::assertExists($dir); + self::assertWritable($dir); + self::assertNotExists($path); + + if (!mkdir($path, $umask)) { + throw new FilesystemException( + $path, + pht("Failed to create directory '%s'.", $path)); + } + + // Need to change permissions explicitly because mkdir does something + // slightly different. mkdir(2) man page: + // 'The parameter mode specifies the permissions to use. It is modified by + // the process's umask in the usual way: the permissions of the created + // directory are (mode & ~umask & 0777)."' + if ($umask) { + self::changePermissions($path, $umask); + } + + return $path; + } + + + /** + * Create a temporary directory and return the path to it. You are + * responsible for removing it (e.g., with Filesystem::remove()) + * when you are done with it. + * + * @param string Optional directory prefix. + * @param int Permissions to create the directory with. By default, + * these permissions are very restrictive (0700). + * @param string Optional root directory. If not provided, the system + * temporary directory (often "/tmp") will be used. + * @return string Path to newly created temporary directory. + * + * @task directory + */ + public static function createTemporaryDirectory( + $prefix = '', + $umask = 0700, + $root_directory = null) { + $prefix = preg_replace('/[^A-Z0-9._-]+/i', '', $prefix); + + if ($root_directory !== null) { + $tmp = $root_directory; + self::assertExists($tmp); + self::assertIsDirectory($tmp); + self::assertWritable($tmp); + } else { + $tmp = sys_get_temp_dir(); + if (!$tmp) { + throw new FilesystemException( + $tmp, + pht('Unable to determine system temporary directory.')); + } + } + + $base = $tmp.DIRECTORY_SEPARATOR.$prefix; + + $tries = 3; + do { + $dir = $base.substr(base_convert(md5(mt_rand()), 16, 36), 0, 16); + try { + self::createDirectory($dir, $umask); + break; + } catch (FilesystemException $ex) { + // Ignore. + } + } while (--$tries); + + if (!$tries) { + $df = disk_free_space($tmp); + if ($df !== false && $df < 1024 * 1024) { + throw new FilesystemException( + $dir, + pht('Failed to create a temporary directory: the disk is full.')); + } + + throw new FilesystemException( + $dir, + pht("Failed to create a temporary directory in '%s'.", $tmp)); + } + + return $dir; + } + + + /** + * List files in a directory. + * + * @param string Path, absolute or relative to PWD. + * @param bool If false, exclude files beginning with a ".". + * + * @return array List of files and directories in the specified + * directory, excluding `.' and `..'. + * + * @task directory + */ + public static function listDirectory($path, $include_hidden = true) { + $path = self::resolvePath($path); + + self::assertExists($path); + self::assertIsDirectory($path); + self::assertReadable($path); + + $list = @scandir($path); + if ($list === false) { + throw new FilesystemException( + $path, + pht("Unable to list contents of directory '%s'.", $path)); + } + + foreach ($list as $k => $v) { + if ($v == '.' || $v == '..' || (!$include_hidden && $v[0] == '.')) { + unset($list[$k]); + } + } + + return array_values($list); + } + + + /** + * Return all directories between a path and the specified root directory + * (defaulting to "/"). Iterating over them walks from the path to the root. + * + * @param string Path, absolute or relative to PWD. + * @param string The root directory. + * @return list List of parent paths, including the provided path. + * @task directory + */ + public static function walkToRoot($path, $root = null) { + $path = self::resolvePath($path); + + if (is_link($path)) { + $path = realpath($path); + } + + // NOTE: On Windows, paths start like "C:\", so "/" does not contain + // every other path. We could possibly special case "/" to have the same + // meaning on Windows that it does on Linux, but just special case the + // common case for now. See PHI817. + if ($root !== null) { + $root = self::resolvePath($root); + + if (is_link($root)) { + $root = realpath($root); + } + + // NOTE: We don't use `isDescendant()` here because we don't want to + // reject paths which don't exist on disk. + $root_list = new FileList(array($root)); + if (!$root_list->contains($path)) { + return array(); + } + } else { + if (phutil_is_windows()) { + $root = null; + } else { + $root = '/'; + } + } + + $walk = array(); + $parts = explode(DIRECTORY_SEPARATOR, $path); + foreach ($parts as $k => $part) { + if (!strlen($part)) { + unset($parts[$k]); + } + } + + while (true) { + if (phutil_is_windows()) { + $next = implode(DIRECTORY_SEPARATOR, $parts); + } else { + $next = DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $parts); + } + + $walk[] = $next; + if ($next == $root) { + break; + } + + if (!$parts) { + break; + } + + array_pop($parts); + } + + return $walk; + } + + +/* -( Paths )-------------------------------------------------------------- */ + + + /** + * Checks if a path is specified as an absolute path. + * + * @param string + * @return bool + */ + public static function isAbsolutePath($path) { + if (phutil_is_windows()) { + return (bool)preg_match('/^[A-Za-z]+:/', $path); + } else { + return !strncmp($path, DIRECTORY_SEPARATOR, 1); + } + } + + /** + * Canonicalize a path by resolving it relative to some directory (by + * default PWD), following parent symlinks and removing artifacts. If the + * path is itself a symlink it is left unresolved. + * + * @param string Path, absolute or relative to PWD. + * @return string Canonical, absolute path. + * + * @task path + */ + public static function resolvePath($path, $relative_to = null) { + $is_absolute = self::isAbsolutePath($path); + + if (!$is_absolute) { + if (!$relative_to) { + $relative_to = getcwd(); + } + $path = $relative_to.DIRECTORY_SEPARATOR.$path; + } + + if (is_link($path)) { + $parent_realpath = realpath(dirname($path)); + if ($parent_realpath !== false) { + return $parent_realpath.DIRECTORY_SEPARATOR.basename($path); + } + } + + $realpath = realpath($path); + if ($realpath !== false) { + return $realpath; + } + + + // This won't work if the file doesn't exist or is on an unreadable mount + // or something crazy like that. Try to resolve a parent so we at least + // cover the nonexistent file case. + $parts = explode(DIRECTORY_SEPARATOR, trim($path, DIRECTORY_SEPARATOR)); + while (end($parts) !== false) { + array_pop($parts); + if (phutil_is_windows()) { + $attempt = implode(DIRECTORY_SEPARATOR, $parts); + } else { + $attempt = DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $parts); + } + $realpath = realpath($attempt); + if ($realpath !== false) { + $path = $realpath.substr($path, strlen($attempt)); + break; + } + } + + return $path; + } + + /** + * Test whether a path is descendant from some root path after resolving all + * symlinks and removing artifacts. Both paths must exists for the relation + * to obtain. A path is always a descendant of itself as long as it exists. + * + * @param string Child path, absolute or relative to PWD. + * @param string Root path, absolute or relative to PWD. + * @return bool True if resolved child path is in fact a descendant of + * resolved root path and both exist. + * @task path + */ + public static function isDescendant($path, $root) { + try { + self::assertExists($path); + self::assertExists($root); + } catch (FilesystemException $e) { + return false; + } + $fs = new FileList(array($root)); + return $fs->contains($path); + } + + /** + * Convert a canonical path to its most human-readable format. It is + * guaranteed that you can use resolvePath() to restore a path to its + * canonical format. + * + * @param string Path, absolute or relative to PWD. + * @param string Optionally, working directory to make files readable + * relative to. + * @return string Human-readable path. + * + * @task path + */ + public static function readablePath($path, $pwd = null) { + if ($pwd === null) { + $pwd = getcwd(); + } + + foreach (array($pwd, self::resolvePath($pwd)) as $parent) { + $parent = rtrim($parent, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + $len = strlen($parent); + if (!strncmp($parent, $path, $len)) { + $path = substr($path, $len); + return $path; + } + } + + return $path; + } + + /** + * Determine whether or not a path exists in the filesystem. This differs from + * file_exists() in that it returns true for symlinks. This method does not + * attempt to resolve paths before testing them. + * + * @param string Test for the existence of this path. + * @return bool True if the path exists in the filesystem. + * @task path + */ + public static function pathExists($path) { + return file_exists($path) || is_link($path); + } + + + /** + * Determine if an executable binary (like `git` or `svn`) exists within + * the configured `$PATH`. + * + * @param string Binary name, like `'git'` or `'svn'`. + * @return bool True if the binary exists and is executable. + * @task exec + */ + public static function binaryExists($binary) { + return self::resolveBinary($binary) !== null; + } + + + /** + * Locates the full path that an executable binary (like `git` or `svn`) is at + * the configured `$PATH`. + * + * @param string Binary name, like `'git'` or `'svn'`. + * @return string The full binary path if it is present, or null. + * @task exec + */ + public static function resolveBinary($binary) { + if (phutil_is_windows()) { + list($err, $stdout) = exec_manual('where %s', $binary); + $stdout = phutil_split_lines($stdout); + + // If `where %s` could not find anything, check for relative binary + if ($err) { + $path = self::resolvePath($binary); + if (self::pathExists($path)) { + return $path; + } + return null; + } + $stdout = head($stdout); + } else { + list($err, $stdout) = exec_manual('which %s', $binary); + } + + return $err === 0 ? trim($stdout) : null; + } + + + /** + * Determine if two paths are equivalent by resolving symlinks. This is + * different from resolving both paths and comparing them because + * resolvePath() only resolves symlinks in parent directories, not the + * path itself. + * + * @param string First path to test for equivalence. + * @param string Second path to test for equivalence. + * @return bool True if both paths are equivalent, i.e. reference the same + * entity in the filesystem. + * @task path + */ + public static function pathsAreEquivalent($u, $v) { + $u = self::resolvePath($u); + $v = self::resolvePath($v); + + $real_u = realpath($u); + $real_v = realpath($v); + + if ($real_u) { + $u = $real_u; + } + if ($real_v) { + $v = $real_v; + } + return ($u == $v); + } + + +/* -( Assert )------------------------------------------------------------- */ + + + /** + * Assert that something (e.g., a file, directory, or symlink) exists at a + * specified location. + * + * @param string Assert that this path exists. + * @return void + * + * @task assert + */ + public static function assertExists($path) { + if (self::pathExists($path)) { + return; + } + + // Before we claim that the path doesn't exist, try to find a parent we + // don't have "+x" on. If we find one, tailor the error message so we don't + // say "does not exist" in cases where the path does exist, we just don't + // have permission to test its existence. + foreach (self::walkToRoot($path) as $parent) { + if (!self::pathExists($parent)) { + continue; + } + + if (!is_dir($parent)) { + continue; + } + + if (phutil_is_windows()) { + // Do nothing. On Windows, there's no obvious equivalent to the + // check below because "is_executable(...)" always appears to return + // "false" for any directory. + } else if (!is_executable($parent)) { + // On Linux, note that we don't need read permission ("+r") on parent + // directories to determine that a path exists, only execute ("+x"). + throw new FilesystemException( + $path, + pht( + 'Filesystem path "%s" can not be accessed because a parent '. + 'directory ("%s") is not executable (the current process does '. + 'not have "+x" permission).', + $path, + $parent)); + } + } + + throw new FilesystemException( + $path, + pht( + 'Filesystem path "%s" does not exist.', + $path)); + } + + + /** + * Assert that nothing exists at a specified location. + * + * @param string Assert that this path does not exist. + * @return void + * + * @task assert + */ + public static function assertNotExists($path) { + if (file_exists($path) || is_link($path)) { + throw new FilesystemException( + $path, + pht("Path '%s' already exists!", $path)); + } + } + + + /** + * Assert that a path represents a file, strictly (i.e., not a directory). + * + * @param string Assert that this path is a file. + * @return void + * + * @task assert + */ + public static function assertIsFile($path) { + if (!is_file($path)) { + throw new FilesystemException( + $path, + pht("Requested path '%s' is not a file.", $path)); + } + } + + + /** + * Assert that a path represents a directory, strictly (i.e., not a file). + * + * @param string Assert that this path is a directory. + * @return void + * + * @task assert + */ + public static function assertIsDirectory($path) { + if (!is_dir($path)) { + throw new FilesystemException( + $path, + pht("Requested path '%s' is not a directory.", $path)); + } + } + + + /** + * Assert that a file or directory exists and is writable. + * + * @param string Assert that this path is writable. + * @return void + * + * @task assert + */ + public static function assertWritable($path) { + if (!is_writable($path)) { + throw new FilesystemException( + $path, + pht("Requested path '%s' is not writable.", $path)); + } + } + + + /** + * Assert that a file or directory exists and is readable. + * + * @param string Assert that this path is readable. + * @return void + * + * @task assert + */ + public static function assertReadable($path) { + if (!is_readable($path)) { + throw new FilesystemException( + $path, + pht("Path '%s' is not readable.", $path)); + } + } + +} diff --git a/src/filesystem/FilesystemException.php b/src/filesystem/FilesystemException.php new file mode 100644 index 00000000..cc464ff7 --- /dev/null +++ b/src/filesystem/FilesystemException.php @@ -0,0 +1,34 @@ +path = $path; + parent::__construct($message); + } + + + /** + * Retrieve the path associated with the exception. Generally, this is + * something like a path that couldn't be read or written, or a path that + * was expected to exist but didn't. + * + * @return string Path associated with the exception. + */ + public function getPath() { + return $this->path; + } + +} diff --git a/src/filesystem/PhutilDeferredLog.php b/src/filesystem/PhutilDeferredLog.php new file mode 100644 index 00000000..386fa8c1 --- /dev/null +++ b/src/filesystem/PhutilDeferredLog.php @@ -0,0 +1,246 @@ +setData( + * array( + * 'T' => date('c'), + * 'u' => $username, + * )); + * + * The log will be appended when the object's destructor is called, or when you + * invoke @{method:write}. Note that programs can exit without invoking object + * destructors (e.g., in the case of an unhandled exception, memory exhaustion, + * or SIGKILL) so writes are not guaranteed. You can call @{method:write} to + * force an explicit write to disk before the destructor is called. + * + * Log variables will be written with bytes 0x00-0x1F, 0x7F-0xFF, and backslash + * escaped using C-style escaping. Since this range includes tab, you can use + * tabs as field separators to ensure the file format is easily parsable. In + * PHP, you can decode this encoding with `stripcslashes`. + * + * If a variable is included in the log format but a value is never provided + * with @{method:setData}, it will be written as "-". + * + * @task log Logging + * @task write Writing the Log + * @task internal Internals + */ +final class PhutilDeferredLog extends Phobject { + + private $file; + private $format; + private $data; + private $didWrite; + private $failQuietly; + + +/* -( Logging )------------------------------------------------------------ */ + + + /** + * Create a new log entry, which will be written later. The format string + * should use "%x"-style placeholders to represent data which will be added + * later: + * + * $log = new PhutilDeferredLog('/some/file.log', '[%T] %u'); + * + * @param string|null The file the entry should be written to, or null to + * create a log object which does not write anywhere. + * @param string The log entry format. + * @task log + */ + public function __construct($file, $format) { + $this->file = $file; + $this->format = $format; + $this->data = array(); + $this->didWrite = false; + } + + + /** + * Add data to the log. Provide a map of variables to replace in the format + * string. For example, if you use a format string like: + * + * "[%T]\t%u" + * + * ...you might add data like this: + * + * $log->setData( + * array( + * 'T' => date('c'), + * 'u' => $username, + * )); + * + * When the log is written, the "%T" and "%u" variables will be replaced with + * the values you provide. + * + * @param dict Map of variables to values. + * @return this + * @task log + */ + public function setData(array $map) { + $this->data = $map + $this->data; + return $this; + } + + + /** + * Get existing log data. + * + * @param string Log data key. + * @param wild Default to return if data does not exist. + * @return wild Data, or default if data does not exist. + * @task log + */ + public function getData($key, $default = null) { + return idx($this->data, $key, $default); + } + + + /** + * Set the path where the log will be written. You can pass `null` to prevent + * the log from writing. + * + * NOTE: You can not change the file after the log writes. + * + * @param string|null File where the entry should be written to, or null to + * prevent writes. + * @return this + * @task log + */ + public function setFile($file) { + if ($this->didWrite) { + throw new Exception( + pht('You can not change the logfile after a write has occurred!')); + } + $this->file = $file; + return $this; + } + + public function getFile() { + return $this->file; + } + + + /** + * Set quiet (logged) failure, instead of the default loud (exception) + * failure. Throwing exceptions from destructors which exit at the end of a + * request can result in difficult-to-debug behavior. + */ + public function setFailQuietly($fail_quietly) { + $this->failQuietly = $fail_quietly; + return $this; + } + + +/* -( Writing the Log )---------------------------------------------------- */ + + + /** + * When the log object is destroyed, it writes if it hasn't written yet. + * @task write + */ + public function __destruct() { + $this->write(); + } + + + /** + * Write the log explicitly, if it hasn't been written yet. Normally you do + * not need to call this method; it will be called when the log object is + * destroyed. However, you can explicitly force the write earlier by calling + * this method. + * + * A log object will never write more than once, so it is safe to call this + * method even if the object's destructor later runs. + * + * @return this + * @task write + */ + public function write() { + if ($this->didWrite) { + return $this; + } + + // Even if we aren't going to write, format the line to catch any errors + // and invoke possible __toString() calls. + $line = $this->format(); + + try { + if ($this->file !== null) { + $dir = dirname($this->file); + if (!Filesystem::pathExists($dir)) { + Filesystem::createDirectory($dir, 0755, true); + } + + $ok = @file_put_contents( + $this->file, + $line, + FILE_APPEND | LOCK_EX); + + if ($ok === false) { + throw new Exception( + pht( + 'Unable to write to logfile "%s"!', + $this->file)); + } + } + } catch (Exception $ex) { + if ($this->failQuietly) { + phlog($ex); + } else { + throw $ex; + } + } + + $this->didWrite = true; + return $this; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Format the log string, replacing "%x" variables with values. + * + * @return string Finalized, log string for writing to disk. + * @task internals + */ + private function format() { + + // Always convert '%%' to literal '%'. + $map = array('%' => '%') + $this->data; + + $result = ''; + $saw_percent = false; + foreach (phutil_utf8v($this->format) as $c) { + if ($saw_percent) { + $saw_percent = false; + if (array_key_exists($c, $map)) { + $result .= addcslashes($map[$c], "\0..\37\\\177..\377"); + } else { + $result .= '-'; + } + } else if ($c == '%') { + $saw_percent = true; + } else { + $result .= $c; + } + } + + return rtrim($result)."\n"; + } + +} diff --git a/src/filesystem/PhutilDirectoryFixture.php b/src/filesystem/PhutilDirectoryFixture.php new file mode 100644 index 00000000..8eb4c14a --- /dev/null +++ b/src/filesystem/PhutilDirectoryFixture.php @@ -0,0 +1,50 @@ +getPath(), + Filesystem::resolvePath($archive)); + return $obj; + } + + public static function newEmptyFixture() { + $obj = new PhutilDirectoryFixture(); + $obj->path = Filesystem::createTemporaryDirectory(); + return $obj; + } + + private function __construct() { + // + } + + public function __destruct() { + Filesystem::remove($this->path); + } + + public function getPath($to_file = null) { + return $this->path.'/'.ltrim($to_file, '/'); + } + + public function saveToArchive($path) { + $tmp = new TempFile(); + + execx( + 'tar -C %s -czvvf %s .', + $this->getPath(), + $tmp); + + $ok = rename($tmp, Filesystem::resolvePath($path)); + if (!$ok) { + throw new FilesystemException($path, pht('Failed to overwrite file.')); + } + + return $this; + } + +} diff --git a/src/filesystem/PhutilFileLock.php b/src/filesystem/PhutilFileLock.php new file mode 100644 index 00000000..e8dd07f4 --- /dev/null +++ b/src/filesystem/PhutilFileLock.php @@ -0,0 +1,119 @@ +lock(); + * + * do_contentious_things(); + * + * $lock->unlock(); + * + * For more information on locks, see @{class:PhutilLock}. + * + * @task construct Constructing Locks + * @task impl Implementation + */ +final class PhutilFileLock extends PhutilLock { + + private $lockfile; + private $handle; + + +/* -( Constructing Locks )------------------------------------------------- */ + + + /** + * Create a new lock on a lockfile. The file need not exist yet. + * + * @param string The lockfile to use. + * @return PhutilFileLock New lock object. + * + * @task construct + */ + public static function newForPath($lockfile) { + $lockfile = Filesystem::resolvePath($lockfile); + + $name = 'file:'.$lockfile; + $lock = self::getLock($name); + if (!$lock) { + $lock = new PhutilFileLock($name); + $lock->lockfile = $lockfile; + self::registerLock($lock); + } + + return $lock; + } + +/* -( Locking )------------------------------------------------------------ */ + + + /** + * Acquire the lock. If lock acquisition fails because the lock is held by + * another process, throws @{class:PhutilLockException}. Other exceptions + * indicate that lock acquisition has failed for reasons unrelated to locking. + * + * If the lock is already held, this method throws. You can test the lock + * status with @{method:isLocked}. + * + * @param float Seconds to block waiting for the lock. + * @return void + * + * @task lock + */ + protected function doLock($wait) { + $path = $this->lockfile; + + $handle = @fopen($path, 'a+'); + if (!$handle) { + throw new FilesystemException( + $path, + pht("Unable to open lock '%s' for writing!", $path)); + } + + $start_time = microtime(true); + do { + $would_block = null; + $ok = flock($handle, LOCK_EX | LOCK_NB, $would_block); + if ($ok) { + break; + } else { + usleep(10000); + } + } while ($wait && $wait > (microtime(true) - $start_time)); + + if (!$ok) { + fclose($handle); + throw new PhutilLockException($this->getName()); + } + + $this->handle = $handle; + } + + + /** + * Release the lock. Throws an exception on failure, e.g. if the lock is not + * currently held. + * + * @return void + * + * @task lock + */ + protected function doUnlock() { + $ok = flock($this->handle, LOCK_UN | LOCK_NB); + if (!$ok) { + throw new Exception(pht('Unable to unlock file!')); + } + + $ok = fclose($this->handle); + if (!$ok) { + throw new Exception(pht('Unable to close file!')); + } + + $this->handle = null; + } + +} diff --git a/src/filesystem/PhutilFileTree.php b/src/filesystem/PhutilFileTree.php new file mode 100644 index 00000000..a2486e36 --- /dev/null +++ b/src/filesystem/PhutilFileTree.php @@ -0,0 +1,112 @@ +splitPath($path); + $parts = array_reverse($parts); + $this->insertPath($parts, $data); + return $this; + } + + public function destroy() { + $this->parentNode = null; + foreach ($this->children as $child) { + $child->destroy(); + } + $this->children = array(); + return $this; + } + + /** + * Get the next node, iterating in depth-first order. + */ + public function getNextNode() { + if ($this->children) { + return head($this->children); + } + $cursor = $this; + while ($cursor) { + if ($cursor->getNextSibling()) { + return $cursor->getNextSibling(); + } + $cursor = $cursor->parentNode; + } + return null; + } + + public function getName() { + return $this->name; + } + + public function getFullPath() { + return $this->fullPath; + } + + public function getDepth() { + return $this->depth; + } + + public function getData() { + return $this->data; + } + + protected function insertPath(array $parts, $data) { + $part = array_pop($parts); + if ($part === null) { + if ($this->data) { + $full_path = $this->getFullPath(); + throw new Exception( + pht("Duplicate insertion for path '%s'.", $full_path)); + } + $this->data = $data; + return; + } + + if (empty($this->children[$part])) { + $node = new PhutilFileTree(); + $node->parentNode = $this; + $node->depth = $this->depth + 1; + $node->name = $part; + $node->fullPath = $this->parentNode ? ($this->fullPath.'/'.$part) : $part; + $this->children[$part] = $node; + } + + $this->children[$part]->insertPath($parts, $data); + } + + protected function splitPath($path) { + $path = trim($path, '/'); + $parts = preg_split('@/+@', $path); + return $parts; + } + + protected function getNextSibling() { + if (!$this->parentNode) { + return null; + } + + $found = false; + foreach ($this->parentNode->children as $node) { + if ($found) { + return $node; + } + if ($this->name === $node->name) { + $found = true; + } + } + + return null; + } + +} diff --git a/src/filesystem/PhutilLock.php b/src/filesystem/PhutilLock.php new file mode 100644 index 00000000..f152b521 --- /dev/null +++ b/src/filesystem/PhutilLock.php @@ -0,0 +1,235 @@ +lock(); + * do_contentious_things(); + * $lock->unlock(); + * + * If the lock can't be acquired because it is already held, + * @{class:PhutilLockException} is thrown. Other exceptions indicate + * permanent failure unrelated to locking. + * + * When extending this class, you should call @{method:getLock} to look up + * an existing lock object, and @{method:registerLock} when objects are + * constructed to register for automatic unlock on shutdown. + * + * @task impl Lock Implementation + * @task registry Lock Registry + * @task construct Constructing Locks + * @task status Determining Lock Status + * @task lock Locking + * @task internal Internals + */ +abstract class PhutilLock extends Phobject { + + private static $registeredShutdownFunction = false; + private static $locks = array(); + + private $locked = false; + private $profilerID; + private $name; + +/* -( Constructing Locks )------------------------------------------------- */ + + + /** + * Build a new lock, given a lock name. The name should be globally unique + * across all locks. + * + * @param string Globally unique lock name. + * @task construct + */ + protected function __construct($name) { + $this->name = $name; + } + + +/* -( Lock Implementation )------------------------------------------------ */ + + + /** + * Acquires the lock, or throws @{class:PhutilLockException} if it fails. + * + * @param float Seconds to block waiting for the lock. + * @return void + * @task impl + */ + abstract protected function doLock($wait); + + + /** + * Releases the lock. + * + * @return void + * @task impl + */ + abstract protected function doUnlock(); + + +/* -( Lock Registry )------------------------------------------------------ */ + + + /** + * Returns a globally unique name for this lock. + * + * @return string Globally unique lock name, across all locks. + * @task registry + */ + final public function getName() { + return $this->name; + } + + + /** + * Get a named lock, if it has been registered. + * + * @param string Lock name. + * @task registry + */ + protected static function getLock($name) { + return idx(self::$locks, $name); + } + + + /** + * Register a lock for cleanup when the process exits. + * + * @param PhutilLock Lock to register. + * @task registry + */ + protected static function registerLock(PhutilLock $lock) { + if (!self::$registeredShutdownFunction) { + register_shutdown_function(array(__CLASS__, 'unlockAll')); + self::$registeredShutdownFunction = true; + } + + $name = $lock->getName(); + if (self::getLock($name)) { + throw new Exception( + pht("Lock '%s' is already registered!", $name)); + } + + self::$locks[$name] = $lock; + } + + +/* -( Determining Lock Status )-------------------------------------------- */ + + + /** + * Determine if the lock is currently held. + * + * @return bool True if the lock is held. + * + * @task status + */ + final public function isLocked() { + return $this->locked; + } + + +/* -( Locking )------------------------------------------------------------ */ + + + /** + * Acquire the lock. If lock acquisition fails because the lock is held by + * another process, throws @{class:PhutilLockException}. Other exceptions + * indicate that lock acquisition has failed for reasons unrelated to locking. + * + * If the lock is already held by this process, this method throws. You can + * test the lock status with @{method:isLocked}. + * + * @param float Seconds to block waiting for the lock. By default, do not + * block. + * @return this + * + * @task lock + */ + final public function lock($wait = 0) { + if ($this->locked) { + $name = $this->getName(); + throw new Exception( + pht("Lock '%s' has already been locked by this process.", $name)); + } + + $profiler = PhutilServiceProfiler::getInstance(); + $profiler_id = $profiler->beginServiceCall( + array( + 'type' => 'lock', + 'name' => $this->getName(), + )); + + try { + $this->doLock((float)$wait); + } catch (Exception $ex) { + $profiler->endServiceCall( + $profiler_id, + array( + 'lock' => false, + )); + throw $ex; + } + + $this->profilerID = $profiler_id; + $this->locked = true; + + return $this; + } + + + /** + * Release the lock. Throws an exception on failure, e.g. if the lock is not + * currently held. + * + * @return this + * + * @task lock + */ + final public function unlock() { + if (!$this->locked) { + $name = $this->getName(); + throw new Exception( + pht("Lock '%s is not locked by this process!", $name)); + } + + $this->doUnlock(); + + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall( + $this->profilerID, + array( + 'lock' => true, + )); + + $this->profilerID = null; + $this->locked = false; + + return $this; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * On shutdown, we release all the locks. You should not call this method + * directly. Use @{method:unlock} to release individual locks. + * + * @return void + * + * @task internal + */ + public static function unlockAll() { + foreach (self::$locks as $key => $lock) { + if ($lock->locked) { + $lock->unlock(); + } + } + } + +} diff --git a/src/filesystem/PhutilLockException.php b/src/filesystem/PhutilLockException.php new file mode 100644 index 00000000..6361bc49 --- /dev/null +++ b/src/filesystem/PhutilLockException.php @@ -0,0 +1,16 @@ +hint = $hint; + return $this; + } + + public function getHint() { + return $this->hint; + } + +} diff --git a/src/filesystem/PhutilProcessQuery.php b/src/filesystem/PhutilProcessQuery.php new file mode 100644 index 00000000..558d3379 --- /dev/null +++ b/src/filesystem/PhutilProcessQuery.php @@ -0,0 +1,125 @@ +isOverseer = $is_overseer; + return $this; + } + + public function withInstances(array $instances) { + $this->instances = $instances; + return $this; + } + + public function execute() { + if (phutil_is_windows()) { + throw new Exception( + pht( + 'Querying system processes is not currently supported on '. + 'Windows.')); + } + + // TODO: See T12827. This formulation likely does not work properly on + // Solaris. + + list($processes) = execx('ps -o pid,command -a -x -w -w -w'); + $processes = phutil_split_lines($processes, false); + + $refs = array(); + foreach ($processes as $process) { + $parts = preg_split('/\s+/', trim($process), 2); + list($pid, $command) = $parts; + + $ref = id(new PhutilProcessRef()) + ->setPID((int)$pid); + + $argv = $this->getArgv($pid, $command); + $ref->setArgv($argv); + + // If this is an overseer and the command has a "-l" ("Label") argument, + // the argument contains the "PHABRICATOR_INSTANCE" value for the daemon. + // Parse it out and annotate the process. + $instance = null; + if ($ref->getIsOverseer()) { + $matches = null; + if (preg_match('/-l (\S+)/', $command, $matches)) { + $instance = $matches[1]; + } + } + + $ref->setInstance($instance); + + $refs[] = $ref; + } + + if ($this->isOverseer !== null) { + foreach ($refs as $key => $ref) { + if ($ref->getIsOverseer() !== $this->isOverseer) { + unset($refs[$key]); + } + } + } + + if ($this->instances) { + $instances_map = array_fuse($this->instances); + foreach ($refs as $key => $ref) { + if (!isset($instances_map[$ref->getInstance()])) { + unset($refs[$key]); + } + } + } + + return array_values($refs); + } + + private function getArgv($pid, $command) { + + // In the output of "ps", arguments in process titles are not escaped, so + // we can not distinguish between the processes created by running these + // commands by looking only at the output of "ps": + // + // echo 'a b' + // echo a b + // + // Both commands will have the same process title in the output of "ps". + + // This means we may split the command incorrectly in the general case, + // and this misparsing may be important if the process binary resides in + // a directory with spaces in its path and we're trying to identify which + // binary a process is running. + + // On Ubuntu, and likely most other Linux systems, we can get a raw + // command line from "/proc" with arguments delimited by "\0". + + // On macOS, there's no "/proc" and we don't currently have a robust way + // to split the process command in a way that parses spaces properly, so + // fall back to a best effort based on the output of "ps". This is almost + // always correct, since it is uncommon to put binaries under paths with + // spaces in them. + + $proc_cmdline = sprintf('/proc/%d/cmdline', $pid); + try { + $argv = Filesystem::readFile($proc_cmdline); + $argv = explode("\0", $argv); + + // The output itself is terminated with "\0", so remove the final empty + // argument. + if (last($argv) === '') { + array_pop($argv); + } + + return $argv; + } catch (Exception $ex) { + // If we fail to read "/proc", fall through to less reliable methods. + } + + // If we haven't found a better source, just split the "ps" output on + // spaces. + return preg_split('/\s+/', $command); + } +} diff --git a/src/filesystem/PhutilProcessRef.php b/src/filesystem/PhutilProcessRef.php new file mode 100644 index 00000000..dabc6483 --- /dev/null +++ b/src/filesystem/PhutilProcessRef.php @@ -0,0 +1,85 @@ +pid = $pid; + return $this; + } + + public function getPID() { + return $this->pid; + } + + public function getCommand() { + if (!$this->command) { + $this->command = phutil_string_cast(csprintf('%LR', $this->argv)); + } + + return $this->command; + } + + public function getIsOverseer() { + if ($this->isOverseer === null) { + $this->isOverseer = $this->getCommandMatch( + array( + array('phd-daemon'), + array('php', 'phd-daemon'), + )); + } + + return $this->isOverseer; + } + + public function setInstance($instance) { + $this->instance = $instance; + return $this; + } + + public function getInstance() { + return $this->instance; + } + + private function getCommandMatch(array $patterns) { + $argv = $this->getArgv(); + + foreach ($patterns as $pattern) { + $pattern = array_values($pattern); + $is_match = true; + for ($ii = 0; $ii < count($pattern); $ii++) { + if (!isset($argv[$ii])) { + $is_match = false; + break; + } + + if (basename($argv[$ii]) !== $pattern[$ii]) { + $is_match = false; + break; + } + } + + if ($is_match) { + return true; + } + } + + return false; + } + + public function setArgv(array $argv) { + $this->argv = $argv; + return $this; + } + + public function getArgv() { + return $this->argv; + } + +} diff --git a/src/filesystem/TempFile.php b/src/filesystem/TempFile.php new file mode 100644 index 00000000..895b7a2b --- /dev/null +++ b/src/filesystem/TempFile.php @@ -0,0 +1,116 @@ +dir = Filesystem::createTemporaryDirectory( + '', + 0700, + $root_directory); + if ($filename === null) { + $this->file = tempnam($this->dir, getmypid().'-'); + } else { + $this->file = $this->dir.'/'.$filename; + } + + // If we fatal (e.g., call a method on NULL), destructors are not called. + // Make sure our destructor is invoked. + register_shutdown_function(array($this, '__destruct')); + + Filesystem::writeFile($this, ''); + } + + +/* -( Configuration )------------------------------------------------------ */ + + + /** + * Normally, the file is deleted when this object passes out of scope. You + * can set it to be preserved instead. + * + * @param bool True to preserve the file after object destruction. + * @return this + * @task config + */ + public function setPreserveFile($preserve) { + $this->preserve = $preserve; + return $this; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Get the path to the temporary file. Normally you can just use the object + * in a string context. + * + * @return string Absolute path to the temporary file. + * @task internal + */ + public function __toString() { + return $this->file; + } + + + /** + * When the object is destroyed, it destroys the temporary file. You can + * change this behavior with @{method:setPreserveFile}. + * + * @task internal + */ + public function __destruct() { + if ($this->destroyed) { + return; + } + + if ($this->preserve) { + return; + } + + Filesystem::remove($this->dir); + + // NOTE: tempnam() doesn't guarantee it will return a file inside the + // directory you passed to the function, so we make sure to nuke the file + // explicitly. + + Filesystem::remove($this->file); + + $this->file = null; + $this->dir = null; + $this->destroyed = true; + } + +} diff --git a/src/filesystem/__tests__/FileFinderTestCase.php b/src/filesystem/__tests__/FileFinderTestCase.php new file mode 100644 index 00000000..f7214bd1 --- /dev/null +++ b/src/filesystem/__tests__/FileFinderTestCase.php @@ -0,0 +1,232 @@ +excludePath('./exclude') + ->excludePath('subdir.txt'); + } + + public function testFinderWithChecksums() { + $this->assertFinder( + pht('Basic Checksums'), + $this->newFinder() + ->setGenerateChecksums(true) + ->withType('f') + ->withPath('*') + ->withSuffix('txt'), + array( + '.hidden.txt' => + 'b6cfc9ce9afe12b258ee1c19c235aa27', + 'file.txt' => + '725130ba6441eadb4e5d807898e0beae', + 'include_dir.txt/anotherfile.txt' => + '91e5c1ad76ff229c6456ac92e74e1d9f', + 'include_dir.txt/subdir.txt/alsoinclude.txt' => + '91e5c1ad76ff229c6456ac92e74e1d9f', + 'test.txt' => + 'aea46212fa8b8d0e0e6aa34a15c9e2f5', + )); + } + + public function testFinderWithoutChecksums() { + $this->assertFinder( + pht('Basic No Checksums'), + $this->newFinder() + ->withType('f') + ->withPath('*') + ->withSuffix('txt'), + array( + '.hidden.txt', + 'file.txt', + 'include_dir.txt/anotherfile.txt', + 'include_dir.txt/subdir.txt/alsoinclude.txt', + 'test.txt', + )); + } + + public function testFinderWithFilesAndDirectories() { + $this->assertFinder( + pht('With Files And Directories'), + $this->newFinder() + ->setGenerateChecksums(true) + ->withPath('*') + ->withSuffix('txt'), + array( + '.hidden.txt' => + 'b6cfc9ce9afe12b258ee1c19c235aa27', + 'file.txt' => + '725130ba6441eadb4e5d807898e0beae', + 'include_dir.txt' => null, + 'include_dir.txt/anotherfile.txt' => + '91e5c1ad76ff229c6456ac92e74e1d9f', + 'include_dir.txt/subdir.txt' => null, + 'include_dir.txt/subdir.txt/alsoinclude.txt' => + '91e5c1ad76ff229c6456ac92e74e1d9f', + 'test.txt' => + 'aea46212fa8b8d0e0e6aa34a15c9e2f5', + )); + } + + public function testFinderWithDirectories() { + $this->assertFinder( + pht('Just Directories'), + $this->newFinder() + ->withType('d'), + array( + 'include_dir.txt', + 'include_dir.txt/subdir.txt', + )); + } + + public function testFinderWithPath() { + $this->assertFinder( + pht('With Path'), + $this->newFinder() + ->setGenerateChecksums(true) + ->withType('f') + ->withPath('*/include_dir.txt/subdir.txt/alsoinclude.txt') + ->withSuffix('txt'), + array( + 'include_dir.txt/subdir.txt/alsoinclude.txt' => + '91e5c1ad76ff229c6456ac92e74e1d9f', + )); + } + + public function testFinderWithNames() { + $this->assertFinder( + pht('With Names'), + $this->newFinder() + ->withType('f') + ->withPath('*') + ->withName('test'), + array( + 'include_dir.txt/subdir.txt/test', + 'include_dir.txt/test', + 'test', + )); + } + + public function testFinderWithNameAndSuffix() { + $this->assertFinder( + pht('With Name and Suffix'), + $this->newFinder() + ->withType('f') + ->withName('alsoinclude.txt') + ->withSuffix('txt'), + array( + 'include_dir.txt/subdir.txt/alsoinclude.txt', + )); + } + + public function testFinderWithGlobMagic() { + // Fill a temporary directory with all this magic garbage so we don't have + // to check a bunch of files with backslashes in their names into version + // control. + $tmp_dir = Filesystem::createTemporaryDirectory(); + + $crazy_magic = array( + 'backslash\\.\\*', + 'star-*.*', + 'star-*.txt', + 'star.t*t', + 'star.tesseract', + ); + + foreach ($crazy_magic as $sketchy_path) { + Filesystem::writeFile($tmp_dir.'/'.$sketchy_path, '.'); + } + + $this->assertFinder( + pht('Glob Magic, Literal .t*t'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withSuffix('t*t'), + array( + 'star.t*t', + )); + + $this->assertFinder( + pht('Glob Magic, .tesseract'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withSuffix('tesseract'), + array( + 'star.tesseract', + )); + + $this->assertFinder( + pht('Glob Magic, Name'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withName('star-*'), + array()); + + $this->assertFinder( + pht('Glob Magic, Name + Suffix'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withName('star-*.*'), + array( + 'star-*.*', + )); + + $this->assertFinder( + pht('Glob Magic, Backslash Suffix'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withSuffix('\\*'), + array( + 'backslash\\.\\*', + )); + + $this->assertFinder( + pht('Glob Magic, With Globs'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withNameGlob('star-*'), + array( + 'star-*.*', + 'star-*.txt', + )); + + $this->assertFinder( + pht('Glob Magic, With Globs + Suffix'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withNameGlob('star-*') + ->withSuffix('txt'), + array( + 'star-*.txt', + )); + } + + private function assertFinder($label, FileFinder $finder, $expect) { + $modes = array( + 'php', + 'shell', + ); + foreach ($modes as $mode) { + $actual = id(clone $finder) + ->setForceMode($mode) + ->find(); + + if ($finder->getGenerateChecksums()) { + ksort($actual); + } else { + sort($actual); + } + + $this->assertEqual( + $expect, + $actual, + pht('Test Case "%s" in Mode "%s"', $label, $mode)); + } + } + +} diff --git a/src/filesystem/__tests__/FilesystemTestCase.php b/src/filesystem/__tests__/FilesystemTestCase.php new file mode 100644 index 00000000..b04de456 --- /dev/null +++ b/src/filesystem/__tests__/FilesystemTestCase.php @@ -0,0 +1,216 @@ +assertEqual( + true, + Filesystem::binaryExists($exists)); + + // We don't expect to find this binary on any system. + + $this->assertEqual( + false, + Filesystem::binaryExists('halting-problem-decider')); + } + + public function testResolveBinary() { + // Test to make sure resolveBinary() returns the full path to the `which` + // and `where` binaries. + + if (phutil_is_windows()) { + $binary = 'where'; + } else { + $binary = 'which'; + } + + $path = Filesystem::resolveBinary($binary); + $this->assertFalse(null === $path); + $this->assertTrue(file_exists($path)); + $this->assertFalse(is_dir($path)); + + $this->assertEqual(null, + Filesystem::resolveBinary('halting-problem-decider')); + } + + public function testWriteUniqueFile() { + $tmp = new TempFile(); + $dir = dirname($tmp); + + // Writing an empty file should work. + $f = Filesystem::writeUniqueFile($dir, ''); + $this->assertEqual('', Filesystem::readFile($f)); + + // File name should be unique. + $g = Filesystem::writeUniqueFile($dir, 'quack'); + $this->assertTrue($f != $g); + } + + public function testReadRandomBytes() { + $number_of_bytes = 1024; + $data = Filesystem::readRandomBytes($number_of_bytes); + $this->assertTrue(strlen($data) == $number_of_bytes); + + $data1 = Filesystem::readRandomBytes(128); + $data2 = Filesystem::readRandomBytes(128); + $this->assertFalse($data1 == $data2); + + $caught = null; + try { + Filesystem::readRandomBytes(0); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof Exception); + } + + public function testWalkToRoot() { + $test_cases = array( + array( + dirname(__FILE__).'/data/include_dir.txt/subdir.txt/test', + dirname(__FILE__), + array( + dirname(__FILE__).'/data/include_dir.txt/subdir.txt/test', + dirname(__FILE__).'/data/include_dir.txt/subdir.txt', + dirname(__FILE__).'/data/include_dir.txt', + dirname(__FILE__).'/data', + dirname(__FILE__), + ), + ), + array( + dirname(__FILE__).'/data/include_dir.txt/subdir.txt', + dirname(__FILE__), + array( + dirname(__FILE__).'/data/include_dir.txt/subdir.txt', + dirname(__FILE__).'/data/include_dir.txt', + dirname(__FILE__).'/data', + dirname(__FILE__), + ), + ), + + 'root and path are identical' => array( + dirname(__FILE__), + dirname(__FILE__), + array( + dirname(__FILE__), + ), + ), + + 'root is not an ancestor of path' => array( + dirname(__FILE__), + dirname(__FILE__).'/data/include_dir.txt/subdir.txt', + array(), + ), + + 'fictional paths work' => array( + '/x/y/z', + '/', + array( + '/x/y/z', + '/x/y', + '/x', + '/', + ), + ), + + ); + + foreach ($test_cases as $test_case) { + list($path, $root, $expected) = $test_case; + + $this->assertEqual( + $expected, + Filesystem::walkToRoot($path, $root)); + } + } + + public function testisDescendant() { + $test_cases = array( + array( + __FILE__, + dirname(__FILE__), + true, + ), + array( + dirname(__FILE__), + dirname(dirname(__FILE__)), + true, + ), + array( + dirname(__FILE__), + phutil_get_library_root_for_path(__FILE__), + true, + ), + array( + dirname(dirname(__FILE__)), + dirname(__FILE__), + false, + ), + array( + dirname(__FILE__).'/quack', + dirname(__FILE__), + false, + ), + ); + + foreach ($test_cases as $test_case) { + list($path, $root, $expected) = $test_case; + + $this->assertEqual( + $expected, + Filesystem::isDescendant($path, $root), + sprintf( + 'Filesystem::isDescendant(%s, %s)', + phutil_var_export($path), + phutil_var_export($root))); + } + } + + public function testRandomIntegers() { + $valid_ranges = array( + array(5, 5), + array(-1, 1), + array(0, 10000), + array(0, 999999999), + array(-65535, 65536), + ); + + foreach ($valid_ranges as $case) { + list($min, $max) = $case; + + $result = Filesystem::readRandomInteger($min, $max); + + $this->assertTrue($min <= $result, pht('%d <= %d', $min, $result)); + $this->assertTrue($max >= $result, pht('%d >= %d', $max, $result)); + } + + $invalid_ranges = array( + array('1', '2'), + array(1.0, 2.0), + array(5, 3), + ); + + foreach ($invalid_ranges as $case) { + list($min, $max) = $case; + + $caught = null; + try { + Filesystem::readRandomInteger($min, $max); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + } + +} diff --git a/src/filesystem/__tests__/PhutilDeferredLogTestCase.php b/src/filesystem/__tests__/PhutilDeferredLogTestCase.php new file mode 100644 index 00000000..3e6c6432 --- /dev/null +++ b/src/filesystem/__tests__/PhutilDeferredLogTestCase.php @@ -0,0 +1,169 @@ +checkLog( + "derp\n", + 'derp', + array()); + + $this->checkLog( + "[20 Aug 1984] alincoln\n", + '[%T] %u', + array( + 'T' => '20 Aug 1984', + 'u' => 'alincoln', + )); + + $this->checkLog( + "%%%%%\n", + '%%%%%%%%%%', + array( + '%' => '%', + )); + + $this->checkLog( + "\\000\\001\\002\n", + '%a%b%c', + array( + 'a' => chr(0), + 'b' => chr(1), + 'c' => chr(2), + )); + + $this->checkLog( + "Download: 100%\n", + 'Download: %C', + array( + 'C' => '100%', + )); + + $this->checkLog( + "- bee -\n", + '%a %b %c', + array( + 'b' => 'bee', + )); + + $this->checkLog( + "\\\\\n", + '%b', + array( + 'b' => '\\', + )); + + $this->checkLog( + "a\t\\t\n", + "%a\t%b", + array( + 'a' => 'a', + 'b' => "\t", + )); + + $this->checkLog( + "\1ab\n", + "\1a%a", + array( + 'a' => 'b', + )); + + $this->checkLog( + "a % xb\n", + '%a %% x%b', + array( + 'a' => 'a', + 'b' => 'b', + )); + } + + public function testLogWriteFailure() { + $caught = null; + try { + if (phutil_is_hiphop_runtime()) { + // In HipHop exceptions thrown in destructors are not normally + // catchable, so call __destruct() explicitly. + $log = new PhutilDeferredLog('/derp/derp/derp/derp/derp', 'derp'); + $log->__destruct(); + } else { + new PhutilDeferredLog('/derp/derp/derp/derp/derp', 'derp'); + } + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof Exception); + } + + public function testManyWriters() { + $root = phutil_get_library_root('arcanist').'/../'; + $bin = $root.'scripts/test/deferred_log.php'; + + $n_writers = 3; + $n_lines = 8; + + $tmp = new TempFile(); + + $futures = array(); + for ($ii = 0; $ii < $n_writers; $ii++) { + $futures[] = new ExecFuture('%s %d %s', $bin, $n_lines, (string)$tmp); + } + + id(new FutureIterator($futures)) + ->resolveAll(); + + $this->assertEqual( + str_repeat("abcdefghijklmnopqrstuvwxyz\n", $n_writers * $n_lines), + Filesystem::readFile($tmp)); + } + + public function testNoWrite() { + $tmp = new TempFile(); + + $log = new PhutilDeferredLog($tmp, 'xyz'); + $log->setFile(null); + unset($log); + + $this->assertEqual('', Filesystem::readFile($tmp), pht('No Write')); + } + + public function testDoubleWrite() { + $tmp = new TempFile(); + + $log = new PhutilDeferredLog($tmp, 'xyz'); + $log->write(); + $log->write(); + unset($log); + + $this->assertEqual( + "xyz\n", + Filesystem::readFile($tmp), pht('Double Write')); + } + + public function testSetAfterWrite() { + $tmp1 = new TempFile(); + $tmp2 = new TempFile(); + + $log = new PhutilDeferredLog($tmp1, 'xyz'); + $log->write(); + + $caught = null; + try { + $log->setFile($tmp2); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception, pht('Set After Write')); + } + + private function checkLog($expect, $format, $data) { + $tmp = new TempFile(); + + $log = new PhutilDeferredLog($tmp, $format); + $log->setData($data); + unset($log); + + $this->assertEqual($expect, Filesystem::readFile($tmp), $format); + } + +} diff --git a/src/filesystem/__tests__/PhutilFileLockTestCase.php b/src/filesystem/__tests__/PhutilFileLockTestCase.php new file mode 100644 index 00000000..17f9632b --- /dev/null +++ b/src/filesystem/__tests__/PhutilFileLockTestCase.php @@ -0,0 +1,184 @@ +assertTrue($this->lockTest($file)); + + $this->assertTrue($this->lockTest($file)); + } + + public function testLockHolding() { + // When a process is holding a lock, other processes should be unable + // to acquire it. + + $file = new TempFile(); + $hold = $this->holdLock($file); + + $this->assertFalse($this->lockTest($file)); + + $hold->resolveKill(); + + $this->assertTrue($this->lockTest($file)); + } + + public function testInProcessLocking() { + // Other processes should be unable to lock a file if we hold the lock. + + $file = new TempFile(); + + $lock = PhutilFileLock::newForPath($file); + $lock->lock(); + + $this->assertFalse($this->lockTest($file)); + + $lock->unlock(); + + $this->assertTrue($this->lockTest($file)); + } + + public function testInProcessHolding() { + // We should be unable to lock a file if another process is holding the + // lock. + + $file = new TempFile(); + $lock = PhutilFileLock::newForPath($file); + + $hold = $this->holdLock($file); + $caught = null; + try { + $lock->lock(); + } catch (PhutilLockException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilLockException); + + $hold->resolveKill(); + + $this->assertTrue($this->lockTest($file)); + + $lock->lock(); + $lock->unlock(); + } + + public function testRelock() { + // Trying to lock a file twice should throw an exception. + + $file = new TempFile(); + $lock = PhutilFileLock::newForPath($file); + $lock->lock(); + + $caught = null; + try { + $lock->lock(); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testExcessiveUnlock() { + // Trying to unlock a file twice should throw an exception. + + $file = new TempFile(); + $lock = PhutilFileLock::newForPath($file); + $lock->lock(); + + $lock->unlock(); + + $caught = null; + try { + $lock->unlock(); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testUnlockAll() { + // unlockAll() should release all locks. + + $file = new TempFile(); + $lock = PhutilFileLock::newForPath($file); + + $lock->lock(); + + $this->assertFalse($this->lockTest($file)); + + PhutilFileLock::unlockAll(); + + $this->assertTrue($this->lockTest($file)); + + // Calling this again shouldn't do anything bad. + PhutilFileLock::unlockAll(); + + $this->assertTrue($this->lockTest($file)); + + $lock->lock(); + $lock->unlock(); + } + + public function testIsLocked() { + // isLocked() should report lock status accurately. + + $file = new TempFile(); + $lock = PhutilFileLock::newForPath($file); + + $this->assertFalse($lock->isLocked()); + + $lock->lock(); + + $this->assertTrue($lock->isLocked()); + + $lock->unlock(); + + $this->assertFalse($lock->isLocked()); + } + + private function lockTest($file) { + list($err) = $this->buildLockFuture('--test', $file)->resolve(); + return ($err == 0); + } + + private function holdLock($file) { + $future = $this->buildLockFuture('--hold', $file); + + // We can't return until we're sure the subprocess has had time to acquire + // the lock. Since actually testing for the lock would be kind of silly + // and guarantee that we loop forever if the locking primitive broke, + // watch stdout for a *claim* that it has acquired the lock instead. + + // Make sure we don't loop forever, no matter how bad things get. + $future->setTimeout(30); + + $buf = ''; + while (!$future->isReady()) { + list($stdout) = $future->read(); + $buf .= $stdout; + if (strpos($buf, 'LOCK ACQUIRED') !== false) { + return $future; + } + } + + throw new Exception(pht('Unable to hold lock in external process!')); + } + + private function buildLockFuture($flags, $file) { + $root = dirname(phutil_get_library_root('arcanist')); + $bin = $root.'/scripts/utils/lock.php'; + + // NOTE: Use `exec` so this passes on Ubuntu, where the default `dash` shell + // will eat any kills we send during the tests. + $future = new ExecFuture('exec php %s %C %s', $bin, $flags, $file); + $future->start(); + return $future; + } + +} diff --git a/src/filesystem/__tests__/PhutilProcessRefTestCase.php b/src/filesystem/__tests__/PhutilProcessRefTestCase.php new file mode 100644 index 00000000..1c542ee7 --- /dev/null +++ b/src/filesystem/__tests__/PhutilProcessRefTestCase.php @@ -0,0 +1,59 @@ +setArgv($argv); + + $actual = $ref->getIsOverseer(); + + $this->assertEqual( + $expect, + $actual, + pht('argv: %s', implode(' ', $argv))); + } + } + +} diff --git a/src/filesystem/__tests__/data/.hidden.txt b/src/filesystem/__tests__/data/.hidden.txt new file mode 100644 index 00000000..f414c299 --- /dev/null +++ b/src/filesystem/__tests__/data/.hidden.txt @@ -0,0 +1 @@ +Hidden included file diff --git a/src/filesystem/__tests__/data/exclude/file.txt b/src/filesystem/__tests__/data/exclude/file.txt new file mode 100644 index 00000000..5c6507c7 --- /dev/null +++ b/src/filesystem/__tests__/data/exclude/file.txt @@ -0,0 +1 @@ +This file is excluded. diff --git a/src/filesystem/__tests__/data/exclude/test b/src/filesystem/__tests__/data/exclude/test new file mode 100644 index 00000000..bce1946c --- /dev/null +++ b/src/filesystem/__tests__/data/exclude/test @@ -0,0 +1 @@ +Test file. diff --git a/src/filesystem/__tests__/data/file.txt b/src/filesystem/__tests__/data/file.txt new file mode 100644 index 00000000..6e8ebc4f --- /dev/null +++ b/src/filesystem/__tests__/data/file.txt @@ -0,0 +1 @@ +Included file. diff --git a/src/filesystem/__tests__/data/include_dir.txt/anotherfile.txt b/src/filesystem/__tests__/data/include_dir.txt/anotherfile.txt new file mode 100644 index 00000000..2dbbec48 --- /dev/null +++ b/src/filesystem/__tests__/data/include_dir.txt/anotherfile.txt @@ -0,0 +1 @@ +Also included. diff --git a/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/alsoinclude.txt b/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/alsoinclude.txt new file mode 100644 index 00000000..2dbbec48 --- /dev/null +++ b/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/alsoinclude.txt @@ -0,0 +1 @@ +Also included. diff --git a/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/test b/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/test new file mode 100644 index 00000000..bce1946c --- /dev/null +++ b/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/test @@ -0,0 +1 @@ +Test file. diff --git a/src/filesystem/__tests__/data/include_dir.txt/test b/src/filesystem/__tests__/data/include_dir.txt/test new file mode 100644 index 00000000..bce1946c --- /dev/null +++ b/src/filesystem/__tests__/data/include_dir.txt/test @@ -0,0 +1 @@ +Test file. diff --git a/src/filesystem/__tests__/data/test b/src/filesystem/__tests__/data/test new file mode 100644 index 00000000..bce1946c --- /dev/null +++ b/src/filesystem/__tests__/data/test @@ -0,0 +1 @@ +Test file. diff --git a/src/filesystem/__tests__/data/test.txt b/src/filesystem/__tests__/data/test.txt new file mode 100644 index 00000000..bce1946c --- /dev/null +++ b/src/filesystem/__tests__/data/test.txt @@ -0,0 +1 @@ +Test file. diff --git a/src/filesystem/binary/PhutilBinaryAnalyzer.php b/src/filesystem/binary/PhutilBinaryAnalyzer.php new file mode 100644 index 00000000..3ab30909 --- /dev/null +++ b/src/filesystem/binary/PhutilBinaryAnalyzer.php @@ -0,0 +1,67 @@ +getBinaryKey(); + } + + public function getBinaryKey() { + return $this->getPhobjectClassConstant('BINARY'); + } + + public function isBinaryAvailable() { + return Filesystem::binaryExists($this->getBinaryName()); + } + + abstract protected function newBinaryVersion(); + + protected function newBinaryPath() { + return Filesystem::resolveBinary($this->getBinaryName()); + } + + final public function getBinaryVersion() { + return $this->newBinaryVersion(); + } + + final public function requireBinaryVersion() { + $version = $this->getBinaryVersion(); + $binary = $this->getBinaryName(); + if ($version === null) { + throw new Exception( + pht( + 'Unable to determine the installed version of binary "%s". This '. + 'version is required.', + $binary)); + } + return $version; + } + + final public function getBinaryPath() { + return $this->newBinaryPath(); + } + + final public static function getAllBinaries() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getBinaryKey') + ->setSortMethod('getBinaryName') + ->execute(); + } + + final public static function getForBinary($binary) { + $map = self::getAllBinaries(); + + $analyzer = idx($map, $binary); + if (!$analyzer) { + throw new Exception( + pht( + 'No analyzer is available for binary "%s".', + $binary)); + } + + return $analyzer; + } + +} diff --git a/src/filesystem/binary/PhutilDiffBinaryAnalyzer.php b/src/filesystem/binary/PhutilDiffBinaryAnalyzer.php new file mode 100644 index 00000000..4c4cabd8 --- /dev/null +++ b/src/filesystem/binary/PhutilDiffBinaryAnalyzer.php @@ -0,0 +1,31 @@ +setEnv( + array( + 'HGPLAIN' => 1, + )); + + list($err, $stdout) = $future->resolve(); + + if ($err) { + return null; + } + + return self::parseMercurialBinaryVersion($stdout); + } + + public static function parseMercurialBinaryVersion($stdout) { + // NOTE: At least on OSX, recent versions of Mercurial report this + // string in this format: + // + // Mercurial Distributed SCM (version 3.1.1+20140916) + + $matches = null; + $pattern = '/^Mercurial Distributed SCM \(version ([\d.]+)/m'; + if (preg_match($pattern, $stdout, $matches)) { + return $matches[1]; + } + + return null; + } + + /** + * The `locate` command is deprecated as of Mercurial 3.2, to be replaced + * with `files` command, which supports most of the same arguments. This + * determines whether the new `files` command should be used instead of + * the `locate` command. + * + * @return boolean True if the version of Mercurial is new enough to support + * the `files` command, or false if otherwise. + */ + public function isMercurialFilesCommandAvailable() { + return self::versionHasCapability( + $this->requireBinaryVersion(), + self::CAPABILITY_FILES); + } + + public function isMercurialVulnerableToInjection() { + return self::versionHasCapability( + $this->requireBinaryVersion(), + self::CAPABILITY_INJECTION); + } + + + public static function versionHasCapability( + $mercurial_version, + $capability) { + + switch ($capability) { + case self::CAPABILITY_FILES: + return version_compare($mercurial_version, '3.2', '>='); + case self::CAPABILITY_INJECTION: + return version_compare($mercurial_version, '3.2.4', '<'); + default: + throw new Exception( + pht( + 'Unknown Mercurial capability "%s".', + $capability)); + } + + } + + +} diff --git a/src/filesystem/binary/PhutilPygmentizeBinaryAnalyzer.php b/src/filesystem/binary/PhutilPygmentizeBinaryAnalyzer.php new file mode 100644 index 00000000..608be001 --- /dev/null +++ b/src/filesystem/binary/PhutilPygmentizeBinaryAnalyzer.php @@ -0,0 +1,31 @@ + '2.11.0', + 'definitely git 7.0' => null, + ); + + foreach ($map as $input => $expect) { + $actual = PhutilGitBinaryAnalyzer::parseGitBinaryVersion($input); + $this->assertEqual($expect, $actual, $input); + } + } + + public function getParseMercurialBinaryVersions() { + $map = array( + "Mercurial Distributed SCM (version 3.5.2+20151001)\n" + => '3.5.2', + 'This Is Mercurial 22.0' => null, + ); + + foreach ($map as $input => $expect) { + $actual = + PhutilMercurialBinaryAnalyzer::parseMercurialBinaryVersion( + $input); + $this->assertEqual($expect, $actual, $input); + } + } + + public function testParseSubversionBinaryVersions() { + $map = array( + "1.7.20\n" => '1.7.20', + ); + + foreach ($map as $input => $expect) { + $actual = + PhutilSubversionBinaryAnalyzer::parseSubversionBinaryVersion( + $input); + $this->assertEqual($expect, $actual, $input); + } + } + + public function testParseDiffBinaryVersions() { + $diff_version_281 = << '2.8.1', + 'diff version 1.2.3' => null, + ); + + foreach ($map as $input => $expect) { + $actual = PhutilDiffBinaryAnalyzer::parseDiffBinaryVersion($input); + $this->assertEqual($expect, $actual, $input); + } + } + + public function testParsePygmentizeBinaryVersions() { + $map = array( + "Pygments version 2.0.1, (c) 2006-2014 by Georg Brandl.\n" + => '2.0.1', + 'pygments 3.4' => null, + ); + + foreach ($map as $input => $expect) { + $actual = + PhutilPygmentizeBinaryAnalyzer::parsePygmentizeBinaryVersion( + $input); + $this->assertEqual($expect, $actual, $input); + } + } + + public function testMercurialFilesCommandVersions() { + $cases = array( + PhutilMercurialBinaryAnalyzer::CAPABILITY_FILES => array( + '2.6.2' => false, + '2.9' => false, + '3.1' => false, + '3.2' => true, + '3.3' => true, + '3.5.2' => true, + ), + PhutilMercurialBinaryAnalyzer::CAPABILITY_INJECTION => array( + '2.0' => true, + '3.2.3' => true, + '3.2.4' => false, + ), + ); + + foreach ($cases as $capability => $map) { + foreach ($map as $input => $expect) { + $actual = PhutilMercurialBinaryAnalyzer::versionHasCapability( + $input, + $capability); + $this->assertEqual( + $expect, + $actual, + pht('%s on %s', $capability, $input)); + } + } + + } + +} diff --git a/src/filesystem/linesofalarge/LinesOfALarge.php b/src/filesystem/linesofalarge/LinesOfALarge.php new file mode 100644 index 00000000..94496cdd --- /dev/null +++ b/src/filesystem/linesofalarge/LinesOfALarge.php @@ -0,0 +1,224 @@ +delimiter = $character; + return $this; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Hook, called before @{method:rewind()}. Allows a concrete implementation + * to open resources or reset state. + * + * @return void + * @task internals + */ + abstract protected function willRewind(); + + + /** + * Called when the iterator needs more data. The subclass should return more + * data, or empty string to indicate end-of-stream. + * + * @return string Data, or empty string for end-of-stream. + * @task internals + */ + abstract protected function readMore(); + + +/* -( Iterator Interface )------------------------------------------------- */ + + + /** + * @task iterator + */ + final public function rewind() { + $this->willRewind(); + + $this->buf = ''; + $this->pos = 0; + $this->num = 0; + $this->eof = false; + $this->valid = true; + + $this->next(); + } + + + /** + * @task iterator + */ + final public function key() { + return $this->num; + } + + + /** + * @task iterator + */ + final public function current() { + return $this->line; + } + + + /** + * @task iterator + */ + final public function valid() { + return $this->valid; + } + + + /** + * @task iterator + */ + final public function next() { + // Consume the stream a chunk at a time into an internal buffer, then + // read lines out of that buffer. This gives us flexibility (stream sources + // only need to be able to read blocks of bytes) and performance (we can + // read in reasonably-sized chunks of many lines), at the cost of some + // complexity in buffer management. + + // We do this in a loop to avoid recursion when consuming more bytes, in + // case the size of a line is very large compared to the chunk size we + // read. + while (true) { + if (strlen($this->buf)) { + + // If we don't have a delimiter, return the entire buffer. + if ($this->delimiter === null) { + $this->num++; + $this->line = substr($this->buf, $this->pos); + $this->buf = ''; + $this->pos = 0; + return; + } + + // If we already have some data buffered, try to get the next line from + // the buffer. Search through the buffer for a delimiter. This should be + // the common case. + $endl = strpos($this->buf, $this->delimiter, $this->pos); + + if ($endl !== false) { + // We found a delimiter, so return the line it delimits. We leave + // the buffer as-is so we don't need to reallocate it, in case it is + // large relative to the size of a line. Instead, we move our cursor + // within the buffer forward. + $this->num++; + $this->line = substr($this->buf, $this->pos, ($endl - $this->pos)); + $this->pos = $endl + 1; + return; + } + + // We only have part of a line left in the buffer (no delimiter in the + // remaining piece), so throw away the part we've already emitted and + // continue below. + $this->buf = substr($this->buf, $this->pos); + $this->pos = 0; + } + + // We weren't able to produce the next line from the bytes we already had + // buffered, so read more bytes from the input stream. + + if ($this->eof) { + // NOTE: We keep track of EOF (an empty read) so we don't make any more + // reads afterward. Normally, we'll return from the first EOF read, + // emit the line, and then next() will be called again. Without tracking + // EOF, we'll attempt another read. A well-behaved implementation should + // still return empty string, but we can protect against any issues + // here by keeping a flag. + $more = ''; + } else { + $more = $this->readMore(); + } + + if (strlen($more)) { + // We got some bytes, so add them to the buffer and then try again. + $this->buf .= $more; + continue; + } else { + // No more bytes. If we have a buffer, return its contents. We + // potentially return part of a line here if the last line had no + // delimiter, but that currently seems reasonable as a default + // behavior. If we don't have a buffer, we're done. + $this->eof = true; + if (strlen($this->buf)) { + $this->num++; + $this->line = $this->buf; + $this->buf = null; + } else { + $this->valid = false; + } + break; + } + } + } + +} diff --git a/src/filesystem/linesofalarge/LinesOfALargeExecFuture.php b/src/filesystem/linesofalarge/LinesOfALargeExecFuture.php new file mode 100644 index 00000000..c54151f1 --- /dev/null +++ b/src/filesystem/linesofalarge/LinesOfALargeExecFuture.php @@ -0,0 +1,119 @@ +future = $future; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * On destruction, we terminate the subprocess if it hasn't exited already. + * + * @return void + * @task internals + */ + public function __destruct() { + if (!$this->future->isReady()) { + $this->future->resolveKill(); + } + } + + + /** + * The PHP `foreach()` construct calls rewind() once, so we allow the first + * `rewind()`, without effect. Subsequent rewinds mean misuse. + * + * @return void + * @task internals + */ + protected function willRewind() { + if ($this->didRewind) { + throw new Exception( + pht( + "You can not reiterate over a %s object. The entire goal of the ". + "construct is to avoid keeping output in memory. What you are ". + "attempting to do is silly and doesn't make any sense.", + __CLASS__)); + } + $this->didRewind = true; + } + + + /** + * Read more data from the subprocess. + * + * @return string Bytes read from stdout. + * @task internals + */ + protected function readMore() { + $future = $this->future; + + while (true) { + // Read is nonblocking, so we need to sit in this loop waiting for input + // or we'll incorrectly signal EOF to the parent. + $stdout = $future->readStdout(); + $future->discardStdoutBuffer(); + + if (strlen($stdout)) { + return $stdout; + } + + // If we didn't read anything, we can exit the loop if the subprocess + // has exited. + + if ($future->isReady()) { + // Throw if the process exits with a nonzero status code. This makes + // error handling simpler, and prevents us from returning part of a line + // if the process terminates mid-output. + $future->resolvex(); + + // Read and return anything that's left. + $stdout = $future->readStdout(); + $future->discardStdoutBuffer(); + + return $stdout; + } + } + } + +} diff --git a/src/filesystem/linesofalarge/LinesOfALargeFile.php b/src/filesystem/linesofalarge/LinesOfALargeFile.php new file mode 100644 index 00000000..e04c4074 --- /dev/null +++ b/src/filesystem/linesofalarge/LinesOfALargeFile.php @@ -0,0 +1,106 @@ +fileName = Filesystem::resolvePath((string)$file_name); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Closes the file handle. + * + * @return void + * @task internals + */ + public function __destruct() { + $this->closeHandle(); + } + + + /** + * Close the file handle, if it is open. + * + * @return $this + * @task internals + */ + private function closeHandle() { + if ($this->handle) { + fclose($this->handle); + $this->handle = null; + } + return $this; + } + + + /** + * Closes the file handle if it is open, and reopens it. + * + * @return void + * @task internals + */ + protected function willRewind() { + $this->closeHandle(); + $this->handle = @fopen($this->fileName, 'r'); + if (!$this->handle) { + throw new FilesystemException( + $this->fileName, + pht('Failed to open file!')); + } + } + + + /** + * Read the file chunk-by-chunk. + * + * @return string Next chunk of the file. + * @task internals + */ + protected function readMore() { + // NOTE: At least on OSX in reasonably normal test cases, increasing the + // size of this read has no impact on performance. + + $more = @fread($this->handle, 2048); + if ($more === false) { + throw new FilesystemException( + $this->fileName, + pht('Failed to read file!')); + } + return $more; + } + +} diff --git a/src/filesystem/linesofalarge/__tests__/LinesOfALargeExecFutureTestCase.php b/src/filesystem/linesofalarge/__tests__/LinesOfALargeExecFutureTestCase.php new file mode 100644 index 00000000..fc552637 --- /dev/null +++ b/src/filesystem/linesofalarge/__tests__/LinesOfALargeExecFutureTestCase.php @@ -0,0 +1,62 @@ +writeAndRead( + "cat\ndog\nbird\n", + array( + 'cat', + 'dog', + 'bird', + )); + } + + public function testExecLargeFile() { + $line = pht('The quick brown fox jumps over the lazy dog.'); + $n = 100; + + $this->writeAndRead( + str_repeat($line."\n", $n), + array_fill(0, $n, $line)); + } + + public function testExecLongLine() { + $line = str_repeat('x', 64 * 1024); + $this->writeAndRead($line, array($line)); + } + + public function testExecException() { + $caught = null; + try { + $future = new ExecFuture('does-not-exist.exe.sh'); + foreach (new LinesOfALargeExecFuture($future) as $line) { + // ignore + } + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof CommandException); + } + + private function writeAndRead($write, $read) { + $future = new ExecFuture('cat'); + $future->write($write); + + $lines = array(); + foreach (new LinesOfALargeExecFuture($future) as $line) { + $lines[] = $line; + } + + $this->assertEqual( + $read, + $lines, + pht('Write: %s', id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs(32) + ->truncateString($write))); + } + +} diff --git a/src/filesystem/linesofalarge/__tests__/LinesOfALargeFileTestCase.php b/src/filesystem/linesofalarge/__tests__/LinesOfALargeFileTestCase.php new file mode 100644 index 00000000..94fcbb2a --- /dev/null +++ b/src/filesystem/linesofalarge/__tests__/LinesOfALargeFileTestCase.php @@ -0,0 +1,132 @@ +writeAndRead( + 'abcd', + array( + 'abcd', + )); + } + + public function testTerminalDelimiterPresent() { + $this->writeAndRead( + "bat\ncat\ndog\n", + array( + 'bat', + 'cat', + 'dog', + )); + } + + public function testTerminalDelimiterAbsent() { + $this->writeAndRead( + "bat\ncat\ndog", + array( + 'bat', + 'cat', + 'dog', + )); + } + + public function testChangeDelimiter() { + $this->writeAndRead( + "bat\1cat\1dog\1", + array( + 'bat', + 'cat', + 'dog', + ), + "\1"); + } + + public function testEmptyLines() { + $this->writeAndRead( + "\n\nbat\n", + array( + '', + '', + 'bat', + )); + } + + public function testLargeFile() { + $line = pht('The quick brown fox jumps over the lazy dog.'); + $n = 100; + + $this->writeAndRead( + str_repeat($line."\n", $n), + array_fill(0, $n, $line)); + } + + public function testLongLine() { + $line = str_repeat('x', 64 * 1024); + $this->writeAndRead($line, array($line)); + } + + public function testReadFailure() { + $caught = null; + try { + $f = new LinesOfALargeFile('/does/not/exist.void'); + $f->rewind(); + } catch (FilesystemException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof $ex); + } + + public function testLineFilter() { + $write = "bat\ncat\ndog\nBat\nCat\nDog\n"; + $read = array( + 1 => 'cat', + 4 => 'Cat', + ); + + $tmp = new TempFile(); + Filesystem::writeFile($tmp, $write); + + $lines = array(); + $iterator = new PhutilCallbackFilterIterator( + new LinesOfALargeFile($tmp), + array($this, 'allowCatsOnly')); + foreach ($iterator as $n => $line) { + $lines[$n - 1] = $line; + } + + $this->assertEqual( + $read, + $lines, + pht('Write: %s', id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs(32) + ->truncateString($write))); + } + + public function allowCatsOnly($line) { + $line = strtoupper($line); + if ($line != 'CAT') { + return null; + } + return $line; + } + + private function writeAndRead($write, $read, $delimiter = "\n") { + $tmp = new TempFile(); + Filesystem::writeFile($tmp, $write); + + $lines = array(); + $iterator = id(new LinesOfALargeFile($tmp))->setDelimiter($delimiter); + foreach ($iterator as $n => $line) { + $lines[$n - 1] = $line; + } + + $this->assertEqual( + $read, + $lines, + pht('Write: %s', id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs(32) + ->truncateString($write))); + } + +} diff --git a/src/future/Future.php b/src/future/Future.php new file mode 100644 index 00000000..dcc3c25f --- /dev/null +++ b/src/future/Future.php @@ -0,0 +1,189 @@ +getDefaultWait(); + do { + $this->checkException(); + if ($this->isReady()) { + break; + } + + $read = $this->getReadSockets(); + $write = $this->getWriteSockets(); + + if ($timeout !== null) { + $elapsed = microtime(true) - $start; + + if ($elapsed > $timeout) { + $this->checkException(); + return null; + } else { + $wait = $timeout - $elapsed; + } + } + + if ($read || $write) { + self::waitForSockets($read, $write, $wait); + } + } while (true); + + $this->checkException(); + return $this->getResult(); + } + + public function setException(Exception $ex) { + $this->exception = $ex; + return $this; + } + + public function getException() { + return $this->exception; + } + + + /** + * If an exception was set by setException(), throw it. + */ + private function checkException() { + if ($this->exception) { + throw $this->exception; + } + } + + + /** + * Retrieve a list of sockets which we can wait to become readable while + * a future is resolving. If your future has sockets which can be + * `select()`ed, return them here (or in @{method:getWriteSockets}) to make + * the resolve loop do a `select()`. If you do not return sockets in either + * case, you'll get a busy wait. + * + * @return list A list of sockets which we expect to become readable. + */ + public function getReadSockets() { + return array(); + } + + + /** + * Retrieve a list of sockets which we can wait to become writable while a + * future is resolving. See @{method:getReadSockets}. + * + * @return list A list of sockets which we expect to become writable. + */ + public function getWriteSockets() { + return array(); + } + + + /** + * Wait for activity on one of several sockets. + * + * @param list List of sockets expected to become readable. + * @param list List of sockets expected to become writable. + * @param float Timeout, in seconds. + * @return void + */ + public static function waitForSockets( + array $read_list, + array $write_list, + $timeout = 1) { + if (!self::$handlerInstalled) { + // If we're spawning child processes, we need to install a signal handler + // here to catch cases like execing '(sleep 60 &) &' where the child + // exits but a socket is kept open. But we don't actually need to do + // anything because the SIGCHLD will interrupt the stream_select(), as + // long as we have a handler registered. + if (function_exists('pcntl_signal')) { + if (!pcntl_signal(SIGCHLD, array(__CLASS__, 'handleSIGCHLD'))) { + throw new Exception(pht('Failed to install signal handler!')); + } + } + self::$handlerInstalled = true; + } + + $timeout_sec = (int)$timeout; + $timeout_usec = (int)(1000000 * ($timeout - $timeout_sec)); + + $exceptfds = array(); + $ok = @stream_select( + $read_list, + $write_list, + $exceptfds, + $timeout_sec, + $timeout_usec); + + if ($ok === false) { + // Hopefully, means we received a SIGCHLD. In the worst case, we degrade + // to a busy wait. + } + } + + public static function handleSIGCHLD($signo) { + // This function is a dummy, we just need to have some handler registered + // so that PHP will get interrupted during stream_select(). If we don't + // register a handler, stream_select() won't fail. + } + + + /** + * Retrieve the final result of the future. This method will be called after + * the future is ready (as per @{method:isReady}) but before results are + * passed back to the caller. The major use of this function is that you can + * override it in subclasses to do postprocessing or error checking, which is + * particularly useful if building application-specific futures on top of + * primitive transport futures (like @{class:CurlFuture} and + * @{class:ExecFuture}) which can make it tricky to hook this logic into the + * main pipeline. + * + * @return mixed Final resolution of this future. + */ + protected function getResult() { + return $this->result; + } + + /** + * Default amount of time to wait on stream select for this future. Normally + * 1 second is fine, but if the future has a timeout sooner than that it + * should return the amount of time left before the timeout. + */ + public function getDefaultWait() { + return 1; + } + + public function start() { + $this->isReady(); + return $this; + } + +} diff --git a/src/future/FutureIterator.php b/src/future/FutureIterator.php new file mode 100644 index 00000000..ac1eec97 --- /dev/null +++ b/src/future/FutureIterator.php @@ -0,0 +1,327 @@ + new ExecFuture('wc -c a.txt'), + * 'b.txt' => new ExecFuture('wc -c b.txt'), + * 'c.txt' => new ExecFuture('wc -c c.txt'), + * ); + * + * foreach (new FutureIterator($futures) as $key => $future) { + * // IMPORTANT: keys are preserved but the order of elements is not. This + * // construct iterates over the futures in the order they resolve, so the + * // fastest future is the one you'll get first. This allows you to start + * // doing followup processing as soon as possible. + * + * list($err, $stdout) = $future->resolve(); + * do_some_processing($stdout); + * } + * + * For a general overview of futures, see @{article:Using Futures}. + * + * @task basics Basics + * @task config Configuring Iteration + * @task iterator Iterator Interface + * @task internal Internals + */ +final class FutureIterator extends Phobject implements Iterator { + + protected $wait = array(); + protected $work = array(); + protected $futures = array(); + protected $key; + + protected $limit; + + protected $timeout; + protected $isTimeout = false; + + +/* -( Basics )------------------------------------------------------------- */ + + + /** + * Create a new iterator over a list of futures. + * + * @param list List of @{class:Future}s to resolve. + * @task basics + */ + public function __construct(array $futures) { + assert_instances_of($futures, 'Future'); + $this->futures = $futures; + } + + + /** + * Block until all futures resolve. + * + * @return void + * @task basics + */ + public function resolveAll() { + foreach ($this as $future) { + $future->resolve(); + } + } + + /** + * Add another future to the set of futures. This is useful if you have a + * set of futures to run mostly in parallel, but some futures depend on + * others. + * + * @param Future @{class:Future} to add to iterator + * @task basics + */ + public function addFuture(Future $future, $key = null) { + if ($key === null) { + $this->futures[] = $future; + $this->wait[] = last_key($this->futures); + } else if (!isset($this->futures[$key])) { + $this->futures[$key] = $future; + $this->wait[] = $key; + } else { + throw new Exception(pht('Invalid key %s', $key)); + } + + // Start running the future if we don't have $this->limit futures running + // already. updateWorkingSet() won't start running the future if there's no + // limit, so we'll manually poke it here in that case. + $this->updateWorkingSet(); + if (!$this->limit) { + $future->isReady(); + } + return $this; + } + + +/* -( Configuring Iteration )---------------------------------------------- */ + + + /** + * Set a maximum amount of time you want to wait before the iterator will + * yield a result. If no future has resolved yet, the iterator will yield + * null for key and value. Among other potential uses, you can use this to + * show some busy indicator: + * + * $futures = id(new FutureIterator($futures)) + * ->setUpdateInterval(1); + * foreach ($futures as $future) { + * if ($future === null) { + * echo "Still working...\n"; + * } else { + * // ... + * } + * } + * + * This will echo "Still working..." once per second as long as futures are + * resolving. By default, FutureIterator never yields null. + * + * @param float Maximum number of seconds to block waiting on futures before + * yielding null. + * @return this + * + * @task config + */ + public function setUpdateInterval($interval) { + $this->timeout = $interval; + return $this; + } + + + /** + * Limit the number of simultaneously executing futures. + * + * $futures = id(new FutureIterator($futures)) + * ->limit(4); + * foreach ($futures as $future) { + * // Run no more than 4 futures simultaneously. + * } + * + * @param int Maximum number of simultaneous jobs allowed. + * @return this + * + * @task config + */ + public function limit($max) { + $this->limit = $max; + return $this; + } + + +/* -( Iterator Interface )------------------------------------------------- */ + + + /** + * @task iterator + */ + public function rewind() { + $this->wait = array_keys($this->futures); + $this->work = null; + $this->updateWorkingSet(); + $this->next(); + } + + /** + * @task iterator + */ + public function next() { + $this->key = null; + if (!count($this->wait)) { + return; + } + + $read_sockets = array(); + $write_sockets = array(); + + $start = microtime(true); + $timeout = $this->timeout; + $this->isTimeout = false; + + $check = $this->getWorkingSet(); + $resolve = null; + do { + $read_sockets = array(); + $write_sockets = array(); + $can_use_sockets = true; + $wait_time = 1; + foreach ($check as $wait => $key) { + $future = $this->futures[$key]; + try { + if ($future->getException()) { + $resolve = $wait; + continue; + } + if ($future->isReady()) { + if ($resolve === null) { + $resolve = $wait; + } + continue; + } + + $got_sockets = false; + $socks = $future->getReadSockets(); + if ($socks) { + $got_sockets = true; + foreach ($socks as $socket) { + $read_sockets[] = $socket; + } + } + + $socks = $future->getWriteSockets(); + if ($socks) { + $got_sockets = true; + foreach ($socks as $socket) { + $write_sockets[] = $socket; + } + } + + // If any currently active future had neither read nor write sockets, + // we can't wait for the current batch of items using sockets. + if (!$got_sockets) { + $can_use_sockets = false; + } else { + $wait_time = min($wait_time, $future->getDefaultWait()); + } + } catch (Exception $ex) { + $this->futures[$key]->setException($ex); + $resolve = $wait; + break; + } + } + if ($resolve === null) { + + // Check for a setUpdateInterval() timeout. + if ($timeout !== null) { + $elapsed = microtime(true) - $start; + if ($elapsed > $timeout) { + $this->isTimeout = true; + return; + } else { + $wait_time = $timeout - $elapsed; + } + } + + if ($can_use_sockets) { + Future::waitForSockets($read_sockets, $write_sockets, $wait_time); + } else { + usleep(1000); + } + } + } while ($resolve === null); + + $this->key = $this->wait[$resolve]; + unset($this->wait[$resolve]); + $this->updateWorkingSet(); + } + + /** + * @task iterator + */ + public function current() { + if ($this->isTimeout) { + return null; + } + return $this->futures[$this->key]; + } + + /** + * @task iterator + */ + public function key() { + if ($this->isTimeout) { + return null; + } + return $this->key; + } + + /** + * @task iterator + */ + public function valid() { + if ($this->isTimeout) { + return true; + } + return ($this->key !== null); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * @task internal + */ + protected function getWorkingSet() { + if ($this->work === null) { + return $this->wait; + } + + return $this->work; + } + + /** + * @task internal + */ + protected function updateWorkingSet() { + if (!$this->limit) { + return; + } + + $old = $this->work; + $this->work = array_slice($this->wait, 0, $this->limit, true); + + // If we're using a limit, our futures are sleeping and need to be polled + // to begin execution, so poll any futures which weren't in our working set + // before. + foreach ($this->work as $work => $key) { + if (!isset($old[$work])) { + $this->futures[$key]->isReady(); + } + } + } + +} diff --git a/src/future/FutureProxy.php b/src/future/FutureProxy.php new file mode 100644 index 00000000..0cb6fda9 --- /dev/null +++ b/src/future/FutureProxy.php @@ -0,0 +1,71 @@ +setProxiedFuture($proxied); + } + } + + public function setProxiedFuture(Future $proxied) { + $this->proxied = $proxied; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->proxied) { + throw new Exception(pht('The proxied future has not been provided yet.')); + } + return $this->proxied; + } + + public function isReady() { + return $this->getProxiedFuture()->isReady(); + } + + public function resolve($timeout = null) { + $this->getProxiedFuture()->resolve($timeout); + return $this->getResult(); + } + + public function setException(Exception $ex) { + $this->getProxiedFuture()->setException($ex); + return $this; + } + + public function getException() { + return $this->getProxiedFuture()->getException(); + } + + public function getReadSockets() { + return $this->getProxiedFuture()->getReadSockets(); + } + + public function getWriteSockets() { + return $this->getProxiedFuture()->getWriteSockets(); + } + + protected function getResult() { + if ($this->result === null) { + $result = $this->getProxiedFuture()->resolve(); + $result = $this->didReceiveResult($result); + $this->result = $result; + } + return $this->result; + } + + public function start() { + $this->getProxiedFuture()->start(); + return $this; + } + + abstract protected function didReceiveResult($result); + +} diff --git a/src/future/ImmediateFuture.php b/src/future/ImmediateFuture.php new file mode 100644 index 00000000..a5fe0a33 --- /dev/null +++ b/src/future/ImmediateFuture.php @@ -0,0 +1,17 @@ +result = $result; + } + + public function isReady() { + return true; + } + +} diff --git a/src/future/__tests__/FutureIteratorTestCase.php b/src/future/__tests__/FutureIteratorTestCase.php new file mode 100644 index 00000000..a310ee23 --- /dev/null +++ b/src/future/__tests__/FutureIteratorTestCase.php @@ -0,0 +1,23 @@ +limit(2); + + $results = array(); + foreach ($iterator as $future) { + if ($future === $future1) { + $iterator->addFuture($future2); + } + $results[] = $future->resolve(); + } + + $this->assertEqual(2, count($results)); + } + +} diff --git a/src/future/asana/PhutilAsanaFuture.php b/src/future/asana/PhutilAsanaFuture.php new file mode 100644 index 00000000..32dfa217 --- /dev/null +++ b/src/future/asana/PhutilAsanaFuture.php @@ -0,0 +1,105 @@ +accessToken = $token; + return $this; + } + + public function setRawAsanaQuery($action, array $params = array()) { + $this->action = $action; + $this->params = $params; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + public function setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + public function getTimeout() { + return $this->timeout; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->action) { + throw new Exception( + pht( + 'You must %s!', + 'setRawAsanaQuery()')); + } + + if (!$this->accessToken) { + throw new Exception( + pht( + 'You must %s!', + 'setAccessToken()')); + } + + $uri = new PhutilURI('https://app.asana.com/'); + $uri->setPath('/api/1.0/'.ltrim($this->action, '/')); + + $future = new HTTPSFuture($uri); + $future->setData($this->params); + $future->addHeader('Authorization', 'Bearer '.$this->accessToken); + $future->setMethod($this->method); + + $timeout = $this->getTimeout(); + if ($timeout !== null) { + $future->setTimeout($timeout); + } + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + $data = null; + try { + $data = phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from Asana.'), + $ex); + } + + if (idx($data, 'errors')) { + $errors = print_r($data['errors'], true); + throw new Exception( + pht( + 'Received errors from Asana: %s', + $errors)); + } + + return $data['data']; + } + +} diff --git a/src/future/aws/PhutilAWSCloudFormationFuture.php b/src/future/aws/PhutilAWSCloudFormationFuture.php new file mode 100644 index 00000000..084b46fc --- /dev/null +++ b/src/future/aws/PhutilAWSCloudFormationFuture.php @@ -0,0 +1,20 @@ +parameters = $parameters; + return $this; + } + + protected function getParameters() { + return $this->parameters; + } + + public function getServiceName() { + return 'cloudformation'; + } + +} diff --git a/src/future/aws/PhutilAWSCloudWatchFuture.php b/src/future/aws/PhutilAWSCloudWatchFuture.php new file mode 100644 index 00000000..d8e02374 --- /dev/null +++ b/src/future/aws/PhutilAWSCloudWatchFuture.php @@ -0,0 +1,19 @@ +parameters = $parameters; + return $this; + } + + protected function getParameters() { + return $this->parameters; + } + + public function getServiceName() { + return 'monitoring'; + } + +} diff --git a/src/future/aws/PhutilAWSEC2Future.php b/src/future/aws/PhutilAWSEC2Future.php new file mode 100644 index 00000000..19a56fa3 --- /dev/null +++ b/src/future/aws/PhutilAWSEC2Future.php @@ -0,0 +1,20 @@ +parameters = $parameters; + return $this; + } + + protected function getParameters() { + return $this->parameters; + } + + public function getServiceName() { + return 'ec2'; + } + +} diff --git a/src/future/aws/PhutilAWSException.php b/src/future/aws/PhutilAWSException.php new file mode 100644 index 00000000..7646c7b6 --- /dev/null +++ b/src/future/aws/PhutilAWSException.php @@ -0,0 +1,52 @@ +httpStatus = $http_status; + $this->requestID = idx($params, 'RequestID'); + + $this->params = $params; + + $desc = array(); + $desc[] = pht('AWS Request Failed'); + $desc[] = pht('HTTP Status Code: %d', $http_status); + + $found_error = false; + if ($this->requestID) { + $desc[] = pht('AWS Request ID: %s', $this->requestID); + $errors = idx($params, 'Errors'); + + if ($errors) { + $desc[] = pht('AWS Errors:'); + foreach ($errors as $error) { + list($code, $message) = $error; + if ($code) { + $found_error = true; + } + $desc[] = " - {$code}: {$message}\n"; + } + } + } + if (!$found_error) { + $desc[] = pht('Response Body: %s', idx($params, 'body')); + } + + $desc = implode("\n", $desc); + + parent::__construct($desc); + } + + public function getRequestID() { + return $this->requestID; + } + + public function getHTTPStatus() { + return $this->httpStatus; + } + +} diff --git a/src/future/aws/PhutilAWSFuture.php b/src/future/aws/PhutilAWSFuture.php new file mode 100644 index 00000000..16fd3632 --- /dev/null +++ b/src/future/aws/PhutilAWSFuture.php @@ -0,0 +1,170 @@ +accessKey = $access_key; + return $this; + } + + public function getAccessKey() { + return $this->accessKey; + } + + public function setSecretKey(PhutilOpaqueEnvelope $secret_key) { + $this->secretKey = $secret_key; + return $this; + } + + public function getSecretKey() { + return $this->secretKey; + } + + public function getRegion() { + return $this->region; + } + + public function setRegion($region) { + $this->region = $region; + return $this; + } + + public function setEndpoint($endpoint) { + $this->endpoint = $endpoint; + return $this; + } + + public function getEndpoint() { + return $this->endpoint; + } + + public function setHTTPMethod($method) { + $this->httpMethod = $method; + return $this; + } + + public function getHTTPMethod() { + return $this->httpMethod; + } + + public function setPath($path) { + $this->path = $path; + return $this; + } + + public function getPath() { + return $this->path; + } + + public function setData($data) { + $this->data = $data; + return $this; + } + + public function getData() { + return $this->data; + } + + protected function getParameters() { + return array(); + } + + public function addHeader($key, $value) { + $this->headers[] = array($key, $value); + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->getParameters(); + $method = $this->getHTTPMethod(); + $host = $this->getEndpoint(); + $path = $this->getPath(); + $data = $this->getData(); + + $uri = id(new PhutilURI("https://{$host}/", $params)) + ->setPath($path); + + $future = id(new HTTPSFuture($uri, $data)) + ->setMethod($method); + + foreach ($this->headers as $header) { + list($key, $value) = $header; + $future->addHeader($key, $value); + } + + $this->signRequest($future); + + $this->future = $future; + } + + return $this->future; + } + + protected function signRequest(HTTPSFuture $future) { + $access_key = $this->getAccessKey(); + $secret_key = $this->getSecretKey(); + + $region = $this->getRegion(); + + id(new PhutilAWSv4Signature()) + ->setRegion($region) + ->setService($this->getServiceName()) + ->setAccessKey($access_key) + ->setSecretKey($secret_key) + ->setSignContent($this->shouldSignContent()) + ->signRequest($future); + } + + protected function shouldSignContent() { + return false; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + try { + $xml = @(new SimpleXMLElement($body)); + } catch (Exception $ex) { + $xml = null; + } + + if ($status->isError() || !$xml) { + if (!($status instanceof HTTPFutureHTTPResponseStatus)) { + throw $status; + } + + $params = array( + 'body' => $body, + ); + if ($xml) { + $params['RequestID'] = $xml->RequestID[0]; + $errors = array($xml->Error); + foreach ($errors as $error) { + $params['Errors'][] = array($error->Code, $error->Message); + } + } + + throw new PhutilAWSException($status->getStatusCode(), $params); + } + + return $xml; + } + +} diff --git a/src/future/aws/PhutilAWSS3Future.php b/src/future/aws/PhutilAWSS3Future.php new file mode 100644 index 00000000..de00a508 --- /dev/null +++ b/src/future/aws/PhutilAWSS3Future.php @@ -0,0 +1,70 @@ +bucket = $bucket; + return $this; + } + + public function getBucket() { + return $this->bucket; + } + + public function setParametersForGetObject($key) { + $bucket = $this->getBucket(); + + $this->setHTTPMethod('GET'); + $this->setPath($bucket.'/'.$key); + + return $this; + } + + public function setParametersForPutObject($key, $value) { + $bucket = $this->getBucket(); + + $this->setHTTPMethod('PUT'); + $this->setPath($bucket.'/'.$key); + + $this->addHeader('X-Amz-ACL', 'private'); + $this->addHeader('Content-Type', 'application/octet-stream'); + + $this->setData($value); + + return $this; + } + + public function setParametersForDeleteObject($key) { + $bucket = $this->getBucket(); + + $this->setHTTPMethod('DELETE'); + $this->setPath($bucket.'/'.$key); + + return $this; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if (!$status->isError()) { + return $body; + } + + if ($status->getStatusCode() === 404) { + return null; + } + + return parent::didReceiveResult($result); + } + + protected function shouldSignContent() { + return true; + } + +} diff --git a/src/future/aws/PhutilAWSv4Signature.php b/src/future/aws/PhutilAWSv4Signature.php new file mode 100644 index 00000000..86c322b8 --- /dev/null +++ b/src/future/aws/PhutilAWSv4Signature.php @@ -0,0 +1,265 @@ +accessKey = $access_key; + return $this; + } + + public function setSecretKey(PhutilOpaqueEnvelope $secret_key) { + $this->secretKey = $secret_key; + return $this; + } + + public function setDate($date) { + $this->date = $date; + return $this; + } + + public function getDate() { + if ($this->date === null) { + $this->date = gmdate('Ymd\THis\Z', time()); + } + return $this->date; + } + + public function setRegion($region) { + $this->region = $region; + return $this; + } + + public function getRegion() { + return $this->region; + } + + public function setService($service) { + $this->service = $service; + return $this; + } + + public function getService() { + return $this->service; + } + + public function setSigningKey($signing_key) { + $this->signingKey = $signing_key; + return $this; + } + + public function getSigningKey() { + if ($this->signingKey === null) { + $this->signingKey = $this->computeSigningKey(); + } + + return $this->signingKey; + } + + private function getAlgorithm() { + return 'AWS4-HMAC-SHA256'; + } + + public function setSignContent($sign_content) { + $this->signContent = $sign_content; + return $this; + } + + public function getSignContent() { + return $this->signContent; + } + + private function getHost(HTTPSFuture $future) { + $uri = new PhutilURI($future->getURI()); + return $uri->getDomain(); + } + + private function getPath(HTTPSFuture $future) { + $uri = new PhutilURI($future->getURI()); + return $uri->getPath(); + } + + public function signRequest(HTTPSFuture $future) { + $body_signature = $this->getBodySignature($future); + + if ($this->getSignContent()) { + $future->addHeader('X-Amz-Content-sha256', $body_signature); + } + + $future->addHeader('X-Amz-Date', $this->getDate()); + + $request_signature = $this->getCanonicalRequestSignature( + $future, + $body_signature); + + $string_to_sign = $this->getStringToSign($request_signature); + + $signing_key = $this->getSigningKey(); + + $signature = hash_hmac('sha256', $string_to_sign, $signing_key); + + $algorithm = $this->getAlgorithm(); + $credential = $this->getCredential(); + $signed_headers = $this->getSignedHeaderList($future); + + $authorization = + $algorithm.' '. + 'Credential='.$credential.','. + 'SignedHeaders='.$signed_headers.','. + 'Signature='.$signature; + + $future->addHeader('Authorization', $authorization); + + return $future; + } + + private function getBodySignature(HTTPSFuture $future) { + $http_body = $future->getData(); + + if (is_array($http_body)) { + $http_body = ''; + } + + return hash('sha256', $http_body); + } + + private function getCanonicalRequestSignature( + HTTPSFuture $future, + $body_signature) { + + $http_method = $future->getMethod(); + + $path = $this->getPath($future); + $path = rawurlencode($path); + $path = str_replace('%2F', '/', $path); + + $canonical_parameters = $this->getCanonicalParameterList($future); + $canonical_headers = $this->getCanonicalHeaderList($future); + $signed_headers = $this->getSignedHeaderList($future); + + $canonical_request = + $http_method."\n". + $path."\n". + $canonical_parameters."\n". + $canonical_headers."\n". + "\n". + $signed_headers."\n". + $body_signature; + + return hash('sha256', $canonical_request); + } + + private function getStringToSign($request_signature) { + $algorithm = $this->getAlgorithm(); + $date = $this->getDate(); + $scope_parts = $this->getScopeParts(); + $scope = implode('/', $scope_parts); + + $string_to_sign = + $algorithm."\n". + $date."\n". + $scope."\n". + $request_signature; + + return $string_to_sign; + } + + private function getScopeParts() { + return array( + substr($this->getDate(), 0, 8), + $this->getRegion(), + $this->getService(), + 'aws4_request', + ); + } + + private function computeSigningKey() { + $secret_key = $this->secretKey; + if (!$secret_key) { + throw new Exception( + pht( + 'You must either provide a signing key with setSigningKey(), or '. + 'provide a secret key with setSecretKey().')); + } + + // NOTE: This part of the algorithm uses the raw binary hashes, and the + // result is not human-readable. + $raw_hash = true; + + $signing_key = 'AWS4'.$secret_key->openEnvelope(); + + $scope_parts = $this->getScopeParts(); + foreach ($scope_parts as $scope_part) { + $signing_key = hash_hmac('sha256', $scope_part, $signing_key, $raw_hash); + } + + return $signing_key; + } + + private function getCanonicalHeaderList(HTTPSFuture $future) { + $headers = $this->getCanonicalHeaderMap($future); + + $canonical_headers = array(); + foreach ($headers as $header => $header_value) { + $canonical_headers[] = $header.':'.trim($header_value); + } + + return implode("\n", $canonical_headers); + } + + private function getCanonicalHeaderMap(HTTPSFuture $future) { + $headers = $future->getHeaders(); + $headers[] = array( + 'Host', + $this->getHost($future), + ); + + $header_map = array(); + foreach ($headers as $header) { + list($key, $value) = $header; + $key = phutil_utf8_strtolower($key); + $header_map[$key] = $value; + } + + ksort($header_map); + + return $header_map; + } + + private function getSignedHeaderList(HTTPSFuture $future) { + $headers = $this->getCanonicalHeaderMap($future); + return implode(';', array_keys($headers)); + } + + private function getCanonicalParameterList(HTTPSFuture $future) { + $uri = new PhutilURI($future->getURI()); + $params = $uri->getQueryParamsAsMap(); + + ksort($params); + $canonical_parameters = phutil_build_http_querystring($params); + + return $canonical_parameters; + } + + private function getCredential() { + $access_key = $this->accessKey; + if (!strlen($access_key)) { + throw new PhutilInvalidStateException('setAccessKey'); + } + + $parts = $this->getScopeParts(); + array_unshift($parts, $access_key); + + return implode('/', $parts); + } + +} diff --git a/src/future/aws/PhutilCloudWatchMetric.php b/src/future/aws/PhutilCloudWatchMetric.php new file mode 100644 index 00000000..2a589393 --- /dev/null +++ b/src/future/aws/PhutilCloudWatchMetric.php @@ -0,0 +1,50 @@ +name = $name; + return $this; + } + + public function getName() { + return $this->name; + } + + public function setValue($value) { + $this->value = $value; + return $this; + } + + public function getValue() { + return $this->value; + } + + public function setUnit($unit) { + $this->unit = $unit; + return $this; + } + + public function getUnit() { + return $this->unit; + } + + public function setDimensions(array $dimensions) { + $this->dimensions = $dimensions; + return $this; + } + + public function getDimensions() { + return $this->dimensions; + } + + public function addDimension($name, $value) { + $this->dimensions[$name] = $value; + return $this; + } + +} diff --git a/src/future/aws/__tests__/PhutilAWSv4SignatureTestCase.php b/src/future/aws/__tests__/PhutilAWSv4SignatureTestCase.php new file mode 100644 index 00000000..b6b56b56 --- /dev/null +++ b/src/future/aws/__tests__/PhutilAWSv4SignatureTestCase.php @@ -0,0 +1,195 @@ +setMethod($method) + ->addHeader('Range', 'bytes=0-9'); + + $signature = id(new PhutilAWSv4Signature()) + ->setAccessKey($access_key) + ->setSecretKey(new PhutilOpaqueEnvelope($secret_key)) + ->setSignContent(true) + ->setDate($date) + ->setRegion($region) + ->setService($service); + + $signature->signRequest($future); + + $expect = <<assertSignature($expect, $future); + } + + + public function testAWSv4SignaturesS3PutObject() { + $access_key = 'AKIAIOSFODNN7EXAMPLE'; + $secret_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'; + $date = '20130524T000000Z'; + $region = 'us-east-1'; + $service = 's3'; + $uri = 'https://examplebucket.s3.amazonaws.com/test$file.text'; + $method = 'PUT'; + $body = 'Welcome to Amazon S3.'; + + $future = id(new HTTPSFuture($uri, $body)) + ->setMethod($method) + ->addHeader('X-Amz-Storage-Class', 'REDUCED_REDUNDANCY') + ->addHeader('Date', 'Fri, 24 May 2013 00:00:00 GMT'); + + $signature = id(new PhutilAWSv4Signature()) + ->setAccessKey($access_key) + ->setSecretKey(new PhutilOpaqueEnvelope($secret_key)) + ->setSignContent(true) + ->setDate($date) + ->setRegion($region) + ->setService($service); + + $signature->signRequest($future); + + $expect = <<assertSignature($expect, $future); + } + + + public function testAWSv4SignaturesS3GetBucketLifecycle() { + $access_key = 'AKIAIOSFODNN7EXAMPLE'; + $secret_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'; + $date = '20130524T000000Z'; + $region = 'us-east-1'; + $service = 's3'; + $uri = 'https://examplebucket.s3.amazonaws.com/?lifecycle'; + $method = 'GET'; + + $future = id(new HTTPSFuture($uri)) + ->setMethod($method); + + $signature = id(new PhutilAWSv4Signature()) + ->setAccessKey($access_key) + ->setSecretKey(new PhutilOpaqueEnvelope($secret_key)) + ->setSignContent(true) + ->setDate($date) + ->setRegion($region) + ->setService($service); + + $signature->signRequest($future); + + $expect = <<assertSignature($expect, $future); + } + + + public function testAWSv4SignaturesS3GetBucket() { + $access_key = 'AKIAIOSFODNN7EXAMPLE'; + $secret_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'; + $date = '20130524T000000Z'; + $region = 'us-east-1'; + $service = 's3'; + $uri = 'https://examplebucket.s3.amazonaws.com/?max-keys=2&prefix=J'; + $method = 'GET'; + + $future = id(new HTTPSFuture($uri)) + ->setMethod($method); + + $signature = id(new PhutilAWSv4Signature()) + ->setAccessKey($access_key) + ->setSecretKey(new PhutilOpaqueEnvelope($secret_key)) + ->setSignContent(true) + ->setDate($date) + ->setRegion($region) + ->setService($service); + + $signature->signRequest($future); + + $expect = <<assertSignature($expect, $future); + } + + public function testAWSv4SignaturesVanillaQuery() { + $access_key = 'AKIDEXAMPLE'; + $secret_key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'; + $date = '20150830T123600Z'; + $region = 'us-east-1'; + $service = 'service'; + $uri = 'https://example.amazonaws.com/?Param2=value2&Param1=value1'; + $method = 'GET'; + + $future = id(new HTTPSFuture($uri)) + ->setMethod($method); + + $signature = id(new PhutilAWSv4Signature()) + ->setAccessKey($access_key) + ->setSecretKey(new PhutilOpaqueEnvelope($secret_key)) + ->setSignContent(false) + ->setDate($date) + ->setRegion($region) + ->setService($service); + + $signature->signRequest($future); + + $expect = <<assertSignature($expect, $future); + } + + private function assertSignature($expect, HTTPSFuture $signed) { + $authorization = null; + foreach ($signed->getHeaders() as $header) { + list($key, $value) = $header; + if (phutil_utf8_strtolower($key) === 'authorization') { + $authorization = $value; + break; + } + } + + $expect = str_replace("\n\n", ' ', $expect); + $expect = str_replace("\n", '', $expect); + + $this->assertEqual($expect, $authorization); + } + + +} diff --git a/src/future/aws/management/PhutilAWSManagementWorkflow.php b/src/future/aws/management/PhutilAWSManagementWorkflow.php new file mode 100644 index 00000000..b7f56617 --- /dev/null +++ b/src/future/aws/management/PhutilAWSManagementWorkflow.php @@ -0,0 +1,83 @@ +getArgv(); + + $access_key = $argv->getArg('access-key'); + $secret_key = $argv->getArg('secret-key'); + + $has_root = (strlen($access_key) || strlen($secret_key)); + if ($has_root) { + if (!strlen($access_key) || !strlen($secret_key)) { + throw new PhutilArgumentUsageException( + pht( + 'When specifying AWS credentials with --access-key and '. + '--secret-key, you must provide both keys.')); + } + + $template->setAccessKey($access_key); + $template->setSecretKey(new PhutilOpaqueEnvelope($secret_key)); + } + + $has_any = ($has_root); + if (!$has_any) { + throw new PhutilArgumentUsageException( + pht( + 'You must specify AWS credentials. Use --access-key and '. + '--secret-key to provide root credentials.')); + } + + $region = $argv->getArg('region'); + if (!strlen($region)) { + throw new PhutilArgumentUsageException( + pht( + 'You must specify an AWS region with --region.')); + } + + $template->setRegion($region); + + $endpoint = $argv->getArg('endpoint'); + if (!strlen($endpoint)) { + throw new PhutilArgumentUsageException( + pht( + 'You must specify an AWS endpoint with --endpoint.')); + } + + $template->setEndpoint($endpoint); + + return $template; + } + + protected function getAWSArguments() { + return array( + array( + 'name' => 'access-key', + 'param' => 'key', + 'help' => pht('AWS access key.'), + ), + array( + 'name' => 'secret-key', + 'param' => 'file', + 'help' => pht('AWS secret key.'), + ), + array( + 'name' => 'region', + 'param' => 'region', + 'help' => pht('AWS region.'), + ), + array( + 'name' => 'endpoint', + 'param' => 'endpoint', + 'help' => pht('Name of the AWS region to access.'), + ), + ); + } + +} diff --git a/src/future/aws/management/PhutilAWSS3DeleteManagementWorkflow.php b/src/future/aws/management/PhutilAWSS3DeleteManagementWorkflow.php new file mode 100644 index 00000000..f2f1e8d6 --- /dev/null +++ b/src/future/aws/management/PhutilAWSS3DeleteManagementWorkflow.php @@ -0,0 +1,45 @@ +setName('delete') + ->setExamples( + '**delete** --key __key__') + ->setSynopsis(pht('Delete an object from S3.')) + ->setArguments( + array_merge( + $this->getAWSArguments(), + $this->getAWSS3BucketArguments(), + array( + array( + 'name' => 'key', + 'param' => 'key', + 'help' => pht('Specify a key to delete.'), + ), + ))); + } + + public function execute(PhutilArgumentParser $args) { + $key = $args->getArg('key'); + if (!strlen($key)) { + throw new PhutilArgumentUsageException( + pht( + 'Specify an AWS S3 object key to access with --key.')); + } + + $future = $this->newAWSFuture(new PhutilAWSS3Future()) + ->setParametersForDeleteObject($key); + + $future->resolve(); + + echo tsprintf( + "%s\n", + pht('Deleted "%s".', $key)); + + return 0; + } + +} diff --git a/src/future/aws/management/PhutilAWSS3GetManagementWorkflow.php b/src/future/aws/management/PhutilAWSS3GetManagementWorkflow.php new file mode 100644 index 00000000..fab9af10 --- /dev/null +++ b/src/future/aws/management/PhutilAWSS3GetManagementWorkflow.php @@ -0,0 +1,57 @@ +setName('get') + ->setExamples( + '**get** --key __key__') + ->setSynopsis(pht('Download content from S3.')) + ->setArguments( + array_merge( + $this->getAWSArguments(), + $this->getAWSS3BucketArguments(), + array( + array( + 'name' => 'key', + 'param' => 'key', + 'help' => pht('Specify a key to retrieve.'), + ), + ))); + } + + public function execute(PhutilArgumentParser $args) { + $bucket = $args->getArg('bucket'); + if (!strlen($bucket)) { + throw new PhutilArgumentUsageException( + pht( + 'Specify an AWS S3 bucket to access with --bucket.')); + } + + $endpoint = $args->getArg('endpoint'); + if (!strlen($endpoint)) { + throw new PhutilArgumentUsageException( + pht( + 'Specify an AWS S3 endpoint with --endpoint.')); + } + + $key = $args->getArg('key'); + if (!strlen($key)) { + throw new PhutilArgumentUsageException( + pht( + 'Specify an AWS S3 object key to access with --key.')); + } + + $future = $this->newAWSFuture(new PhutilAWSS3Future()) + ->setBucket($bucket) + ->setEndpoint($endpoint) + ->setParametersForGetObject($key); + + echo $future->resolve(); + + return 0; + } + +} diff --git a/src/future/aws/management/PhutilAWSS3ManagementWorkflow.php b/src/future/aws/management/PhutilAWSS3ManagementWorkflow.php new file mode 100644 index 00000000..35d32538 --- /dev/null +++ b/src/future/aws/management/PhutilAWSS3ManagementWorkflow.php @@ -0,0 +1,27 @@ + 'bucket', + 'param' => 'bucket', + 'help' => pht('Name of the S3 bucket to access.'), + ), + ); + } + + protected function newAWSFuture($future) { + $future = parent::newAWSFuture($future); + + $argv = $this->getArgv(); + $bucket = $argv->getArg('bucket'); + + $future->setBucket($bucket); + + return $future; + } + +} diff --git a/src/future/aws/management/PhutilAWSS3PutManagementWorkflow.php b/src/future/aws/management/PhutilAWSS3PutManagementWorkflow.php new file mode 100644 index 00000000..199bf125 --- /dev/null +++ b/src/future/aws/management/PhutilAWSS3PutManagementWorkflow.php @@ -0,0 +1,52 @@ +setName('put') + ->setExamples( + '**put** --key __key__') + ->setSynopsis(pht('Upload content to S3.')) + ->setArguments( + array_merge( + $this->getAWSArguments(), + $this->getAWSS3BucketArguments(), + array( + array( + 'name' => 'key', + 'param' => 'key', + 'help' => pht('Specify a key to upload.'), + ), + ))); + } + + public function execute(PhutilArgumentParser $args) { + $key = $args->getArg('key'); + if (!strlen($key)) { + throw new PhutilArgumentUsageException( + pht( + 'Specify an AWS S3 object key to access with --key.')); + } + + $future = $this->newAWSFuture(new PhutilAWSS3Future()); + + echo tsprintf( + "%s\n", + pht('Reading data from stdin...')); + + $data = file_get_contents('php://stdin'); + + $future->setParametersForPutObject($key, $data); + + $result = $future->resolve(); + + echo tsprintf( + "%s\n", + pht('Uploaded "%s".', $key)); + + return 0; + } + +} diff --git a/src/future/exec/CommandException.php b/src/future/exec/CommandException.php new file mode 100644 index 00000000..a83b86b5 --- /dev/null +++ b/src/future/exec/CommandException.php @@ -0,0 +1,78 @@ +command = $command; + $this->error = $error; + $this->stdout = $stdout; + $this->stderr = $stderr; + + $summary = array(); + $summary[] = $this->summarize($message); + + $summary[] = 'COMMAND'; + $summary[] = $this->summarize($command); + + $summary[] = null; + $summary[] = 'STDOUT'; + $summary[] = $this->summarize($stdout); + + $summary[] = null; + $summary[] = 'STDERR'; + $summary[] = $this->summarize($stderr); + + $summary = implode("\n", $summary); + + parent::__construct($summary); + } + + public function getCommand() { + return $this->command; + } + + public function getError() { + return $this->error; + } + + public function getStdout() { + return $this->stdout; + } + + public function getStderr() { + return $this->stderr; + } + + private function summarize($string) { + if (!strlen($string)) { + return '(empty)'; + } + + $limit = 1000; + + $len = strlen($string); + if ($len > $limit) { + $cut = $len - $limit; + $suffix = pht('... (%s more byte(s)) ...', new PhutilNumber($cut)); + if ($cut > strlen($suffix)) { + $string = substr($string, 0, $limit).$suffix; + } + } + + // Strip out any credentials for the purpose of building a human readable + // summary of the exception, since these are rarely-if-ever useful when + // debugging, but can expose otherwise sensitive information. + $string = phutil_censor_credentials($string); + + return $string; + } + +} diff --git a/src/future/exec/ExecFuture.php b/src/future/exec/ExecFuture.php new file mode 100644 index 00000000..5e0f0062 --- /dev/null +++ b/src/future/exec/ExecFuture.php @@ -0,0 +1,976 @@ + array('pipe', 'r'), // stdin + 1 => array('pipe', 'w'), // stdout + 2 => array('pipe', 'w'), // stderr + ); + + +/* -( Creating ExecFutures )----------------------------------------------- */ + + + /** + * Create a new ExecFuture. + * + * $future = new ExecFuture('wc -l %s', $file_path); + * + * @param string `sprintf()`-style command string which will be passed + * through @{function:csprintf} with the rest of the arguments. + * @param ... Zero or more additional arguments for @{function:csprintf}. + * @return ExecFuture ExecFuture for running the specified command. + * @task create + */ + public function __construct($command) { + $argv = func_get_args(); + $this->command = call_user_func_array('csprintf', $argv); + $this->stdin = new PhutilRope(); + } + + +/* -( Command Information )------------------------------------------------ */ + + + /** + * Retrieve the raw command to be executed. + * + * @return string Raw command. + * @task info + */ + public function getCommand() { + return $this->command; + } + + + /** + * Retrieve the byte limit for the stderr buffer. + * + * @return int Maximum buffer size, in bytes. + * @task info + */ + public function getStderrSizeLimit() { + return $this->stderrSizeLimit; + } + + + /** + * Retrieve the byte limit for the stdout buffer. + * + * @return int Maximum buffer size, in bytes. + * @task info + */ + public function getStdoutSizeLimit() { + return $this->stdoutSizeLimit; + } + + + /** + * Get the process's pid. This only works after execution is initiated, e.g. + * by a call to start(). + * + * @return int Process ID of the executing process. + * @task info + */ + public function getPID() { + $status = $this->procGetStatus(); + return $status['pid']; + } + + +/* -( Configuring Execution )---------------------------------------------- */ + + + /** + * Set a maximum size for the stdout read buffer. To limit stderr, see + * @{method:setStderrSizeLimit}. The major use of these methods is to use less + * memory if you are running a command which sometimes produces huge volumes + * of output that you don't really care about. + * + * NOTE: Setting this to 0 means "no buffer", not "unlimited buffer". + * + * @param int Maximum size of the stdout read buffer. + * @return this + * @task config + */ + public function setStdoutSizeLimit($limit) { + $this->stdoutSizeLimit = $limit; + return $this; + } + + + /** + * Set a maximum size for the stderr read buffer. + * See @{method:setStdoutSizeLimit} for discussion. + * + * @param int Maximum size of the stderr read buffer. + * @return this + * @task config + */ + public function setStderrSizeLimit($limit) { + $this->stderrSizeLimit = $limit; + return $this; + } + + + /** + * Set the maximum internal read buffer size this future. The future will + * block reads once the internal stdout or stderr buffer exceeds this size. + * + * NOTE: If you @{method:resolve} a future with a read buffer limit, you may + * block forever! + * + * TODO: We should probably release the read buffer limit during + * @{method:resolve}, or otherwise detect this. For now, be careful. + * + * @param int|null Maximum buffer size, or `null` for unlimited. + * @return this + */ + public function setReadBufferSize($read_buffer_size) { + $this->readBufferSize = $read_buffer_size; + return $this; + } + + + /** + * Set whether to use non-blocking streams on Windows. + * + * @param bool Whether to use non-blocking streams. + * @return this + * @task config + */ + public function setUseWindowsFileStreams($use_streams) { + if (phutil_is_windows()) { + $this->useWindowsFileStreams = $use_streams; + } + return $this; + } + + +/* -( Interacting With Commands )------------------------------------------ */ + + + /** + * Read and return output from stdout and stderr, if any is available. This + * method keeps a read cursor on each stream, but the entire streams are + * still returned when the future resolves. You can call read() again after + * resolving the future to retrieve only the parts of the streams you did not + * previously read: + * + * $future = new ExecFuture('...'); + * // ... + * list($stdout) = $future->read(); // Returns output so far + * list($stdout) = $future->read(); // Returns new output since first call + * // ... + * list($stdout) = $future->resolvex(); // Returns ALL output + * list($stdout) = $future->read(); // Returns unread output + * + * NOTE: If you set a limit with @{method:setStdoutSizeLimit} or + * @{method:setStderrSizeLimit}, this method will not be able to read data + * past the limit. + * + * NOTE: If you call @{method:discardBuffers}, all the stdout/stderr data + * will be thrown away and the cursors will be reset. + * + * @return pair <$stdout, $stderr> pair with new output since the last call + * to this method. + * @task interact + */ + public function read() { + $stdout = $this->readStdout(); + + $result = array( + $stdout, + (string)substr($this->stderr, $this->stderrPos), + ); + + $this->stderrPos = strlen($this->stderr); + + return $result; + } + + public function readStdout() { + if ($this->start) { + $this->isReady(); // Sync + } + + $result = (string)substr($this->stdout, $this->stdoutPos); + $this->stdoutPos = strlen($this->stdout); + return $result; + } + + + /** + * Write data to stdin of the command. + * + * @param string Data to write. + * @param bool If true, keep the pipe open for writing. By default, the pipe + * will be closed as soon as possible so that commands which + * listen for EOF will execute. If you want to keep the pipe open + * past the start of command execution, do an empty write with + * `$keep_pipe = true` first. + * @return this + * @task interact + */ + public function write($data, $keep_pipe = false) { + if (strlen($data)) { + if (!$this->stdin) { + throw new Exception(pht('Writing to a closed pipe!')); + } + $this->stdin->append($data); + } + $this->closePipe = !$keep_pipe; + + return $this; + } + + + /** + * Permanently discard the stdout and stderr buffers and reset the read + * cursors. This is basically useful only if you are streaming a large amount + * of data from some process: + * + * $future = new ExecFuture('zcat huge_file.gz'); + * do { + * $done = $future->resolve(0.1); // Every 100ms, + * list($stdout) = $future->read(); // read output... + * echo $stdout; // send it somewhere... + * $future->discardBuffers(); // and then free the buffers. + * } while ($done === null); + * + * Conceivably you might also need to do this if you're writing a client using + * @{class:ExecFuture} and `netcat`, but you probably should not do that. + * + * NOTE: This completely discards the data. It won't be available when the + * future resolves. This is almost certainly only useful if you need the + * buffer memory for some reason. + * + * @return this + * @task interact + */ + public function discardBuffers() { + $this->discardStdoutBuffer(); + + $this->stderr = ''; + $this->stderrPos = 0; + + return $this; + } + + public function discardStdoutBuffer() { + $this->stdout = ''; + $this->stdoutPos = 0; + return $this; + } + + + /** + * Returns true if this future was killed by a timeout configured with + * @{method:setTimeout}. + * + * @return bool True if the future was killed for exceeding its time limit. + */ + public function getWasKilledByTimeout() { + return $this->killedByTimeout; + } + + +/* -( Configuring Execution )---------------------------------------------- */ + + + /** + * Set a hard limit on execution time. If the command runs longer, it will + * be terminated and the future will resolve with an error code. You can test + * if a future was killed by a timeout with @{method:getWasKilledByTimeout}. + * + * The subprocess will be sent a `TERM` signal, and then a `KILL` signal a + * short while later if it fails to exit. + * + * @param int Maximum number of seconds this command may execute for before + * it is signaled. + * @return this + * @task config + */ + public function setTimeout($seconds) { + $this->terminateTimeout = $seconds; + $this->killTimeout = $seconds + min($seconds, 60); + return $this; + } + + +/* -( Resolving Execution )------------------------------------------------ */ + + + /** + * Resolve a command you expect to exit with return code 0. Works like + * @{method:resolve}, but throws if $err is nonempty. Returns only + * $stdout and $stderr. See also @{function:execx}. + * + * list($stdout, $stderr) = $future->resolvex(); + * + * @param float Optional timeout after which resolution will pause and + * execution will return to the caller. + * @return pair <$stdout, $stderr> pair. + * @task resolve + */ + public function resolvex($timeout = null) { + list($err, $stdout, $stderr) = $this->resolve($timeout); + if ($err) { + $cmd = $this->command; + + if ($this->getWasKilledByTimeout()) { + // NOTE: The timeout can be a float and PhutilNumber only handles + // integers, so just use "%s" to render it. + $message = pht( + 'Command killed by timeout after running for more than %s seconds.', + $this->terminateTimeout); + } else { + $message = pht('Command failed with error #%d!', $err); + } + + throw new CommandException( + $message, + $cmd, + $err, + $stdout, + $stderr); + } + return array($stdout, $stderr); + } + + + /** + * Resolve a command you expect to return valid JSON. Works like + * @{method:resolvex}, but also throws if stderr is nonempty, or stdout is not + * valid JSON. Returns a PHP array, decoded from the JSON command output. + * + * @param float Optional timeout after which resolution will pause and + * execution will return to the caller. + * @return array PHP array, decoded from JSON command output. + * @task resolve + */ + public function resolveJSON($timeout = null) { + list($stdout, $stderr) = $this->resolvex($timeout); + if (strlen($stderr)) { + $cmd = $this->command; + throw new CommandException( + pht( + "JSON command '%s' emitted text to stderr when none was expected: %d", + $cmd, + $stderr), + $cmd, + 0, + $stdout, + $stderr); + } + try { + return phutil_json_decode($stdout); + } catch (PhutilJSONParserException $ex) { + $cmd = $this->command; + throw new CommandException( + pht( + "JSON command '%s' did not produce a valid JSON object on stdout: %s", + $cmd, + $stdout), + $cmd, + 0, + $stdout, + $stderr); + } + } + + /** + * Resolve the process by abruptly terminating it. + * + * @return list List of results. + * @task resolve + */ + public function resolveKill() { + if (!$this->result) { + $signal = 9; + + if ($this->proc) { + proc_terminate($this->proc, $signal); + } + + $this->result = array( + 128 + $signal, + $this->stdout, + $this->stderr, + ); + $this->closeProcess(); + } + + return $this->result; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Provides read sockets to the future core. + * + * @return list List of read sockets. + * @task internal + */ + public function getReadSockets() { + list($stdin, $stdout, $stderr) = $this->pipes; + $sockets = array(); + if (isset($stdout) && !feof($stdout)) { + $sockets[] = $stdout; + } + if (isset($stderr) && !feof($stderr)) { + $sockets[] = $stderr; + } + return $sockets; + } + + + /** + * Provides write sockets to the future core. + * + * @return list List of write sockets. + * @task internal + */ + public function getWriteSockets() { + list($stdin, $stdout, $stderr) = $this->pipes; + $sockets = array(); + if (isset($stdin) && $this->stdin->getByteLength() && !feof($stdin)) { + $sockets[] = $stdin; + } + return $sockets; + } + + + /** + * Determine if the read buffer is empty. + * + * @return bool True if the read buffer is empty. + * @task internal + */ + public function isReadBufferEmpty() { + return !strlen($this->stdout); + } + + + /** + * Determine if the write buffer is empty. + * + * @return bool True if the write buffer is empty. + * @task internal + */ + public function isWriteBufferEmpty() { + return !$this->getWriteBufferSize(); + } + + + /** + * Determine the number of bytes in the write buffer. + * + * @return int Number of bytes in the write buffer. + * @task internal + */ + public function getWriteBufferSize() { + if (!$this->stdin) { + return 0; + } + return $this->stdin->getByteLength(); + } + + + /** + * Reads some bytes from a stream, discarding output once a certain amount + * has been accumulated. + * + * @param resource Stream to read from. + * @param int Maximum number of bytes to return from $stream. If + * additional bytes are available, they will be read and + * discarded. + * @param string Human-readable description of stream, for exception + * message. + * @param int Maximum number of bytes to read. + * @return string The data read from the stream. + * @task internal + */ + private function readAndDiscard($stream, $limit, $description, $length) { + $output = ''; + + if ($length <= 0) { + return ''; + } + + do { + $data = fread($stream, min($length, 64 * 1024)); + if (false === $data) { + throw new Exception(pht('Failed to read from %s', $description)); + } + + $read_bytes = strlen($data); + + if ($read_bytes > 0 && $limit > 0) { + if ($read_bytes > $limit) { + $data = substr($data, 0, $limit); + } + $output .= $data; + $limit -= strlen($data); + } + + if (strlen($output) >= $length) { + break; + } + } while ($read_bytes > 0); + + return $output; + } + + + /** + * Begin or continue command execution. + * + * @return bool True if future has resolved. + * @task internal + */ + public function isReady() { + // NOTE: We have soft dependencies on PhutilServiceProfiler and + // PhutilErrorTrap here. These dependencies are soft to avoid the need to + // build them into the Phage agent. Under normal circumstances, these + // classes are always available. + + if (!$this->pipes) { + + // NOTE: See note above about Phage. + if (class_exists('PhutilServiceProfiler')) { + $profiler = PhutilServiceProfiler::getInstance(); + $this->profilerCallID = $profiler->beginServiceCall( + array( + 'type' => 'exec', + 'command' => (string)$this->command, + )); + } + + if (!$this->start) { + // We might already have started the timer via initiating resolution. + $this->start = microtime(true); + } + + $unmasked_command = $this->command; + if ($unmasked_command instanceof PhutilCommandString) { + $unmasked_command = $unmasked_command->getUnmaskedString(); + } + + $pipes = array(); + + if (phutil_is_windows()) { + // See T4395. proc_open under Windows uses "cmd /C [cmd]", which will + // strip the first and last quote when there aren't exactly two quotes + // (and some other conditions as well). This results in a command that + // looks like `command" "path to my file" "something something` which is + // clearly wrong. By surrounding the command string with quotes we can + // be sure this process is harmless. + if (strpos($unmasked_command, '"') !== false) { + $unmasked_command = '"'.$unmasked_command.'"'; + } + } + + if ($this->hasEnv()) { + $env = $this->getEnv(); + } else { + $env = null; + } + + $cwd = $this->getCWD(); + + // NOTE: See note above about Phage. + if (class_exists('PhutilErrorTrap')) { + $trap = new PhutilErrorTrap(); + } else { + $trap = null; + } + + $spec = self::$descriptorSpec; + if ($this->useWindowsFileStreams) { + $this->windowsStdoutTempFile = new TempFile(); + $this->windowsStderrTempFile = new TempFile(); + + $spec = array( + 0 => self::$descriptorSpec[0], // stdin + 1 => fopen($this->windowsStdoutTempFile, 'wb'), // stdout + 2 => fopen($this->windowsStderrTempFile, 'wb'), // stderr + ); + + if (!$spec[1] || !$spec[2]) { + throw new Exception(pht( + 'Unable to create temporary files for '. + 'Windows stdout / stderr streams')); + } + } + + $proc = @proc_open( + $unmasked_command, + $spec, + $pipes, + $cwd, + $env); + + if ($this->useWindowsFileStreams) { + fclose($spec[1]); + fclose($spec[2]); + $pipes = array( + 0 => head($pipes), // stdin + 1 => fopen($this->windowsStdoutTempFile, 'rb'), // stdout + 2 => fopen($this->windowsStderrTempFile, 'rb'), // stderr + ); + + if (!$pipes[1] || !$pipes[2]) { + throw new Exception(pht( + 'Unable to open temporary files for '. + 'reading Windows stdout / stderr streams')); + } + } + + if ($trap) { + $err = $trap->getErrorsAsString(); + $trap->destroy(); + } else { + $err = error_get_last(); + } + + if (!is_resource($proc)) { + throw new Exception( + pht( + 'Failed to `%s`: %s', + 'proc_open()', + $err)); + } + + $this->pipes = $pipes; + $this->proc = $proc; + + list($stdin, $stdout, $stderr) = $pipes; + + if (!phutil_is_windows()) { + + // On Windows, we redirect process standard output and standard error + // through temporary files, and then use stream_select to determine + // if there's more data to read. + + if ((!stream_set_blocking($stdout, false)) || + (!stream_set_blocking($stderr, false)) || + (!stream_set_blocking($stdin, false))) { + $this->__destruct(); + throw new Exception(pht('Failed to set streams nonblocking.')); + } + } + + $this->tryToCloseStdin(); + + return false; + } + + if (!$this->proc) { + return true; + } + + list($stdin, $stdout, $stderr) = $this->pipes; + + while (isset($this->stdin) && $this->stdin->getByteLength()) { + $write_segment = $this->stdin->getAnyPrefix(); + + $bytes = fwrite($stdin, $write_segment); + if ($bytes === false) { + throw new Exception(pht('Unable to write to stdin!')); + } else if ($bytes) { + $this->stdin->removeBytesFromHead($bytes); + } else { + // Writes are blocked for now. + break; + } + } + + $this->tryToCloseStdin(); + + // Read status before reading pipes so that we can never miss data that + // arrives between our last read and the process exiting. + $status = $this->procGetStatus(); + + $read_buffer_size = $this->readBufferSize; + + $max_stdout_read_bytes = PHP_INT_MAX; + $max_stderr_read_bytes = PHP_INT_MAX; + if ($read_buffer_size !== null) { + $max_stdout_read_bytes = $read_buffer_size - strlen($this->stdout); + $max_stderr_read_bytes = $read_buffer_size - strlen($this->stderr); + } + + if ($max_stdout_read_bytes > 0) { + $this->stdout .= $this->readAndDiscard( + $stdout, + $this->getStdoutSizeLimit() - strlen($this->stdout), + 'stdout', + $max_stdout_read_bytes); + } + + if ($max_stderr_read_bytes > 0) { + $this->stderr .= $this->readAndDiscard( + $stderr, + $this->getStderrSizeLimit() - strlen($this->stderr), + 'stderr', + $max_stderr_read_bytes); + } + + $is_done = false; + if (!$status['running']) { + // We may still have unread bytes on stdout or stderr, particularly if + // this future is being buffered and streamed. If we do, we don't want to + // consider the subprocess to have exited until we've read everything. + // See T9724 for context. + if (feof($stdout) && feof($stderr)) { + $is_done = true; + } + } + + if ($is_done) { + if ($this->useWindowsFileStreams) { + fclose($stdout); + fclose($stderr); + } + + // If the subprocess got nuked with `kill -9`, we get a -1 exitcode. + // Upgrade this to a slightly more informative value by examining the + // terminating signal code. + $err = $status['exitcode']; + if ($err == -1) { + if ($status['signaled']) { + $err = 128 + $status['termsig']; + } + } + + $this->result = array( + $err, + $this->stdout, + $this->stderr, + ); + $this->closeProcess(); + return true; + } + + $elapsed = (microtime(true) - $this->start); + + if ($this->terminateTimeout && ($elapsed >= $this->terminateTimeout)) { + if (!$this->didTerminate) { + $this->killedByTimeout = true; + $this->sendTerminateSignal(); + return false; + } + } + + if ($this->killTimeout && ($elapsed >= $this->killTimeout)) { + $this->killedByTimeout = true; + $this->resolveKill(); + return true; + } + + } + + + /** + * @return void + * @task internal + */ + public function __destruct() { + if (!$this->proc) { + return; + } + + // NOTE: If we try to proc_close() an open process, we hang indefinitely. To + // avoid this, kill the process explicitly if it's still running. + + $status = $this->procGetStatus(); + if ($status['running']) { + $this->sendTerminateSignal(); + if (!$this->waitForExit(5)) { + $this->resolveKill(); + } + } else { + $this->closeProcess(); + } + } + + + /** + * Close and free resources if necessary. + * + * @return void + * @task internal + */ + private function closeProcess() { + foreach ($this->pipes as $pipe) { + if (isset($pipe)) { + @fclose($pipe); + } + } + $this->pipes = array(null, null, null); + if ($this->proc) { + @proc_close($this->proc); + $this->proc = null; + } + $this->stdin = null; + + if ($this->profilerCallID !== null) { + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall( + $this->profilerCallID, + array( + 'err' => $this->result ? idx($this->result, 0) : null, + )); + $this->profilerCallID = null; + } + } + + + /** + * Execute `proc_get_status()`, but avoid pitfalls. + * + * @return dict Process status. + * @task internal + */ + private function procGetStatus() { + // After the process exits, we only get one chance to read proc_get_status() + // before it starts returning garbage. Make sure we don't throw away the + // last good read. + if ($this->procStatus) { + if (!$this->procStatus['running']) { + return $this->procStatus; + } + } + $this->procStatus = proc_get_status($this->proc); + + return $this->procStatus; + } + + /** + * Try to close stdin, if we're done using it. This keeps us from hanging if + * the process on the other end of the pipe is waiting for EOF. + * + * @return void + * @task internal + */ + private function tryToCloseStdin() { + if (!$this->closePipe) { + // We've been told to keep the pipe open by a call to write(..., true). + return; + } + + if ($this->stdin->getByteLength()) { + // We still have bytes to write. + return; + } + + list($stdin) = $this->pipes; + if (!$stdin) { + // We've already closed stdin. + return; + } + + // There's nothing stopping us from closing stdin, so close it. + + @fclose($stdin); + $this->pipes[0] = null; + } + + public function getDefaultWait() { + $wait = parent::getDefaultWait(); + + $next_timeout = $this->getNextTimeout(); + if ($next_timeout) { + if (!$this->start) { + $this->start = microtime(true); + } + $elapsed = (microtime(true) - $this->start); + $wait = max(0, min($next_timeout - $elapsed, $wait)); + } + + return $wait; + } + + private function getNextTimeout() { + if ($this->didTerminate) { + return $this->killTimeout; + } else { + return $this->terminateTimeout; + } + } + + private function sendTerminateSignal() { + $this->didTerminate = true; + proc_terminate($this->proc); + return $this; + } + + private function waitForExit($duration) { + $start = microtime(true); + + while (true) { + $status = $this->procGetStatus(); + if (!$status['running']) { + return true; + } + + $waited = (microtime(true) - $start); + if ($waited > $duration) { + return false; + } + } + } + +} diff --git a/src/future/exec/PhutilBacktraceSignalHandler.php b/src/future/exec/PhutilBacktraceSignalHandler.php new file mode 100644 index 00000000..131a54bc --- /dev/null +++ b/src/future/exec/PhutilBacktraceSignalHandler.php @@ -0,0 +1,22 @@ +getTraceAsString()); + } + +} diff --git a/src/future/exec/PhutilCallbackSignalHandler.php b/src/future/exec/PhutilCallbackSignalHandler.php new file mode 100644 index 00000000..2cde5472 --- /dev/null +++ b/src/future/exec/PhutilCallbackSignalHandler.php @@ -0,0 +1,22 @@ +signal = $signal; + $this->callback = $callback; + } + + public function canHandleSignal(PhutilSignalRouter $router, $signo) { + return ($signo === $this->signal); + } + + public function handleSignal(PhutilSignalRouter $router, $signo) { + call_user_func($this->callback, $signo); + } + +} diff --git a/src/future/exec/PhutilConsoleMetricsSignalHandler.php b/src/future/exec/PhutilConsoleMetricsSignalHandler.php new file mode 100644 index 00000000..45675c8d --- /dev/null +++ b/src/future/exec/PhutilConsoleMetricsSignalHandler.php @@ -0,0 +1,14 @@ +didGetWINCHSignal(); + } + +} diff --git a/src/future/exec/PhutilExecPassthru.php b/src/future/exec/PhutilExecPassthru.php new file mode 100644 index 00000000..16b51393 --- /dev/null +++ b/src/future/exec/PhutilExecPassthru.php @@ -0,0 +1,141 @@ +execute(); + * + * You can set the current working directory for the command with + * @{method:setCWD}, and set the environment with @{method:setEnv}. + * + * @task command Executing Passthru Commands + */ +final class PhutilExecPassthru extends PhutilExecutableFuture { + + + private $command; + private $passthruResult; + + +/* -( Executing Passthru Commands )---------------------------------------- */ + + + /** + * Build a new passthru command. + * + * $exec = new PhutilExecPassthru('ls %s', $dir); + * + * @param string Command pattern. See @{function:csprintf}. + * @param ... Pattern arguments. + * + * @task command + */ + public function __construct($pattern /* , ... */) { + $args = func_get_args(); + $this->command = call_user_func_array('csprintf', $args); + } + + + /** + * Execute this command. + * + * @return int Error code returned by the subprocess. + * + * @task command + */ + public function execute() { + $command = $this->command; + + $profiler = PhutilServiceProfiler::getInstance(); + $call_id = $profiler->beginServiceCall( + array( + 'type' => 'exec', + 'subtype' => 'passthru', + 'command' => $command, + )); + + $spec = array(STDIN, STDOUT, STDERR); + $pipes = array(); + + if ($command instanceof PhutilCommandString) { + $unmasked_command = $command->getUnmaskedString(); + } else { + $unmasked_command = $command; + } + + if ($this->hasEnv()) { + $env = $this->getEnv(); + } else { + $env = null; + } + + $cwd = $this->getCWD(); + + $options = array(); + if (phutil_is_windows()) { + // Without 'bypass_shell', things like launching vim don't work properly, + // and we can't execute commands with spaces in them, and all commands + // invoked from git bash fail horridly, and everything is a mess in + // general. + $options['bypass_shell'] = true; + } + + $trap = new PhutilErrorTrap(); + $proc = @proc_open( + $unmasked_command, + $spec, + $pipes, + $cwd, + $env, + $options); + $errors = $trap->getErrorsAsString(); + $trap->destroy(); + + if (!is_resource($proc)) { + throw new Exception( + pht( + 'Failed to passthru %s: %s', + 'proc_open()', + $errors)); + } + + $err = proc_close($proc); + + $profiler->endServiceCall( + $call_id, + array( + 'err' => $err, + )); + + return $err; + } + + +/* -( Future )------------------------------------------------------------- */ + + + public function isReady() { + // This isn't really a future because it executes synchronously and has + // full control of the console. We're just implementing the interfaces to + // make it easier to share code with ExecFuture. + + if ($this->passthruResult === null) { + $this->passthruResult = $this->execute(); + } + + return true; + } + + protected function getResult() { + return $this->passthruResult; + } + +} diff --git a/src/future/exec/PhutilExecutableFuture.php b/src/future/exec/PhutilExecutableFuture.php new file mode 100644 index 00000000..53819825 --- /dev/null +++ b/src/future/exec/PhutilExecutableFuture.php @@ -0,0 +1,193 @@ +setEnv(array('X' => 'y')); + * + * // Env will have ONLY "X". + * $exec->setEnv(array('X' => 'y'), $wipe_process_env = true); + * + * @param map Dictionary of environmental variables. + * @param bool Optionally, pass `true` to replace the existing environment. + * @return this + * + * @task config + */ + final public function setEnv(array $env, $wipe_process_env = false) { + // Force values to strings here. The underlying PHP commands get upset if + // they are handed non-string values as environmental variables. + foreach ($env as $key => $value) { + $env[$key] = (string)$value; + } + + if (!$wipe_process_env) { + $env = $env + $this->getEnv(); + } + + $this->env = $env; + + return $this; + } + + + /** + * Set the value of a specific environmental variable for this command. + * + * @param string Environmental variable name. + * @param string|null New value, or null to remove this variable. + * @return this + * @task config + */ + final public function updateEnv($key, $value) { + $env = $this->getEnv(); + + if ($value === null) { + unset($env[$key]); + } else { + $env[$key] = (string)$value; + } + + $this->env = $env; + + return $this; + } + + + /** + * Returns `true` if this command has a configured environment. + * + * @return bool True if this command has an environment. + * @task config + */ + final public function hasEnv() { + return ($this->env !== null); + } + + + /** + * Get the configured environment. + * + * @return map Effective environment for this command. + * @task config + */ + final public function getEnv() { + if (!$this->hasEnv()) { + $default_env = $_ENV; + + // If `variables_order` does not include "E", the $_ENV superglobal + // does not build and there's no apparent reasonable way for us to + // rebuild it (we could perhaps parse the output of `export`). + + // For now, explicitly populate variables which we rely on and which + // we know may exist. After T12071, we should be able to rely on + // $_ENV and no longer need to do this. + + $known_keys = array( + 'PHABRICATOR_ENV', + 'PHABRICATOR_INSTANCE', + ); + + foreach ($known_keys as $known_key) { + $value = getenv($known_key); + if (strlen($value)) { + $default_env[$known_key] = $value; + } + } + + $this->setEnv($default_env, $wipe_process_env = true); + } + + return $this->env; + } + + + /** + * Set the current working directory for the subprocess (that is, set where + * the subprocess will execute). If not set, the default value is the parent's + * current working directory. + * + * @param string Directory to execute the subprocess in. + * @return this + * @task config + */ + final public function setCWD($cwd) { + $cwd = phutil_string_cast($cwd); + + try { + Filesystem::assertExists($cwd); + } catch (FilesystemException $ex) { + throw new PhutilProxyException( + pht( + 'Unable to run a command in directory "%s".', + $cwd), + $ex); + } + + if (!is_dir($cwd)) { + throw new Exception( + pht( + 'Preparing to run a command in directory "%s", but that path is '. + 'not a directory.', + $cwd)); + } + + // Although you don't technically need read permission to "chdir()" into + // a directory, it is almost certainly a mistake to execute a subprocess + // in a CWD we can't read. Refuse to do this. If callers have some + // exceptionally clever scheme up their sleeves they can always have the + // subprocess "cd" or "chdir()" explicitly. + + if (!is_readable($cwd)) { + throw new Exception( + pht( + 'Preparing to run a command in directory "%s", but that directory '. + 'is not readable (the current process does not have "+r" '. + 'permission).', + $cwd)); + } + + + if (phutil_is_windows()) { + // Do nothing. On Windows, calling "is_executable(...)" on a directory + // always appears to return "false". Skip this check under Windows. + } else if (!is_executable($cwd)) { + throw new Exception( + pht( + 'Preparing to run a command in directory "%s", but that directory '. + 'is not executable (the current process does not have "+x" '. + 'permission).', + $cwd)); + } + + $this->cwd = $cwd; + + return $this; + } + + + /** + * Get the command's current working directory. + * + * @return string Working directory. + * @task config + */ + final public function getCWD() { + return $this->cwd; + } + +} diff --git a/src/future/exec/PhutilSignalHandler.php b/src/future/exec/PhutilSignalHandler.php new file mode 100644 index 00000000..d0ffb9db --- /dev/null +++ b/src/future/exec/PhutilSignalHandler.php @@ -0,0 +1,8 @@ + + } + + public static function initialize() { + if (!self::$router) { + $router = new self(); + + // If pcntl_signal() does not exist (particularly, on Windows), just + // don't install signal handlers. + if (function_exists('pcntl_signal')) { + pcntl_signal(SIGHUP, array($router, 'routeSignal')); + pcntl_signal(SIGTERM, array($router, 'routeSignal')); + pcntl_signal(SIGWINCH, array($router, 'routeSignal')); + } + + self::$router = $router; + } + + return self::getRouter(); + } + + public static function getRouter() { + if (!self::$router) { + throw new Exception(pht('Signal router has not been initialized!')); + } + + return self::$router; + } + + public function installHandler($key, PhutilSignalHandler $handler) { + if (isset($this->handlers[$key])) { + throw new Exception( + pht( + 'Signal handler with key "%s" is already installed.', + $key)); + } + + $this->handlers[$key] = $handler; + + return $this; + } + + public function getHandler($key) { + return idx($this->handlers, $key); + } + + public function routeSignal($signo) { + $exceptions = array(); + + $handlers = $this->handlers; + foreach ($handlers as $key => $handler) { + try { + if ($handler->canHandleSignal($this, $signo)) { + $handler->handleSignal($this, $signo); + } + } catch (Exception $ex) { + $exceptions[] = $ex; + } + } + + if ($exceptions) { + throw new PhutilAggregateException( + pht( + 'Signal handlers raised exceptions while handling "%s".', + phutil_get_signal_name($signo)), + $exceptions); + } + + switch ($signo) { + case SIGTERM: + // Normally, PHP doesn't invoke destructors when exiting in response to + // a signal. This forces it to do so, so we have a fighting chance of + // releasing any locks, leases or resources on our way out. + exit(128 + $signo); + } + } + +} diff --git a/src/future/exec/__tests__/ExecFutureTestCase.php b/src/future/exec/__tests__/ExecFutureTestCase.php new file mode 100644 index 00000000..2ce0ad0c --- /dev/null +++ b/src/future/exec/__tests__/ExecFutureTestCase.php @@ -0,0 +1,155 @@ +write('')->resolvex(); + + $this->assertEqual('', $stdout); + } + + public function testKeepPipe() { + // NOTE: This is mostly testing the semantics of $keep_pipe in write(). + + list($stdout) = id(new ExecFuture('cat')) + ->write('', true) + ->start() + ->write('x', true) + ->write('y', true) + ->write('z', false) + ->resolvex(); + + $this->assertEqual('xyz', $stdout); + } + + public function testLargeBuffer() { + // NOTE: This is mostly a coverage test to hit branches where we're still + // flushing a buffer. + + $data = str_repeat('x', 1024 * 1024 * 4); + list($stdout) = id(new ExecFuture('cat'))->write($data)->resolvex(); + + $this->assertEqual($data, $stdout); + } + + public function testBufferLimit() { + $data = str_repeat('x', 1024 * 1024); + list($stdout) = id(new ExecFuture('cat')) + ->setStdoutSizeLimit(1024) + ->write($data) + ->resolvex(); + + $this->assertEqual(substr($data, 0, 1024), $stdout); + } + + public function testResolveTimeoutTestShouldRunLessThan1Sec() { + // NOTE: This tests interactions between the resolve() timeout and the + // ExecFuture timeout, which are similar but not identical. + + $future = id(new ExecFuture('sleep 32000'))->start(); + $future->setTimeout(32000); + + // We expect this to return in 0.01s. + $result = $future->resolve(0.01); + $this->assertEqual($result, null); + + // We expect this to now force the time out / kill immediately. If we don't + // do this, we'll hang when exiting until our subprocess exits (32000 + // seconds!) + $future->setTimeout(0.01); + $future->resolve(); + } + + public function testTerminateWithoutStart() { + // We never start this future, but it should be fine to kill a future from + // any state. + $future = new ExecFuture('sleep 1'); + $future->resolveKill(); + + $this->assertTrue(true); + } + + public function testTimeoutTestShouldRunLessThan1Sec() { + // NOTE: This is partly testing that we choose appropriate select wait + // times; this test should run for significantly less than 1 second. + + $future = new ExecFuture('sleep 32000'); + list($err) = $future->setTimeout(0.01)->resolve(); + + $this->assertTrue($err > 0); + $this->assertTrue($future->getWasKilledByTimeout()); + } + + public function testMultipleTimeoutsTestShouldRunLessThan1Sec() { + $futures = array(); + for ($ii = 0; $ii < 4; $ii++) { + $futures[] = id(new ExecFuture('sleep 32000'))->setTimeout(0.01); + } + + foreach (new FutureIterator($futures) as $future) { + list($err) = $future->resolve(); + + $this->assertTrue($err > 0); + $this->assertTrue($future->getWasKilledByTimeout()); + } + } + + public function testMultipleResolves() { + // It should be safe to call resolve(), resolvex(), resolveKill(), etc., + // as many times as you want on the same process. + + $future = new ExecFuture('echo quack'); + $future->resolve(); + $future->resolvex(); + list($err) = $future->resolveKill(); + + $this->assertEqual(0, $err); + } + + public function testReadBuffering() { + $str_len_8 = 'abcdefgh'; + $str_len_4 = 'abcd'; + + // This is a write/read with no read buffer. + $future = new ExecFuture('cat'); + $future->write($str_len_8); + + do { + $future->isReady(); + list($read) = $future->read(); + if (strlen($read)) { + break; + } + } while (true); + + // We expect to get the entire string back in the read. + $this->assertEqual($str_len_8, $read); + $future->resolve(); + + + // This is a write/read with a read buffer. + $future = new ExecFuture('cat'); + $future->write($str_len_8); + + // Set the read buffer size. + $future->setReadBufferSize(4); + do { + $future->isReady(); + list($read) = $future->read(); + if (strlen($read)) { + break; + } + } while (true); + + // We expect to get the entire string back in the read. + $this->assertEqual($str_len_4, $read); + + // Remove the limit so we can resolve the future. + $future->setReadBufferSize(null); + $future->resolve(); + } + +} diff --git a/src/future/exec/__tests__/ExecPassthruTestCase.php b/src/future/exec/__tests__/ExecPassthruTestCase.php new file mode 100644 index 00000000..f7795fc4 --- /dev/null +++ b/src/future/exec/__tests__/ExecPassthruTestCase.php @@ -0,0 +1,16 @@ +execute(); + $this->assertEqual(0, $err); + } + +} diff --git a/src/future/exec/execx.php b/src/future/exec/execx.php new file mode 100644 index 00000000..bde37d29 --- /dev/null +++ b/src/future/exec/execx.php @@ -0,0 +1,107 @@ +resolvex(); +} + + +/** + * Execute a command and capture stdout, stderr, and the return value. + * + * list ($err, $stdout, $stderr) = exec_manual('ls %s', $file); + * + * When invoking this function, you must manually handle the error condition. + * Error flows can often be simplified by using @{function:execx} instead, + * which throws an exception when it encounters an error. + * + * @param string sprintf()-style command pattern to execute. + * @param ... Arguments to sprintf pattern. + * @return array List of return code, stdout, and stderr. + */ +function exec_manual($cmd /* , ... */) { + $args = func_get_args(); + $ef = newv('ExecFuture', $args); + return $ef->resolve(); +} + + +/** + * Wrapper for @{class:PhutilExecPassthru}. + * + * @param string sprintf()-style command pattern to execute. + * @param ... Arguments to sprintf pattern. + * @return int Return code. + */ +function phutil_passthru($cmd /* , ... */) { + $args = func_get_args(); + return newv('PhutilExecPassthru', $args)->execute(); +} + + +/** + * Return a human-readable signal name (like "SIGINT" or "SIGKILL") for a given + * signal number. + * + * @param int Signal number. + * @return string Human-readable signal name. + */ +function phutil_get_signal_name($signo) { + // These aren't always defined; try our best to look up the signal name. + $constant_names = array( + 'SIGHUP', + 'SIGINT', + 'SIGQUIT', + 'SIGILL', + 'SIGTRAP', + 'SIGABRT', + 'SIGIOT', + 'SIGBUS', + 'SIGFPE', + 'SIGUSR1', + 'SIGSEGV', + 'SIGUSR2', + 'SIGPIPE', + 'SIGALRM', + 'SIGTERM', + 'SIGSTKFLT', + 'SIGCLD', + 'SIGCHLD', + 'SIGCONT', + 'SIGTSTP', + 'SIGTTIN', + 'SIGTTOU', + 'SIGURG', + 'SIGXCPU', + 'SIGXFSZ', + 'SIGVTALRM', + 'SIGPROF', + 'SIGWINCH', + 'SIGPOLL', + 'SIGIO', + 'SIGPWR', + 'SIGSYS', + 'SIGBABY', + ); + + $signal_names = array(); + foreach ($constant_names as $constant) { + if (defined($constant)) { + $signal_names[constant($constant)] = $constant; + } + } + + return idx($signal_names, $signo); +} diff --git a/src/future/github/PhutilGitHubFuture.php b/src/future/github/PhutilGitHubFuture.php new file mode 100644 index 00000000..c6b23def --- /dev/null +++ b/src/future/github/PhutilGitHubFuture.php @@ -0,0 +1,130 @@ +accessToken = $token; + return $this; + } + + public function setRawGitHubQuery($action, array $params = array()) { + $this->action = $action; + $this->params = $params; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + public function addHeader($key, $value) { + $this->headers[] = array($key, $value); + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->action) { + throw new Exception( + pht( + 'You must %s!', + 'setRawGitHubQuery()')); + } + + if (!$this->accessToken) { + throw new Exception( + pht( + 'You must %s!', + 'setAccessToken()')); + } + + $uri = new PhutilURI('https://api.github.com/'); + $uri->setPath('/'.ltrim($this->action, '/')); + + $future = new HTTPSFuture($uri); + $future->setData($this->params); + $future->addHeader('Authorization', 'token '.$this->accessToken); + // NOTE: GitHub requires a 'User-Agent' header. + $future->addHeader('User-Agent', __CLASS__); + $future->setMethod($this->method); + + foreach ($this->headers as $header) { + list($key, $value) = $header; + $future->addHeader($key, $value); + } + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + if ($this->isRateLimitResponse($status, $headers)) { + // Do nothing, this is a rate limit. + } else if ($this->isNotModifiedResponse($status)) { + // Do nothing, this is a "Not Modified" response. + } else { + // This is an error condition we do not expect. + throw $status; + } + } + + try { + if (strlen($body)) { + $data = phutil_json_decode($body); + } else { + // This can happen for 304 responses. + $data = array(); + } + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from GitHub.'), + $ex); + } + + return id(new PhutilGitHubResponse()) + ->setStatus($status) + ->setHeaders($headers) + ->setBody($data); + } + + private function isNotModifiedResponse($status) { + return ($status->getStatusCode() == 304); + } + + private function isRateLimitResponse($status, array $headers) { + if ($status->getStatusCode() != 403) { + return false; + } + + foreach ($headers as $header) { + list($key, $value) = $header; + if (phutil_utf8_strtolower($key) === 'x-ratelimit-remaining') { + if (!(int)$value) { + return true; + } + } + } + + return false; + } + +} diff --git a/src/future/github/PhutilGitHubResponse.php b/src/future/github/PhutilGitHubResponse.php new file mode 100644 index 00000000..e379dadd --- /dev/null +++ b/src/future/github/PhutilGitHubResponse.php @@ -0,0 +1,49 @@ +status = $status; + return $this; + } + + public function getStatus() { + return $this->status; + } + + public function setBody(array $body) { + $this->body = $body; + return $this; + } + + public function getBody() { + return $this->body; + } + + public function setHeaders(array $headers) { + $this->headers = $headers; + return $this; + } + + public function getHeaders() { + return $this->headers; + } + + public function getHeaderValue($key, $default = null) { + $key = phutil_utf8_strtolower($key); + + foreach ($this->headers as $header) { + list($hkey, $value) = $header; + if (phutil_utf8_strtolower($hkey) === $key) { + return $value; + } + } + + return $default; + } + +} diff --git a/src/future/http/BaseHTTPFuture.php b/src/future/http/BaseHTTPFuture.php new file mode 100644 index 00000000..591cf781 --- /dev/null +++ b/src/future/http/BaseHTTPFuture.php @@ -0,0 +1,427 @@ +resolve(); + * + * This is an abstract base class which defines the API that HTTP futures + * conform to. Concrete implementations are available in @{class:HTTPFuture} + * and @{class:HTTPSFuture}. All futures return a tuple + * when resolved; status is an object of class @{class:HTTPFutureResponseStatus} + * and may represent any of a wide variety of errors in the transport layer, + * a support library, or the actual HTTP exchange. + * + * @task create Creating a New Request + * @task config Configuring the Request + * @task resolve Resolving the Request + * @task internal Internals + */ +abstract class BaseHTTPFuture extends Future { + + private $method = 'GET'; + private $timeout = 300.0; + private $headers = array(); + private $uri; + private $data; + private $expect; + + +/* -( Creating a New Request )--------------------------------------------- */ + + + /** + * Build a new future which will make an HTTP request to a given URI, with + * some optional data payload. Since this class is abstract you can't actually + * instantiate it; instead, build a new @{class:HTTPFuture} or + * @{class:HTTPSFuture}. + * + * @param string Fully-qualified URI to send a request to. + * @param mixed String or array to include in the request. Strings will be + * transmitted raw; arrays will be encoded and sent as + * 'application/x-www-form-urlencoded'. + * @task create + */ + final public function __construct($uri, $data = array()) { + $this->setURI((string)$uri); + $this->setData($data); + } + + +/* -( Configuring the Request )-------------------------------------------- */ + + + /** + * Set a timeout for the service call. If the request hasn't resolved yet, + * the future will resolve with a status that indicates the request timed + * out. You can determine if a status is a timeout status by calling + * isTimeout() on the status object. + * + * @param float Maximum timeout, in seconds. + * @return this + * @task config + */ + public function setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + + /** + * Get the currently configured timeout. + * + * @return float Maximum number of seconds the request will execute for. + * @task config + */ + public function getTimeout() { + return $this->timeout; + } + + + /** + * Select the HTTP method (e.g., "GET", "POST", "PUT") to use for the request. + * By default, requests use "GET". + * + * @param string HTTP method name. + * @return this + * @task config + */ + final public function setMethod($method) { + static $supported_methods = array( + 'GET' => true, + 'POST' => true, + 'PUT' => true, + 'DELETE' => true, + ); + + if (empty($supported_methods[$method])) { + throw new Exception( + pht( + "The HTTP method '%s' is not supported. Supported HTTP methods ". + "are: %s.", + $method, + implode(', ', array_keys($supported_methods)))); + } + + $this->method = $method; + return $this; + } + + + /** + * Get the HTTP method the request will use. + * + * @return string HTTP method name, like "GET". + * @task config + */ + final public function getMethod() { + return $this->method; + } + + + /** + * Set the URI to send the request to. Note that this is also a constructor + * parameter. + * + * @param string URI to send the request to. + * @return this + * @task config + */ + public function setURI($uri) { + $this->uri = (string)$uri; + return $this; + } + + + /** + * Get the fully-qualified URI the request will be made to. + * + * @return string URI the request will be sent to. + * @task config + */ + public function getURI() { + return $this->uri; + } + + + /** + * Provide data to send along with the request. Note that this is also a + * constructor parameter; it may be more convenient to provide it there. Data + * must be a string (in which case it will be sent raw) or an array (in which + * case it will be encoded and sent as 'application/x-www-form-urlencoded'). + * + * @param mixed Data to send with the request. + * @return this + * @task config + */ + public function setData($data) { + if (!is_string($data) && !is_array($data)) { + throw new Exception(pht('Data parameter must be an array or string.')); + } + $this->data = $data; + return $this; + } + + + /** + * Get the data which will be sent with the request. + * + * @return mixed Data which will be sent. + * @task config + */ + public function getData() { + return $this->data; + } + + + /** + * Add an HTTP header to the request. The same header name can be specified + * more than once, which will cause multiple headers to be sent. + * + * @param string Header name, like "Accept-Language". + * @param string Header value, like "en-us". + * @return this + * @task config + */ + public function addHeader($name, $value) { + $this->headers[] = array($name, $value); + return $this; + } + + + /** + * Get headers which will be sent with the request. Optionally, you can + * provide a filter, which will return only headers with that name. For + * example: + * + * $all_headers = $future->getHeaders(); + * $just_user_agent = $future->getHeaders('User-Agent'); + * + * In either case, an array with all (or all matching) headers is returned. + * + * @param string|null Optional filter, which selects only headers with that + * name if provided. + * @return array List of all (or all matching) headers. + * @task config + */ + public function getHeaders($filter = null) { + $filter = strtolower($filter); + + $result = array(); + foreach ($this->headers as $header) { + list($name, $value) = $header; + if (!$filter || ($filter == strtolower($name))) { + $result[] = $header; + } + } + + return $result; + } + + /** + * Set the status codes that are expected in the response. + * If set, isError on the status object will return true for status codes + * that are not in the input array. Otherwise, isError will be true for any + * HTTP status code outside the 2xx range (notwithstanding other errors such + * as connection or transport issues). + * + * @param array|null List of expected HTTP status codes. + * + * @return this + * @task config + */ + public function setExpectStatus($status_codes) { + $this->expect = $status_codes; + return $this; + } + + /** + * Return list of expected status codes, or null if not set. + * + * @return array|null List of expected status codes. + */ + public function getExpectStatus() { + return $this->expect; + } + + + /** + * Add a HTTP basic authentication header to the request. + * + * @param string Username to authenticate with. + * @param PhutilOpaqueEnvelope Password to authenticate with. + * @return this + * @task config + */ + public function setHTTPBasicAuthCredentials( + $username, + PhutilOpaqueEnvelope $password) { + + $password_plaintext = $password->openEnvelope(); + $credentials = base64_encode($username.':'.$password_plaintext); + + return $this->addHeader('Authorization', 'Basic '.$credentials); + } + + public function getHTTPRequestByteLength() { + // NOTE: This isn't very accurate, but it's only used by the "--trace" + // call profiler to help pick out huge requests. + $data = $this->getData(); + + if (is_scalar($data)) { + return strlen($data); + } + + return strlen(phutil_build_http_querystring($data)); + } + + +/* -( Resolving the Request )---------------------------------------------- */ + + + /** + * Exception-oriented @{method:resolve}. Throws if the status indicates an + * error occurred. + * + * @return tuple HTTP request result tuple. + * @task resolve + */ + final public function resolvex() { + $result = $this->resolve(); + + list($status, $body, $headers) = $result; + if ($status->isError()) { + throw $status; + } + + return array($body, $headers); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Parse a raw HTTP response into a tuple. + * + * @param string Raw HTTP response. + * @return tuple Valid resolution tuple. + * @task internal + */ + protected function parseRawHTTPResponse($raw_response) { + $rex_base = "@^(?P.*?)\r?\n\r?\n(?P.*)$@s"; + $rex_head = "@^HTTP/\S+ (?P\d+) ?(?P.*?)". + "(?:\r?\n(?P.*))?$@s"; + + // We need to parse one or more header blocks in case we got any + // "HTTP/1.X 100 Continue" nonsense back as part of the response. This + // happens with HTTPS requests, at the least. + $response = $raw_response; + while (true) { + $matches = null; + if (!preg_match($rex_base, $response, $matches)) { + return $this->buildMalformedResult($raw_response); + } + + $head = $matches['head']; + $body = $matches['body']; + + if (!preg_match($rex_head, $head, $matches)) { + return $this->buildMalformedResult($raw_response); + } + + $response_code = (int)$matches['code']; + $response_status = strtolower($matches['status']); + if ($response_code == 100) { + // This is HTTP/1.X 100 Continue, so this whole chunk is moot. + $response = $body; + } else if (($response_code == 200) && + ($response_status == 'connection established')) { + // When tunneling through an HTTPS proxy, we get an initial header + // block like "HTTP/1.X 200 Connection established", then newlines, + // then the normal response. Drop this chunk. + $response = $body; + } else { + $headers = $this->parseHeaders(idx($matches, 'headers')); + break; + } + } + + $status = new HTTPFutureHTTPResponseStatus( + $response_code, + $body, + $headers, + $this->expect); + + return array($status, $body, $headers); + } + + /** + * Parse an HTTP header block. + * + * @param string Raw HTTP headers. + * @return list List of HTTP header tuples. + * @task internal + */ + protected function parseHeaders($head_raw) { + $rex_header = '@^(?P.*?):\s*(?P.*)$@'; + + $headers = array(); + + if (!$head_raw) { + return $headers; + } + + $headers_raw = preg_split("/\r?\n/", $head_raw); + foreach ($headers_raw as $header) { + $m = null; + if (preg_match($rex_header, $header, $m)) { + $headers[] = array($m['name'], $m['value']); + } else { + $headers[] = array($header, null); + } + } + + return $headers; + } + + + /** + * Find value of the first header with given name. + * + * @param list List of headers from `resolve()`. + * @param string Case insensitive header name. + * @return string Value of the header or null if not found. + * @task resolve + */ + public static function getHeader(array $headers, $search) { + assert_instances_of($headers, 'array'); + foreach ($headers as $header) { + list($name, $value) = $header; + if (strcasecmp($name, $search) == 0) { + return $value; + } + } + return null; + } + + + /** + * Build a result tuple indicating a parse error resulting from a malformed + * HTTP response. + * + * @return tuple Valid resolution tuple. + * @task internal + */ + protected function buildMalformedResult($raw_response) { + $body = null; + $headers = array(); + + $status = new HTTPFutureParseResponseStatus( + HTTPFutureParseResponseStatus::ERROR_MALFORMED_RESPONSE, + $raw_response); + return array($status, $body, $headers); + } + +} diff --git a/src/future/http/HTTPFuture.php b/src/future/http/HTTPFuture.php new file mode 100644 index 00000000..bfe5466d --- /dev/null +++ b/src/future/http/HTTPFuture.php @@ -0,0 +1,302 @@ +resolvex(); + * + * Or + * + * $future = new HTTPFuture('http://www.example.com/'); + * list($http_response_status_object, + * $response_body, + * $headers) = $future->resolve(); + * + * Prefer @{method:resolvex} to @{method:resolve} as the former throws + * @{class:HTTPFutureHTTPResponseStatus} on failures, which includes an + * informative exception message. + */ +final class HTTPFuture extends BaseHTTPFuture { + + private $host; + private $port = 80; + private $fullRequestPath; + + private $socket; + private $writeBuffer; + private $response; + + private $stateConnected = false; + private $stateWriteComplete = false; + private $stateReady = false; + private $stateStartTime; + + private $profilerCallID; + + public function setURI($uri) { + $parts = parse_url($uri); + if (!$parts) { + throw new Exception(pht("Could not parse URI '%s'.", $uri)); + } + + if (empty($parts['scheme']) || $parts['scheme'] !== 'http') { + throw new Exception( + pht( + "URI '%s' must be fully qualified with '%s' scheme.", + $uri, + 'http://')); + } + + if (!isset($parts['host'])) { + throw new Exception( + pht("URI '%s' must be fully qualified and include host name.", $uri)); + } + + $this->host = $parts['host']; + + if (!empty($parts['port'])) { + $this->port = $parts['port']; + } + + if (isset($parts['user']) || isset($parts['pass'])) { + throw new Exception( + pht('HTTP Basic Auth is not supported by %s.', __CLASS__)); + } + + if (isset($parts['path'])) { + $this->fullRequestPath = $parts['path']; + } else { + $this->fullRequestPath = '/'; + } + + if (isset($parts['query'])) { + $this->fullRequestPath .= '?'.$parts['query']; + } + + return parent::setURI($uri); + } + + public function __destruct() { + if ($this->socket) { + @fclose($this->socket); + $this->socket = null; + } + } + + public function getReadSockets() { + if ($this->socket) { + return array($this->socket); + } + return array(); + } + + public function getWriteSockets() { + if (strlen($this->writeBuffer)) { + return array($this->socket); + } + return array(); + } + + public function isWriteComplete() { + return $this->stateWriteComplete; + } + + private function getDefaultUserAgent() { + return __CLASS__.'/1.0'; + } + + public function isReady() { + if ($this->stateReady) { + return true; + } + + if (!$this->socket) { + $this->stateStartTime = microtime(true); + $this->socket = $this->buildSocket(); + if (!$this->socket) { + return $this->stateReady; + } + + $profiler = PhutilServiceProfiler::getInstance(); + $this->profilerCallID = $profiler->beginServiceCall( + array( + 'type' => 'http', + 'uri' => $this->getURI(), + )); + } + + if (!$this->stateConnected) { + $read = array(); + $write = array($this->socket); + $except = array(); + $select = stream_select($read, $write, $except, $tv_sec = 0); + if ($write) { + $this->stateConnected = true; + } + } + + if ($this->stateConnected) { + if (strlen($this->writeBuffer)) { + $bytes = @fwrite($this->socket, $this->writeBuffer); + if ($bytes === false) { + throw new Exception(pht('Failed to write to buffer.')); + } else if ($bytes) { + $this->writeBuffer = substr($this->writeBuffer, $bytes); + } + } + + if (!strlen($this->writeBuffer)) { + $this->stateWriteComplete = true; + } + + while (($data = fread($this->socket, 32768)) || strlen($data)) { + $this->response .= $data; + } + + if ($data === false) { + throw new Exception(pht('Failed to read socket.')); + } + } + + return $this->checkSocket(); + } + + private function buildSocket() { + $errno = null; + $errstr = null; + $socket = @stream_socket_client( + 'tcp://'.$this->host.':'.$this->port, + $errno, + $errstr, + $ignored_connection_timeout = 1.0, + STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT); + + if (!$socket) { + $this->stateReady = true; + $this->result = $this->buildErrorResult( + HTTPFutureTransportResponseStatus::ERROR_CONNECTION_FAILED); + return null; + } + + $ok = stream_set_blocking($socket, 0); + if (!$ok) { + throw new Exception(pht('Failed to set stream nonblocking.')); + } + + $this->writeBuffer = $this->buildHTTPRequest(); + + return $socket; + } + + private function checkSocket() { + $timeout = false; + $now = microtime(true); + if (($now - $this->stateStartTime) > $this->getTimeout()) { + $timeout = true; + } + + if (!feof($this->socket) && !$timeout) { + return false; + } + + $this->stateReady = true; + + if ($timeout) { + $this->result = $this->buildErrorResult( + HTTPFutureTransportResponseStatus::ERROR_TIMEOUT); + } else if (!$this->stateConnected) { + $this->result = $this->buildErrorResult( + HTTPFutureTransportResponseStatus::ERROR_CONNECTION_REFUSED); + } else if (!$this->stateWriteComplete) { + $this->result = $this->buildErrorResult( + HTTPFutureTransportResponseStatus::ERROR_CONNECTION_FAILED); + } else { + $this->result = $this->parseRawHTTPResponse($this->response); + } + + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall($this->profilerCallID, array()); + + return true; + } + + private function buildErrorResult($error) { + return array( + $status = new HTTPFutureTransportResponseStatus($error, $this->getURI()), + $body = null, + $headers = array(), + ); + } + + private function buildHTTPRequest() { + $data = $this->getData(); + $method = $this->getMethod(); + $uri = $this->fullRequestPath; + + $add_headers = array(); + + if ($this->getMethod() == 'GET') { + if (is_array($data)) { + $data = phutil_build_http_querystring($data); + if (strpos($uri, '?') !== false) { + $uri .= '&'.$data; + } else { + $uri .= '?'.$data; + } + $data = ''; + } + } else { + if (is_array($data)) { + $data = phutil_build_http_querystring($data)."\r\n"; + $add_headers[] = array( + 'Content-Type', + 'application/x-www-form-urlencoded', + ); + } + } + + $length = strlen($data); + + $add_headers[] = array( + 'Content-Length', + $length, + ); + + if (!$this->getHeaders('User-Agent')) { + $add_headers[] = array( + 'User-Agent', + $this->getDefaultUserAgent(), + ); + } + + if (!$this->getHeaders('Host')) { + $add_headers[] = array( + 'Host', + $this->host, + ); + } + + $headers = array_merge($this->getHeaders(), $add_headers); + foreach ($headers as $key => $header) { + list($name, $value) = $header; + if (strlen($value)) { + $value = ': '.$value; + } + $headers[$key] = $name.$value."\r\n"; + } + + return + "{$method} {$uri} HTTP/1.0\r\n". + implode('', $headers). + "\r\n". + $data; + } + +} diff --git a/src/future/http/HTTPSFuture.php b/src/future/http/HTTPSFuture.php new file mode 100644 index 00000000..7dca7eda --- /dev/null +++ b/src/future/http/HTTPSFuture.php @@ -0,0 +1,824 @@ +cabundle = $temp; + return $this; + } + + /** + * Set the SSL certificate to use for this session, given a path. + * + * @param string The path to a valid SSL certificate for this session + * @return this + */ + public function setCABundleFromPath($path) { + $this->cabundle = $path; + return $this; + } + + /** + * Get the path to the SSL certificate for this session. + * + * @return string|null + */ + public function getCABundle() { + return $this->cabundle; + } + + /** + * Set whether Location headers in the response will be respected. + * The default is true. + * + * @param boolean true to follow any Location header present in the response, + * false to return the request directly + * @return this + */ + public function setFollowLocation($follow) { + $this->followLocation = $follow; + return $this; + } + + /** + * Get whether Location headers in the response will be respected. + * + * @return boolean + */ + public function getFollowLocation() { + return $this->followLocation; + } + + /** + * Set the fallback CA certificate if one is not specified + * for the session, given a path. + * + * @param string The path to a valid SSL certificate + * @return void + */ + public static function setGlobalCABundleFromPath($path) { + self::$globalCABundle = $path; + } + /** + * Set the fallback CA certificate if one is not specified + * for the session, given a string. + * + * @param string The certificate + * @return void + */ + public static function setGlobalCABundleFromString($certificate) { + $temp = new TempFile(); + Filesystem::writeFile($temp, $certificate); + self::$globalCABundle = $temp; + } + + /** + * Get the fallback global CA certificate + * + * @return string + */ + public static function getGlobalCABundle() { + return self::$globalCABundle; + } + + /** + * Load contents of remote URI. Behaves pretty much like + * `@file_get_contents($uri)` but doesn't require `allow_url_fopen`. + * + * @param string + * @param float + * @return string|false + */ + public static function loadContent($uri, $timeout = null) { + $future = new HTTPSFuture($uri); + if ($timeout !== null) { + $future->setTimeout($timeout); + } + try { + list($body) = $future->resolvex(); + return $body; + } catch (HTTPFutureResponseStatus $ex) { + return false; + } + } + + public function setDownloadPath($download_path) { + $this->downloadPath = $download_path; + + if (Filesystem::pathExists($download_path)) { + throw new Exception( + pht( + 'Specified download path "%s" already exists, refusing to '. + 'overwrite.')); + } + + return $this; + } + + public function setProgressSink(PhutilProgressSink $progress_sink) { + $this->progressSink = $progress_sink; + return $this; + } + + public function getProgressSink() { + return $this->progressSink; + } + + /** + * Attach a file to the request. + * + * @param string HTTP parameter name. + * @param string File content. + * @param string File name. + * @param string File mime type. + * @return this + */ + public function attachFileData($key, $data, $name, $mime_type) { + if (isset($this->files[$key])) { + throw new Exception( + pht( + '%s currently supports only one file attachment for each '. + 'parameter name. You are trying to attach two different files with '. + 'the same parameter, "%s".', + __CLASS__, + $key)); + } + + $this->files[$key] = array( + 'data' => $data, + 'name' => $name, + 'mime' => $mime_type, + ); + + return $this; + } + + public function isReady() { + if (isset($this->result)) { + return true; + } + + $uri = $this->getURI(); + $domain = id(new PhutilURI($uri))->getDomain(); + + $is_download = $this->isDownload(); + + // See T13396. For now, use the streaming response parser only if we're + // downloading the response to disk. + $use_streaming_parser = (bool)$is_download; + + if (!$this->handle) { + $uri_object = new PhutilURI($uri); + $proxy = PhutilHTTPEngineExtension::buildHTTPProxyURI($uri_object); + + $profiler = PhutilServiceProfiler::getInstance(); + $this->profilerCallID = $profiler->beginServiceCall( + array( + 'type' => 'http', + 'uri' => $uri, + 'proxy' => (string)$proxy, + )); + + if (!self::$multi) { + self::$multi = curl_multi_init(); + if (!self::$multi) { + throw new Exception(pht('%s failed!', 'curl_multi_init()')); + } + } + + if (!empty(self::$pool[$domain])) { + $curl = array_pop(self::$pool[$domain]); + } else { + $curl = curl_init(); + if (!$curl) { + throw new Exception(pht('%s failed!', 'curl_init()')); + } + } + + $this->handle = $curl; + curl_multi_add_handle(self::$multi, $curl); + + curl_setopt($curl, CURLOPT_URL, $uri); + + if (defined('CURLOPT_PROTOCOLS')) { + // cURL supports a lot of protocols, and by default it will honor + // redirects across protocols (for instance, from HTTP to POP3). Beyond + // being very silly, this also has security implications: + // + // http://blog.volema.com/curl-rce.html + // + // Disable all protocols other than HTTP and HTTPS. + + $allowed_protocols = CURLPROTO_HTTPS | CURLPROTO_HTTP; + curl_setopt($curl, CURLOPT_PROTOCOLS, $allowed_protocols); + curl_setopt($curl, CURLOPT_REDIR_PROTOCOLS, $allowed_protocols); + } + + if (strlen($this->rawBody)) { + if ($this->getData()) { + throw new Exception( + pht( + 'You can not execute an HTTP future with both a raw request '. + 'body and structured request data.')); + } + + // We aren't actually going to use this file handle, since we are + // just pushing data through the callback, but cURL gets upset if + // we don't hand it a real file handle. + $tmp = new TempFile(); + $this->fileHandle = fopen($tmp, 'r'); + + // NOTE: We must set CURLOPT_PUT here to make cURL use CURLOPT_INFILE. + // We'll possibly overwrite the method later on, unless this is really + // a PUT request. + curl_setopt($curl, CURLOPT_PUT, true); + curl_setopt($curl, CURLOPT_INFILE, $this->fileHandle); + curl_setopt($curl, CURLOPT_INFILESIZE, strlen($this->rawBody)); + curl_setopt($curl, CURLOPT_READFUNCTION, + array($this, 'willWriteBody')); + } else { + $data = $this->formatRequestDataForCURL(); + curl_setopt($curl, CURLOPT_POSTFIELDS, $data); + } + + $headers = $this->getHeaders(); + + $saw_expect = false; + for ($ii = 0; $ii < count($headers); $ii++) { + list($name, $value) = $headers[$ii]; + $headers[$ii] = $name.': '.$value; + if (!strncasecmp($name, 'Expect', strlen('Expect'))) { + $saw_expect = true; + } + } + if (!$saw_expect) { + // cURL sends an "Expect" header by default for certain requests. While + // there is some reasoning behind this, it causes a practical problem + // in that lighttpd servers reject these requests with a 417. Both sides + // are locked in an eternal struggle (lighttpd has introduced a + // 'server.reject-expect-100-with-417' option to deal with this case). + // + // The ostensibly correct way to suppress this behavior on the cURL side + // is to add an empty "Expect:" header. If we haven't seen some other + // explicit "Expect:" header, do so. + // + // See here, for example, although this issue is fairly widespread: + // http://curl.haxx.se/mail/archive-2009-07/0008.html + $headers[] = 'Expect:'; + } + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + + // Set the requested HTTP method, e.g. GET / POST / PUT. + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->getMethod()); + + // Make sure we get the headers and data back. + curl_setopt($curl, CURLOPT_HEADER, true); + curl_setopt($curl, CURLOPT_WRITEFUNCTION, + array($this, 'didReceiveDataCallback')); + + if ($this->followLocation) { + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($curl, CURLOPT_MAXREDIRS, 20); + } + + if (defined('CURLOPT_TIMEOUT_MS')) { + // If CURLOPT_TIMEOUT_MS is available, use the higher-precision timeout. + $timeout = max(1, ceil(1000 * $this->getTimeout())); + curl_setopt($curl, CURLOPT_TIMEOUT_MS, $timeout); + } else { + // Otherwise, fall back to the lower-precision timeout. + $timeout = max(1, ceil($this->getTimeout())); + curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); + } + + // We're going to try to set CAINFO below. This doesn't work at all on + // OSX around Yosemite (see T5913). On these systems, we'll use the + // system CA and then try to tell the user that their settings were + // ignored and how to fix things if we encounter a CA-related error. + // Assume we have custom CA settings to start with; we'll clear this + // flag if we read the default CA info below. + + // Try some decent fallbacks here: + // - First, check if a bundle is set explicitly for this request, via + // `setCABundle()` or similar. + // - Then, check if a global bundle is set explicitly for all requests, + // via `setGlobalCABundle()` or similar. + // - Then, if a local custom.pem exists, use that, because it probably + // means that the user wants to override everything (also because the + // user might not have access to change the box's php.ini to add + // curl.cainfo). + // - Otherwise, try using curl.cainfo. If it's set explicitly, it's + // probably reasonable to try using it before we fall back to what + // libphutil ships with. + // - Lastly, try the default that libphutil ships with. If it doesn't + // work, give up and yell at the user. + + if (!$this->getCABundle()) { + $caroot = dirname(phutil_get_library_root('arcanist')); + $caroot = $caroot.'/resources/ssl/'; + + $ini_val = ini_get('curl.cainfo'); + if (self::getGlobalCABundle()) { + $this->setCABundleFromPath(self::getGlobalCABundle()); + } else if (Filesystem::pathExists($caroot.'custom.pem')) { + $this->setCABundleFromPath($caroot.'custom.pem'); + } else if ($ini_val) { + // TODO: We can probably do a pathExists() here, even. + $this->setCABundleFromPath($ini_val); + } else { + $this->setCABundleFromPath($caroot.'default.pem'); + } + } + + if ($this->canSetCAInfo()) { + curl_setopt($curl, CURLOPT_CAINFO, $this->getCABundle()); + } + + $verify_peer = 1; + $verify_host = 2; + + $extensions = PhutilHTTPEngineExtension::getAllExtensions(); + foreach ($extensions as $extension) { + if ($extension->shouldTrustAnySSLAuthorityForURI($uri_object)) { + $verify_peer = 0; + } + if ($extension->shouldTrustAnySSLHostnameForURI($uri_object)) { + $verify_host = 0; + } + } + + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $verify_peer); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $verify_host); + curl_setopt($curl, CURLOPT_SSLVERSION, 0); + + // See T13391. Recent versions of cURL default to "HTTP/2" on some + // connections, but do not support HTTP/2 proxies. Until HTTP/2 + // stabilizes, force HTTP/1.1 explicitly. + curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + + if ($proxy) { + curl_setopt($curl, CURLOPT_PROXY, (string)$proxy); + } + + if ($is_download) { + $this->downloadHandle = @fopen($this->downloadPath, 'wb+'); + if (!$this->downloadHandle) { + throw new Exception( + pht( + 'Failed to open filesystem path "%s" for writing.', + $this->downloadPath)); + } + } + + if ($use_streaming_parser) { + $streaming_parser = id(new PhutilHTTPResponseParser()) + ->setFollowLocationHeaders($this->getFollowLocation()); + + if ($this->downloadHandle) { + $streaming_parser->setWriteHandle($this->downloadHandle); + } + + $progress_sink = $this->getProgressSink(); + if ($progress_sink) { + $streaming_parser->setProgressSink($progress_sink); + } + + $this->parser = $streaming_parser; + } + } else { + $curl = $this->handle; + + if (!self::$results) { + // NOTE: In curl_multi_select(), PHP calls curl_multi_fdset() but does + // not check the return value of &maxfd for -1 until recent versions + // of PHP (5.4.8 and newer). cURL may return -1 as maxfd in some unusual + // situations; if it does, PHP enters select() with nfds=0, which blocks + // until the timeout is reached. + // + // We could try to guess whether this will happen or not by examining + // the version identifier, but we can also just sleep for only a short + // period of time. + curl_multi_select(self::$multi, 0.01); + } + } + + do { + $active = null; + $result = curl_multi_exec(self::$multi, $active); + } while ($result == CURLM_CALL_MULTI_PERFORM); + + while ($info = curl_multi_info_read(self::$multi)) { + if ($info['msg'] == CURLMSG_DONE) { + self::$results[(int)$info['handle']] = $info; + } + } + + if (!array_key_exists((int)$curl, self::$results)) { + return false; + } + + // The request is complete, so release any temporary files we wrote + // earlier. + $this->temporaryFiles = array(); + + $info = self::$results[(int)$curl]; + $result = $this->responseBuffer; + $err_code = $info['result']; + + if ($err_code) { + if (($err_code == CURLE_SSL_CACERT) && !$this->canSetCAInfo()) { + $status = new HTTPFutureCertificateResponseStatus( + HTTPFutureCertificateResponseStatus::ERROR_IMMUTABLE_CERTIFICATES, + $uri); + } else { + $status = new HTTPFutureCURLResponseStatus($err_code, $uri); + } + + $body = null; + $headers = array(); + $this->result = array($status, $body, $headers); + } else if ($this->parser) { + $streaming_parser = $this->parser; + try { + $responses = $streaming_parser->getResponses(); + $final_response = last($responses); + $result = array( + $final_response->getStatus(), + $final_response->getBody(), + $final_response->getHeaders(), + ); + } catch (HTTPFutureParseResponseStatus $ex) { + $result = array($ex, null, array()); + } + + $this->result = $result; + } else { + // cURL returns headers of all redirects, we strip all but the final one. + $redirects = curl_getinfo($curl, CURLINFO_REDIRECT_COUNT); + $result = preg_replace('/^(.*\r\n\r\n){'.$redirects.'}/sU', '', $result); + $this->result = $this->parseRawHTTPResponse($result); + } + + curl_multi_remove_handle(self::$multi, $curl); + unset(self::$results[(int)$curl]); + + // NOTE: We want to use keepalive if possible. Return the handle to a + // pool for the domain; don't close it. + if ($this->shouldReuseHandles()) { + self::$pool[$domain][] = $curl; + } + + if ($is_download) { + if ($this->downloadHandle) { + fflush($this->downloadHandle); + fclose($this->downloadHandle); + $this->downloadHandle = null; + } + } + + $sink = $this->getProgressSink(); + if ($sink) { + $status = head($this->result); + if ($status->isError()) { + $sink->didFailWork(); + } else { + $sink->didCompleteWork(); + } + } + + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall($this->profilerCallID, array()); + + return true; + } + + + /** + * Callback invoked by cURL as it reads HTTP data from the response. We save + * the data to a buffer. + */ + public function didReceiveDataCallback($handle, $data) { + if ($this->parser) { + $this->parser->readBytes($data); + } else { + $this->responseBuffer .= $data; + } + + return strlen($data); + } + + + /** + * Read data from the response buffer. + * + * NOTE: Like @{class:ExecFuture}, this method advances a read cursor but + * does not discard the data. The data will still be buffered, and it will + * all be returned when the future resolves. To discard the data after + * reading it, call @{method:discardBuffers}. + * + * @return string Response data, if available. + */ + public function read() { + if ($this->isDownload()) { + throw new Exception( + pht( + 'You can not read the result buffer while streaming results '. + 'to disk: there is no in-memory buffer to read.')); + } + + if ($this->parser) { + throw new Exception( + pht( + 'Streaming reads are not currently supported by the streaming '. + 'parser.')); + } + + $result = substr($this->responseBuffer, $this->responseBufferPos); + $this->responseBufferPos = strlen($this->responseBuffer); + return $result; + } + + + /** + * Discard any buffered data. Normally, you call this after reading the + * data with @{method:read}. + * + * @return this + */ + public function discardBuffers() { + if ($this->isDownload()) { + throw new Exception( + pht( + 'You can not discard the result buffer while streaming results '. + 'to disk: there is no in-memory buffer to discard.')); + } + + if ($this->parser) { + throw new Exception( + pht( + 'Buffer discards are not currently supported by the streaming '. + 'parser.')); + } + + $this->responseBuffer = ''; + $this->responseBufferPos = 0; + return $this; + } + + + /** + * Produces a value safe to pass to `CURLOPT_POSTFIELDS`. + * + * @return wild Some value, suitable for use in `CURLOPT_POSTFIELDS`. + */ + private function formatRequestDataForCURL() { + // We're generating a value to hand to cURL as CURLOPT_POSTFIELDS. The way + // cURL handles this value has some tricky caveats. + + // First, we can return either an array or a query string. If we return + // an array, we get a "multipart/form-data" request. If we return a + // query string, we get an "application/x-www-form-urlencoded" request. + + // Second, if we return an array we can't duplicate keys. The user might + // want to send the same parameter multiple times. + + // Third, if we return an array and any of the values start with "@", + // cURL includes arbitrary files off disk and sends them to an untrusted + // remote server. For example, an array like: + // + // array('name' => '@/usr/local/secret') + // + // ...will attempt to read that file off disk and transmit its contents with + // the request. This behavior is pretty surprising, and it can easily + // become a relatively severe security vulnerability which allows an + // attacker to read any file the HTTP process has access to. Since this + // feature is very dangerous and not particularly useful, we prevent its + // use. Broadly, this means we must reject some requests because they + // contain an "@" in an inconvenient place. + + // Generally, to avoid the "@" case and because most servers usually + // expect "application/x-www-form-urlencoded" data, we try to return a + // string unless there are files attached to this request. + + $data = $this->getData(); + $files = $this->files; + + $any_data = ($data || (is_string($data) && strlen($data))); + $any_files = (bool)$this->files; + + if (!$any_data && !$any_files) { + // No files or data, so just bail. + return null; + } + + if (!$any_files) { + // If we don't have any files, just encode the data as a query string, + // make sure it's not including any files, and we're good to go. + if (is_array($data)) { + $data = phutil_build_http_querystring($data); + } + + $this->checkForDangerousCURLMagic($data, $is_query_string = true); + + return $data; + } + + // If we've made it this far, we have some files, so we need to return + // an array. First, convert the other data into an array if it isn't one + // already. + + if (is_string($data)) { + // NOTE: We explicitly don't want fancy array parsing here, so just + // do a basic parse and then convert it into a dictionary ourselves. + $parser = new PhutilQueryStringParser(); + $pairs = $parser->parseQueryStringToPairList($data); + + $map = array(); + foreach ($pairs as $pair) { + list($key, $value) = $pair; + if (array_key_exists($key, $map)) { + throw new Exception( + pht( + 'Request specifies two values for key "%s", but parameter '. + 'names must be unique if you are posting file data due to '. + 'limitations with cURL.', + $key)); + } + $map[$key] = $value; + } + + $data = $map; + } + + foreach ($data as $key => $value) { + $this->checkForDangerousCURLMagic($value, $is_query_string = false); + } + + foreach ($this->files as $name => $info) { + if (array_key_exists($name, $data)) { + throw new Exception( + pht( + 'Request specifies a file with key "%s", but that key is also '. + 'defined by normal request data. Due to limitations with cURL, '. + 'requests that post file data must use unique keys.', + $name)); + } + + $tmp = new TempFile($info['name']); + Filesystem::writeFile($tmp, $info['data']); + $this->temporaryFiles[] = $tmp; + + // In 5.5.0 and later, we can use CURLFile. Prior to that, we have to + // use this "@" stuff. + + if (class_exists('CURLFile', false)) { + $file_value = new CURLFile((string)$tmp, $info['mime'], $info['name']); + } else { + $file_value = '@'.(string)$tmp; + } + + $data[$name] = $file_value; + } + + return $data; + } + + + /** + * Detect strings which will cause cURL to do horrible, insecure things. + * + * @param string Possibly dangerous string. + * @param bool True if this string is being used as part of a query string. + * @return void + */ + private function checkForDangerousCURLMagic($string, $is_query_string) { + if (empty($string[0]) || ($string[0] != '@')) { + // This isn't an "@..." string, so it's fine. + return; + } + + if ($is_query_string) { + if (version_compare(phpversion(), '5.2.0', '<')) { + throw new Exception( + pht( + 'Attempting to make an HTTP request, but query string data begins '. + 'with "%s". Prior to PHP 5.2.0 this reads files off disk, which '. + 'creates a wide attack window for security vulnerabilities. '. + 'Upgrade PHP or avoid making cURL requests which begin with "%s".', + '@', + '@')); + } + + // This is safe if we're on PHP 5.2.0 or newer. + return; + } + + throw new Exception( + pht( + 'Attempting to make an HTTP request which includes file data, but the '. + 'value of a query parameter begins with "%s". PHP interprets these '. + 'values to mean that it should read arbitrary files off disk and '. + 'transmit them to remote servers. Declining to make this request.', + '@')); + } + + + /** + * Determine whether CURLOPT_CAINFO is usable on this system. + */ + private function canSetCAInfo() { + // We cannot set CAInfo on OSX after Yosemite. + + $osx_version = PhutilExecutionEnvironment::getOSXVersion(); + if ($osx_version) { + if (version_compare($osx_version, 14, '>=')) { + return false; + } + } + + return true; + } + + + /** + * Write a raw HTTP body into the request. + * + * You must write the entire body before starting the request. + * + * @param string Raw body. + * @return this + */ + public function write($raw_body) { + $this->rawBody = $raw_body; + return $this; + } + + + /** + * Callback to pass data to cURL. + */ + public function willWriteBody($handle, $infile, $len) { + $bytes = substr($this->rawBody, $this->rawBodyPos, $len); + $this->rawBodyPos += $len; + return $bytes; + } + + private function shouldReuseHandles() { + $curl_version = curl_version(); + $version = idx($curl_version, 'version'); + + // NOTE: cURL 7.43.0 has a bug where the POST body length is not recomputed + // properly when a handle is reused. For this version of cURL, disable + // handle reuse and accept a small performance penalty. See T8654. + if ($version == '7.43.0') { + return false; + } + + return true; + } + + private function isDownload() { + return ($this->downloadPath !== null); + } + +} diff --git a/src/future/http/PhutilHTTPEngineExtension.php b/src/future/http/PhutilHTTPEngineExtension.php new file mode 100644 index 00000000..6c1beb9f --- /dev/null +++ b/src/future/http/PhutilHTTPEngineExtension.php @@ -0,0 +1,141 @@ +getPhobjectClassConstant('EXTENSIONKEY'); + } + + final public static function getAllExtensions() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getExtensionKey') + ->execute(); + } + + final public static function getExtension($key) { + $extensions = self::getAllExtensions(); + return idx($extensions, $key); + } + + final public static function requireExtension($key) { + $extension = self::getExtension($key); + + if (!$extension) { + throw new Exception( + pht( + 'No HTTP engine extension exists with extension key "%s".', + $key)); + } + + return $extension; + } + + final public static function buildHTTPProxyURI(PhutilURI $uri) { + $proxy = null; + $via = null; + + $extensions = self::getAllExtensions(); + foreach ($extensions as $extension) { + $extension_proxy = $extension->getHTTPProxyURI($uri); + + if ($extension_proxy === null) { + continue; + } + + if (!($extension_proxy instanceof PhutilURI)) { + throw new Exception( + pht( + 'HTTP extension "%s" (of class "%s") returned an invalid '. + 'result from "%s": expected null, or an object of class "%s".', + $extension->getExtensionName(), + get_class($extension), + 'getHTTPProxyURI()', + 'PhutilURI')); + } + + if ($proxy) { + throw new Exception( + pht( + 'Two different HTTP extensions ("%s" of class "%s" and "%s" of '. + 'class "%s") both provided a proxy URI for URI "%s". No more '. + 'than one extension may provide a proxy for any URI.', + $extension->getExtensionName(), + get_class($extension), + $via->getExtensionName(), + get_class($via), + (string)$uri)); + } + + $proxy = $extension_proxy; + $via = $extension; + } + + return $proxy; + } + +} diff --git a/src/future/http/status/HTTPFutureCURLResponseStatus.php b/src/future/http/status/HTTPFutureCURLResponseStatus.php new file mode 100644 index 00000000..50c61805 --- /dev/null +++ b/src/future/http/status/HTTPFutureCURLResponseStatus.php @@ -0,0 +1,86 @@ +getStatusCode() == CURLE_OPERATION_TIMEOUTED); + } + + protected function getErrorCodeDescription($code) { + $constants = get_defined_constants(); + + $constant_name = null; + foreach ($constants as $constant => $value) { + if ($value == $code && preg_match('/^CURLE_/', $constant)) { + $constant_name = '<'.$constant.'> '; + break; + } + } + + $map = array( + CURLE_COULDNT_RESOLVE_HOST => pht( + 'There was an error resolving the server hostname. Check that you are '. + 'connected to the internet and that DNS is correctly configured. (Did '. + 'you add the domain to `%s` on some other machine, but not this one?)', + '/etc/hosts'), + + CURLE_SSL_CACERT => pht( + 'There was an error verifying the SSL Certificate Authority while '. + 'negotiating the SSL connection. This usually indicates that you are '. + 'using a self-signed certificate but have not added your CA to the '. + 'CA bundle. See instructions in "%s".', + 'libphutil/resources/ssl/README'), + + // Apparently there's no error constant for this? In cURL it's + // CURLE_SSL_CACERT_BADFILE but there's no corresponding constant in + // PHP. + 77 => pht( + 'The SSL CA Bundles that we tried to use could not be read or are '. + 'not formatted correctly.'), + + CURLE_SSL_CONNECT_ERROR => pht( + 'There was an error negotiating the SSL connection. This usually '. + 'indicates that the remote host has a bad SSL certificate, or your '. + 'local host has some sort of SSL misconfiguration which prevents it '. + 'from accepting the CA. If you are using a self-signed certificate, '. + 'see instructions in "%s".', + 'libphutil/resources/ssl/README'), + + CURLE_OPERATION_TIMEOUTED => pht( + 'The request took too long to complete.'), + + CURLE_SSL_PEER_CERTIFICATE => pht( + 'There was an error verifying the SSL connection. This usually '. + 'indicates that the remote host has an SSL certificate for a '. + 'different domain name than you are connecting with. Make sure the '. + 'certificate you have installed is signed for the correct domain.'), + ); + + $default_message = pht( + 'The cURL library raised an error while making a request. You may be '. + 'able to find more information about this error (error code: %d) '. + 'on the cURL site: %s', + $code, + 'http://curl.haxx.se/libcurl/c/libcurl-errors.html#'. + preg_replace('/[^A-Z]/', '', $constant_name)); + + $detailed_message = idx($map, $code, $default_message); + + return $constant_name.$detailed_message; + } + +} diff --git a/src/future/http/status/HTTPFutureCertificateResponseStatus.php b/src/future/http/status/HTTPFutureCertificateResponseStatus.php new file mode 100644 index 00000000..d6e35f89 --- /dev/null +++ b/src/future/http/status/HTTPFutureCertificateResponseStatus.php @@ -0,0 +1,33 @@ + 512) { + $excerpt = substr($body, 0, 512).'...'; + } else { + $excerpt = $body; + } + + $content_type = BaseHTTPFuture::getHeader($headers, 'Content-Type'); + $match = null; + if (preg_match('/;\s*charset=([^;]+)/', $content_type, $match)) { + $encoding = trim($match[1], "\"'"); + try { + $excerpt = phutil_utf8_convert($excerpt, 'UTF-8', $encoding); + } catch (Exception $ex) {} + } + + $this->excerpt = phutil_utf8ize($excerpt); + $this->expect = $expect; + + parent::__construct($status_code); + } + + protected function getErrorCodeType($code) { + return 'HTTP'; + } + + public function isError() { + if ($this->expect === null) { + return ($this->getStatusCode() < 200) || ($this->getStatusCode() > 299); + } + + return !in_array($this->getStatusCode(), $this->expect, true); + } + + public function isRedirect() { + $code = $this->getStatusCode(); + return ($code >= 300 && $code < 400); + } + + public function isTimeout() { + return false; + } + + protected function getErrorCodeDescription($code) { + static $map = array( + 404 => 'Not Found', + 500 => 'Internal Server Error', + ); + + return idx($map, $code)."\n".$this->excerpt."\n"; + } + +} diff --git a/src/future/http/status/HTTPFutureParseResponseStatus.php b/src/future/http/status/HTTPFutureParseResponseStatus.php new file mode 100644 index 00000000..09a0ff7b --- /dev/null +++ b/src/future/http/status/HTTPFutureParseResponseStatus.php @@ -0,0 +1,32 @@ +rawResponse = $raw_response; + parent::__construct($code); + } + + protected function getErrorCodeType($code) { + return 'Parse'; + } + + public function isError() { + return true; + } + + public function isTimeout() { + return false; + } + + protected function getErrorCodeDescription($code) { + return pht( + 'The remote host returned something other than an HTTP response: %s', + $this->rawResponse); + } + +} diff --git a/src/future/http/status/HTTPFutureResponseStatus.php b/src/future/http/status/HTTPFutureResponseStatus.php new file mode 100644 index 00000000..5bf68f0d --- /dev/null +++ b/src/future/http/status/HTTPFutureResponseStatus.php @@ -0,0 +1,43 @@ +statusCode = $status_code; + $this->uri = (string)$uri; + + $type = $this->getErrorCodeType($status_code); + $description = $this->getErrorCodeDescription($status_code); + + $uri_info = ''; + if ($this->uri) { + $uri_info = ' ('.$this->uri.')'; + } + + $message = rtrim("[{$type}/{$status_code}]{$uri_info} {$description}"); + + parent::__construct($message); + } + + final public function getStatusCode() { + return $this->statusCode; + } + + final public function getURI() { + return $this->uri; + } + + abstract public function isError(); + abstract public function isTimeout(); + + public function isRedirect() { + return false; + } + + abstract protected function getErrorCodeType($code); + abstract protected function getErrorCodeDescription($code); + +} diff --git a/src/future/http/status/HTTPFutureTransportResponseStatus.php b/src/future/http/status/HTTPFutureTransportResponseStatus.php new file mode 100644 index 00000000..76649c50 --- /dev/null +++ b/src/future/http/status/HTTPFutureTransportResponseStatus.php @@ -0,0 +1,44 @@ +getStatusCode() == self::ERROR_TIMEOUT); + } + + protected function getErrorCodeDescription($code) { + $map = array( + self::ERROR_TIMEOUT => pht( + 'The request took too long to complete.'), + self::ERROR_CONNECTION_ABORTED => pht( + 'The remote host closed the connection before the request completed.'), + self::ERROR_CONNECTION_REFUSED => pht( + 'The remote host refused the connection. This usually means the '. + 'host is not running an HTTP server, or the network is blocking '. + 'connections from this machine. Verify you can connect to the '. + 'remote host from this host.'), + self::ERROR_CONNECTION_FAILED => pht( + 'Connection could not be initiated. This usually indicates a DNS '. + 'problem: verify the domain name is correct, that you can '. + 'perform a DNS lookup for it from this machine. (Did you add the '. + 'domain to `%s` on some other machine, but not this one?) '. + 'This might also indicate that you specified the wrong port.', + '/etc/hosts'), + ); + return idx($map, $code); + } + +} diff --git a/src/future/oauth/PhutilOAuth1Future.php b/src/future/oauth/PhutilOAuth1Future.php new file mode 100644 index 00000000..084ae6f9 --- /dev/null +++ b/src/future/oauth/PhutilOAuth1Future.php @@ -0,0 +1,306 @@ +callbackURI = $callback_uri; + return $this; + } + + public function setTimestamp($timestamp) { + $this->timestamp = $timestamp; + return $this; + } + + public function setNonce($nonce) { + $this->nonce = $nonce; + return $this; + } + + public function setTokenSecret($token_secret) { + $this->tokenSecret = $token_secret; + return $this; + } + + public function setToken($token) { + $this->token = $token; + return $this; + } + + public function setPrivateKey(PhutilOpaqueEnvelope $private_key) { + $this->privateKey = $private_key; + return $this; + } + + public function setSignatureMethod($signature_method) { + $this->signatureMethod = $signature_method; + return $this; + } + + public function setConsumerKey($consumer_key) { + $this->consumerKey = $consumer_key; + return $this; + } + + public function setConsumerSecret(PhutilOpaqueEnvelope $consumer_secret) { + $this->consumerSecret = $consumer_secret; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + public function setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + public function getTimeout() { + return $this->timeout; + } + + public function __construct($uri, $data = array()) { + $this->uri = new PhutilURI((string)$uri); + $this->data = $data; + $this->setProxiedFuture(new HTTPSFuture($uri, $data)); + } + + public function getSignature() { + $params = array(); + + // NOTE: The JIRA API uses JSON-encoded request bodies which are not + // signed, and OAuth1 provides no real way to sign a nonparameterized + // request body. Possibly we should split this apart into flags which + // control which data is signed, but for now this rule seems to cover + // all the use cases. + + if (is_array($this->data)) { + $params = $this->data; + } + + $params = $params + + $this->uri->getQueryParamsAsMap() + + $this->getOAuth1Headers(); + + return $this->sign($params); + } + + public function addHeader($name, $value) { + // If we haven't built the future yet, hold on to the header until after + // we do, since there might be more changes coming which will affect the + // signature process. + + if (!$this->hasConstructedFuture) { + $this->headers[] = array($name, $value); + } else { + $this->getProxiedFuture()->addHeader($name, $value); + } + return $this; + } + + protected function getProxiedFuture() { + $future = parent::getProxiedFuture(); + + if (!$this->hasConstructedFuture) { + $future->setMethod($this->method); + + $oauth_headers = $this->getOAuth1Headers(); + $oauth_headers['oauth_signature'] = $this->getSignature(); + + $full_oauth_header = array(); + foreach ($oauth_headers as $header => $value) { + $full_oauth_header[] = $header.'="'.urlencode($value).'"'; + } + $full_oauth_header = 'OAuth '.implode(', ', $full_oauth_header); + + $future->addHeader('Authorization', $full_oauth_header); + + foreach ($this->headers as $header) { + $future->addHeader($header[0], $header[1]); + } + $this->headers = array(); + + $timeout = $this->getTimeout(); + if ($timeout !== null) { + $future->setTimeout($timeout); + } + + $this->hasConstructedFuture = true; + } + + return $future; + } + + protected function didReceiveResult($result) { + return $result; + } + + private function getOAuth1Headers() { + if (!$this->nonce) { + $this->nonce = Filesystem::readRandomCharacters(32); + } + if (!$this->timestamp) { + $this->timestamp = time(); + } + + $oauth_headers = array( + 'oauth_consumer_key' => $this->consumerKey, + 'oauth_signature_method' => $this->signatureMethod, + 'oauth_timestamp' => $this->timestamp, + 'oauth_nonce' => $this->nonce, + 'oauth_version' => '1.0', + ); + + if ($this->callbackURI) { + $oauth_headers['oauth_callback'] = (string)$this->callbackURI; + } + + if ($this->token) { + $oauth_headers['oauth_token'] = $this->token; + } + + return $oauth_headers; + } + + private function sign(array $params) { + ksort($params); + + $pstr = array(); + foreach ($params as $key => $value) { + $pstr[] = rawurlencode($key).'='.rawurlencode($value); + } + $pstr = implode('&', $pstr); + + $sign_uri = clone $this->uri; + $sign_uri->setFragment(''); + $sign_uri->removeAllQueryParams(); + + $sign_uri->setProtocol(phutil_utf8_strtolower($sign_uri->getProtocol())); + $protocol = $sign_uri->getProtocol(); + switch ($protocol) { + case 'http': + if ($sign_uri->getPort() == 80) { + $sign_uri->setPort(null); + } + break; + case 'https': + if ($sign_uri->getPort() == 443) { + $sign_uri->setPort(null); + } + break; + } + + $method = rawurlencode(phutil_utf8_strtoupper($this->method)); + $sign_uri = rawurlencode((string)$sign_uri); + $pstr = rawurlencode($pstr); + + $sign_input = "{$method}&{$sign_uri}&{$pstr}"; + return $this->signString($sign_input); + } + + private function signString($string) { + $consumer_secret = null; + if ($this->consumerSecret) { + $consumer_secret = $this->consumerSecret->openEnvelope(); + } + + $key = urlencode($consumer_secret).'&'.urlencode($this->tokenSecret); + + switch ($this->signatureMethod) { + case 'HMAC-SHA1': + if (!$this->consumerSecret) { + throw new Exception( + pht( + "Signature method '%s' requires %s!", + 'HMAC-SHA1', + 'setConsumerSecret()')); + } + + $hash = hash_hmac('sha1', $string, $key, true); + return base64_encode($hash); + case 'RSA-SHA1': + if (!$this->privateKey) { + throw new Exception( + pht( + "Signature method '%s' requires %s!", + 'RSA-SHA1', + 'setPrivateKey()')); + } + + $cert = @openssl_pkey_get_private($this->privateKey->openEnvelope()); + if (!$cert) { + throw new Exception(pht('%s failed!', 'openssl_pkey_get_private()')); + } + + $pkey = @openssl_get_privatekey($cert); + if (!$pkey) { + throw new Exception(pht('%s failed!', 'openssl_get_privatekey()')); + } + + $signature = null; + $ok = openssl_sign($string, $signature, $pkey, OPENSSL_ALGO_SHA1); + if (!$ok) { + throw new Exception(pht('%s failed!', 'openssl_sign()')); + } + + openssl_free_key($pkey); + + return base64_encode($signature); + case 'PLAINTEXT': + if (!$this->consumerSecret) { + throw new Exception( + pht( + "Signature method '%s' requires %s!", + 'PLAINTEXT', + 'setConsumerSecret()')); + } + return $key; + default: + throw new Exception(pht("Unknown signature method '%s'!", $string)); + } + } + + public function resolvex() { + $result = $this->getProxiedFuture()->resolvex(); + return $this->didReceiveResult($result); + } + + public function resolveJSON() { + $result = $this->getProxiedFuture()->resolvex(); + $result = $this->didReceiveResult($result); + list($body) = $result; + + try { + return phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException(pht('Expected JSON.'), $ex); + } + } + + +} diff --git a/src/future/oauth/__tests__/PhutilOAuth1FutureTestCase.php b/src/future/oauth/__tests__/PhutilOAuth1FutureTestCase.php new file mode 100644 index 00000000..73e66375 --- /dev/null +++ b/src/future/oauth/__tests__/PhutilOAuth1FutureTestCase.php @@ -0,0 +1,159 @@ +setTimestamp(1191242090) + ->setNonce('hsu94j3884jdopsl') + ->setConsumerKey('dpf43f3p2l4k3l03') + ->setConsumerSecret(new PhutilOpaqueEnvelope('kd94hf93k423kf44')) + ->setSignatureMethod('PLAINTEXT'); + + $this->assertEqual('kd94hf93k423kf44&', $future->getSignature()); + + + $uri = 'http://photos.example.net/photos'; + $data = array( + 'file' => 'vacation.jpg', + 'size' => 'original', + ); + + $future = id(new PhutilOAuth1Future($uri, $data)) + ->setMethod('GET') + ->setTimestamp(1191242096) + ->setNonce('kllo9940pd9333jh') + ->setConsumerKey('dpf43f3p2l4k3l03') + ->setConsumerSecret(new PhutilOpaqueEnvelope('kd94hf93k423kf44')) + ->setSignatureMethod('HMAC-SHA1') + ->setToken('nnch734d00sl2jdk') + ->setTokenSecret('pfkkdhi9sl3r4s00'); + + $this->assertEqual('tR3+Ty81lMeYAr/Fid0kMTYa/WM=', $future->getSignature()); + } + + public function testOAuth1SigningWithTwitterExamples() { + + // NOTE: This example is from Twitter. + // https://dev.twitter.com/docs/auth/creating-signature + + $uri = 'https://api.twitter.com/1/statuses/update.json?'. + 'include_entities=true'; + $data = array( + 'status' => 'Hello Ladies + Gentlemen, a signed OAuth request!', + ); + + $future = id(new PhutilOAuth1Future($uri, $data)) + ->setMethod('POST') + ->setConsumerKey('xvz1evFS4wEEPTGEFPHBog') + ->setConsumerSecret( + new PhutilOpaqueEnvelope('kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw')) + ->setNonce('kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg') + ->setSignatureMethod('HMAC-SHA1') + ->setTimestamp(1318622958) + ->setToken('370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb') + ->setTokenSecret('LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE'); + + $this->assertEqual('tnnArxj06cWHq44gCs1OSKk/jLY=', $future->getSignature()); + } + + public function testOAuth1SigningWithJIRAExamples() { + + // NOTE: This is an emprically example against JIRA v6.0.6, in that the + // code seems to work when actually authing. It primarily serves as a check + // of the RSA-SHA1 signature method. + +$public_key = <<setConsumerKey('quackquack') + ->setPrivateKey(new PhutilOpaqueEnvelope($private_key)) + ->setTimestamp('1375984131') + ->setNonce('iamaduck') + ->setSignatureMethod('RSA-SHA1'); + + // The actual signature is 684 bytes and begins "QwigfVxpOm0AKoWJkFRwbyseso + // VJobhiXpyY0J79Kzki+vwlT4Xz2Tr4vlwDLsra5gJbfdeme4qJ2rE..." + $this->assertEqual( + '5e63e65237e2b8078426996d5ef1a706', + md5($future->getSignature())); + } + +} diff --git a/src/future/paypal/PhutilPayPalAPIFuture.php b/src/future/paypal/PhutilPayPalAPIFuture.php new file mode 100644 index 00000000..8e5b46b5 --- /dev/null +++ b/src/future/paypal/PhutilPayPalAPIFuture.php @@ -0,0 +1,88 @@ +host = $host; + return $this; + } + + public function getHost() { + return $this->host; + } + + public function setAPIUsername($api_username) { + $this->apiUsername = $api_username; + return $this; + } + + public function setAPIPassword($api_password) { + $this->apiPassword = $api_password; + return $this; + } + + public function setAPISignature($api_signature) { + $this->apiSignature = $api_signature; + return $this; + } + + public function setRawPayPalQuery($action, array $params = array()) { + $this->params = array('METHOD' => $action) + $params + $this->params; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->params) { + throw new Exception(pht('You must %s!', 'setRawPayPalQuery()')); + } + + if (!$this->apiUsername) { + throw new Exception(pht('You must set PayPal API credentials!')); + } + + $params['VERSION'] = '98.0'; + $params['USER'] = $this->apiUsername; + $params['PWD'] = $this->apiPassword; + $params['SIGNATURE'] = $this->apiSignature; + + $this->future = id(new HTTPSFuture($this->getHost(), $params)) + ->setMethod('POST'); + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + $dict = array(); + parse_str($body, $dict); + + if (idx($dict, 'ACK') !== 'Success') { + throw new Exception( + pht('PayPal API call failed: %s', print_r($dict, true))); + } + + return $dict; + } + +} diff --git a/src/future/postmark/PhutilPostmarkFuture.php b/src/future/postmark/PhutilPostmarkFuture.php new file mode 100644 index 00000000..23c21f47 --- /dev/null +++ b/src/future/postmark/PhutilPostmarkFuture.php @@ -0,0 +1,100 @@ +accessToken = $token; + return $this; + } + + public function setClientID($client_id) { + $this->clientID = $client_id; + return $this; + } + + public function setMethod($method, array $parameters) { + $this->method = $method; + $this->parameters = $parameters; + return $this; + } + + public function setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + public function getTimeout() { + return $this->timeout; + } + + protected function getProxiedFuture() { + if (!$this->future) { + if ($this->accessToken === null) { + throw new PhutilInvalidStateException('setAccessToken'); + } + + if ($this->method === null || $this->parameters === null) { + throw new PhutilInvalidStateException('setMethod'); + } + + $uri = id(new PhutilURI('https://api.postmarkapp.com/')) + ->setPath('/'.$this->method); + + $request_body = phutil_json_encode($this->parameters); + + $future = id(new HTTPSFuture($uri)) + ->setData($request_body) + ->setMethod('POST') + ->addHeader('X-Postmark-Server-Token', $this->accessToken) + ->addHeader('Accept', 'application/json') + ->addHeader('Content-Type', 'application/json'); + + $timeout = $this->getTimeout(); + if ($timeout) { + $future->setTimeout($timeout); + } + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + try { + $data = phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from Postmark.'), + $ex); + } + + if (idx($data, 'ErrorCode')) { + $error = $data['ErrorCode']; + throw new Exception( + pht( + 'Received error from Postmark: (%s) %s', + $error, + idx($data, 'Message'))); + } + + return $data; + } + +} diff --git a/src/future/slack/PhutilSlackFuture.php b/src/future/slack/PhutilSlackFuture.php new file mode 100644 index 00000000..7ae8b0b1 --- /dev/null +++ b/src/future/slack/PhutilSlackFuture.php @@ -0,0 +1,87 @@ +accessToken = $token; + return $this; + } + + public function setClientID($client_id) { + $this->clientID = $client_id; + return $this; + } + + public function setRawSlackQuery($action, array $params = array()) { + $this->action = $action; + $this->params = $params; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->action) { + throw new Exception(pht('You must %s!', 'setRawSlackQuery()')); + } + + if (!$this->accessToken) { + throw new Exception(pht('You must %s!', 'setAccessToken()')); + } + + $uri = new PhutilURI('https://slack.com/'); + $uri->setPath('/api/'.$this->action); + $uri->replaceQueryParam('token', $this->accessToken); + + $future = new HTTPSFuture($uri); + $future->setData($this->params); + $future->setMethod($this->method); + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + $data = null; + try { + $data = phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from Slack.'), + $ex); + } + + if (idx($data, 'error')) { + $error = $data['error']; + throw new Exception(pht('Received error from Slack: %s', $error)); + } + + return $data; + } + +} diff --git a/src/future/twitch/PhutilTwitchFuture.php b/src/future/twitch/PhutilTwitchFuture.php new file mode 100644 index 00000000..9dc06c34 --- /dev/null +++ b/src/future/twitch/PhutilTwitchFuture.php @@ -0,0 +1,93 @@ +accessToken = $token; + return $this; + } + + public function setClientID($client_id) { + $this->clientID = $client_id; + return $this; + } + + public function setRawTwitchQuery($action, array $params = array()) { + $this->action = $action; + $this->params = $params; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->action) { + throw new Exception(pht('You must %s!', 'setRawTwitchQuery()')); + } + + if (!$this->accessToken) { + throw new Exception(pht('You must %s!', 'setAccessToken()')); + } + + $uri = new PhutilURI('https://api.twitch.tv/'); + $uri->setPath('/kraken/'.ltrim($this->action, '/')); + $uri->replaceQueryParam('oauth_token', $this->accessToken); + + $future = new HTTPSFuture($uri); + $future->setData($this->params); + $future->setMethod($this->method); + + // NOTE: This is how the Twitch API is versioned. + $future->addHeader('Accept', 'application/vnd.twitchtv.2+json'); + + // NOTE: This is required to avoid rate limiting. + $future->addHeader('Client-ID', $this->clientID); + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + $data = null; + try { + $data = phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from Twitch.'), + $ex); + } + + if (idx($data, 'error')) { + $error = $data['error']; + throw new Exception(pht('Received error from Twitch: %s', $error)); + } + + return $data; + } + +} diff --git a/src/future/wordpress/PhutilWordPressFuture.php b/src/future/wordpress/PhutilWordPressFuture.php new file mode 100644 index 00000000..e2ea8199 --- /dev/null +++ b/src/future/wordpress/PhutilWordPressFuture.php @@ -0,0 +1,89 @@ +accessToken = $token; + return $this; + } + + public function setClientID($client_id) { + $this->clientID = $client_id; + return $this; + } + + public function setRawWordPressQuery($action, array $params = array()) { + $this->action = $action; + $this->params = $params; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->action) { + throw new Exception(pht('You must %s!', 'setRawWordPressQuery()')); + } + + if (!$this->accessToken) { + throw new Exception(pht('You must %s!', 'setAccessToken()')); + } + + $uri = new PhutilURI('https://public-api.wordpress.com/'); + $uri->setPath('/rest/v1/'.ltrim($this->action, '/')); + + $future = new HTTPSFuture($uri); + $future->setData($this->params); + $future->setMethod($this->method); + + // NOTE: This is how WordPress.com REST API authenticates + $future->addHeader('Authorization', 'Bearer '.$this->accessToken); + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + try { + $data = phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from WordPress.com.'), + $ex); + } + + if (idx($data, 'error')) { + $error = $data['error']; + throw new Exception( + pht('Received error from WordPress.com: %s', $error)); + } + + return $data; + } + +} diff --git a/src/init/init-library.php b/src/init/init-library.php new file mode 100644 index 00000000..1041d80b --- /dev/null +++ b/src/init/init-library.php @@ -0,0 +1,70 @@ +setType('class') + ->setName($class_name) + ->selectAndLoadSymbols(); + + if (!$symbols) { + throw new PhutilMissingSymbolException( + $class_name, + 'class or interface', + sprintf( + 'The class or interface "%s" is not defined in the library '. + 'map of any loaded library.', + $class_name)); + } + } catch (PhutilMissingSymbolException $ex) { + $should_throw = true; + + foreach (debug_backtrace() as $backtrace) { + if (empty($backtrace['function'])) { + continue; + } + + switch ($backtrace['function']) { + case 'class_exists': + case 'interface_exists': + case 'method_exists': + case 'property_exists': + case 'trait_exists': + $should_throw = false; + break; + } + } + + if (!$should_throw) { + return false; + } + + // If there are other SPL autoloaders installed, we need to give them a + // chance to load the class. Throw the exception if we're the last + // autoloader; if not, swallow it and let them take a shot. + $autoloaders = spl_autoload_functions(); + $last = end($autoloaders); + if ($last == __FUNCTION__) { + throw $ex; + } + } +} + +spl_autoload_register('__phutil_autoload', $throw = true); + +PhutilBootloader::newLibrary('arcanist', dirname(dirname(__FILE__))); diff --git a/src/init/lib/PhutilBootloader.php b/src/init/lib/PhutilBootloader.php new file mode 100644 index 00000000..7a8759e8 --- /dev/null +++ b/src/init/lib/PhutilBootloader.php @@ -0,0 +1,332 @@ +registerLibrary($name, $path); + } + + public static function getInstance() { + if (!self::$instance) { + self::$instance = new PhutilBootloader(); + } + return self::$instance; + } + + private function __construct() { + // This method intentionally left blank. + } + + public function getClassTree() { + return $this->classTree; + } + + public function registerInMemoryLibrary($name, $map) { + $this->registeredLibraries[$name] = "memory:$name"; + $this->inMemoryMaps[$name] = $map; + + $this->getLibraryMap($name); + } + + public function registerLibrary($name, $path) { + // Detect attempts to load the same library multiple times from different + // locations. This might mean you're doing something silly like trying to + // include two different versions of something, or it might mean you're + // doing something subtle like running a different version of 'arc' on a + // working copy of Arcanist. + if (isset($this->registeredLibraries[$name])) { + $old_path = $this->registeredLibraries[$name]; + if ($old_path != $path) { + throw new PhutilLibraryConflictException($name, $old_path, $path); + } + } + + $this->registeredLibraries[$name] = $path; + + // If we're loading libphutil itself, load the utility functions first so + // we can safely call functions like "id()" when handling errors. In + // particular, this improves error behavior when "utils.php" itself can + // not load. + if ($name === 'arcanist') { + $root = $this->getLibraryRoot('arcanist'); + $this->executeInclude($root.'/utils/utils.php'); + } + + // For libphutil v2 libraries, load all functions when we load the library. + + if (!class_exists('PhutilSymbolLoader', false)) { + $root = $this->getLibraryRoot('arcanist'); + $this->executeInclude($root.'/symbols/PhutilSymbolLoader.php'); + } + + $loader = new PhutilSymbolLoader(); + $loader + ->setLibrary($name) + ->setType('function'); + + try { + $loader->selectAndLoadSymbols(); + } catch (PhutilBootloaderException $ex) { + // Ignore this, it happens if a global function's file is removed or + // similar. Worst case is that we fatal when calling the function, which + // is no worse than fataling here. + } catch (PhutilMissingSymbolException $ex) { + // Ignore this, it happens if a global function is removed. Everything + // else loaded so proceed forward: worst case is a fatal when we + // hit a function call to a function which no longer exists, which is + // no worse than fataling here. + } + + if (empty($_SERVER['PHUTIL_DISABLE_RUNTIME_EXTENSIONS'])) { + $extdir = $path.DIRECTORY_SEPARATOR.'extensions'; + if (Filesystem::pathExists($extdir)) { + $extensions = id(new FileFinder($extdir)) + ->withSuffix('php') + ->withType('f') + ->withFollowSymlinks(true) + ->setForceMode('php') + ->find(); + + foreach ($extensions as $extension) { + $this->loadExtension( + $name, + $path, + $extdir.DIRECTORY_SEPARATOR.$extension); + } + } + } + + return $this; + } + + public function registerLibraryMap(array $map) { + $this->libraryMaps[$this->currentLibrary] = $map; + return $this; + } + + public function getLibraryMap($name) { + if (isset($this->extendedMaps[$name])) { + return $this->extendedMaps[$name]; + } + + if (empty($this->libraryMaps[$name])) { + $root = $this->getLibraryRoot($name); + $this->currentLibrary = $name; + + if (isset($this->inMemoryMaps[$name])) { + $this->libraryMaps[$name] = $this->inMemoryMaps[$name]; + } else { + $okay = include $root.'/__phutil_library_map__.php'; + if (!$okay) { + throw new PhutilBootloaderException( + "Include of '{$root}/__phutil_library_map__.php' failed!"); + } + } + + $map = $this->libraryMaps[$name]; + + $version = isset($map['__library_version__']) + ? $map['__library_version__'] + : 1; + + switch ($version) { + case 1: + throw new Exception( + 'libphutil v1 libraries are no longer supported.'); + case 2: + // NOTE: In version 2 of the library format, all parents (both + // classes and interfaces) are stored in the 'xmap'. The value is + // either a string for a single parent (the common case) or an array + // for multiple parents. + foreach ($map['xmap'] as $child => $parents) { + foreach ((array)$parents as $parent) { + $this->classTree[$parent][] = $child; + } + } + break; + default: + throw new Exception("Unsupported library version '{$version}'!"); + } + } + + $map = $this->libraryMaps[$name]; + + // If there's an extension map for this library, merge the maps. + if (isset($this->extensionMaps[$name])) { + $emap = $this->extensionMaps[$name]; + foreach (array('function', 'class', 'xmap') as $dict_key) { + if (!isset($emap[$dict_key])) { + continue; + } + $map[$dict_key] += $emap[$dict_key]; + } + } + + $this->extendedMaps[$name] = $map; + + return $map; + } + + public function getLibraryMapWithoutExtensions($name) { + // This just does all the checks to make sure the library is valid, then + // we throw away the result. + $this->getLibraryMap($name); + + return $this->libraryMaps[$name]; + } + + public function getLibraryRoot($name) { + if (empty($this->registeredLibraries[$name])) { + throw new PhutilBootloaderException( + "The phutil library '{$name}' has not been loaded!"); + } + return $this->registeredLibraries[$name]; + } + + public function getAllLibraries() { + return array_keys($this->registeredLibraries); + } + + public function loadLibrarySource($library, $source) { + $path = $this->getLibraryRoot($library).'/'.$source; + $this->executeInclude($path); + } + + private function executeInclude($path) { + // Include the source using `include_once`, but convert any warnings or + // recoverable errors into exceptions. + + // Some messages, including "Declaration of X should be compatible with Y", + // do not cause `include_once` to return an error code. Use + // error_get_last() to make sure we're catching everything in every PHP + // version. + + // (Also, the severity of some messages changed between versions of PHP.) + + // Note that we may enter this method after some earlier, unrelated error. + // In this case, error_get_last() will return information for that error. + // In PHP7 and later we could use error_clear_last() to clear that error, + // but the function does not exist in earlier versions of PHP. Instead, + // check if the value has changed. + + // Some parser-like errors, including "class must implement all abstract + // methods", cause PHP to fatal immediately with an E_ERROR. In these + // cases, include_once() does not throw and never returns. We leave + // reporting enabled for these errors since we don't have a way to do + // anything more graceful. + + // Likewise, some errors, including "cannot redeclare Class::method()" + // cause PHP to fatal immediately with E_COMPILE_ERROR. Treat these like + // the similar errors which raise E_ERROR. + + // See also T12190. + + $old_last = error_get_last(); + + try { + $old = error_reporting(E_ERROR | E_COMPILE_ERROR); + $okay = include_once $path; + error_reporting($old); + } catch (Exception $ex) { + throw $ex; + } catch (ParseError $throwable) { + // NOTE: As of PHP7, syntax errors may raise a ParseError (which is a + // Throwable, not an Exception) with a useless message (like "syntax + // error, unexpected ':'") and a trace which ends a level above this. + + // Treating this object normally results in an unusable message which + // does not identify where the syntax error occurred. Converting it to + // a string and taking the first line gives us something reasonable, + // however. + $message = (string)$throwable; + $message = preg_split("/\n/", $message); + $message = reset($message); + + throw new Exception($message); + } + + if (!$okay) { + throw new Exception("Source file \"{$path}\" failed to load."); + } + + $new_last = error_get_last(); + if ($new_last !== null) { + if ($new_last !== $old_last) { + $message = $new_last['message']; + throw new Exception( + "Error while loading file \"{$path}\": {$message}"); + } + } + } + + private function loadExtension($library, $root, $path) { + $old_functions = get_defined_functions(); + $old_functions = array_fill_keys($old_functions['user'], true); + $old_classes = array_fill_keys(get_declared_classes(), true); + $old_interfaces = array_fill_keys(get_declared_interfaces(), true); + + $this->executeInclude($path); + + $new_functions = get_defined_functions(); + $new_functions = array_fill_keys($new_functions['user'], true); + $new_classes = array_fill_keys(get_declared_classes(), true); + $new_interfaces = array_fill_keys(get_declared_interfaces(), true); + + $add_functions = array_diff_key($new_functions, $old_functions); + $add_classes = array_diff_key($new_classes, $old_classes); + $add_interfaces = array_diff_key($new_interfaces, $old_interfaces); + + // NOTE: We can't trust the path we loaded to be the location of these + // symbols, because it might have loaded other paths. + + foreach ($add_functions as $func => $ignored) { + $rfunc = new ReflectionFunction($func); + $fpath = Filesystem::resolvePath($rfunc->getFileName(), $root); + $this->extensionMaps[$library]['function'][$func] = $fpath; + } + + foreach ($add_classes + $add_interfaces as $class => $ignored) { + $rclass = new ReflectionClass($class); + $cpath = Filesystem::resolvePath($rclass->getFileName(), $root); + $this->extensionMaps[$library]['class'][$class] = $cpath; + + $xmap = $rclass->getInterfaceNames(); + $parent = $rclass->getParentClass(); + if ($parent) { + $xmap[] = $parent->getName(); + } + + if ($xmap) { + foreach ($xmap as $parent_class) { + $this->classTree[$parent_class][] = $class; + } + + if (count($xmap) == 1) { + $xmap = head($xmap); + } + + $this->extensionMaps[$library]['xmap'][$class] = $xmap; + } + } + + // Clear the extended library cache (should one exist) so we know that + // we need to rebuild it. + unset($this->extendedMaps[$library]); + } + +} diff --git a/src/init/lib/PhutilBootloaderException.php b/src/init/lib/PhutilBootloaderException.php new file mode 100644 index 00000000..e9a74166 --- /dev/null +++ b/src/init/lib/PhutilBootloaderException.php @@ -0,0 +1,3 @@ +library = $library; + $this->oldPath = $old_path; + $this->newPath = $new_path; + + parent::__construct(pht( + "Library conflict! The library '%s' has already been loaded (from '%s') ". + "but is now being loaded again from a new location ('%s'). You can not ". + "load multiple copies of the same library into a program.", + $library, + $old_path, + $new_path)); + } + + /** + * Retrieve the name of the library in conflict. + * + * @return string The name of the library which conflicts with an existing + * library. + * @task info + */ + public function getLibrary() { + return $this->library; + } + + /** + * Get the path to the library which has already been loaded earlier in the + * program's execution. + * + * @return string The path of the already-loaded library. + * @task info + */ + public function getOldPath() { + return $this->oldPath; + } + + /** + * Get the path to the library which is causing this conflict. + * + * @return string The path of the attempting-to-load library. + * @task info + */ + public function getNewPath() { + return $this->newPath; + } + +} diff --git a/src/init/lib/PhutilMissingSymbolException.php b/src/init/lib/PhutilMissingSymbolException.php new file mode 100644 index 00000000..5b315a57 --- /dev/null +++ b/src/init/lib/PhutilMissingSymbolException.php @@ -0,0 +1,29 @@ +assertEqual('arcanist', phutil_get_current_library_name()); + } + +} diff --git a/src/init/lib/core.php b/src/init/lib/core.php new file mode 100644 index 00000000..c0b0a14f --- /dev/null +++ b/src/init/lib/core.php @@ -0,0 +1,10 @@ +registerLibrary($library, $path); +} + +function phutil_register_library_map(array $map) { + PhutilBootloader::getInstance()->registerLibraryMap($map); +} diff --git a/src/init/lib/moduleutils.php b/src/init/lib/moduleutils.php new file mode 100644 index 00000000..ad447cff --- /dev/null +++ b/src/init/lib/moduleutils.php @@ -0,0 +1,53 @@ +getLibraryRoot($library); +} + +function phutil_get_library_root_for_path($path) { + foreach (Filesystem::walkToRoot($path) as $dir) { + if (Filesystem::pathExists($dir.'/__phutil_library_init__.php')) { + return $dir; + } + } + return null; +} + +function phutil_get_library_name_for_root($path) { + $path = rtrim(Filesystem::resolvePath($path), '/'); + + $bootloader = PhutilBootloader::getInstance(); + $libraries = $bootloader->getAllLibraries(); + foreach ($libraries as $library) { + $root = $bootloader->getLibraryRoot($library); + if (rtrim(Filesystem::resolvePath($root), '/') == $path) { + return $library; + } + } + + return null; +} + +function phutil_get_current_library_name() { + $caller = head(debug_backtrace(false)); + + $root = phutil_get_library_root_for_path($caller['file']); + return phutil_get_library_name_for_root($root); +} + +/** + * Warns about use of deprecated behavior. + */ +function phutil_deprecated($what, $why) { + PhutilErrorHandler::dispatchErrorMessage( + PhutilErrorHandler::DEPRECATED, + $what, + array( + 'why' => $why, + )); +} + +function phutil_load_library($path) { + require_once $path.'/__phutil_library_init__.php'; +} diff --git a/src/internationalization/PhutilLocale.php b/src/internationalization/PhutilLocale.php new file mode 100644 index 00000000..3ef2524e --- /dev/null +++ b/src/internationalization/PhutilLocale.php @@ -0,0 +1,247 @@ +" order. + * + * @param const `PhutilPerson` gender constant. + * @param list List of variants. + * @return string Variant for use. + */ + public function selectGenderVariant($variant, array $translations) { + if ($variant == PhutilPerson::GENDER_FEMININE) { + return end($translations); + } else { + return reset($translations); + } + } + + + /** + * Select a plural variant for this locale. By default, locales use a simple + * rule with two plural variants, listed in "" order. + * + * @param int Plurality of the value. + * @param list List of variants. + * @return string Variant for use. + */ + public function selectPluralVariant($variant, array $translations) { + if ($variant == 1) { + return reset($translations); + } else { + return end($translations); + } + } + + + /** + * Flags a locale as silly, like "English (Pirate)". + * + * These locales are fun but disastrously inappropriate for serious + * businesses. + * + * @return bool True if this locale is silly. + */ + public function isSillyLocale() { + return false; + } + + + /** + * Flags a locale as a testing locale, like "English (US, ALL CAPS)". These + * locales are useful for translation development, but not for normal users. + * + * @return bool True if this is a locale for testing or development. + */ + public function isTestLocale() { + return false; + } + + + /** + * Indicates that the translator should post-process translations in this + * locale by calling @{method:didTranslateString}. + * + * Doing this incurs a performance penalty, and is not useful for most + * languages. However, it can be used to implement test translations like + * "English (US, ALL CAPS)". + * + * @return bool True to postprocess strings. + */ + public function shouldPostProcessTranslations() { + return false; + } + + + /** + * Callback for post-processing translations. + * + * By default, this callback is not invoked. To activate it, return `true` + * from @{method:shouldPostProcessTranslations}. Activating this callback + * incurs a performance penalty. + * + * @param string The raw input pattern. + * @param string The selected translation pattern. + * @param list The raw input arguments. + * @param string The translated string. + * @return string Post-processed translation string. + */ + public function didTranslateString( + $raw_pattern, + $translated_pattern, + array $args, + $result_text) { + return $result_text; + } + + + /** + * Load all available locales. + * + * @return map Map from codes to locale objects. + */ + public static function loadAllLocales() { + static $locales; + + if ($locales === null) { + $objects = id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->execute(); + + $locale_map = array(); + foreach ($objects as $object) { + $locale_code = $object->getLocaleCode(); + if (empty($locale_map[$locale_code])) { + $locale_map[$locale_code] = $object; + } else { + throw new Exception( + pht( + 'Two subclasses of "%s" ("%s" and "%s") define '. + 'locales with the same locale code ("%s"). Each locale must '. + 'have a unique locale code.', + __CLASS__, + get_class($object), + get_class($locale_map[$locale_code]), + $locale_code)); + } + } + + foreach ($locale_map as $locale_code => $locale) { + $fallback_code = $locale->getFallbackLocaleCode(); + if ($fallback_code !== null) { + if (empty($locale_map[$fallback_code])) { + throw new Exception( + pht( + 'The locale "%s" has an invalid fallback locale code ("%s"). '. + 'No locale class exists which defines this locale.', + get_class($locale), + $fallback_code)); + } + } + } + + foreach ($locale_map as $locale_code => $locale) { + $seen = array($locale_code => get_class($locale)); + self::checkLocaleFallback($locale_map, $locale, $seen); + } + + $locales = $locale_map; + } + return $locales; + } + + + /** + * Load a specific locale using a locale code. + * + * @param string Locale code. + * @return PhutilLocale Locale object. + */ + public static function loadLocale($locale_code) { + $all_locales = self::loadAllLocales(); + $locale = idx($all_locales, $locale_code); + + if (!$locale) { + throw new Exception( + pht( + 'There is no locale with the locale code "%s".', + $locale_code)); + } + + return $locale; + } + + + /** + * Recursively check locale fallbacks for cycles. + * + * @param map Map of locales. + * @param PhutilLocale Current locale. + * @param map Map of visited locales. + * @return void + */ + private static function checkLocaleFallback( + array $map, + PhutilLocale $locale, + array $seen) { + + $fallback_code = $locale->getFallbackLocaleCode(); + if ($fallback_code === null) { + return; + } + + if (isset($seen[$fallback_code])) { + $seen[] = get_class($locale); + $seen[] = pht('...'); + throw new Exception( + pht( + 'Locale "%s" is part of a cycle of locales which fall back on '. + 'one another in a loop (%s). Locales which fall back on other '. + 'locales must not loop.', + get_class($locale), + implode(' -> ', $seen))); + } + + $seen[$fallback_code] = get_class($locale); + self::checkLocaleFallback($map, $map[$fallback_code], $seen); + } + +} diff --git a/src/internationalization/PhutilNumber.php b/src/internationalization/PhutilNumber.php new file mode 100644 index 00000000..c906f88c --- /dev/null +++ b/src/internationalization/PhutilNumber.php @@ -0,0 +1,26 @@ +value = $value; + $this->decimals = $decimals; + } + + public function getNumber() { + return $this->value; + } + + public function setDecimals($decimals) { + $this->decimals = $decimals; + return $this; + } + + public function getDecimals() { + return $this->decimals; + } + +} diff --git a/src/internationalization/PhutilPerson.php b/src/internationalization/PhutilPerson.php new file mode 100644 index 00000000..9f66afb0 --- /dev/null +++ b/src/internationalization/PhutilPerson.php @@ -0,0 +1,11 @@ + Map of raw strings to translations. + */ + abstract protected function getTranslations(); + + + /** + * Return a filtered map of all strings in this translation. + * + * Filters out empty/placeholder translations. + * + * @return map Map of raw strings to translations. + */ + final public function getFilteredTranslations() { + $translations = $this->getTranslations(); + + foreach ($translations as $key => $translation) { + if ($translation === null) { + unset($translations[$key]); + } + } + + return $translations; + } + + + /** + * Load all available translation objects. + * + * @return list List of available translation sources. + */ + public static function loadAllTranslations() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->execute(); + } + + + /** + * Load the complete translation map for a locale. + * + * This will compile primary and fallback translations into a single + * translation map. + * + * @param string Locale code, like "en_US". + * @return map Map of all avialable translations. + */ + public static function getTranslationMapForLocale($locale_code) { + $locale = PhutilLocale::loadLocale($locale_code); + + $translations = self::loadAllTranslations(); + + $results = array(); + foreach ($translations as $translation) { + if ($translation->getLocaleCode() == $locale_code) { + $results += $translation->getFilteredTranslations(); + } + } + + $fallback_code = $locale->getFallbackLocaleCode(); + if ($fallback_code !== null) { + $results += self::getTranslationMapForLocale($fallback_code); + } + + return $results; + } + +} diff --git a/src/internationalization/PhutilTranslator.php b/src/internationalization/PhutilTranslator.php new file mode 100644 index 00000000..c2b0984a --- /dev/null +++ b/src/internationalization/PhutilTranslator.php @@ -0,0 +1,275 @@ +locale = $locale; + $this->localeCode = $locale->getLocaleCode(); + $this->shouldPostProcess = $locale->shouldPostProcessTranslations(); + return $this; + } + + public function setWillTranslateCallback($callback) { + $this->willTranslateCallback = $callback; + return $this; + } + + public function getWillTranslateCallback() { + return $this->willTranslateCallback; + } + + /** + * Add translations which will be later used by @{method:translate}. + * The parameter is an array of strings (for simple translations) or arrays + * (for translations with variants). The number of items in the array is + * language specific. It is `array($singular, $plural)` for English. + * + * array( + * 'color' => 'colour', + * '%d beer(s)' => array('%d beer', '%d beers'), + * ); + * + * The arrays can be nested for strings with more variant parts: + * + * array( + * '%d char(s) on %d row(s)' => array( + * array('%d char on %d row', '%d char on %d rows'), + * array('%d chars on %d row', '%d chars on %d rows'), + * ), + * ); + * + * The translation should have the same placeholders as originals. Swapping + * parameter order is possible: + * + * array( + * '%s owns %s.' => '%2$s is owned by %1$s.', + * ); + * + * @param array Identifier in key, translation in value. + * @return PhutilTranslator Provides fluent interface. + */ + public function setTranslations(array $translations) { + $this->translations = $translations; + return $this; + } + + /** + * @phutil-external-symbol class PhutilSafeHTML + * @phutil-external-symbol class PhutilSafeHTMLProducerInterface + * @phutil-external-symbol function phutil_escape_html + * @phutil-external-symbol function phutil_safe_html + */ + public function translate($text /* , ... */) { + $args = func_get_args(); + + if ($this->willTranslateCallback) { + call_user_func_array($this->willTranslateCallback, $args); + } + + if (isset($this->translations[$text])) { + $translation = $this->translations[$text]; + } else { + $translation = $text; + } + + while (is_array($translation)) { + $arg = next($args); + $translation = $this->chooseVariant($translation, $arg); + if ($translation === null) { + $pos = key($args); + + if (is_object($arg)) { + $kind = get_class($arg); + } else { + $kind = gettype($arg); + } + + return sprintf( + '[Invalid Translation!] The "%s" language data offers variant '. + 'translations for the plurality or gender of argument %s, but '. + 'the value for that argument is not an integer, PhutilNumber, or '. + 'PhutilPerson (it is a value of type "%s"). Raw input: <%s>.', + $this->localeCode, + $pos, + $kind, + $text); + } + } + array_shift($args); + + foreach ($args as $k => $arg) { + if ($arg instanceof PhutilNumber) { + $args[$k] = $this->formatNumber($arg->getNumber(), $arg->getDecimals()); + } + } + + // Check if any arguments are PhutilSafeHTML. If they are, we will apply + // any escaping necessary and output HTML. + $is_html = false; + foreach ($args as $arg) { + if ($arg instanceof PhutilSafeHTML || + $arg instanceof PhutilSafeHTMLProducerInterface) { + $is_html = true; + break; + } + } + + if ($is_html) { + foreach ($args as $k => $arg) { + $args[$k] = (string)phutil_escape_html($arg); + } + } + + $result = vsprintf($translation, $args); + if ($result === false) { + // If vsprintf() fails (often because the translated string references + // too many parameters), show the bad template with a note instead of + // returning an empty string. This makes it easier to figure out what + // went wrong and fix it. + $result = pht('[Invalid Translation!] %s', $translation); + } + + if ($this->shouldPostProcess) { + $result = $this->locale->didTranslateString( + $text, + $translation, + $args, + $result); + } + + if ($is_html) { + $result = phutil_safe_html($result); + } + + return $result; + } + + private function chooseVariant(array $translations, $variant) { + if (count($translations) == 1) { + // If we only have one variant, we can select it directly. + return reset($translations); + } + + if ($variant instanceof PhutilNumber) { + $is_gender = false; + $variant = $variant->getNumber(); + } else if ($variant instanceof PhutilPerson) { + $is_gender = true; + $variant = $variant->getGender(); + } else if (is_int($variant)) { + $is_gender = false; + } else { + return null; + } + + if ($is_gender) { + return $this->locale->selectGenderVariant($variant, $translations); + } else { + + // NOTE: This is a microoptimization which slightly improves performance + // for common languages with simple plural rules. Languages do not need + // to be added here even if they use the simple rules. The benefit of + // inclusion here is small, on the order of 5%. + static $simple_plural = array( + 'en_US' => true, + 'en_GB' => true, + 'en_ES' => true, + 'ko_KR' => true, + ); + + if (isset($simple_plural[$this->localeCode])) { + if ($variant == 1) { + return reset($translations); + } else { + return end($translations); + } + } else { + return $this->locale->selectPluralVariant($variant, $translations); + } + } + + } + + /** + * Translate date formatted by `$date->format()`. + * + * @param string Format accepted by `DateTime::format()`. + * @param DateTime + * @return string Formatted and translated date. + */ + public function translateDate($format, DateTime $date) { + static $format_cache = array(); + if (!isset($format_cache[$format])) { + $translatable = 'DlSFMaA'; + preg_match_all( + '/['.$translatable.']|(\\\\.|[^'.$translatable.'])+/', + $format, + $format_cache[$format], + PREG_SET_ORDER); + } + + $parts = array(); + foreach ($format_cache[$format] as $match) { + $part = $date->format($match[0]); + if (!isset($match[1])) { + $part = $this->translate($part); + } + $parts[] = $part; + } + return implode('', $parts); + } + + /** + * Format number with grouped thousands and optional decimal part. Requires + * translations of '.' (decimal point) and ',' (thousands separator). Both + * these translations must be 1 byte long with PHP < 5.4.0. + * + * @param float + * @param int + * @return string + */ + public function formatNumber($number, $decimals = 0) { + return number_format( + $number, + $decimals, + $this->translate('.'), + $this->translate(',')); + } + + public function validateTranslation($original, $translation) { + $pattern = '/<(\S[^>]*>?)?|&(\S[^;]*;?)?/i'; + $original_matches = null; + $translation_matches = null; + + preg_match_all($pattern, $original, $original_matches); + preg_match_all($pattern, $translation, $translation_matches); + + sort($original_matches[0]); + sort($translation_matches[0]); + + if ($original_matches[0] !== $translation_matches[0]) { + return false; + } + return true; + } + +} diff --git a/src/internationalization/__tests__/PhutilLocaleTestCase.php b/src/internationalization/__tests__/PhutilLocaleTestCase.php new file mode 100644 index 00000000..1027d2ed --- /dev/null +++ b/src/internationalization/__tests__/PhutilLocaleTestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } + +} diff --git a/src/internationalization/__tests__/PhutilPersonTest.php b/src/internationalization/__tests__/PhutilPersonTest.php new file mode 100644 index 00000000..953fcd23 --- /dev/null +++ b/src/internationalization/__tests__/PhutilPersonTest.php @@ -0,0 +1,20 @@ +gender; + } + + public function setGender($value) { + $this->gender = $value; + return $this; + } + + public function __toString() { + return pht('Test (%s)', $this->gender); + } + +} diff --git a/src/internationalization/__tests__/PhutilPhtTestCase.php b/src/internationalization/__tests__/PhutilPhtTestCase.php new file mode 100644 index 00000000..fed12b1d --- /dev/null +++ b/src/internationalization/__tests__/PhutilPhtTestCase.php @@ -0,0 +1,101 @@ +assertEqual('beer', pht('beer')); + $this->assertEqual('1 beer(s)', pht('%d beer(s)', 1)); + + $english_locale = PhutilLocale::loadLocale('en_US'); + PhutilTranslator::getInstance()->setLocale($english_locale); + PhutilTranslator::getInstance()->setTranslations( + array( + '%d beer(s)' => array('%d beer', '%d beers'), + )); + + $this->assertEqual('1 beer', pht('%d beer(s)', 1)); + + $czech_locale = PhutilLocale::loadLocale('cs_CZ'); + PhutilTranslator::getInstance()->setLocale($czech_locale); + PhutilTranslator::getInstance()->setTranslations( + array( + '%d beer(s)' => array('%d pivo', '%d piva', '%d piv'), + )); + + $this->assertEqual('5 piv', pht('%d beer(s)', 5)); + } + + public function getDateTranslations() { + // The only purpose of this function is to provide a static list of + // translations which can come from PhutilTranslator::translateDate() to + // allow translation extractor getting them. + return array( + 'D' => array( + pht('Sun'), + pht('Mon'), + pht('Tue'), + pht('Wed'), + pht('Thu'), + pht('Fri'), + pht('Sat'), + ), + 'l' => array( + pht('Sunday'), + pht('Monday'), + pht('Tuesday'), + pht('Wednesday'), + pht('Thursday'), + pht('Friday'), + pht('Saturday'), + ), + 'S' => array( + pht('st'), + pht('nd'), + pht('rd'), + pht('th'), + ), + 'F' => array( + pht('January'), + pht('February'), + pht('March'), + pht('April'), + pht('May'), + pht('June'), + pht('July'), + pht('August'), + pht('September'), + pht('October'), + pht('November'), + pht('December'), + ), + 'M' => array( + pht('Jan'), + pht('Feb'), + pht('Mar'), + pht('Apr'), + pht('May'), + pht('Jun'), + pht('Jul'), + pht('Aug'), + pht('Sep'), + pht('Oct'), + pht('Nov'), + pht('Dec'), + ), + 'a' => array( + pht('am'), + pht('pm'), + ), + 'A' => array( + pht('AM'), + pht('PM'), + ), + ); + } + +} diff --git a/src/internationalization/__tests__/PhutilTranslationTestCase.php b/src/internationalization/__tests__/PhutilTranslationTestCase.php new file mode 100644 index 00000000..50ddb311 --- /dev/null +++ b/src/internationalization/__tests__/PhutilTranslationTestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } + +} diff --git a/src/internationalization/__tests__/PhutilTranslatorTestCase.php b/src/internationalization/__tests__/PhutilTranslatorTestCase.php new file mode 100644 index 00000000..4a2e90cc --- /dev/null +++ b/src/internationalization/__tests__/PhutilTranslatorTestCase.php @@ -0,0 +1,200 @@ +newTranslator('en_US'); + $translator->setTranslations( + array( + '%d line(s)' => array('%d line', '%d lines'), + '%d char(s) on %d row(s)' => array( + array('%d char on %d row', '%d char on %d rows'), + array('%d chars on %d row', '%d chars on %d rows'), + ), + )); + + $this->assertEqual('line', $translator->translate('line')); + $this->assertEqual('param', $translator->translate('%s', 'param')); + + $this->assertEqual('0 lines', $translator->translate('%d line(s)', 0)); + $this->assertEqual('1 line', $translator->translate('%d line(s)', 1)); + $this->assertEqual('2 lines', $translator->translate('%d line(s)', 2)); + + $this->assertEqual( + '1 char on 1 row', + $translator->translate('%d char(s) on %d row(s)', 1, 1)); + $this->assertEqual( + '5 chars on 2 rows', + $translator->translate('%d char(s) on %d row(s)', 5, 2)); + + $this->assertEqual('1 beer(s)', $translator->translate('%d beer(s)', 1)); + } + + public function testCzech() { + $translator = $this->newTranslator('cs_CZ'); + $translator->setTranslations( + array( + '%d beer(s)' => array('%d pivo', '%d piva', '%d piv'), + )); + + $this->assertEqual('0 piv', $translator->translate('%d beer(s)', 0)); + $this->assertEqual('1 pivo', $translator->translate('%d beer(s)', 1)); + $this->assertEqual('2 piva', $translator->translate('%d beer(s)', 2)); + $this->assertEqual('5 piv', $translator->translate('%d beer(s)', 5)); + + $this->assertEqual('1 line(s)', $translator->translate('%d line(s)', 1)); + } + + public function testPerson() { + $translator = $this->newTranslator('cs_CZ'); + $translator->setTranslations( + array( + '%s wrote.' => array('%s napsal.', '%s napsala.'), + )); + + $person = new PhutilPersonTest(); + $this->assertEqual( + 'Test () napsal.', + $translator->translate('%s wrote.', $person)); + + $person->setGender(PhutilPerson::GENDER_MASCULINE); + $this->assertEqual( + 'Test (m) napsal.', + $translator->translate('%s wrote.', $person)); + + $person->setGender(PhutilPerson::GENDER_FEMININE); + $this->assertEqual( + 'Test (f) napsala.', + $translator->translate('%s wrote.', $person)); + } + + public function testTranslateDate() { + $date = new DateTime('2012-06-21'); + $translator = $this->newTranslator('en_US'); + + $this->assertEqual('June', $translator->translateDate('F', $date)); + $this->assertEqual('June 21', $translator->translateDate('F d', $date)); + $this->assertEqual('F', $translator->translateDate('\F', $date)); + + $translator->setTranslations( + array( + 'June' => 'correct', + '21' => 'wrong', + 'F' => 'wrong', + )); + $this->assertEqual('correct', $translator->translateDate('F', $date)); + $this->assertEqual('correct 21', $translator->translateDate('F d', $date)); + $this->assertEqual('F', $translator->translateDate('\F', $date)); + } + + public function testSetInstance() { + $english_translator = $this->newTranslator('en_US'); + + PhutilTranslator::setInstance($english_translator); + $original = PhutilTranslator::getInstance(); + $this->assertEqual('color', pht('color')); + + $british_locale = PhutilLocale::loadLocale('en_GB'); + + $british = new PhutilTranslator(); + $british->setLocale($british_locale); + $british->setTranslations( + array( + 'color' => 'colour', + )); + PhutilTranslator::setInstance($british); + $this->assertEqual('colour', pht('color')); + + PhutilTranslator::setInstance($original); + $this->assertEqual('color', pht('color')); + } + + public function testFormatNumber() { + $translator = $this->newTranslator('en_US'); + + $this->assertEqual('1,234', $translator->formatNumber(1234)); + $this->assertEqual('1,234.5', $translator->formatNumber(1234.5, 1)); + $this->assertEqual('1,234.5678', $translator->formatNumber(1234.5678, 4)); + + $translator->setTranslations( + array( + ',' => ' ', + '.' => ',', + )); + $this->assertEqual('1 234', $translator->formatNumber(1234)); + $this->assertEqual('1 234,5', $translator->formatNumber(1234.5, 1)); + $this->assertEqual('1 234,5678', $translator->formatNumber(1234.5678, 4)); + } + + public function testNumberTranslations() { + $translator = $this->newTranslator('en_US'); + + $translator->setTranslations( + array( + '%s line(s)' => array('%s line', '%s lines'), + )); + + $this->assertEqual( + '1 line', + $translator->translate('%s line(s)', new PhutilNumber(1))); + + $this->assertEqual( + '1,000 lines', + $translator->translate('%s line(s)', new PhutilNumber(1000))); + + $this->assertEqual( + '8.5 lines', + $translator->translate( + '%s line(s)', + id(new PhutilNumber(8.5))->setDecimals(1))); + } + + public function testValidateTranslation() { + $tests = array( + 'a < 2' => array( + 'a < 2' => true, + 'b < 3' => true, + '2 > a' => false, + 'a<2' => false, + ), + 'We win' => array( + 'We win' => true, + 'We win' => true, // false positive + 'We win' => false, + 'We win' => false, + ), + 'We win & triumph' => array( + 'We triumph & win' => true, + 'We win and triumph' => false, + ), + 'beer' => array( + 'pivo' => true, + 'b<>r' => false, + 'b&&r' => false, + ), + ); + + $translator = $this->newTranslator('en_US'); + + foreach ($tests as $original => $translations) { + foreach ($translations as $translation => $expect) { + $valid = ($expect ? 'valid' : 'invalid'); + $this->assertEqual( + $expect, + $translator->validateTranslation($original, $translation), + pht( + "'%s' should be %s with '%s'.", + $original, + $valid, + $translation)); + } + } + } + + private function newTranslator($locale_code) { + $locale = PhutilLocale::loadLocale($locale_code); + return id(new PhutilTranslator()) + ->setLocale($locale); + } + +} diff --git a/src/internationalization/locales/PhutilAllCapsEnglishLocale.php b/src/internationalization/locales/PhutilAllCapsEnglishLocale.php new file mode 100644 index 00000000..8298d493 --- /dev/null +++ b/src/internationalization/locales/PhutilAllCapsEnglishLocale.php @@ -0,0 +1,38 @@ += 2 && $variant <= 4) { + return $paucal; + } + + return $plural; + } + +} diff --git a/src/internationalization/locales/PhutilEmojiLocale.php b/src/internationalization/locales/PhutilEmojiLocale.php new file mode 100644 index 00000000..e142130f --- /dev/null +++ b/src/internationalization/locales/PhutilEmojiLocale.php @@ -0,0 +1,33 @@ +setTranslations()` and language rules set + * by `PhutilTranslator::getInstance()->setLocale()`. + * + * @param string Translation identifier with `sprintf()` placeholders. + * @param mixed Value to select the variant from (e.g. singular or plural). + * @param ... Next values referenced from $text. + * @return string Translated string with substituted values. + */ +function pht($text, $variant = null /* , ... */) { + $args = func_get_args(); + $translator = PhutilTranslator::getInstance(); + return call_user_func_array(array($translator, 'translate'), $args); +} + +/** + * Count all elements in an array, or something in an object. + * + * @param array|Countable A countable object. + * @return PhutilNumber Returns the number of elements in the input + * parameter. + */ +function phutil_count($countable) { + if (!(is_array($countable) || $countable instanceof Countable)) { + throw new InvalidArgumentException(pht('Argument should be countable.')); + } + + return new PhutilNumber(count($countable)); +} + +/** + * Provide a gendered argument to the translation engine. + * + * This function does nothing and only serves as a marker for the static + * extractor so it knows particular arguments may vary on gender. + * + * @param PhutilPerson Something implementing @{interface:PhutilPerson}. + * @return PhutilPerson The argument, unmodified. + */ +function phutil_person(PhutilPerson $person) { + return $person; +} diff --git a/src/internationalization/translation/LibphutilUSEnglishTranslation.php b/src/internationalization/translation/LibphutilUSEnglishTranslation.php new file mode 100644 index 00000000..963940fa --- /dev/null +++ b/src/internationalization/translation/LibphutilUSEnglishTranslation.php @@ -0,0 +1,34 @@ + array( + 'Daemon was idle for more than one second, scaling pool down.', + 'Daemon was idle for more than %s seconds, scaling pool down.', + ), + + 'Analyzing %s file(s) with %s subprocess(es)...' => array( + array( + 'Analyzing one file with a single subprocess...', + 'Analyzing %s file with %s subprocesses...', + ), + array( + 'Analyzing %s files with a single subprocess...', + 'Analyzing %s files with %s subprocesses...', + ), + ), + + '... (%s more byte(s)) ...' => array( + '... (%s more byte) ...', + '... (%s more bytes) ...', + ), + ); + } + +} diff --git a/src/ip/PhutilCIDRBlock.php b/src/ip/PhutilCIDRBlock.php new file mode 100644 index 00000000..e55d42bf --- /dev/null +++ b/src/ip/PhutilCIDRBlock.php @@ -0,0 +1,84 @@ + + } + + public static function newBlock($in) { + if ($in instanceof PhutilCIDRBlock) { + return clone $in; + } + + return self::newFromString($in); + } + + private static function newFromString($str) { + if (!preg_match('(^[\d.:a-fA-F]+/[\d]+\z)', $str)) { + throw new Exception( + pht( + 'CIDR block "%s" is not formatted correctly. Expected an IP block '. + 'in CIDR notation, like "%s" or "%s".', + $str, + '172.30.0.0/16', + '23:45:67:89::/24')); + } + + list($ip, $mask) = explode('/', $str); + + $ip = PhutilIPAddress::newAddress($ip); + + if (preg_match('/^0\d/', $mask)) { + throw new Exception( + pht( + 'CIDR block "%s" is not formatted correctly. The IP block mask '. + '("%s") must not have leading zeroes.', + $str, + $mask)); + } + + $max_bits = $ip->getBitCount(); + + $bits = (int)$mask; + if ($bits < 0 || $bits > $max_bits) { + throw new Exception( + pht( + 'CIDR block "%s" is not formatted correctly. The IP block mask '. + '("%s") must mask between 0 and %s bits, inclusive.', + $str, + $mask, + new PhutilNumber($max_bits))); + } + + $obj = new PhutilCIDRBlock(); + $obj->ip = $ip; + $obj->bits = $bits; + + return $obj; + } + + public function containsAddress($address) { + $address = PhutilIPAddress::newAddress($address); + + $block_bits = $this->ip->toBits(); + $address_bits = $address->toBits(); + + // If the two addresses have different bit widths (IPv4 vs IPv6), this + // CIDR block does not match the address. + if ($this->ip->getBitCount() != $address->getBitCount()) { + return false; + } + + return (strncmp($block_bits, $address_bits, $this->bits) === 0); + } + +} diff --git a/src/ip/PhutilCIDRList.php b/src/ip/PhutilCIDRList.php new file mode 100644 index 00000000..c7e703ea --- /dev/null +++ b/src/ip/PhutilCIDRList.php @@ -0,0 +1,40 @@ +containsAddrsss('172.30.0.1'); + */ +final class PhutilCIDRList extends Phobject { + + private $blocks; + + private function __construct() { + // + } + + public static function newList(array $blocks) { + foreach ($blocks as $key => $block) { + $blocks[$key] = PhutilCIDRBlock::newBlock($block); + } + + $obj = new PhutilCIDRList(); + $obj->blocks = $blocks; + return $obj; + } + + public function containsAddress($address) { + foreach ($this->blocks as $block) { + if ($block->containsAddress($address)) { + return true; + } + } + + return false; + } + +} diff --git a/src/ip/PhutilIPAddress.php b/src/ip/PhutilIPAddress.php new file mode 100644 index 00000000..ee10b4c5 --- /dev/null +++ b/src/ip/PhutilIPAddress.php @@ -0,0 +1,43 @@ + + } + + abstract public function toBits(); + abstract public function getBitCount(); + abstract public function getAddress(); + + public static function newAddress($in) { + if ($in instanceof PhutilIPAddress) { + return clone $in; + } + + try { + return PhutilIPv4Address::newFromString($in); + } catch (Exception $ex) { + // Continue, trying the address as IPv6 instead. + } + + try { + return PhutilIPv6Address::newFromString($in); + } catch (Exception $ex) { + // Continue, throwing a more tailored exception below. + } + + throw new Exception( + pht( + 'IP address "%s" is not properly formatted. Expected an IPv4 address '. + 'like "%s", or an IPv6 address like "%s".', + $in, + '23.45.67.89', + '2345:6789:0123:abcd::')); + } + +} diff --git a/src/ip/PhutilIPv4Address.php b/src/ip/PhutilIPv4Address.php new file mode 100644 index 00000000..28dc3ea0 --- /dev/null +++ b/src/ip/PhutilIPv4Address.php @@ -0,0 +1,86 @@ + + } + + public function getAddress() { + return $this->ip; + } + + public function getBitCount() { + return 32; + } + + protected static function newFromString($str) { + $matches = null; + $ok = preg_match('(^(\d+)\.(\d+)\.(\d+).(\d+)\z)', $str, $matches); + if (!$ok) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted. Expected an IPv4 '. + 'address like "%s".', + $str, + '23.45.67.89')); + } + + $parts = array_slice($matches, 1); + foreach ($parts as $part) { + if (preg_match('/^0\d/', $part)) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted. Address segments '. + 'should have no leading zeroes, but segment "%s" has a leading '. + 'zero.', + $str, + $part)); + } + + $value = (int)$part; + if ($value < 0 || $value > 255) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted. Address segments '. + 'should be between 0 and 255, inclusive, but segment "%s" has '. + 'a value outside of this range.', + $str, + $part)); + } + } + + $obj = new self(); + $obj->ip = $str; + + return $obj; + } + + public function toBits() { + if ($this->bits === null) { + $bits = ''; + foreach (explode('.', $this->ip) as $part) { + $value = (int)$part; + for ($ii = 7; $ii >= 0; $ii--) { + $mask = (1 << $ii); + if (($value & $mask) === $mask) { + $bits .= '1'; + } else { + $bits .= '0'; + } + } + } + + $this->bits = $bits; + } + + return $this->bits; + } + +} diff --git a/src/ip/PhutilIPv6Address.php b/src/ip/PhutilIPv6Address.php new file mode 100644 index 00000000..eb7ada00 --- /dev/null +++ b/src/ip/PhutilIPv6Address.php @@ -0,0 +1,212 @@ + + } + + public function getBitCount() { + return 128; + } + + protected static function newFromString($str) { + $parts = explode(':', $str); + if (count($parts) > 8) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: is has too many '. + 'parts. Expected a maximum of 7 colons, like "%s".', + $str, + '1:2:3:4:a:b:c:d')); + } + + if (count($parts) < 3) { + throw new Exception( + pht( + 'IP address "%s" is not properly formated: it has too few '. + 'parts. Expected a minimum of 2 colons, like "%s".', + $str, + '::1')); + } + + // Look for leading or trailing empty parts. These are valid if the string + // begins or ends like "::", "::1", or "1::", but not valid otherwise. + $has_omission = false; + if ($str === '::') { + $parts = array(null); + $has_omission = true; + } else if ($parts[0] === '') { + if ($parts[1] === '') { + unset($parts[1]); + $parts[0] = null; + $parts = array_values($parts); + $has_omission = true; + } else { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: an address with '. + 'omitted leading sements must begin with "::".', + $str)); + } + } else if (last($parts) === '') { + if ($parts[count($parts) - 2] === '') { + array_pop($parts); + $parts[count($parts) - 1] = null; + $parts = array_values($parts); + $has_omission = true; + } else { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: an address with '. + 'omitted trailing segments must end with "::".', + $str)); + } + } + + foreach ($parts as $idx => $part) { + if ($part !== '') { + continue; + } + + if ($has_omission) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: an address may '. + 'only contain a maximum of one subsequence omitted with "::".', + $str)); + } + + $has_omission = true; + $parts[$idx] = null; + } + + if (!$has_omission) { + if (count($parts) !== 8) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: an address must '. + 'contain exactly 8 segments, or omit a subsequence of segments '. + 'with "::".', + $str)); + } + } + + $values = array(); + foreach ($parts as $idx => $part) { + // This is a "::" segment, so fill in any missing values with 0. + if ($part === null) { + for ($ii = count($parts); $ii <= 8; $ii++) { + $values[] = 0; + } + continue; + } + + if (!preg_match('/^[0-9a-fA-F]{1,4}\z/', $part)) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: the segments of '. + 'an address must be hexadecimal values between "0000" and "ffff", '. + 'inclusive. Segment "%s" is not.', + $str, + $part)); + } + + $values[] = (int)hexdec($part); + } + + $obj = new self(); + $obj->values = $values; + + return $obj; + } + + public function getAddress() { + if ($this->displayAddress === null) { + // Find the longest consecutive sequence of "0" values. We want to + // collapse this into "::". + $longest_run = 0; + $longest_index = 0; + $current_run = null; + $current_index = null; + foreach ($this->values as $idx => $value) { + if ($value !== 0) { + $current_run = null; + continue; + } + + if ($current_run === null) { + $current_run = 1; + $current_index = $idx; + } else { + $current_run++; + } + + if ($current_run > $longest_run) { + $longest_run = $current_run; + $longest_index = $current_index; + } + } + + // Render the segments of the IPv6 address, omitting the longest run + // of consecutive "0" segments. + $pieces = array(); + for ($idx = 0; $idx < count($this->values); $idx++) { + $value = $this->values[$idx]; + + if ($idx === $longest_index) { + if ($longest_run > 1) { + $pieces[] = null; + $idx += ($longest_run - 1); + continue; + } + } + + $pieces[] = dechex($value); + } + + // If the omitted segment is at the beginning or end of the address, add + // an extra piece so we get the leading or trailing "::" when we implode + // the pieces. + if (head($pieces) === null) { + array_unshift($pieces, null); + } + + if (last($pieces) === null) { + $pieces[] = null; + } + + $this->displayAddress = implode(':', $pieces); + } + + return $this->displayAddress; + } + + public function toBits() { + if ($this->bits === null) { + $bits = ''; + foreach ($this->values as $value) { + for ($ii = 15; $ii >= 0; $ii--) { + $mask = (1 << $ii); + if (($value & $mask) === $mask) { + $bits .= '1'; + } else { + $bits .= '0'; + } + } + } + + $this->bits = $bits; + } + + return $this->bits; + } + +} diff --git a/src/ip/__tests__/PhutilIPAddressTestCase.php b/src/ip/__tests__/PhutilIPAddressTestCase.php new file mode 100644 index 00000000..1363fea8 --- /dev/null +++ b/src/ip/__tests__/PhutilIPAddressTestCase.php @@ -0,0 +1,339 @@ + true, + + // No nonsense. + '1.2.3' => false, + 'duck' => false, + '' => false, + '1 2 3 4' => false, + '.' => false, + '1.2.3.4.' => false, + '1..3.4' => false, + + // No leading zeroes. + '0.0.0.0' => true, + '0.0.0.01' => false, + + // No segments > 255. + '255.255.255.255' => true, + '255.255.255.256' => false, + ); + + foreach ($cases as $input => $expect) { + $caught = null; + try { + PhutilIPAddress::newAddress($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + !($caught instanceof Exception), + 'PhutilIPv4Address['.$input.']'); + } + } + + public function testValidIPv6Addresses() { + $cases = array( + '::' => true, + '::1' => true, + '1::' => true, + '1::1' => true, + '1:2:3:4:5:6:7:8' => true, + '1:2:3::5:6:7:8' => true, + '1:2:3::6:7:8' => true, + + // No nonsense. + 'quack:duck' => false, + '11111:22222::' => false, + + + // Too long. + '1:2:3:4:5:6:7:8:9' => false, + + // Too short. + '1:2:3' => false, + + // Too many omitted segments. + '1:2:3:::7:8:9' => false, + '1::3::7:8:9' => false, + ); + + foreach ($cases as $input => $expect) { + $caught = null; + try { + PhutilIPAddress::newAddress($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + !($caught instanceof Exception), + 'PhutilIPv6Address['.$input.']'); + } + } + + public function testIPv4AddressToBits() { + $cases = array( + '0.0.0.0' => '00000000000000000000000000000000', + '255.255.255.255' => '11111111111111111111111111111111', + '255.0.0.0' => '11111111000000000000000000000000', + '0.0.0.1' => '00000000000000000000000000000001', + '0.0.0.2' => '00000000000000000000000000000010', + '0.0.0.3' => '00000000000000000000000000000011', + ); + + foreach ($cases as $input => $expect) { + $actual = PhutilIPAddress::newAddress($input)->toBits(); + $this->assertEqual( + $expect, + $actual, + 'PhutilIPv4Address['.$input.']->toBits()'); + } + } + + public function testIPv6AddressToBits() { + $cases = array( + '::' => + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000', + '::1' => + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000001', + '1::' => + '0000000000000001 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000', + '::ffff:c000:0280' => + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 1111111111111111'. + PhutilIPAddress::newAddress('192.0.2.128')->toBits(), + '21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A' => + '0010000111011010 0000000011010011'. + '0000000000000000 0010111100111011'. + '0000001010101010 0000000011111111'. + '1111111000101000 1001110001011010', + '2001:db8::1' => + '0010000000000001 0000110110111000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000001', + + ); + + foreach ($cases as $input => $expect) { + // Remove any spaces, these are just to make the tests above easier to + // read. + $expect = str_replace(' ', '', $expect); + + $actual = PhutilIPAddress::newAddress($input)->toBits(); + $this->assertEqual( + $expect, + $actual, + 'PhutilIPv6Address['.$input.']->toBits()'); + } + } + + public function testIPv6AddressToAddress() { + $cases = array( + '::' => '::', + '::1' => '::1', + '::01' => '::1', + '0::0001' => '::1', + '0000::0001' => '::1', + '0000:0000::001' => '::1', + + '1::' => '1::', + '01::' => '1::', + '01::0' => '1::', + '0001::0000' => '1::', + + '1:0::0:2' => '1::2', + '1::0:2' => '1::2', + '1:0::2' => '1::2', + + 'CAFE::' => 'cafe::', + '0000:aBe:0:0:1::' => '0:abe:0:0:1::', + + '1:0:0:0:2:0:0:0' => '1::2:0:0:0', + '1:0:0:2:0:0:0:0' => '1:0:0:2::', + ); + + foreach ($cases as $input => $expect) { + $actual = PhutilIPAddress::newAddress($input)->getAddress(); + $this->assertEqual( + $expect, + $actual, + 'PhutilIPv6Address['.$input.']->getAddress()'); + } + } + + public function testValidIPv4CIDRBlocks() { + $cases = array( + // Valid block. + '1.0.0.0/16' => true, + + // No nonsense. + 'duck' => false, + '1/2/3' => false, + '23/0.0.0.0' => false, + '0.0.0.0/0.0.0.0' => false, + + // No leading zeroes. + '1.0.0.0/4' => true, + '1.0.0.0/04' => false, + + // No out-of-range masks. + '1.0.0.0/32' => true, + '1.0.0.0/33' => false, + ); + + foreach ($cases as $input => $expect) { + $caught = null; + try { + PhutilCIDRBlock::newBlock($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + !($caught instanceof Exception), + 'PhutilCIDRBlock['.$input.']'); + } + } + + public function testValidIPv6CIDRBlocks() { + $cases = array( + // Valid block. + '::/16' => true, + '::/128' => true, + + // No nonsense. + '::/1/2' => false, + '::/::' => false, + '::' => false, + + // No leading zeroes. + '::/01' => false, + + // No out-of-range masks. + '::/129' => false, + ); + + foreach ($cases as $input => $expect) { + $caught = null; + try { + PhutilCIDRBlock::newBlock($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + !($caught instanceof Exception), + 'PhutilCIDRBlock['.$input.']'); + } + } + + public function testIPv4CIDRBlockContains() { + $cases = array( + '0.0.0.0/0' => array( + '0.0.0.0' => true, + '1.1.1.1' => true, + '2.3.4.5' => true, + '::' => false, + '::1' => false, + '::ffff:0:0' => false, + ), + '0.0.0.2/32' => array( + '0.0.0.1' => false, + '0.0.0.2' => true, + '0.0.0.3' => false, + '::' => false, + ), + '172.30.0.0/16' => array( + '172.29.255.255' => false, + '172.30.0.0' => true, + '172.30.255.255' => true, + '172.31.0.0' => false, + '::' => false, + ), + ); + + foreach ($cases as $input_block => $tests) { + $block = PhutilCIDRBlock::newBlock($input_block); + foreach ($tests as $input => $expect) { + $this->assertEqual( + $expect, + $block->containsAddress($input), + 'PhutilCIDRBlock['.$input_block.']->containsAddress('.$input.')'); + } + } + } + + public function testIPv6CIDRBlockContains() { + $cases = array( + '::/0' => array( + '1::' => true, + '2::' => true, + '127.0.0.1' => false, + ), + '::ffff:0:0/96' => array( + '::ffff:0:0' => true, + '::ffff:ffff:ffff' => true, + '::fffe:0:0' => false, + '127.0.0.1' => false, + ), + ); + + foreach ($cases as $input_block => $tests) { + $block = PhutilCIDRBlock::newBlock($input_block); + foreach ($tests as $input => $expect) { + $this->assertEqual( + $expect, + $block->containsAddress($input), + 'PhutilCIDRBlock['.$input_block.']->containsAddress('.$input.')'); + } + } + } + + public function testCIDRList() { + $list = array( + '172.30.0.0/16', + '127.0.0.3/32', + ); + + $cases = array( + '0.0.0.0' => false, + '172.30.0.5' => true, + '127.0.0.2' => false, + '127.0.0.3' => true, + ); + + $list = PhutilCIDRList::newList($list); + + foreach ($cases as $input => $expect) { + $this->assertEqual( + $expect, + $list->containsAddress($input), + 'PhutilCIDRList->containsAddress('.$input.')'); + } + } + + +} diff --git a/src/lexer/PhutilJSONFragmentLexer.php b/src/lexer/PhutilJSONFragmentLexer.php new file mode 100644 index 00000000..f704e48f --- /dev/null +++ b/src/lexer/PhutilJSONFragmentLexer.php @@ -0,0 +1,27 @@ + array( + array('"', 's', 'double-quoted-string'), + array('\s+', null), + array('[\\[\\]{},:]', 'o'), + array('(?:true|false|null)', 'k'), + array('-?\d+(\.\d+([eE][-+]?\d+)?)?', 'mf'), + array('.', null), + ), + 'double-quoted-string' => array( + array('[^"\\\\]+', 's'), + array('"', 's', '!pop'), + array('\\\\u[0-9a-fA-F]{4}', 'k'), + array('\\\\.', 'k'), + ), + ); + } + +} diff --git a/src/lexer/PhutilJavaFragmentLexer.php b/src/lexer/PhutilJavaFragmentLexer.php new file mode 100644 index 00000000..fbc082e9 --- /dev/null +++ b/src/lexer/PhutilJavaFragmentLexer.php @@ -0,0 +1,120 @@ + array_merge( + $nonsemantic_rules, + array( + array('('.implode('|', $keywords).')\\b', 'k'), + array('@[^\\W\\d][\\w.]*', 'nd'), + array('('.implode('|', $declarations).')\\b', 'k'), + array('('.implode('|', $types).')\\b', 'kt'), + array('(package|import\\s+static|import)\\b', 'kn', 'import'), + array('('.implode('|', $constants).')\\b', 'kc'), + array('(class|interface)\\b', 'kd', 'class'), + array('"(\\\\.|[^"\\\\]+)*"', 's'), + array("'(\\\\.|[^\\\\]|\\\\u[0-9a-f-A-F]{4})'", 's'), + array('([^\\W\\d]|\\$)[\\w$]*:', 'nl'), + array('([^\\W\\d]|\\$)[\\w$]*', 'n'), + array( + '(([0-9][0-9_]*\\.([0-9][0-9_]*)?|'. + '\\.[0-9][0-9_]*)([eE][+-]?[0-9][0-9_]*)?[fFdD]?|'. + '[0-9][eE][+-]?[0-9][0-9_]*[fFdD]?|'. + '[0-9]([eE][+-]?[0-9][0-9_]*)?[fFdD]|'. + '0[xX]([0-9a-fA-F][0-9a-fA-F_]*\\.?|'. + '([0-9a-fA-F][0-9a-fA-F_]*)?\\.[0-9a-fA-F][0-9a-fA-F_]*)'. + '[pP][+-]?[0-9][0-9_]*[fFdD]?)', + 'mf', + ), + array('0[xX][0-9a-fA-F][0-9a-fA-F_]*[lL]?', 'mh'), + array('0[bB][01][01_]*[lL]?', 'mb'), + array('0[0-7_]+[lL]?', 'mo'), + array('(0|[1-9][0-9_]*[lL]?)', 'mi'), + array('([~^*!%&\\[\\](){}<>|+=:;,./?-])', 'o'), + array('(\S+|\s+)', null), + )), + 'class' => array_merge( + $nonsemantic_rules, + array( + array('([^\W\d]|\$)[\w$]*', 'nc', '!pop'), + array('', null, '!pop'), + )), + 'import' => array_merge( + $nonsemantic_rules, + array( + array('[\w.]+\*?', 'nn', '!pop'), + array('', null, '!pop'), + )), + ); + } + +} diff --git a/src/lexer/PhutilLexer.php b/src/lexer/PhutilLexer.php new file mode 100644 index 00000000..36cc897c --- /dev/null +++ b/src/lexer/PhutilLexer.php @@ -0,0 +1,362 @@ + array(...), + * 'state1' => array(...), + * 'state2' => array(...), + * ) + * + * Lexers start at the state named 'start'. Each state should have a list of + * rules which can match in that state. A list of rules looks like this: + * + * array( + * array('\s+', 'space'), + * array('\d+', 'digit'), + * array('\w+', 'word'), + * ) + * + * The lexer operates by processing each rule in the current state in order. + * When one matches, it produces a token. For example, the lexer above would + * lex this text: + * + * 3 asdf + * + * ...to produce these tokens (assuming the rules are for the 'start' state): + * + * array('digit', '3', null), + * array('space', ' ', null), + * array('word', 'asdf', null), + * + * A rule can also cause a state transition: + * + * array('zebra', 'animal', 'saw_zebra'), + * + * This would match the text "zebra", emit a token of type "animal", and change + * the parser state to "saw_zebra", causing the lexer to start using the rules + * from that state. + * + * To pop the lexer's state, you can use the special state '!pop'. + * + * Finally, you can provide additional options in the fourth parameter. + * Supported options are `case-insensitive` and `context`. + * + * Possible values for `context` are `push` (push the token value onto the + * context stack), `pop` (pop the context stack and use it to provide context + * for the token), and `discard` (pop the context stack and throw away the + * value). + * + * For example, to lex text like this: + * + * Class::CONSTANT + * + * You can use a rule set like this: + * + * 'start' => array( + * array('\w+(?=::)', 'class', 'saw_class', array('context' => 'push')), + * ), + * 'saw_class' => array( + * array('::', 'operator'), + * array('\w+', 'constant, '!pop', array('context' => 'pop')), + * ), + * + * This would parse the above text into this token stream: + * + * array('class', 'Class', null), + * array('operator', '::', null), + * array('constant', 'CONSTANT', 'Class'), + * + * For a concrete implementation, see @{class:PhutilPHPFragmentLexer}. + * + * @task lexerimpl Lexer Implementation + * @task rule Lexer Rules + * @task tokens Lexer Tokens + */ +abstract class PhutilLexer extends Phobject { + + private $processedRules; + private $lastState; + + +/* -( Lexer Rules )-------------------------------------------------------- */ + + + /** + * Return a set of rules for this lexer. See description in + * @{class:PhutilLexer}. + * + * @return dict Lexer rules. + * @task lexerimpl + */ + abstract protected function getRawRules(); + + +/* -( Lexer Rules )-------------------------------------------------------- */ + + + /** + * Process, normalize, and validate the raw lexer rules. + * + * @task rule + */ + protected function getRules() { + $class = get_class($this); + + $raw_rules = $this->getRawRules(); + + if (!is_array($raw_rules)) { + $type = gettype($raw_rules); + throw new UnexpectedValueException( + pht( + 'Expected %s to return array, got %s.', + $class.'->getRawRules()', + $type)); + } + + if (empty($raw_rules['start'])) { + throw new UnexpectedValueException( + pht( + "Expected %s rules to define rules for state '%s'.", + $class, + 'start')); + } + + $processed_rules = array(); + foreach ($raw_rules as $state => $rules) { + + if (!is_array($rules)) { + $type = gettype($rules); + throw new UnexpectedValueException( + pht( + "Expected list of rules for state '%s' in %s, got %s.", + $state, + $class, + $type)); + } + + foreach ($rules as $key => $rule) { + $n = count($rule); + if ($n < 2 || $n > 4) { + throw new UnexpectedValueException( + pht( + "Expected rule '%s' in state '%s' in %s to have 2-4 elements ". + "(regex, token, [next state], [options]), got %d.", + $key, + $state, + $class, + $n)); + } + $rule = array_values($rule); + if (count($rule) == 2) { + $rule[] = null; + } + if (count($rule) == 3) { + $rule[] = array(); + } + + foreach ($rule[3] as $option => $value) { + switch ($option) { + case 'context': + if ($value !== 'push' && + $value !== 'pop' && + $value !== 'discard' && + $value !== null) { + throw new UnexpectedValueException( + pht( + "Rule '%s' in state '%s' in %s has unknown ". + "context rule '%s', expected '%s', '%s' or '%s'.", + $key, + $state, + $class, + $value, + 'push', + 'pop', + 'discard')); + } + break; + default: + throw new UnexpectedValueException( + pht( + "Rule '%s' in state '%s' in %s has unknown option '%s'.", + $key, + $state, + $class, + $option)); + } + } + + $flags = 'sS'; + + // NOTE: The "\G" assertion is an offset-aware version of "^". + $rule[0] = '(\\G'.$rule[0].')'.$flags; + + if (@preg_match($rule[0], '') === false) { + $error = error_get_last(); + throw new UnexpectedValueException( + pht( + "Rule '%s' in state '%s' in %s defines an ". + "invalid regular expression ('%s'): %s", + $key, + $state, + $class, + $rule[0], + idx($error, 'message'))); + } + + $next_state = $rule[2]; + if ($next_state !== null && $next_state !== '!pop') { + if (empty($raw_rules[$next_state])) { + throw new UnexpectedValueException( + pht( + "Rule '%s' in state '%s' in %s transitions to ". + "state '%s', but there are no rules for that state.", + $key, + $state, + $class, + $next_state)); + } + } + + $processed_rules[$state][] = $rule; + } + } + + return $processed_rules; + } + + +/* -( Lexer Tokens )------------------------------------------------------- */ + + + /** + * Lex an input string into tokens. + * + * @param string Input string. + * @param string Initial lexer state. + * @return list List of lexer tokens. + * @task tokens + */ + public function getTokens($input, $initial_state = 'start') { + if (empty($this->processedRules)) { + $this->processedRules = $this->getRules(); + } + $rules = $this->processedRules; + + $this->lastState = null; + + $position = 0; + $length = strlen($input); + + $tokens = array(); + $states = array(); + $states[] = 'start'; + if ($initial_state != 'start') { + $states[] = $initial_state; + } + $context = array(); + while ($position < $length) { + $state_rules = idx($rules, end($states), array()); + foreach ($state_rules as $rule) { + + $matches = null; + if (!preg_match($rule[0], $input, $matches, 0, $position)) { + continue; + } + + list($regexp, $token_type, $next_state, $options) = $rule; + + $match_length = strlen($matches[0]); + if (!$match_length) { + if ($next_state === null) { + throw new UnexpectedValueException( + pht( + "Rule '%s' matched a zero-length token and causes no ". + "state transition.", + $regexp)); + } + } else { + $position += $match_length; + $token = array($token_type, $matches[0]); + + $copt = idx($options, 'context'); + if ($copt == 'push') { + $context[] = $matches[0]; + $token[] = null; + } else if ($copt == 'pop') { + if (empty($context)) { + throw new UnexpectedValueException( + pht("Rule '%s' popped empty context!", $regexp)); + } + $token[] = array_pop($context); + } else if ($copt == 'discard') { + if (empty($context)) { + throw new UnexpectedValueException( + pht("Rule '%s' discarded empty context!", $regexp)); + } + array_pop($context); + $token[] = null; + } else { + $token[] = null; + } + + $tokens[] = $token; + } + + if ($next_state !== null) { + if ($next_state == '!pop') { + array_pop($states); + if (empty($states)) { + throw new UnexpectedValueException( + pht("Rule '%s' popped off the last state.", $regexp)); + } + } else { + $states[] = $next_state; + } + } + + continue 2; + } + + throw new UnexpectedValueException( + pht('No lexer rule matched input at char %d.', $position)); + } + + $this->lastState = $states; + + return $tokens; + } + + + /** + * Merge adjacent tokens of the same type. For example, if a comment is + * tokenized as <"//", "comment">, this method will merge the two tokens into + * a single combined token. + */ + public function mergeTokens(array $tokens) { + $last = null; + $result = array(); + foreach ($tokens as $token) { + if ($last === null) { + $last = $token; + continue; + } + if (($token[0] == $last[0]) && ($token[2] == $last[2])) { + $last[1] .= $token[1]; + } else { + $result[] = $last; + $last = $token; + } + } + if ($last !== null) { + $result[] = $last; + } + return $result; + } + + public function getLexerState() { + return $this->lastState; + } + +} diff --git a/src/lexer/PhutilPHPFragmentLexer.php b/src/lexer/PhutilPHPFragmentLexer.php new file mode 100644 index 00000000..1d6ce3f6 --- /dev/null +++ b/src/lexer/PhutilPHPFragmentLexer.php @@ -0,0 +1,281 @@ + array( + array('<\\?(?i:php)?', 'cp', 'php'), + array('[^<]+', null), + array('<', null), + ), + + 'php' => array_merge(array( + array('\\?>', 'cp', '!pop'), + array( + '<<<([\'"]?)('.$identifier_pattern.')\\1\\n.*?\\n\\2\\;?\\n', + 's', + ), + ), $nonsemantic_rules, array( + array('(?i:__halt_compiler)\\b', 'cp', 'halt_compiler'), + array('(->|::)', 'o', 'attr'), + array('[~!%^&*+=|:.<>/?@-]+', 'o'), + array('[\\[\\]{}();,]', 'o'), + + // After 'new', try to match an unadorned symbol. + array('(?i:new|instanceof)\\b', 'k', 'possible_classname'), + array('(?i:function)\\b', 'k', 'function_definition'), + + // After 'extends' or 'implements', match a list of classes/interfaces. + array('(?i:extends|implements)\\b', 'k', 'class_list'), + + array('(?i:catch)\\b', 'k', 'catch'), + + array('(?i:'.implode('|', $keywords).')\\b', 'k'), + array('(?i:'.implode('|', $constants).')\\b', 'kc'), + + array('\\$+'.$identifier_pattern, 'nv'), + + // Match "f(" as a function and "C::" as a class. These won't work + // if you put a comment between the symbol and the operator, but + // that's a bizarre usage. + array($identifier_ns_pattern.'(?=\s*[\\(])', 'nf'), + array( + $identifier_ns_pattern.'(?=\s*::)', + 'nc', + 'context_attr', + array( + 'context' => 'push', + ), + ), + + array($identifier_ns_pattern, 'no'), + array('(\\d+\\.\\d*|\\d*\\.\\d+)([eE][+-]?[0-9]+)?', 'mf'), + array('\\d+[eE][+-]?[0-9]+', 'mf'), + array('0[0-7]+', 'mo'), + array('0[xX][a-fA-F0-9]+', 'mh'), + array('0[bB][0-1]+', 'm'), + array('\d+', 'mi'), + array("'", 's1', 'string1'), + array('`', 'sb', 'stringb'), + array('"', 's2', 'string2'), + array('.', null), + )), + + // We've just matched a class name, with a "::" lookahead. The name of + // the class is on the top of the context stack. We want to try to match + // the attribute or method (e.g., "X::C" or "X::f()"). + 'context_attr' => array_merge($nonsemantic_rules, array( + array('::', 'o'), + array( + $identifier_pattern.'(?=\s*[\\(])', + 'nf', + '!pop', + array( + 'context' => 'pop', + ), + ), + array( + $identifier_pattern, + 'na', + '!pop', + array( + 'context' => 'pop', + ), + ), + array( + '', + null, + '!pop', + array( + 'context' => 'discard', + ), + ), + )), + + // After '->' or '::', a symbol is an attribute name. Note that we end + // up in 'context_attr' instead of here in some cases. + 'attr' => array_merge($nonsemantic_rules, array( + array($identifier_pattern, 'na', '!pop'), + array('', null, '!pop'), + )), + + // After 'new', a symbol is a class name. + 'possible_classname' => array_merge($nonsemantic_rules, array( + array($identifier_ns_pattern, 'nc', '!pop'), + array('', null, '!pop'), + )), + + 'string1' => array( + array('[^\'\\\\]+', 's1'), + array("'", 's1', '!pop'), + array('\\\\.', 'k'), + array('\\\\$', 'k'), + ), + + 'stringb' => array( + array('[^`\\\\]+', 'sb'), + array('`', 'sb', '!pop'), + array('\\\\.', 'k'), + array('\\\\$', 'k'), + ), + + 'string2' => array( + array('[^"\\\\]+', 's2'), + array('"', 's2', '!pop'), + array('\\\\.', 'k'), + array('\\\\$', 'k'), + ), + + // In a function definition (after "function"), we don't link the name + // as a "nf" (name.function) since it is its own definition. + 'function_definition' => array_merge($nonsemantic_rules, array( + array('&', 'o'), + array('\\(', 'o', '!pop'), + array($identifier_pattern, 'no', '!pop'), + array('', null, '!pop'), + )), + + // For "//" and "#" comments, we need to break out if we see "?" followed + // by ">". + 'line_comment' => array( + array('[^?\\n]+', 'c'), + array('\\n', null, '!pop'), + array('(?=\\?>)', null, '!pop'), + array('\\?', 'c'), + ), + + // We've seen __halt_compiler. Grab the '();' afterward and then eat + // the rest of the file as raw data. + 'halt_compiler' => array_merge($nonsemantic_rules, array( + array('[()]', 'o'), + + array(';', 'o', 'compiler_halted'), + array('\\?>', 'o', 'compiler_halted'), + + // Just halt on anything else. + array('', null, 'compiler_halted'), + )), + + // __halt_compiler has taken effect. + 'compiler_halted' => array( + array('.+', null), + ), + + 'class_list' => array_merge($nonsemantic_rules, array( + array(',', 'o'), + array('(?i:implements)', 'k'), + array($identifier_ns_pattern, 'nc'), + array('', null, '!pop'), + )), + + 'catch' => array_merge($nonsemantic_rules, array( + array('\\(', 'o'), + array($identifier_ns_pattern, 'nc'), + array('', null, '!pop'), + )), + ); + } + +} diff --git a/src/lexer/PhutilPythonFragmentLexer.php b/src/lexer/PhutilPythonFragmentLexer.php new file mode 100644 index 00000000..efcc9ac6 --- /dev/null +++ b/src/lexer/PhutilPythonFragmentLexer.php @@ -0,0 +1,314 @@ + array_merge(array( + array('\\n', null), + // TODO: Docstrings should match only at the start of a line + array('""".*?"""', 'sd'), + array('\'\'\'.*?\'\'\'', 'sd'), + ), $nonsemantic_rules, array( + array('[]{}:(),;[]', 'p'), + array('\\\\\\n', null), + array('\\\\', null), + array('(?:in|is|and|or|not)\\b', 'ow'), + array('(?:!=|==|<<|>>|[-~+/*%=<>&^|.])', 'o'), + array('(?:'.implode('|', $keywords).')\\b', 'k'), + array('def(?=\\s)', 'k', 'funcname'), + array('class(?=\\s)', 'k', 'classname'), + array('from(?=\\s)', 'kn', 'fromimport'), + array('import(?=\\s)', 'kn', 'import'), + array('(? array_merge($nonsemantic_rules, array( + array('[a-zA-Z_]\w*', 'nf', '!pop'), + array('', null, '!pop'), + )), + + 'classname' => array_merge($nonsemantic_rules, array( + array('[a-zA-Z_]\w*', 'nc', '!pop'), + array('', null, '!pop'), + )), + + 'fromimport' => array_merge($nonsemantic_rules, array( + array('import\b', 'kn', '!pop'), + // if None occurs here, it's "raise x from None", since None can + // never be a module name + array('None\b', 'bp', '!pop'), + // sadly, in "raise x from y" y will be highlighted as namespace too + array('[a-zA-Z_.][\w.]*', 'nn'), + array('', null, '!pop'), + )), + + 'import' => array_merge($nonsemantic_rules, array( + array('as\b', 'kn'), + array(',', 'o'), + array('[a-zA-Z_.][\w.]*', 'nn'), + array('', null, '!pop'), + )), + + 'dqs_raw' => $dqs, + 'sqs_raw' => $sqs, + 'dqs' => array_merge($stringescape, $dqs), + 'sqs' => array_merge($stringescape, $sqs), + 'tdqs_raw' => $tdqs, + 'tsqs_raw' => $tsqs, + 'tdqs' => array_merge($stringescape, $tdqs), + 'tsqs' => array_merge($stringescape, $tsqs), + ); + } + +} diff --git a/src/lexer/PhutilShellLexer.php b/src/lexer/PhutilShellLexer.php new file mode 100644 index 00000000..d4e8c523 --- /dev/null +++ b/src/lexer/PhutilShellLexer.php @@ -0,0 +1,86 @@ +getTokens($string); + if (count($this->getLexerState()) > 1) { + throw new UnexpectedValueException( + pht('Unterminated string in argument list!')); + } + + foreach ($tokens as $key => $token) { + switch ($token[0]) { + case "'": + case '"': + unset($tokens[$key]); + break; + case 'esc': + $tokens[$key][0] = 'arg'; + $tokens[$key][1] = substr($token[1], 1); + break; + default: + break; + } + } + + $tokens = $this->mergeTokens(array_values($tokens)); + + $argv = array(); + foreach ($tokens as $token) { + if ($token[0] == 'arg') { + $argv[] = $token[1]; + } + } + + return $argv; + } + + protected function getRawRules() { + return array( + 'start' => array( + array('\s+', ' '), + array("'", "'", 'string1'), + array('"', '"', 'string2'), + array('\\\\.', 'esc'), + array('[^\\s\'"\\\\]+', 'arg'), + ), + 'string1' => array( + // NOTE: In a single-quoted string, backslash is not an escape. + array('[^\']+', 'arg'), + array("'", "'", '!pop'), + ), + 'string2' => array( + // NOTE: In a double-quoted string, backslash IS an escape, but only + // for some characters: ", $, `, \ and newline. + array('[^"\\\\]+', 'arg'), + array('"', '"', '!pop'), + array('\\\\["$`\\\\\\n]', 'esc'), + array('\\\\.', 'arg'), + ), + ); + } + +} diff --git a/src/lexer/PhutilSimpleOptionsLexer.php b/src/lexer/PhutilSimpleOptionsLexer.php new file mode 100644 index 00000000..c83c19d4 --- /dev/null +++ b/src/lexer/PhutilSimpleOptionsLexer.php @@ -0,0 +1,90 @@ +getTokens($input); + + foreach ($tokens as $key => $token) { + list($type, $value) = $token; + switch ($type) { + case 'esc': + $tokens[$key][0] = 'word'; + $tokens[$key][1] = substr($value, 1); + break; + } + } + + $tokens = $this->mergeTokens($tokens); + + // Find spaces in between two words and turn them into words. This allows + // us to parse unescaped spaces in values correctly. + for ($ii = 0; $ii < count($tokens); $ii++) { + list($type, $value) = $tokens[$ii]; + if ($type != ' ') { + continue; + } + $last = idx($tokens, $ii - 1); + if (!$last) { + continue; + } + $next = idx($tokens, $ii + 1); + if (!$next) { + continue; + } + if ($last[0] == 'word' && $next[0] == 'word') { + $tokens[$ii][0] = 'word'; + } + } + + // NOTE: Strip these only after merging tokens, so "a b" merges into two + // words, "a" and "b", not a single "ab" word. + foreach ($tokens as $key => $token) { + list($type, $value) = $token; + switch ($type) { + case "'": + case '"': + case ' ': + unset($tokens[$key]); + break; + } + } + + return array_values($tokens); + } + + protected function getRawRules() { + return array( + 'start' => array( + array('\s+', ' '), + array("'", "'", 'string1'), + array('"', '"', 'string2'), + array(',', ','), + array('=', '='), + array('[^\\s\'"=,]+', 'word'), + ), + 'string1' => array( + array('[^\'\\\\]+', 'word'), + array("'", "'", '!pop'), + array('\\\\.', 'esc'), + array('\\\\$', '!pop'), + ), + 'string2' => array( + array('[^"\\\\]+', 'word'), + array('"', '"', '!pop'), + array('\\\\.', 'esc'), + array('\\\\$', '!pop'), + ), + ); + } + +} diff --git a/src/lexer/PhutilTypeLexer.php b/src/lexer/PhutilTypeLexer.php new file mode 100644 index 00000000..0ebe88a8 --- /dev/null +++ b/src/lexer/PhutilTypeLexer.php @@ -0,0 +1,32 @@ + array( + array('\s+', ' '), + array('\\|', '|'), + array('<', '<'), + array('>', '>'), + array(',', ','), + array('\\?', '?'), + array('optional', 'opt'), + array('map', 'map'), + array('list', 'list'), + array('int|float|bool|string|null|callable|wild|regex', 'k'), + array('\\\\?[a-zA-Z_\x7f-\xff]+(\\\\[a-zA-Z_\x7f-\xff]+)*', 'k'), + array('\\(', '(', 'comment'), + ), + 'comment' => array( + array('\\)', ')', '!pop'), + array('[^\\)]+', 'cm'), + ), + ); + } + +} diff --git a/src/lexer/__tests__/PhutilPHPFragmentLexerTestCase.php b/src/lexer/__tests__/PhutilPHPFragmentLexerTestCase.php new file mode 100644 index 00000000..33dde736 --- /dev/null +++ b/src/lexer/__tests__/PhutilPHPFragmentLexerTestCase.php @@ -0,0 +1,317 @@ +runLexer($file, $data); + } + } + + private function runLexer($file, $data) { + $lexer = new PhutilPHPFragmentLexer(); + + $initial_state = 'start'; + switch ($file) { + case 'pop-from-php.txt': + $initial_state = 'php'; + break; + case 'trailing-backslash-1.txt': + case 'trailing-backslash-2.txt': + case 'trailing-backslash-b.txt': + // It's important these test cases not have trailing newlines. + $data = rtrim($data); + break; + } + + $caught = null; + $tokens = null; + try { + $tokens = $lexer->getTokens($data, $initial_state); + } catch (Exception $ex) { + $caught = $ex; + } + + switch ($file) { + case 'basics.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $tokens = $lexer->mergeTokens($tokens); + $this->assertEqual( + array( + array('cp', '', null), + array(null, "\n\nd\n", null), + ), + $tokens, + $file); + break; + case 'extendsimplements.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', '?>', null), + array(null, "\n", null), + ), + $tokens, + $file); + break; + case 'trailing-backslash-1.txt': + case 'trailing-backslash-2.txt': + case 'trailing-backslash-b.txt': + $this->assertEqual(null, $caught); + break; + default: + throw new Exception(pht("No assertion block for test '%s'!", $file)); + } + } + + +} diff --git a/src/lexer/__tests__/PhutilShellLexerTestCase.php b/src/lexer/__tests__/PhutilShellLexerTestCase.php new file mode 100644 index 00000000..eeff827e --- /dev/null +++ b/src/lexer/__tests__/PhutilShellLexerTestCase.php @@ -0,0 +1,208 @@ +runLexer($file, $data); + } + } + + private function runLexer($file, $data) { + $lexer = new PhutilShellLexer(); + + $initial_state = 'start'; + + $caught = null; + $tokens = null; + try { + $tokens = $lexer->getTokens($data, $initial_state); + } catch (Exception $ex) { + $caught = $ex; + } + + $argv = null; + try { + $argv = $lexer->splitArguments($data); + } catch (Exception $ex) { + // Ignore; not diagnostically useful. + } + + switch ($file) { + case 'basic.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array('arg', 'arg1', null), + array(' ', ' ', null), + array('arg', 'arg2', null), + array(' ', ' ', null), + array('arg', 'arg3', null), + ), + $tokens, + $file); + $this->assertEqual( + array( + 'arg1', + 'arg2', + 'arg3', + ), + $argv, + $file); + break; + case 'escape.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array("'", "'", null), + array('arg', '\\', null), + array("'", "'", null), + array(' ', ' ', null), + array('"', '"', null), + array('esc', '\\"', null), + array('"', '"', null), + ), + $tokens, + $file); + $this->assertEqual( + array( + '\\', + '"', + ), + $argv, + $file); + break; + case 'slashes.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array('arg', 'a', null), + array('esc', '\\ ', null), + array('arg', 'b', null), + array(' ', ' ', null), + array("'", "'", null), + array('arg', 'a\\b', null), + array("'", "'", null), + array(' ', ' ', null), + array('"', '"', null), + array('arg', 'a', null), + array('arg', '\\b', null), + array('"', '"', null), + array(' ', ' ', null), + array('"', '"', null), + array('esc', '\\$', null), + array('esc', '\\`', null), + array('esc', '\\\\', null), + array('esc', '\\"', null), + array('esc', '\\'."\n", null), + array('arg', 'xyz', null), + array('"', '"', null), + ), + $tokens, + $file); + $this->assertEqual( + array( + 'a b', + 'a\\b', + 'a\\b', + '$`\\"'."\n".'xyz', + ), + $argv, + $file); + break; + case 'spaces.txt': + $this->assertEqual( + array( + array('arg', 'arg1', null), + array(' ', ' ', null), + array('arg', 'arg2', null), + array(' ', ' ', null), + array('arg', 'arg3', null), + ), + $tokens, + $file); + $this->assertEqual( + array( + 'arg1', + 'arg2', + 'arg3', + ), + $argv, + $file); + break; + case 'strings.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array('arg', 'a', null), + array(' ', ' ', null), + array("'", "'", null), + array('arg', 'b', null), + array("'", "'", null), + array(' ', ' ', null), + array('"', '"', null), + array('arg', 'c', null), + array('"', '"', null), + array(' ', ' ', null), + array("'", "'", null), + array('arg', 'd', null), + array("'", "'", null), + array("'", "'", null), + array('arg', 'e', null), + array("'", "'", null), + array(' ', ' ', null), + array('"', '"', null), + array('arg', 'f', null), + array('"', '"', null), + array('"', '"', null), + array('arg', 'g', null), + array('"', '"', null), + array(' ', ' ', null), + array('"', '"', null), + array('arg', 'h', null), + array('"', '"', null), + array('"', '"', null), + array('arg', "'", null), + array('"', '"', null), + array('"', '"', null), + array('arg', 'i', null), + array('"', '"', null), + ), + $tokens, + $file); + $this->assertEqual( + array( + 'a', + 'b', + 'c', + 'de', + 'fg', + 'h\'i', + ), + $argv, + $file); + break; + case 'unterminated.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + 'start', + 'string1', + ), + $lexer->getLexerState(), + $file); + $this->assertEqual( + null, + $argv, + $file); + break; + default: + throw new Exception(pht("No assertion block for test '%s'!", $file)); + } + } + + +} diff --git a/src/lexer/__tests__/PhutilSimpleOptionsLexerTestCase.php b/src/lexer/__tests__/PhutilSimpleOptionsLexerTestCase.php new file mode 100644 index 00000000..599f1933 --- /dev/null +++ b/src/lexer/__tests__/PhutilSimpleOptionsLexerTestCase.php @@ -0,0 +1,61 @@ +assertEqual( + array( + array('word', 'legs', null), + array('=', '=', null), + array('word', '4', null), + ), + $this->getTokens('legs=4')); + + $this->assertEqual( + array( + array('word', 'legs', null), + array('=', '=', null), + array('word', '4', null), + array(',', ',', null), + array(' ', ' ', null), + array('word', 'LEGS', null), + array('=', '=', null), + array('word', '4', null), + ), + $this->getTokens('legs=4, LEGS=4')); + } + + public function testSimpleOptionsLexerNiceTokens() { + $this->assertEqual( + array( + array('word', 'legs', null), + ), + $this->getNiceTokens(' legs ')); + + $this->assertEqual( + array( + array('word', 'a', null), + array('word', ' ', null), + array('word', 'b', null), + ), + $this->getNiceTokens(' a b ')); + + $this->assertEqual( + array( + array('word', 'a', null), + array('word', 'b', null), + ), + $this->getNiceTokens('"a""b"')); + } + + private function getTokens($input) { + $lexer = new PhutilSimpleOptionsLexer(); + return $lexer->getTokens($input); + } + + private function getNiceTokens($input) { + $lexer = new PhutilSimpleOptionsLexer(); + return $lexer->getNiceTokens($input); + } + +} diff --git a/src/lexer/__tests__/php/basics.txt b/src/lexer/__tests__/php/basics.txt new file mode 100644 index 00000000..a701c8f0 --- /dev/null +++ b/src/lexer/__tests__/php/basics.txt @@ -0,0 +1 @@ + + +d diff --git a/src/lexer/__tests__/php/extendsimplements.txt b/src/lexer/__tests__/php/extendsimplements.txt new file mode 100644 index 00000000..59067bcc --- /dev/null +++ b/src/lexer/__tests__/php/extendsimplements.txt @@ -0,0 +1,3 @@ + diff --git a/src/lexer/__tests__/php/symbols.txt b/src/lexer/__tests__/php/symbols.txt new file mode 100644 index 00000000..3ce2fabe --- /dev/null +++ b/src/lexer/__tests__/php/symbols.txt @@ -0,0 +1,8 @@ +raiseLintInLibrary( $library, diff --git a/src/lint/linter/xhpast/rules/ArcanistPHPCompatibilityXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistPHPCompatibilityXHPASTLinterRule.php index f3dd662e..743d1484 100644 --- a/src/lint/linter/xhpast/rules/ArcanistPHPCompatibilityXHPASTLinterRule.php +++ b/src/lint/linter/xhpast/rules/ArcanistPHPCompatibilityXHPASTLinterRule.php @@ -17,8 +17,8 @@ final class ArcanistPHPCompatibilityXHPASTLinterRule } if ($compat_info === null) { - $target = phutil_get_library_root('phutil'). - '/../resources/php_compat_info.json'; + $target = phutil_get_library_root('arcanist'). + '/../resources/php/symbol-information.json'; $compat_info = phutil_json_decode(Filesystem::readFile($target)); } diff --git a/src/moduleutils/PhutilLibraryMapBuilder.php b/src/moduleutils/PhutilLibraryMapBuilder.php new file mode 100644 index 00000000..410ff8fc --- /dev/null +++ b/src/moduleutils/PhutilLibraryMapBuilder.php @@ -0,0 +1,514 @@ +root = $root; + } + + /** + * Control status output. Use `--quiet` to set this. + * + * @param bool If true, don't show status output. + * @return this + * + * @task map + */ + public function setQuiet($quiet) { + $this->quiet = $quiet; + return $this; + } + + /** + * Control subprocess parallelism limit. Use `--limit` to set this. + * + * @param int Maximum number of subprocesses to run in parallel. + * @return this + * + * @task map + */ + public function setSubprocessLimit($limit) { + $this->subprocessLimit = $limit; + return $this; + } + + /** + * Get the map of symbols in this library, analyzing the library to build it + * if necessary. + * + * @return map Information about symbols in this library. + * + * @task map + */ + public function buildMap() { + if ($this->librarySymbolMap === null) { + $this->analyzeLibrary(); + } + return $this->librarySymbolMap; + } + + + /** + * Get the map of files in this library, analyzing the library to build it + * if necessary. + * + * Returns a map of file paths to information about symbols used and defined + * in the file. + * + * @return map Information about files in this library. + * + * @task map + */ + public function buildFileSymbolMap() { + if ($this->fileSymbolMap === null) { + $this->analyzeLibrary(); + } + return $this->fileSymbolMap; + } + + /** + * Build and update the library map. + * + * @return void + * + * @task map + */ + public function buildAndWriteMap() { + $library_map = $this->buildMap(); + + $this->log(pht('Writing map...')); + $this->writeLibraryMap($library_map); + } + + /** + * Write a status message to the user, if not running in quiet mode. + * + * @param string Message to write. + * @return this + * + * @task map + */ + private function log($message) { + if (!$this->quiet) { + @fwrite(STDERR, "%s\n", $message); + } + return $this; + } + + +/* -( Path Management )---------------------------------------------------- */ + + /** + * Get the path to some file in the library. + * + * @param string A library-relative path. If omitted, returns the library + * root path. + * @return string An absolute path. + * + * @task path + */ + private function getPath($path = '') { + return $this->root.'/'.$path; + } + + /** + * Get the path to the symbol cache file. + * + * @return string Absolute path to symbol cache. + * + * @task path + */ + private function getPathForSymbolCache() { + return $this->getPath('.phutil_module_cache'); + } + + /** + * Get the path to the map file. + * + * @return string Absolute path to the library map. + * + * @task path + */ + private function getPathForLibraryMap() { + return $this->getPath('__phutil_library_map__.php'); + } + + /** + * Get the path to the library init file. + * + * @return string Absolute path to the library init file + * + * @task path + */ + private function getPathForLibraryInit() { + return $this->getPath('__phutil_library_init__.php'); + } + + +/* -( Symbol Analysis and Caching )---------------------------------------- */ + + /** + * Load the library symbol cache, if it exists and is readable and valid. + * + * @return dict Map of content hashes to cache of output from + * `phutil_symbols.php`. + * + * @task symbol + */ + private function loadSymbolCache() { + $cache_file = $this->getPathForSymbolCache(); + + try { + $cache = Filesystem::readFile($cache_file); + } catch (Exception $ex) { + $cache = null; + } + + $symbol_cache = array(); + if ($cache) { + try { + $symbol_cache = phutil_json_decode($cache); + } catch (PhutilJSONParserException $ex) { + $symbol_cache = array(); + } + } + + $version = idx($symbol_cache, self::SYMBOL_CACHE_VERSION_KEY); + if ($version != self::SYMBOL_CACHE_VERSION) { + // Throw away caches from a different version of the library. + $symbol_cache = array(); + } + unset($symbol_cache[self::SYMBOL_CACHE_VERSION_KEY]); + + return $symbol_cache; + } + + /** + * Write a symbol map to disk cache. + * + * @param dict Symbol map of relative paths to symbols. + * @param dict Source map (like @{method:loadSourceFileMap}). + * @return void + * + * @task symbol + */ + private function writeSymbolCache(array $symbol_map, array $source_map) { + $cache_file = $this->getPathForSymbolCache(); + + $cache = array( + self::SYMBOL_CACHE_VERSION_KEY => self::SYMBOL_CACHE_VERSION, + ); + + foreach ($symbol_map as $file => $symbols) { + $cache[$source_map[$file]] = $symbols; + } + + $json = json_encode($cache); + try { + Filesystem::writeFile($cache_file, $json); + } catch (FilesystemException $ex) { + $this->log(pht('Unable to save the cache!')); + } + } + + /** + * Drop the symbol cache, forcing a clean rebuild. + * + * @return this + * + * @task symbol + */ + public function dropSymbolCache() { + $this->log(pht('Dropping symbol cache...')); + Filesystem::remove($this->getPathForSymbolCache()); + } + + /** + * Build a future which returns a `phutil_symbols.php` analysis of a source + * file. + * + * @param string Relative path to the source file to analyze. + * @return Future Analysis future. + * + * @task symbol + */ + private function buildSymbolAnalysisFuture($file) { + $absolute_file = $this->getPath($file); + $bin = dirname(__FILE__).'/../../support/lib/extract-symbols.php'; + + return new ExecFuture('php -f %R -- --ugly %R', $bin, $absolute_file); + } + + +/* -( Source Management )-------------------------------------------------- */ + + /** + * Build a map of all source files in a library to hashes of their content. + * Returns an array like this: + * + * array( + * 'src/parser/ExampleParser.php' => '60b725f10c9c85c70d97880dfe8191b3', + * // ... + * ); + * + * @return dict Map of library-relative paths to content hashes. + * @task source + */ + private function loadSourceFileMap() { + $root = $this->getPath(); + + $init = $this->getPathForLibraryInit(); + if (!Filesystem::pathExists($init)) { + throw new Exception( + pht( + "Provided path '%s' is not a %s library.", + $root, + 'phutil')); + } + + $files = id(new FileFinder($root)) + ->withType('f') + ->withSuffix('php') + ->excludePath('*/.*') + ->setGenerateChecksums(true) + ->find(); + + $extensions_dir = 'extensions/'; + $extensions_len = strlen($extensions_dir); + + $map = array(); + foreach ($files as $file => $hash) { + $file = Filesystem::readablePath($file, $root); + $file = ltrim($file, '/'); + + if (dirname($file) == '.') { + // We don't permit normal source files at the root level, so just ignore + // them; they're special library files. + continue; + } + + // Ignore files in the extensions/ directory. + if (!strncmp($file, $extensions_dir, $extensions_len)) { + continue; + } + + // We include also filename in the hash to handle cases when the file is + // moved without modifying its content. + $map[$file] = md5($hash.$file); + } + + return $map; + } + + /** + * Convert the symbol analysis of all the source files in the library into + * a library map. + * + * @param dict Symbol analysis of all source files. + * @return dict Library map. + * @task source + */ + private function buildLibraryMap(array $symbol_map) { + $library_map = array( + 'class' => array(), + 'function' => array(), + 'xmap' => array(), + ); + + // Detect duplicate symbols within the library. + foreach ($symbol_map as $file => $info) { + foreach ($info['have'] as $type => $symbols) { + foreach ($symbols as $symbol => $declaration) { + $lib_type = ($type == 'interface') ? 'class' : $type; + if (!empty($library_map[$lib_type][$symbol])) { + $prior = $library_map[$lib_type][$symbol]; + throw new Exception( + pht( + "Definition of %s '%s' in file '%s' duplicates prior ". + "definition in file '%s'. You can not declare the ". + "same symbol twice.", + $type, + $symbol, + $file, + $prior)); + } + $library_map[$lib_type][$symbol] = $file; + } + } + $library_map['xmap'] += $info['xmap']; + } + + // Simplify the common case (one parent) to make the file a little easier + // to deal with. + foreach ($library_map['xmap'] as $class => $extends) { + if (count($extends) == 1) { + $library_map['xmap'][$class] = reset($extends); + } + } + + // Sort the map so it is relatively stable across changes. + foreach ($library_map as $key => $symbols) { + ksort($symbols); + $library_map[$key] = $symbols; + } + ksort($library_map); + + return $library_map; + } + + /** + * Write a finalized library map. + * + * @param dict Library map structure to write. + * @return void + * + * @task source + */ + private function writeLibraryMap(array $library_map) { + $map_file = $this->getPathForLibraryMap(); + $version = self::LIBRARY_MAP_VERSION; + + $library_map = array( + self::LIBRARY_MAP_VERSION_KEY => $version, + ) + $library_map; + + $library_map = phutil_var_export($library_map); + $at = '@'; + + $source_file = <<log(pht('Finding source files...')); + $source_map = $this->loadSourceFileMap(); + $this->log( + pht('Found %s files.', new PhutilNumber(count($source_map)))); + + // Load the symbol cache with existing parsed symbols. This allows us + // to remap libraries quickly by analyzing only changed files. + $this->log(pht('Loading symbol cache...')); + $symbol_cache = $this->loadSymbolCache(); + + // If the XHPAST binary is not up-to-date, build it now. Otherwise, + // `phutil_symbols.php` will attempt to build the binary and will fail + // miserably because it will be trying to build the same file multiple + // times in parallel. + if (!PhutilXHPASTBinary::isAvailable()) { + PhutilXHPASTBinary::build(); + } + + // Build out the symbol analysis for all the files in the library. For + // each file, check if it's in cache. If we miss in the cache, do a fresh + // analysis. + $symbol_map = array(); + $futures = array(); + foreach ($source_map as $file => $hash) { + if (!empty($symbol_cache[$hash])) { + $symbol_map[$file] = $symbol_cache[$hash]; + continue; + } + $futures[$file] = $this->buildSymbolAnalysisFuture($file); + } + $this->log( + pht('Found %s files in cache.', new PhutilNumber(count($symbol_map)))); + + // Run the analyzer on any files which need analysis. + if ($futures) { + $limit = $this->subprocessLimit; + + $this->log( + pht( + 'Analyzing %s file(s) with %s subprocess(es)...', + phutil_count($futures), + new PhutilNumber($limit))); + + $progress = new PhutilConsoleProgressBar(); + if ($this->quiet) { + $progress->setQuiet(true); + } + $progress->setTotal(count($futures)); + + $futures = id(new FutureIterator($futures)) + ->limit($limit); + foreach ($futures as $file => $future) { + $result = $future->resolveJSON(); + if (empty($result['error'])) { + $symbol_map[$file] = $result; + } else { + $progress->done(false); + throw new XHPASTSyntaxErrorException( + $result['line'], + $file.': '.$result['error']); + } + $progress->update(1); + } + $progress->done(); + } + + $this->fileSymbolMap = $symbol_map; + + // We're done building the cache, so write it out immediately. Note that + // we've only retained entries for files we found, so this implicitly cleans + // out old cache entries. + $this->writeSymbolCache($symbol_map, $source_map); + + // Our map is up to date, so either show it on stdout or write it to disk. + $this->log(pht('Building library map...')); + + $this->librarySymbolMap = $this->buildLibraryMap($symbol_map); + } + + +} diff --git a/src/object/Phobject.php b/src/object/Phobject.php new file mode 100644 index 00000000..0a7a59ee --- /dev/null +++ b/src/object/Phobject.php @@ -0,0 +1,104 @@ +throwOnAttemptedIteration(); + } + + public function key() { + $this->throwOnAttemptedIteration(); + } + + public function next() { + $this->throwOnAttemptedIteration(); + } + + public function rewind() { + $this->throwOnAttemptedIteration(); + } + + public function valid() { + $this->throwOnAttemptedIteration(); + } + + private function throwOnAttemptedIteration() { + throw new DomainException( + pht( + 'Attempting to iterate an object (of class %s) which is not iterable.', + get_class($this))); + } + + + /** + * Read the value of a class constant. + * + * This is the same as just typing `self::CONSTANTNAME`, but throws a more + * useful message if the constant is not defined and allows the constant to + * be limited to a maximum length. + * + * @param string Name of the constant. + * @param int|null Maximum number of bytes permitted in the value. + * @return string Value of the constant. + */ + public function getPhobjectClassConstant($key, $byte_limit = null) { + $class = new ReflectionClass($this); + + $const = $class->getConstant($key); + if ($const === false) { + throw new Exception( + pht( + '"%s" class "%s" must define a "%s" constant.', + __CLASS__, + get_class($this), + $key)); + } + + if ($byte_limit !== null) { + if (!is_string($const) || (strlen($const) > $byte_limit)) { + throw new Exception( + pht( + '"%s" class "%s" has an invalid "%s" property. Field constants '. + 'must be strings and no more than %s bytes in length.', + __CLASS__, + get_class($this), + $key, + new PhutilNumber($byte_limit))); + } + } + + return $const; + } + +} diff --git a/src/object/__tests__/PhobjectTestCase.php b/src/object/__tests__/PhobjectTestCase.php new file mode 100644 index 00000000..d401b481 --- /dev/null +++ b/src/object/__tests__/PhobjectTestCase.php @@ -0,0 +1,40 @@ +duck; + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof DomainException); + + $caught = null; + try { + $object->duck = 'quack'; + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof DomainException); + } + + public function testThrowOnIteration() { + $object = new PhutilTestPhobject(); + + $caught = null; + try { + foreach ($object as $item) { + // ... + } + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof DomainException); + } + +} diff --git a/src/object/__tests__/PhutilTestPhobject.php b/src/object/__tests__/PhutilTestPhobject.php new file mode 100644 index 00000000..7bd5b81b --- /dev/null +++ b/src/object/__tests__/PhutilTestPhobject.php @@ -0,0 +1,3 @@ +setBugtraqPattern('http://bugs.com/%BUGID%') + * ->setBugtraqCaptureExpression('/[Ii]ssues?:?(\s*,?\s*#\d+)+/') + * ->setBugtraqSelectExpression('/(\d+)/') + * ->processCorpus($message); + * + * This will produce: + * + * Issues: http://bugs.com/123, http://bugs.com/345 + * + */ +final class PhutilBugtraqParser extends Phobject { + + private $bugtraqPattern; + private $bugtraqCaptureExpression; + private $bugtraqSelectExpression; + + public function setBugtraqPattern($pattern) { + $this->bugtraqPattern = $pattern; + return $this; + } + + public function setBugtraqCaptureExpression($regex) { + PhutilTypeSpec::newFromString('regex')->check($regex); + + $this->bugtraqCaptureExpression = $regex; + return $this; + } + + public function setBugtraqSelectExpression($regex) { + PhutilTypeSpec::newFromString('regex')->check($regex); + + $this->bugtraqSelectExpression = $regex; + return $this; + } + + public function processCorpus($corpus) { + $regexp = $this->bugtraqCaptureExpression; + $matches = null; + $flags = PREG_SET_ORDER | PREG_OFFSET_CAPTURE; + + // First, find all the matching text ranges. We do this up front because + // when we do the replacement pass at the end, the whole thing needs to go + // in reverse order. + + preg_match_all($regexp, $corpus, $matches, $flags); + $captures = array(); + foreach ($matches as $match) { + list($captured_text, $captured_offset) = $match[0]; + $captures[] = array( + 'text' => $captured_text, + 'at' => $captured_offset, + ); + } + + // Find the actual bug IDs. If there's a selection expression, we use that + // to pick bug IDs out of a larger context. For example, the syntax may be: + // + // Issues: 123, 124 + // + // In this case, "123" and "124" are the issue IDs, and could be selected + // with an expression like: + // + // /(\d+)/ + // + // If there's no selection expression, we use the entire match. + + $bug_ids = array(); + $select_regexp = $this->bugtraqSelectExpression; + foreach ($captures as $capture) { + $captured_text = $capture['text']; + $captured_offset = $capture['at']; + + if (strlen($select_regexp)) { + $selections = null; + preg_match_all( + $select_regexp, + $captured_text, + $selections, + PREG_OFFSET_CAPTURE); + + foreach ($selections[1] as $selection) { + $bug_ids[] = array( + 'text' => $selection[0], + 'at' => $captured_offset + $selection[1], + ); + } + } else { + $bug_ids[] = array( + 'text' => $captured_text, + 'at' => $captured_offset, + ); + } + } + + // Now that we have all the bug IDs to replace, replace them (in reverse + // order, so the offsets don't get messed up). + $bug_ids = array_reverse($bug_ids); + foreach ($bug_ids as $bug) { + $new_text = str_replace( + '%BUGID%', + $bug['text'], + $this->bugtraqPattern); + + $corpus = substr_replace( + $corpus, + $new_text, + $bug['at'], + strlen($bug['text'])); + } + + return $corpus; + } + +} diff --git a/src/parser/PhutilDocblockParser.php b/src/parser/PhutilDocblockParser.php new file mode 100644 index 00000000..a1eda282 --- /dev/null +++ b/src/parser/PhutilDocblockParser.php @@ -0,0 +1,163 @@ + line number. + $map = array(); + $lines = explode("\n", $text); + $num = 1; + foreach ($lines as $line) { + $len = strlen($line) + 1; + for ($jj = 0; $jj < $len; $jj++) { + $map[] = $num; + } + ++$num; + } + + foreach ($matches[0] as $match) { + list($data, $offset) = $match; + $blocks[] = array($data, $map[$offset]); + } + + return $blocks; + } + + public function parse($docblock) { + // Strip off comments. + $docblock = trim($docblock); + $docblock = preg_replace('@^/\*\*@', '', $docblock); + $docblock = preg_replace('@\*/$@', '', $docblock); + $docblock = preg_replace('@^\s*\*@m', '', $docblock); + + // Normalize multi-line @specials. + $lines = explode("\n", $docblock); + $last = false; + foreach ($lines as $k => $line) { + + // NOTE: We allow "@specials" to be preceded by up to two whitespace + // characters; more than that and we assume the block is a code block. + // Broadly, there's ambiguity between a special like: + // + // <... lots of indentation ...> @author alincoln + // + // ...and a code block like: + // + // <... lots of indentation ...> @def square(x, y): + // + // Because standard practice is to indent the entire block one level, + // we allow that and one additional space before assuming something is + // a code block. + + if (preg_match('/^\s{0,2}@\w/i', $line)) { + $last = $k; + $lines[$last] = trim($line); + } else if (preg_match('/^\s*$/', $line)) { + $last = false; + } else if ($last !== false) { + $lines[$last] = $lines[$last].' '.trim($line); + unset($lines[$k]); + } + } + + $docblock = implode("\n", $lines); + + $special = array(); + + // Parse @specials. + $matches = null; + $have_specials = preg_match_all( + '/^@([\w-]+)[ \t]*([^\n]*)/m', + $docblock, + $matches, + PREG_SET_ORDER); + + if ($have_specials) { + $docblock = preg_replace( + '/^@([\w-]+)[ \t]*([^\n]*)?\n*/m', + '', + $docblock); + foreach ($matches as $match) { + list($_, $type, $data) = $match; + $data = trim($data); + + // For flags like "@stable" which don't have any string data, set the + // value to true. + if (!strlen($data)) { + $data = true; + } + + if (!isset($special[$type])) { + $special[$type] = $data; + } else { + if (!is_array($special[$type])) { + $special[$type] = (array)$special[$type]; + } + $special[$type][] = $data; + } + } + } + + // Convert `array(true, true, true)` to `true`. + foreach ($special as $type => $data) { + if (is_array($data)) { + $all_trues = true; + + foreach ($data as $value) { + if ($value !== true) { + $all_trues = false; + break; + } + } + + if ($all_trues) { + $special[$type] = true; + } + } + } + + $docblock = str_replace("\t", ' ', $docblock); + + // Smush the whole docblock to the left edge. + $min_indent = 80; + $indent = 0; + foreach (array_filter(explode("\n", $docblock)) as $line) { + for ($ii = 0; $ii < strlen($line); $ii++) { + if ($line[$ii] != ' ') { + break; + } + $indent++; + } + $min_indent = min($indent, $min_indent); + } + + $docblock = preg_replace( + '/^'.str_repeat(' ', $min_indent).'/m', + '', + $docblock); + $docblock = rtrim($docblock); + // Trim any empty lines off the front, but leave the indent level if there + // is one. + $docblock = preg_replace('/^\s*\n/', '', $docblock); + + return array($docblock, $special); + } + +} diff --git a/src/parser/PhutilEditorConfig.php b/src/parser/PhutilEditorConfig.php new file mode 100644 index 00000000..a03d2bf6 --- /dev/null +++ b/src/parser/PhutilEditorConfig.php @@ -0,0 +1,195 @@ + array( + 'latin1', + 'utf-8', + 'utf-8-bom', + 'utf-16be', + 'utf-16le', + ), + self::END_OF_LINE => array('lf', 'cr', 'crlf'), + self::INDENT_SIZE => 'int|string', + self::INDENT_STYLE => array('space', 'tab'), + self::FINAL_NEWLINE => 'bool', + self::LINE_LENGTH => 'int', + self::TAB_WIDTH => 'int', + self::TRAILING_WHITESPACE => 'bool', + ); + + private $root; + + /** + * Constructor. + * + * @param string The root directory. + */ + public function __construct($root) { + $this->root = $root; + } + + /** + * Get the specified EditorConfig property for the specified path. + * + * @param string + * @param string + * @return wild + */ + public function getProperty($path, $key) { + if (!idx(self::$knownProperties, $key)) { + throw new InvalidArgumentException(pht('Invalid EditorConfig property.')); + } + + $props = $this->getProperties($path); + + switch ($key) { + case self::INDENT_SIZE: + if (idx($props, self::INDENT_SIZE) === null && + idx($props, self::INDENT_STYLE) === 'tab') { + return 'tab'; + } else if (idx($props, self::INDENT_SIZE) === 'tab' && + idx($props, self::TAB_WIDTH) === null) { + return idx($props, self::TAB_WIDTH); + } + break; + + case self::TAB_WIDTH: + if (idx($props, self::TAB_WIDTH) === null && + idx($props, self::INDENT_SIZE) !== null && + idx($props, self::INDENT_SIZE) !== 'tab') { + return idx($props, self::INDENT_SIZE); + } + break; + } + + return idx($props, $key); + } + + /** + * Get the EditorConfig properties for the specified path. + * + * Returns a map containing all of the EditorConfig properties which apply + * to the specified path. The following rules are applied when processing + * EditorConfig files: + * + * - If a glob does not contain `/`, it can match a path in any subdirectory. + * - If the first character of a glob is `/`, it will only match files in the + * same directory as the `.editorconfig` file. + * - Properties and values are case-insensitive. + * - Unknown properties will be silently ignored. + * - Values are not validated against the specification (this may change in + * the future). + * - Invalid glob patterns will be silently ignored. + * + * @param string + * @return map + */ + public function getProperties($path) { + $configs = $this->getEditorConfigs($path); + $matches = array(); + + foreach ($configs as $config) { + list($path_prefix, $editorconfig) = $config; + + foreach ($editorconfig as $glob => $properties) { + if (!$glob) { + continue; + } + + if (strpos($glob, '/') === false) { + $glob = '**/'.$glob; + } else if (strncmp($glob, '/', 0)) { + $glob = substr($glob, 1); + } + + $glob = $path_prefix.'/'.$glob; + try { + if (!phutil_fnmatch($glob, $path)) { + continue; + } + } catch (Exception $ex) { + // Invalid glob pattern... ignore it. + continue; + } + + foreach ($properties as $property => $value) { + $property = strtolower($property); + + if (!idx(self::$knownProperties, $property)) { + // Unknown property... ignore it. + continue; + } + + if (is_string($value)) { + $value = strtolower($value); + } + if ($value === '') { + $value = null; + } + $matches[$property] = $value; + } + } + } + + return $matches; + } + + /** + * Returns the EditorConfig files which affect the specified path. + * + * Find and parse all `.editorconfig` files between the specified path and + * the root directory. The results are returned in the same order that they + * should be matched. + * + * return list> + */ + private function getEditorConfigs($path) { + $configs = array(); + $found_root = false; + $root = $this->root; + + do { + $path = dirname($path); + $file = $path.'/.editorconfig'; + + if (!Filesystem::pathExists($file)) { + continue; + } + + $contents = Filesystem::readFile($file); + $config = phutil_ini_decode($contents); + + if (idx($config, 'root') === true) { + $found_root = true; + } + unset($config['root']); + array_unshift($configs, array($path, $config)); + + if ($found_root) { + break; + } + } while ($path != $root && Filesystem::isDescendant($path, $root)); + + return $configs; + } + +} diff --git a/src/parser/PhutilEmailAddress.php b/src/parser/PhutilEmailAddress.php new file mode 100644 index 00000000..6acda756 --- /dev/null +++ b/src/parser/PhutilEmailAddress.php @@ -0,0 +1,114 @@ +$/', $email_address, $matches)) { + $display_name = trim($matches[1], '\'" '); + if (strpos($matches[2], '@') !== false) { + list($local_part, $domain_name) = explode('@', $matches[2], 2); + } else { + $local_part = $matches[2]; + $domain_name = null; + } + } else if (preg_match('/^(.*)@(.*)$/', $email_address, $matches)) { + $display_name = null; + $local_part = $matches[1]; + $domain_name = $matches[2]; + } else { + $display_name = null; + $local_part = $email_address; + $domain_name = null; + } + + $this->displayName = $display_name; + $this->localPart = $local_part; + $this->domainName = $domain_name; + } + + public function __toString() { + $address = $this->getAddress(); + if (strlen($this->displayName)) { + $display_name = $this->encodeDisplayName($this->displayName); + return $display_name.' <'.$address.'>'; + } else { + return $address; + } + } + + public function setDisplayName($display_name) { + $this->displayName = $display_name; + return $this; + } + + public function getDisplayName() { + return $this->displayName; + } + + public function setLocalPart($local_part) { + $this->localPart = $local_part; + return $this; + } + + public function getLocalPart() { + return $this->localPart; + } + + public function setDomainName($domain_name) { + $this->domainName = $domain_name; + return $this; + } + + public function getDomainName() { + return $this->domainName; + } + + public function setAddress($address) { + $parts = explode('@', $address, 2); + + $this->localPart = $parts[0]; + if (isset($parts[1])) { + $this->domainName = $parts[1]; + } + + return $this; + } + + public function getAddress() { + $address = $this->localPart; + if (strlen($this->domainName)) { + $address .= '@'.$this->domainName; + } + return $address; + } + + private function encodeDisplayName($name) { + // NOTE: This is a reasonable effort based on a cursory reading of + // RFC2822, but may be significantly misguided. + + // Newlines are not permitted, even when escaped. Discard them. + $name = preg_replace("/\s*[\r\n]+\s*/", ' ', $name); + + // Escape double quotes and backslashes. + $name = addcslashes($name, '\\"'); + + // Quote the string. + $name = '"'.$name.'"'; + + return $name; + } + +} diff --git a/src/parser/PhutilGitURI.php b/src/parser/PhutilGitURI.php new file mode 100644 index 00000000..cfe5530f --- /dev/null +++ b/src/parser/PhutilGitURI.php @@ -0,0 +1,92 @@ +parseURI($uri); + if ($parts) { + $this->user = $parts[1]; + $this->domain = $parts[2]; + $this->path = $parts[3]; + } + } + + private static function parseURI($uri) { + // See T4913. Fail the parse if there is leading whitespace; stricter + // systems will not accept these URIs. + if (ltrim($uri) !== $uri) { + return null; + } + + $user = '(?:([^@]+)@)?'; + $domain = '([^:]+)'; + $path = ':(.*)'; + + $regexp = '/^'.$user.$domain.$path.'$/'; + $matches = null; + $ok = preg_match($regexp, $uri, $matches); + if ($ok) { + return array_pad($matches, 4, ''); + } + + return null; + } + + public function __toString() { + $user = null; + if ($this->user) { + $user = $this->user.'@'; + } + + $domain = $this->domain; + $path = $this->path; + + return $user.$domain.':'.$path; + } + + public function setDomain($domain) { + $this->domain = $domain; + return $this; + } + + public function getDomain() { + return $this->domain; + } + + public function setPath($path) { + $this->path = $path; + return $this; + } + + public function getPath() { + return $this->path; + } + + public function setUser($user) { + $this->user = $user; + return $this; + } + + public function getUser() { + return $this->user; + } + +} diff --git a/src/parser/PhutilJSON.php b/src/parser/PhutilJSON.php new file mode 100644 index 00000000..0bcc4f76 --- /dev/null +++ b/src/parser/PhutilJSON.php @@ -0,0 +1,155 @@ +encodeFormattedObject($object, 0)."\n"; + } + + + /** + * Encode a list in JSON and pretty-print it, discarding keys. + * + * @param list List to encode in JSON. + * @return string Pretty-printed list representation. + */ + public function encodeAsList(array $list) { + return $this->encodeFormattedArray($list, 0)."\n"; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Pretty-print a JSON object. + * + * @param dict Object to format. + * @param int Current depth, for indentation. + * @return string Pretty-printed value. + * @task internal + */ + private function encodeFormattedObject($object, $depth) { + if (empty($object)) { + return '{}'; + } + + $pre = $this->getIndent($depth); + $key_pre = $this->getIndent($depth + 1); + $keys = array(); + $vals = array(); + $max = 0; + foreach ($object as $key => $val) { + $ekey = $this->encodeFormattedValue((string)$key, 0); + $max = max($max, strlen($ekey)); + $keys[] = $ekey; + $vals[] = $this->encodeFormattedValue($val, $depth + 1); + } + $key_lines = array(); + foreach ($keys as $k => $key) { + $key_lines[] = $key_pre.$key.': '.$vals[$k]; + } + $key_lines = implode(",\n", $key_lines); + + $out = "{\n"; + $out .= $key_lines; + $out .= "\n"; + $out .= $pre.'}'; + + return $out; + } + + + /** + * Pretty-print a JSON list. + * + * @param list List to format. + * @param int Current depth, for indentation. + * @return string Pretty-printed value. + * @task internal + */ + private function encodeFormattedArray($array, $depth) { + if (empty($array)) { + return '[]'; + } + + $pre = $this->getIndent($depth); + $val_pre = $this->getIndent($depth + 1); + + $vals = array(); + foreach ($array as $val) { + $vals[] = $val_pre.$this->encodeFormattedValue($val, $depth + 1); + } + $val_lines = implode(",\n", $vals); + + $out = "[\n"; + $out .= $val_lines; + $out .= "\n"; + $out .= $pre.']'; + + return $out; + } + + + /** + * Pretty-print a JSON value. + * + * @param dict Value to format. + * @param int Current depth, for indentation. + * @return string Pretty-printed value. + * @task internal + */ + private function encodeFormattedValue($value, $depth) { + if (is_array($value)) { + if (phutil_is_natural_list($value)) { + return $this->encodeFormattedArray($value, $depth); + } else { + return $this->encodeFormattedObject($value, $depth); + } + } else { + if (defined('JSON_UNESCAPED_SLASHES')) { + // If we have a new enough version of PHP, disable escaping of slashes + // when pretty-printing values. Escaping slashes can defuse an attack + // where the attacker embeds "" inside a JSON string, but that + // isn't relevant when rendering JSON for human viewers. + return json_encode($value, JSON_UNESCAPED_SLASHES); + } else { + return json_encode($value); + } + } + } + + + /** + * Render a string corresponding to the current indent depth. + * + * @param int Current depth. + * @return string Indentation. + * @task internal + */ + private function getIndent($depth) { + if (!$depth) { + return ''; + } else { + return str_repeat(' ', $depth); + } + } + +} diff --git a/src/parser/PhutilJSONParser.php b/src/parser/PhutilJSONParser.php new file mode 100644 index 00000000..d3b5aef5 --- /dev/null +++ b/src/parser/PhutilJSONParser.php @@ -0,0 +1,64 @@ +allowDuplicateKeys = $allow_duplicate_keys; + return $this; + } + + public function parse($json) { + $jsonlint_root = phutil_get_library_root('arcanist'); + $jsonlint_root = $jsonlint_root.'/../externals/jsonlint'; + + require_once $jsonlint_root.'/src/Seld/JsonLint/JsonParser.php'; + require_once $jsonlint_root.'/src/Seld/JsonLint/Lexer.php'; + require_once $jsonlint_root.'/src/Seld/JsonLint/ParsingException.php'; + require_once $jsonlint_root.'/src/Seld/JsonLint/Undefined.php'; + + $parser = new JsonLintJsonParser(); + try { + $output = $parser->parse($json, $this->getFlags()); + } catch (JsonLintParsingException $ex) { + $details = $ex->getDetails(); + $message = preg_replace("/^Parse error .*\\^\n/s", '', $ex->getMessage()); + + throw new PhutilJSONParserException( + $message, + idx(idx($details, 'loc', array()), 'last_line'), + idx(idx($details, 'loc', array()), 'last_column'), + idx($details, 'token'), + idx($details, 'expected')); + } + + if (!is_array($output)) { + throw new PhutilJSONParserException( + pht( + '%s is not a valid JSON object.', + PhutilReadableSerializer::printShort($json))); + } + + return $output; + } + + private function getFlags() { + $flags = JsonLintJsonParser::PARSE_TO_ASSOC; + + if ($this->allowDuplicateKeys) { + $flags |= JsonLintJsonParser::ALLOW_DUPLICATE_KEYS; + } else { + $flags |= JsonLintJsonParser::DETECT_KEY_CONFLICTS; + } + + return $flags; + } + +} diff --git a/src/parser/PhutilLanguageGuesser.php b/src/parser/PhutilLanguageGuesser.php new file mode 100644 index 00000000..7b0dc6fc --- /dev/null +++ b/src/parser/PhutilLanguageGuesser.php @@ -0,0 +1,47 @@ + 1, + // Capture "#!/usr/bin/php" sorts of things. + '@^#!.*bin/(\S+)@' => 1, + // Capture initial " 1, + // Capture emacs "mode" header. + '@^.*-[*]-.*mode\s*:\s*(\S+).*-[*]-.*$@m' => 1, + // Look for things that seem to be diffs. + '/^---.*$\n^[+]{3}.*$\n^@@/m' => 'diff', + '/^diff --git/' => 'diff', + // Look for plausible console output. + '@^(?:\S+[\\\\/] )?[$] @' => 'console', + ); + + foreach ($patterns as $pattern => $language) { + $matches = null; + if (preg_match($pattern, $source, $matches)) { + if (is_numeric($language)) { + return $matches[$language]; + } else { + return $language; + } + } + } + + return null; + } + +} diff --git a/src/parser/PhutilParserGenerator.php b/src/parser/PhutilParserGenerator.php new file mode 100644 index 00000000..f084adb7 --- /dev/null +++ b/src/parser/PhutilParserGenerator.php @@ -0,0 +1,910 @@ +setTerminals(array('a', 'b')) + * ->setStartRule('S') + * ->setRules( + * array( + * 'S' => 'A b', + * 'A' => array( + * 'A a', + * 'a', + * ))) + * ->processGrammar(); + * + * To actually parse token streams, use @{method:parseTokens}. + * + * $tokens = get_tokens(); // Usually from PhutilLexer + * $callback = 'some_callback'; + * $tree = $parser->parseTokens($tokens, $callback); + * + * The callback is invoked when a grammar rule matches. It should have this + * signature: + * + * function parser_callback($rule, $production, array $tokens) { + * // ... + * } + * + * The `$rule` is the matching rule; the `$production` is the matching + * production, and `$tokens` is the matching tokens (for terminal rules) or the + * return value of previous parse callbacks (for nonterminal rules). + * + * You should either return a result of evaluation, or some sort of abstract + * representation of the parse tree (this is more likely to be useful for more + * complex grammars). + * + * NOTE: This class generates LR(1) parsers, which perform less-than-optimally + * on large grammars. Worse, it is written in PHP. It is suitable only for + * very simple grammars with few states. + * + * NOTE: These parsers silently resolve reduce/reduce conflicts by choosing the + * first reduction, and silently resolve shift/reduce conflicts by shifting. + * These are the same rules used by Yacc, but are implicit. + * + * @task rules Grammar Rules + * @task rvalidation Rule Validation + * @task first Computing First() + * @task tables Computing Action and Goto Tables + * @task inspect Inspecting Generator State + */ +final class PhutilParserGenerator extends Phobject { + + private $terminals; + private $rules; + private $startRule = 'start'; + private $states = array(); + private $sets = array(); + private $successor = array(); + private $setHashes = array(); + private $actionTable; + private $gotoTable; + + private $rulesValidated = false; + private $eofSymbol; + private $initSymbol; + private $epsilonSymbol; + private $endSymbol; + + private $firstTable; + + public function processGrammar() { + $this->validateRules(); + $this->buildFirstTable(); + + $init = $this->getInitSymbol(); + $eof = $this->getEOFSymbol(); + $end = $this->getEndSymbol(); + + $this->rules[$init] = array( + array($this->startRule, $end), + ); + list($is_new, $state) = $this->addState( + array( + array($this->getInitSymbol(), 0, 0, $eof), + )); + $this->buildSuccessors($state); + + $this->buildTables(); + + return $this; + } + + +/* -( Grammar Rules )------------------------------------------------------ */ + + + public function setTerminals(array $terminals) { + $this->terminals = array_fill_keys($terminals, true); + return $this; + } + + public function setRules(array $rules) { + $this->rules = $rules; + return $this; + } + + public function setStartRule($rule_name) { + $this->startRule = $rule_name; + return $this; + } + + public function getStartRule() { + return $this->startRule; + } + + public function getEOFSymbol() { + if ($this->eofSymbol === null) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->eofSymbol; + } + + public function getInitSymbol() { + if ($this->initSymbol === null) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->initSymbol; + } + + public function getEpsilonSymbol() { + if ($this->epsilonSymbol === null) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->epsilonSymbol; + } + + public function getEndSymbol() { + if ($this->endSymbol === null) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->endSymbol; + } + + public function isTerminal($symbol) { + return isset($this->terminals[$symbol]); + } + + public function isRule($symbol) { + return isset($this->rules[$symbol]); + } + + +/* -( Rule Validation )---------------------------------------------------- */ + + + /** + * Perform a battery of tests on the provided rules to detect problems which + * would prevent us from generating a parser. + * + * @return void + * @task rvalidation + */ + private function validateRules() { + // Rules must be specified in the right format. + $this->parseRules(); + + // Rules must contain only known symbols. + $this->validateRuleSymbols(); + + // The start rule must exist and be valid. + $this->validateStartRule(); + + // Now, we select printable names for special symbols (EOF, epsilon, etc) + // that don't conflict with any symbols in the grammar. + $this->chooseSpecialSymbols(); + + // Make sure every terminal can be reached by some rule. + $this->validateAllTerminalsReachable(); + + // Make sure every rule can be reached. + $this->validateAllRulesReachable(); + + // Make sure every rule has some valid reduction. + $this->validateAllRulesReducible(); + + $this->rulesValidated = true; + } + + + /** + * @task rvalidation + */ + private function parseRules() { + foreach ($this->rules as $rule_name => $rule_variants) { + if (!is_array($rule_variants)) { + $rule_variants = array($rule_variants); + $this->rules[$rule_name] = $rule_variants; + } + foreach ($rule_variants as $vkey => $variant) { + if ($variant === null) { + $variant = array(null); + } else if (!is_array($variant)) { + $variant = preg_split('/\s+/', $variant); + } else { + foreach ($variant as $symbol) { + if (($symbol === null) && count($variant) > 1) { + throw new PhutilInvalidRuleParserGeneratorException( + pht( + "Rule '%s' contains a production '%s' which is ". + "nonempty but has a null in it. A rule with other ". + "may not contain null.", + $rule_name, + $vkey)); + } + } + } + $this->rules[$rule_name][$vkey] = array_values($variant); + } + } + } + + + /** + * @task rvalidation + */ + private function validateRuleSymbols() { + foreach ($this->rules as $rule => $productions) { + foreach ($productions as $production_name => $production) { + foreach ($production as $symbol) { + if ($symbol === null) { + continue; + } + if ($this->isTerminal($symbol)) { + continue; + } + if ($this->isRule($symbol)) { + continue; + } + $production_string = implode(' ', $production); + throw new PhutilUnknownSymbolParserGeneratorException( + pht( + "Symbol '%s' in production '%s' ('%s') of rule '%s' does not ". + "name a rule or terminal. Did you misspell a symbol, fail to ". + "specify a terminal, or forget a rule?", + $symbol, + $production_name, + $production_string, + $rule)); + } + } + } + } + + + /** + * @task rvalidation + */ + private function validateStartRule() { + $start_rule = $this->getStartRule(); + if (!$this->isRule($start_rule)) { + throw new PhutilUnknownSymbolParserGeneratorException( + pht( + "Start rule '%s' does not appear in the rules for the grammar. Use ". + "%s to choose a different start rule, or add a rule named '%s'.", + $start_rule, + 'setStartRule()', + $start_rule)); + } + } + + + /** + * @task rvalidation + */ + private function chooseSpecialSymbols() { + $special = array( + 'eofSymbol' => '(end-of-file)', + 'epsilonSymbol' => '(epsilon)', + 'initSymbol' => '(init)', + 'endSymbol' => '(end)', + ); + + foreach ($special as $key => $value) { + while ($this->isRule($value) || $this->isTerminal($value)) { + $value .= "'"; + } + $special[$key] = $value; + } + + $this->eofSymbol = $special['eofSymbol']; + $this->epsilonSymbol = $special['epsilonSymbol']; + $this->initSymbol = $special['initSymbol']; + $this->endSymbol = $special['endSymbol']; + + foreach ($this->rules as $rule => $productions) { + foreach ($productions as $production_name => $production) { + foreach ($production as $key => $symbol) { + if ($symbol === null) { + $this->rules[$rule][$production_name][$key] = $this->epsilonSymbol; + } + } + $this->rules[$rule][$production_name][] = $this->endSymbol; + } + } + + $this->terminals[$this->getEOFSymbol()] = true; + } + + + /** + * @task rvalidation + */ + private function validateAllTerminalsReachable() { + $seen = array(); + foreach ($this->rules as $rule => $productions) { + foreach ($productions as $production) { + foreach ($production as $symbol) { + $seen[$symbol] = true; + } + } + } + + $missing = array_diff_key($this->terminals, $seen); + unset($missing[$this->getEOFSymbol()]); + if ($missing) { + $missing_terminals = array_keys($missing); + $missing_terminals = implode(', ', $missing_terminals); + throw new PhutilUnreachableTerminalParserGeneratorException( + pht( + 'Some terminals do not appear in any rule: %s', + $missing_terminals)); + } + } + + + /** + * @task rvalidation + */ + private function validateAllRulesReachable() { + $stack = array(); + $reachable = $this->computeReachableRules($this->getStartRule(), $stack); + + $missing = array_diff_key($this->rules, $reachable); + unset($missing[$this->getStartRule()]); + + if ($missing) { + $missing_rules = array_keys($missing); + $missing_rules = implode(', ', $missing_rules); + throw new PhutilUnreachableRuleParserGeneratorException( + pht( + 'Some rules can never be reached from any production: %s', + $missing_rules)); + } + } + + + /** + * @task rvalidation + */ + private function computeReachableRules($rule, array &$stack) { + if (isset($stack[$rule])) { + return $stack[$rule]; + } + + $stack[$rule] = array(); + + foreach ($this->rules[$rule] as $production) { + foreach ($production as $symbol) { + if ($this->isRule($symbol)) { + $stack[$rule][$symbol] = true; + $stack[$rule] += $this->computeReachableRules($symbol, $stack); + } + } + } + + return $stack[$rule]; + } + + + /** + * @task rvalidation + */ + private function validateAllRulesReducible() { + $reducible = array(); + foreach ($this->rules as $rule => $productions) { + if (!$this->isRuleReducible($rule, $reducible)) { + throw new PhutilIrreducibleRuleParserGeneratorException( + pht( + "Rule '%s' can never be reduced: it recurses indefinitely ". + "and reaches no production of terminals.", + $rule)); + } + } + } + + + /** + * @task rvalidation + */ + private function isRuleReducible($rule, array &$reducible) { + if (isset($reducible[$rule])) { + return $reducible[$rule]; + } + + // Set this ahead of time so we don't end up in an infinite loop if + // rules recurse. We'll overwrite it if we find a reduction. + $reducible[$rule] = false; + $reducible[$rule] = $this->computeRuleReducible($rule, $reducible); + return $reducible[$rule]; + } + + + /** + * @task rvalidation + */ + private function computeRuleReducible($rule, array &$reducible) { + $epsilon = $this->getEpsilonSymbol(); + $end = $this->getEndSymbol(); + + $productions = $this->rules[$rule]; + + // In the first pass, try to find a trivially reducible production, e.g. one + // with epsilon or only terminals. Also, remove recursive productions (those + // which directly involve the rule itself) because we know we won't be able + // to reduce them. If we're lucky, this will allow us to determine that the + // rule is reducible without recursion. For example, we can immediately + // reduce these productions: + // + // R -> a + // R -> b c d + // R -> (epsilon) + // + // We can never reduce these productions: + // + // R -> R + // R -> a R b + // + // We might be able to reduce these productions, but they aren't as cheap + // or easy to figure out, since we need to first determine if other rules + // can be reduced: + // + // R -> X Y + // R -> X a + // + // If we find a reduction, we return immediately. + + foreach ($productions as $key => $production) { + $has_only_terminals = true; + foreach ($production as $symbol) { + if ($symbol == $end) { + break; + } else if ($symbol == $epsilon) { + // The rule contains an epsilon production, which can always reduce + // it. + return true; + } else if ($symbol == $rule) { + // The rule contains itself; this production is never reducible. We + // must find another reducible production. + unset($productions[$key]); + continue 2; + } else if ($this->isTerminal($symbol)) { + // This is a terminal; keep looking. We'll be able to reduce the + // production if it contains only terminals. + continue; + } else { + // This is a rule, so we can't trivially reduce it. We'll keep it + // for the next round if we can't find any trivial reductions. + $has_only_terminals = false; + break; + } + } + + if ($has_only_terminals) { + return true; + } + } + + // If we have no productions left, this rule can't be reduced. + if (empty($productions)) { + return false; + } + + // We have remaining productions which include other rules. Look for a + // nontrivial reduction. For example: + // + // R -> X Y + // X -> x + // Y -> y + // + // In this case, X and Y are both reducible, so "X Y" is reducible and thus + // R is reducible. + foreach ($productions as $production) { + $can_reduce = true; + foreach ($production as $symbol) { + // NOTE: We don't need to check for epsilon here, because we would + // already have determined the rule was reducible if we had an epsilon + // production. + if ($symbol == $end) { + break; + } else if ($this->isTerminal($symbol)) { + continue; + } else if (!$this->isRuleReducible($symbol, $reducible)) { + $can_reduce = false; + break; + } + } + + if ($can_reduce) { + // The production contained only terminals and reducible rules, so it + // is reducible. We're good and don't need to examine remaining + // productions. + return true; + } + } + + // We didn't find any reducible productions. + return false; + } + + +/* -( Computing First() )-------------------------------------------------- */ + + + private function buildFirstTable() { + $this->firstTable = array(); + foreach ($this->rules as $rule => $productions) { + $this->buildRuleFirst($rule); + } + } + + private function buildRuleFirst($rule) { + if (isset($this->firstTable[$rule])) { + return $this->firstTable[$rule]; + } + + $this->firstTable[$rule] = array(); + $productions = $this->rules[$rule]; + foreach ($productions as $key => $production) { + $this->firstTable[$rule] += $this->getFirstForProduction($production); + } + + return $this->firstTable[$rule]; + } + + private function getFirstForProduction(array $production) { + $set = array(); + + $end = $this->getEndSymbol(); + $epsilon = $this->getEpsilonSymbol(); + $eof = $this->getEOFSymbol(); + + $accept_epsilon = true; + foreach ($production as $symbol) { + if ($symbol === $end) { + break; + } else if ($symbol === $epsilon) { + break; + } else if ($this->isTerminal($symbol)) { + $set[$symbol] = true; + $accept_epsilon = false; + break; + } else { + $symbol_set = $this->buildRuleFirst($symbol); + + $has_epsilon = isset($symbol_set[$epsilon]); + unset($symbol_set[$epsilon]); + $set += $symbol_set; + if (!$has_epsilon) { + $accept_epsilon = false; + break; + } + } + } + + if ($accept_epsilon) { + $set[$epsilon] = true; + } + + return $set; + } + + +/* -( Computing States )--------------------------------------------------- */ + + + private function addState(array $set) { + $seen = array(); + foreach ($set as $item) { + $seen[$item[0]][$item[1]][$item[2]][$item[3]] = true; + } + + $end = $this->getEndSymbol(); + $epsilon = $this->getEpsilonSymbol(); + + for ($ii = 0; $ii < count($set); $ii++) { + $item = $set[$ii]; + + $production = $this->rules[$item[0]][$item[1]]; + $next = $production[$item[2]]; + if ($this->isTerminal($next)) { + continue; + } else if ($next === $epsilon) { + continue; + } else if ($next === $end) { + continue; + } + + $v = array_slice($production, $item[2] + 1, -1); + $v[] = $item[3]; + $v[] = $end; + + $firsts = $this->getFirstForProduction($v); + + foreach ($firsts as $nfirst => $ignored) { + if (!$this->isTerminal($nfirst)) { + unset($firsts[$nfirst]); + } + } + + foreach ($this->rules[$next] as $pkey => $nproduction) { + foreach ($firsts as $nfirst => $ignored) { + if (isset($seen[$next][$pkey][0][$nfirst])) { + continue; + } + $set[] = array($next, $pkey, 0, $nfirst); + $seen[$next][$pkey][0][$nfirst] = true; + } + } + } + + $hash = $this->hashSet($set); + if (isset($this->setHashes[$hash])) { + return array(false, $this->setHashes[$hash]); + } + + $this->states[] = $set; + $state = last_key($this->states); + $this->setHashes[$hash] = $state; + + return array(true, $state); + } + + private function buildSuccessors($start_state) { + $end = $this->getEndSymbol(); + + $nexts = array(); + foreach ($this->states[$start_state] as $item) { + $next = $this->rules[$item[0]][$item[1]][$item[2]]; + if ($next === $end) { + continue; + } + $nexts[$next][] = array( + $item[0], + $item[1], + $item[2] + 1, + $item[3], + ); + } + + foreach ($nexts as $next => $items) { + list($is_new, $state) = $this->addState($items); + $this->successor[$start_state][$next] = $state; + if ($is_new) { + $this->buildSuccessors($state); + } + } + } + + private function hashSet(array $set) { + foreach ($set as $k => $item) { + $set[$k] = implode("\0", $item); + } + sort($set); + $set = implode("\1", $set); + + return md5($set); + } + + + private function buildTables() { + $action = array(); + $goto = array(); + + $end = $this->getEndSymbol(); + $eof = $this->getEOFSymbol(); + $init = $this->getInitSymbol(); + + foreach ($this->states as $state => $items) { + $shift = array(); + $reduce = array(); + $accept = false; + foreach ($items as $item) { + $next = $this->rules[$item[0]][$item[1]][$item[2]]; + if ($next == $end) { + if ($item[0] !== $init) { + $reduce[$item[3]][] = $item; + } else if ($item[0] === $init && $item[3] === $eof) { + $accept = $item; + } + } else if ($this->isTerminal($next)) { + $shift[$next] = $item; + } else { + $goto[$state][$next] = $this->successor[$state][$next]; + } + } + + foreach ($reduce as $next => $reductions) { + if (count($reductions) > 1) { + $ways = array(); + foreach ($reductions as $reduction) { + $ways[] = "{$reduction[0]}/{$reduction[1]}"; + } + $ways = implode('; ', $ways); + + // TODO: As below, we should have more explicit handling of + // reduce/reduce conflicts. For now, just pick the first one. + + if (false) { + throw new Exception( + pht( + "Reduce/reduce conflict: from state '%s', when a ". + "'%s' is encountered, it may be reduced in multiple ". + "ways: %s", + $state, + $next, + $ways)); + } + } + $reduce[$next] = head($reductions); + } + + $srconflicts = array_intersect_key($shift, $reduce); + foreach ($srconflicts as $next => $ignored) { + + // TODO: We should probably have better or more explicit handling of + // shift/reduce conflicts. For now, we just shift. + + if (false) { + $what = $reduce[$next][0]; + throw new Exception( + pht( + "Shift/reduce conflict: from state '%s', when a '%s' ". + "is encountered, shifting conflicts with reducing '%s'.", + $state, + $next, + $what)); + } else { + // Resolve the shift/reduce by shifting. + $reduce = array(); + } + } + + if ($accept && isset($shift[$eof])) { + throw new Exception(pht('Accept/shift conflict!')); + } + + if ($accept && isset($reduce[$eof])) { + throw new Exception(pht('Accept/reduce conflict!')); + } + + foreach ($reduce as $next => $item) { + $action[$state][$next] = array( + 'R', + array( + $item[0], + $item[1], + count($this->rules[$item[0]][$item[1]]) - 1, + ), + ); + } + + foreach ($shift as $next => $item) { + $action[$state][$next] = array( + 'S', + $this->successor[$state][$next], + ); + } + + if ($accept) { + $action[$state][$eof] = array('A'); + } + } + + $this->actionTable = $action; + $this->gotoTable = $goto; + } + + public function generateParserFunction($name) { + $out = array(); + $out[] = 'function '.$name.'(array $tokens, $callback) {'; + $out[] = ' return '.__CLASS__.'::parseTokensWithTables('; + $out[] = ' '.$this->formatAndIndent($this->actionTable, 4).','; + $out[] = ' '.$this->formatAndIndent($this->gotoTable, 4).','; + $out[] = ' '.$this->formatAndIndent($this->getEOFSymbol(), 4).','; + $out[] = ' $tokens,'; + $out[] = ' $callback);'; + $out[] = '}'; + return implode("\n", $out); + } + + private function formatAndIndent($var, $depth) { + $var = phutil_var_export($var); + $var = str_replace("\n", "\n".str_repeat(' ', $depth), $var); + + return $var; + } + + public function parseTokens(array $tokens, $callback) { + return self::parseTokensWithTables( + $this->actionTable, + $this->gotoTable, + $this->getEOFSymbol(), + $tokens, + $callback); + } + + public static function parseTokensWithTables( + $action_table, + $goto_table, + $eof_symbol, + array $tokens, + $callback) { + + $state_stack = array(0); + $token_stack = array(); + + $tokens = array_reverse($tokens); + while (true) { + $state = end($state_stack); + + if (empty($tokens)) { + $next = $eof_symbol; + } else { + $next_token = end($tokens); + $next = $next_token[0]; + } + + if (!isset($action_table[$state][$next])) { + $expected = implode(', ', array_keys($action_table[$state])); + throw new Exception( + pht( + "Unexpected '%s' in state %s! Expected: %s", + $next, + $state, + $expected)); + } + + $action = $action_table[$state][$next]; + + switch ($action[0]) { + case 'S': + $state_stack[] = $action[1]; + $token_stack[] = array_pop($tokens); + break; + case 'R': + $r_rule = $action[1][0]; + $r_prod = $action[1][1]; + $r_size = $action[1][2]; + + $token_v = array(); + while ($r_size--) { + $token_v[] = array_pop($token_stack); + array_pop($state_stack); + } + $token_v = array_reverse($token_v); + $token_stack[] = call_user_func_array( + $callback, + array($r_rule, $r_prod, $token_v)); + $goto = $goto_table[end($state_stack)][$r_rule]; + $state_stack[] = $goto; + break; + case 'A': + break 2; + } + } + + return head($token_stack); + } + + +/* -( Inspecting Generator State )----------------------------------------- */ + + + /** + * @task inspect + */ + public function inspectRules() { + if (!$this->rulesValidated) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->rules; + } + + + /** + * @task inspect + */ + public function inspectFirstTable() { + if ($this->firstTable === null) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->firstTable; + } + + +} diff --git a/src/parser/PhutilQueryStringParser.php b/src/parser/PhutilQueryStringParser.php new file mode 100644 index 00000000..90f67f64 --- /dev/null +++ b/src/parser/PhutilQueryStringParser.php @@ -0,0 +1,139 @@ + 'z', + * ); + * + * ...with the `.` replaced with an underscore, `_`. Other characters converted + * in this way include space and unmatched opening brackets. + * + * Broadly, this is part of the terrible legacy of `register_globals`. Since + * we'd like to be able to parse all valid query strings without destroying any + * data, this class implements a less-encumbered parser. + */ +final class PhutilQueryStringParser extends Phobject { + + + /** + * Parses a query string into a dictionary, applying PHP rules for handling + * array nomenclature (like `a[]=1`) in parameter names. + * + * For a more basic parse, see @{method:parseQueryStringToPairList}. + * + * @param string Query string. + * @return map Parsed dictionary. + */ + public function parseQueryString($query_string) { + $result = array(); + + $list = $this->parseQueryStringToPairList($query_string); + foreach ($list as $parts) { + list($key, $value) = $parts; + if (!strlen($key)) { + continue; + } + $this->parseQueryKeyToArr($key, $value, $result); + } + + return $result; + } + + + /** + * Parses a query string into a basic list of pairs, without handling any + * array information in the keys. For example: + * + * a[]=1&a[]=2 + * + * ...will parse into: + * + * array( + * array('a[]', '1'), + * array('a[]', '2'), + * ); + * + * Use @{method:parseQueryString} to produce a more sophisticated parse which + * applies array rules and returns a dictionary. + * + * @param string Query string. + * @return list> List of parsed parameters. + */ + public function parseQueryStringToPairList($query_string) { + $list = array(); + + if (!strlen($query_string)) { + return $list; + } + + $pairs = explode('&', $query_string); + foreach ($pairs as $pair) { + if (!strlen($pair)) { + continue; + } + $parts = explode('=', $pair, 2); + if (count($parts) < 2) { + $parts[] = ''; + } + $list[] = array( + urldecode($parts[0]), + urldecode($parts[1]), + ); + } + + return $list; + } + + + /** + * Treats the key as a flat query that potentially has square brackets. If + * there are square brackets we parse them into an array. + * + * Example input: + * $key = "email[0]"; + * $val = "my@example.com"; + * + * Example output: + * array("email" => array(0 => "my@example.com")); + * + * @param string $key + * @param string $val + * @param array $input_arr + */ + private function parseQueryKeyToArr($key, $val, array &$input_arr) { + if (preg_match('/^[^\[\]]+(?:\[[^\[\]]*\])+$/', $key)) { + $key_pieces = preg_split('/\]?\[/', rtrim($key, ']')); + if ($key_pieces) { + $cursor = &$input_arr; + foreach ($key_pieces as $piece) { + if (strlen($piece)) { + if (empty($cursor[$piece]) || !is_array($cursor[$piece])) { + $cursor[$piece] = array(); + } + } else { + $cursor[] = array(); + $piece = last_key($cursor); + } + $cursor = &$cursor[$piece]; + } + + $cursor = $val; + unset($cursor); + } + } else { + $input_arr[$key] = $val; + } + } +} diff --git a/src/parser/PhutilSimpleOptions.php b/src/parser/PhutilSimpleOptions.php new file mode 100644 index 00000000..bcb25a4c --- /dev/null +++ b/src/parser/PhutilSimpleOptions.php @@ -0,0 +1,195 @@ + '4', + * 'eyes' => '2', + * ); + * + * @param string Input option list. + * @return dict Parsed dictionary. + * @task parse + */ + public function parse($input) { + $result = array(); + + $lexer = new PhutilSimpleOptionsLexer(); + $tokens = $lexer->getNiceTokens($input); + + $state = 'key'; + $pairs = array(); + foreach ($tokens as $token) { + list($type, $value) = $token; + switch ($state) { + case 'key': + if ($type != 'word') { + return array(); + } + if (!strlen($value)) { + return array(); + } + $key = $this->normalizeKey($value); + $state = '='; + break; + case '=': + if ($type == '=') { + $state = 'value'; + break; + } + if ($type == ',') { + $pairs[] = array($key, true); + $state = 'key'; + break; + } + return array(); + case 'value': + if ($type == ',') { + $pairs[] = array($key, null); + $state = 'key'; + break; + } + if ($type != 'word') { + return array(); + } + $pairs[] = array($key, $value); + $state = ','; + break; + case ',': + if ($type == 'word') { + $pair = array_pop($pairs); + $pair[1] .= $value; + $pairs[] = $pair; + break; + } + if ($type != ',') { + return array(); + } + $state = 'key'; + break; + } + } + + if ($state == '=') { + $pairs[] = array($key, true); + } + if ($state == 'value') { + $pairs[] = array($key, null); + } + + $result = array(); + foreach ($pairs as $pair) { + list($key, $value) = $pair; + if ($value === null) { + unset($result[$key]); + } else { + $result[$key] = $value; + } + } + + return $result; + } + + +/* -( Unparsing Simple Options )------------------------------------------- */ + + + /** + * Convert a dictionary into a simple option list. For example: + * + * array( + * 'legs' => '4', + * 'eyes' => '2', + * ); + * + * ...becomes: + * + * legs=4, eyes=2 + * + * @param dict Input dictionary. + * @param string Additional characters to escape. + * @return string Unparsed option list. + */ + public function unparse(array $options, $escape = '') { + $result = array(); + foreach ($options as $name => $value) { + $name = $this->normalizeKey($name); + if (!strlen($value)) { + continue; + } + if ($value === true) { + $result[] = $this->quoteString($name, $escape); + } else { + $qn = $this->quoteString($name, $escape); + $qv = $this->quoteString($value, $escape); + $result[] = $qn.'='.$qv; + } + } + return implode(', ', $result); + } + + +/* -( Parser Configuration )----------------------------------------------- */ + + + /** + * Configure case sensitivity of the parser. By default, the parser is + * case insensitive, so "legs=4" has the same meaning as "LEGS=4". If you + * set it to be case sensitive, the keys have different meanings. + * + * @param bool True to make the parser case sensitive, false (default) to + * make it case-insensitive. + * @return this + * @task config + */ + public function setCaseSensitive($case_sensitive) { + $this->caseSensitive = $case_sensitive; + return $this; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + private function normalizeKey($key) { + if (!strlen($key)) { + throw new Exception(pht('Empty key is invalid!')); + } + if (!$this->caseSensitive) { + $key = strtolower($key); + } + return $key; + } + + private function quoteString($string, $escape) { + if (preg_match('/[^a-zA-Z0-9]/', $string)) { + $string = '"'.addcslashes($string, '\\\'"'.$escape).'"'; + } + return $string; + } + +} diff --git a/src/parser/PhutilTypeSpec.php b/src/parser/PhutilTypeSpec.php new file mode 100644 index 00000000..c49fccf4 --- /dev/null +++ b/src/parser/PhutilTypeSpec.php @@ -0,0 +1,1921 @@ + + * map + * type|type + * + * A type may be marked as optional by suffixing it with "?" or prefixing it + * with the word "optional": + * + * int? + * optional int + * + * A type may have a human-readable comment in parentheses, at the end: + * + * int (must be even) + * + * For example, these are valid type specifications: + * + * int|string + * map + * list> + * optional int + * string (uppercase) + * + */ +final class PhutilTypeSpec extends Phobject { + + private $type; + private $subtypes = array(); + private $optional; + private $comment; + + private function __construct() {} + + public function getType() { + return $this->type; + } + + public function check($value, $name = null) { + switch ($this->type) { + case 'int': + if (!is_int($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'float': + if (!is_float($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'bool': + if (!is_bool($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'string': + if (!is_string($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'regex': + $trap = new PhutilErrorTrap(); + $ok = @preg_match($value, ''); + $err = $trap->getErrorsAsString(); + $trap->destroy(); + + if ($ok === false) { + throw new PhutilTypeCheckException($this, $value, $name, $err); + } + break; + case 'null': + if (!is_null($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'list': + if (!is_array($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + if ($value && !phutil_is_natural_list($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + try { + foreach ($value as $v) { + $this->subtypes[0]->check($v); + } + } catch (PhutilTypeCheckException $ex) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'map': + if (!is_array($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + try { + foreach ($value as $k => $v) { + $this->subtypes[0]->check($k); + $this->subtypes[1]->check($v); + } + } catch (PhutilTypeCheckException $ex) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'or': + foreach ($this->subtypes as $subtype) { + try { + $subtype->check($value); + return; + } catch (PhutilTypeCheckException $ex) { + // Ignore. + } + } + throw new PhutilTypeCheckException($this, $value, $name); + case 'wild': + return; + default: + if (class_exists($this->type, false)) { + if ($value instanceof $this->type) { + return; + } + } else if (interface_exists($this->type, false)) { + if ($value instanceof $this->type) { + return; + } + } + + throw new PhutilTypeCheckException($this, $value, $name); + } + } + + public static function checkMap(array $values, array $types) { + $extra = array_diff_key($values, $types); + if ($extra) { + throw new PhutilTypeExtraParametersException($extra); + } + + $missing = array(); + foreach ($types as $key => $type) { + $types[$key] = self::newFromString($type); + if (!array_key_exists($key, $values)) { + if (!$types[$key]->optional) { + $missing[] = $key; + } + } + } + + if ($missing) { + throw new PhutilTypeMissingParametersException($missing); + } + + foreach ($types as $key => $type) { + if (array_key_exists($key, $values)) { + $type->check($values[$key], $key); + } + } + } + + public static function getCommonParentClass($class_a, $class_b) { + // Make sure both classes are really classes. + try { + if (!class_exists($class_a) || !class_exists($class_b)) { + return null; + } + } catch (PhutilMissingSymbolException $ex) { + return null; + } + + $ancestors_a = array(); + do { + $ancestors_a[] = $class_a; + } while ($class_a = get_parent_class($class_a)); + + $ancestors_b = array(); + do { + $ancestors_b[] = $class_b; + } while ($class_b = get_parent_class($class_b)); + + return head(array_intersect($ancestors_a, $ancestors_b)); + } + + public static function getTypeOf($value) { + if (is_int($value)) { + return 'int'; + } else if (is_float($value)) { + return 'float'; + } else if (is_bool($value)) { + return 'bool'; + } else if (is_string($value)) { + return 'string'; + } else if (is_null($value)) { + return 'null'; + } else if (is_object($value)) { + return get_class($value); + } else if (is_array($value)) { + $vtype = self::getTypeOfVector($value); + if ($value && phutil_is_natural_list($value)) { + return 'list<'.$vtype.'>'; + } else { + $ktype = self::getTypeOfVector(array_keys($value)); + return "map<{$ktype}, {$vtype}>"; + } + } else { + return 'wild'; + } + } + + private static function getTypeOfVector(array $vector) { + if (!$vector) { + return 'wild'; + } + + $type = null; + foreach ($vector as $value) { + $vtype = self::getTypeOf($value); + if ($type === null) { + $type = $vtype; + } else if ($type === $vtype) { + continue; + } else { + $parent = self::getCommonParentClass($type, $vtype); + if ($parent) { + $type = $parent; + } else { + return 'wild'; + } + } + } + + return $type; + } + + public function toString() { + $sub = array(); + foreach ($this->subtypes as $subtype) { + $sub[] = $subtype->toString(); + } + + switch ($this->type) { + case 'map': + $string = 'map<'.$sub[0].', '.$sub[1].'>'; + break; + case 'list': + $string = 'list<'.$sub[0].'>'; + break; + case 'or': + $string = implode('|', $sub); + break; + default: + $string = $this->type; + break; + } + + if ($this->optional) { + $string = 'optional '.$string; + } + + if ($this->comment) { + $string .= ' ('.$this->comment.')'; + } + + return $string; + } + + public static function newFromString($string) { + $lexer = self::getLexer(); + $tokens = $lexer->getTokens($string); + + // Strip whitespace tokens. + foreach ($tokens as $key => $token) { + $type = $token[0]; + if ($type == ' ') { + unset($tokens[$key]); + } + } + + $tokens = array_values($tokens); + $callback = array(__CLASS__, 'didReduceTokens'); + return self::parseTokens($tokens, $callback); + } + + public static function didReduceTokens($rule, $production, array $tokens) { + switch ($rule) { + case 'start': + case 'some_type': + case 'not_or_type': + return $tokens[0]; + case 'type': + if ($production == 'yes') { + $tokens[0]->optional = true; + } + return $tokens[0]; + case 'basic_type': + $obj = new PhutilTypeSpec(); + $obj->type = $tokens[0][1]; + return $obj; + case 'or_type': + $l = $tokens[0]; + $r = $tokens[2]; + + if ($l->type == 'or') { + if ($r->type == 'or') { + foreach ($r->subtypes as $subtype) { + $l->subtypes[] = $subtype; + } + } else { + $l->subtypes[] = $r; + } + return $l; + } else if ($r->type == 'or') { + $r->subtypes[] = $l; + return $r; + } else { + $obj = new PhutilTypeSpec(); + $obj->type = 'or'; + $obj->subtypes[] = $l; + $obj->subtypes[] = $r; + return $obj; + } + break; + case 'map_type': + $obj = new PhutilTypeSpec(); + $obj->type = 'map'; + $obj->subtypes[] = $tokens[2]; + $obj->subtypes[] = $tokens[4]; + return $obj; + case 'list_type': + $obj = new PhutilTypeSpec(); + $obj->type = 'list'; + $obj->subtypes[] = $tokens[2]; + return $obj; + case 'maybe_optional': + if ($production == 'yes') { + $tokens[1]->optional = true; + return $tokens[1]; + } else { + return $tokens[0]; + } + break; + case 'maybe_comment': + if ($production == 'yes') { + $tokens[0]->comment = $tokens[1]; + } + return $tokens[0]; + case 'comment': + return $tokens[1]; + case 'comment_text': + $result = ''; + foreach ($tokens as $token) { + if (is_array($token)) { + $result .= $token[1]; + } else { + $result .= $token; + } + } + return $result; + default: + throw new Exception(pht("Unhandled parser rule '%s'!", $rule)); + } + } + + private static function getLexer() { + static $lexer; + if (!$lexer) { + $lexer = new PhutilTypeLexer(); + } + return $lexer; + } + + private static function parseTokens(array $tokens, $callback) { + // NOTE: This is automatically generated by the script + // `support/parser/generate-type-parser.php`. + + return PhutilParserGenerator::parseTokensWithTables( + array( + 0 => array( + 'opt' => array( + 0 => 'S', + 1 => 3, + ), + 'k' => array( + 0 => 'S', + 1 => 20, + ), + 'map' => array( + 0 => 'S', + 1 => 21, + ), + 'list' => array( + 0 => 'S', + 1 => 71, + ), + ), + 1 => array( + '(end-of-file)' => array( + 0 => 'A', + ), + ), + 2 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'start', + 1 => 0, + 2 => 1, + ), + ), + ), + 3 => array( + 'k' => array( + 0 => 'S', + 1 => 20, + ), + 'map' => array( + 0 => 'S', + 1 => 21, + ), + 'list' => array( + 0 => 'S', + 1 => 71, + ), + ), + 4 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'maybe_optional', + 1 => 'yes', + 2 => 2, + ), + ), + ), + 5 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'maybe_comment', + 1 => 'no', + 2 => 1, + ), + ), + '(' => array( + 0 => 'S', + 1 => 7, + ), + ), + 6 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'maybe_comment', + 1 => 'yes', + 2 => 2, + ), + ), + ), + 7 => array( + 'cm' => array( + 0 => 'S', + 1 => 11, + ), + ), + 8 => array( + ')' => array( + 0 => 'S', + 1 => 9, + ), + 'cm' => array( + 0 => 'S', + 1 => 10, + ), + ), + 9 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'comment', + 1 => 0, + 2 => 3, + ), + ), + ), + 10 => array( + ')' => array( + 0 => 'R', + 1 => array( + 0 => 'comment_text', + 1 => 0, + 2 => 2, + ), + ), + 'cm' => array( + 0 => 'R', + 1 => array( + 0 => 'comment_text', + 1 => 0, + 2 => 2, + ), + ), + ), + 11 => array( + ')' => array( + 0 => 'R', + 1 => array( + 0 => 'comment_text', + 1 => 1, + 2 => 1, + ), + ), + 'cm' => array( + 0 => 'R', + 1 => array( + 0 => 'comment_text', + 1 => 1, + 2 => 1, + ), + ), + ), + 12 => array( + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'no', + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'no', + 2 => 1, + ), + ), + '?' => array( + 0 => 'S', + 1 => 13, + ), + ), + 13 => array( + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'yes', + 2 => 2, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'yes', + 2 => 2, + ), + ), + ), + 14 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 15, + ), + ), + 15 => array( + 'k' => array( + 0 => 'S', + 1 => 20, + ), + 'map' => array( + 0 => 'S', + 1 => 21, + ), + 'list' => array( + 0 => 'S', + 1 => 71, + ), + ), + 16 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + ), + 17 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 18 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + ), + 19 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + ), + 20 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 21 => array( + '<' => array( + 0 => 'S', + 1 => 22, + ), + ), + 22 => array( + 'k' => array( + 0 => 'S', + 1 => 57, + ), + 'map' => array( + 0 => 'S', + 1 => 58, + ), + 'list' => array( + 0 => 'S', + 1 => 67, + ), + ), + 23 => array( + ',' => array( + 0 => 'S', + 1 => 24, + ), + ), + 24 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 25 => array( + '>' => array( + 0 => 'S', + 1 => 26, + ), + ), + 26 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + ), + 27 => array( + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'no', + 2 => 1, + ), + ), + '?' => array( + 0 => 'S', + 1 => 28, + ), + ), + 28 => array( + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'yes', + 2 => 2, + ), + ), + ), + 29 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 30, + ), + ), + 30 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 31 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + ), + 32 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 33 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + ), + 34 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + ), + 35 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 36 => array( + '<' => array( + 0 => 'S', + 1 => 37, + ), + ), + 37 => array( + 'k' => array( + 0 => 'S', + 1 => 57, + ), + 'map' => array( + 0 => 'S', + 1 => 58, + ), + 'list' => array( + 0 => 'S', + 1 => 67, + ), + ), + 38 => array( + ',' => array( + 0 => 'S', + 1 => 39, + ), + ), + 39 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 40 => array( + '>' => array( + 0 => 'S', + 1 => 41, + ), + ), + 41 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + ), + 42 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 43, + ), + ), + 43 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 44 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + ), + 45 => array( + '<' => array( + 0 => 'S', + 1 => 46, + ), + ), + 46 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 47 => array( + '>' => array( + 0 => 'S', + 1 => 48, + ), + ), + 48 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + ), + 49 => array( + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'no', + 2 => 1, + ), + ), + '?' => array( + 0 => 'S', + 1 => 50, + ), + ), + 50 => array( + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'yes', + 2 => 2, + ), + ), + ), + 51 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 52, + ), + ), + 52 => array( + 'k' => array( + 0 => 'S', + 1 => 57, + ), + 'map' => array( + 0 => 'S', + 1 => 58, + ), + 'list' => array( + 0 => 'S', + 1 => 67, + ), + ), + 53 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + ), + 54 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 55 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + ), + 56 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + ), + 57 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 58 => array( + '<' => array( + 0 => 'S', + 1 => 59, + ), + ), + 59 => array( + 'k' => array( + 0 => 'S', + 1 => 57, + ), + 'map' => array( + 0 => 'S', + 1 => 58, + ), + 'list' => array( + 0 => 'S', + 1 => 67, + ), + ), + 60 => array( + ',' => array( + 0 => 'S', + 1 => 61, + ), + ), + 61 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 62 => array( + '>' => array( + 0 => 'S', + 1 => 63, + ), + ), + 63 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + ), + 64 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 65, + ), + ), + 65 => array( + 'k' => array( + 0 => 'S', + 1 => 57, + ), + 'map' => array( + 0 => 'S', + 1 => 58, + ), + 'list' => array( + 0 => 'S', + 1 => 67, + ), + ), + 66 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + ), + 67 => array( + '<' => array( + 0 => 'S', + 1 => 68, + ), + ), + 68 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 69 => array( + '>' => array( + 0 => 'S', + 1 => 70, + ), + ), + 70 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + ), + 71 => array( + '<' => array( + 0 => 'S', + 1 => 72, + ), + ), + 72 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 73 => array( + '>' => array( + 0 => 'S', + 1 => 74, + ), + ), + 74 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + ), + 75 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 76, + ), + ), + 76 => array( + 'k' => array( + 0 => 'S', + 1 => 20, + ), + 'map' => array( + 0 => 'S', + 1 => 21, + ), + 'list' => array( + 0 => 'S', + 1 => 71, + ), + ), + 77 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + ), + 78 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'maybe_optional', + 1 => 'no', + 2 => 1, + ), + ), + ), + ), + array( + 0 => array( + 'start' => 1, + 'maybe_optional' => 2, + 'maybe_comment' => 78, + 'type' => 5, + 'some_type' => 12, + 'or_type' => 14, + 'not_or_type' => 75, + 'basic_type' => 17, + 'map_type' => 18, + 'list_type' => 19, + ), + 3 => array( + 'maybe_comment' => 4, + 'type' => 5, + 'some_type' => 12, + 'or_type' => 14, + 'not_or_type' => 75, + 'basic_type' => 17, + 'map_type' => 18, + 'list_type' => 19, + ), + 5 => array( + 'comment' => 6, + ), + 7 => array( + 'comment_text' => 8, + ), + 15 => array( + 'not_or_type' => 16, + 'basic_type' => 17, + 'map_type' => 18, + 'list_type' => 19, + ), + 22 => array( + 'type' => 23, + 'some_type' => 49, + 'or_type' => 51, + 'not_or_type' => 64, + 'basic_type' => 54, + 'map_type' => 55, + 'list_type' => 56, + ), + 24 => array( + 'type' => 25, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 30 => array( + 'not_or_type' => 31, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 37 => array( + 'type' => 38, + 'some_type' => 49, + 'or_type' => 51, + 'not_or_type' => 64, + 'basic_type' => 54, + 'map_type' => 55, + 'list_type' => 56, + ), + 39 => array( + 'type' => 40, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 43 => array( + 'not_or_type' => 44, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 46 => array( + 'type' => 47, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 52 => array( + 'not_or_type' => 53, + 'basic_type' => 54, + 'map_type' => 55, + 'list_type' => 56, + ), + 59 => array( + 'type' => 60, + 'some_type' => 49, + 'or_type' => 51, + 'not_or_type' => 64, + 'basic_type' => 54, + 'map_type' => 55, + 'list_type' => 56, + ), + 61 => array( + 'type' => 62, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 65 => array( + 'not_or_type' => 66, + 'basic_type' => 54, + 'map_type' => 55, + 'list_type' => 56, + ), + 68 => array( + 'type' => 69, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 72 => array( + 'type' => 73, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 76 => array( + 'not_or_type' => 77, + 'basic_type' => 17, + 'map_type' => 18, + 'list_type' => 19, + ), + ), + '(end-of-file)', + $tokens, + $callback); + } + +} diff --git a/src/parser/PhutilURI.php b/src/parser/PhutilURI.php new file mode 100644 index 00000000..7ddd3074 --- /dev/null +++ b/src/parser/PhutilURI.php @@ -0,0 +1,559 @@ +protocol = $uri->protocol; + $this->user = $uri->user; + $this->pass = $uri->pass; + $this->domain = $uri->domain; + $this->port = $uri->port; + $this->path = $uri->path; + $this->query = $uri->query; + $this->fragment = $uri->fragment; + $this->type = $uri->type; + + $this->initializeQueryParams(phutil_string_cast($uri), $params); + + return; + } + + $uri = phutil_string_cast($uri); + + $type = self::TYPE_URI; + + // Reject ambiguous URIs outright. Different versions of different clients + // parse these in different ways. See T12526 for discussion. + if (preg_match('(^[^/:]*://[^/]*[#?].*:)', $uri)) { + throw new Exception( + pht( + 'Rejecting ambiguous URI "%s". This URI is not formatted or '. + 'encoded properly.', + $uri)); + } + + $matches = null; + if (preg_match('(^([^/:]*://[^/]*)(\\?.*)\z)', $uri, $matches)) { + // If the URI is something like `idea://open?file=/path/to/file`, the + // `parse_url()` function will parse `open?file=` as the host. This is + // not the expected result. Break the URI into two pieces, stick a slash + // in between them, parse that, then remove the path. See T6106. + + $parts = parse_url($matches[1].'/'.$matches[2]); + unset($parts['path']); + } else if ($this->isGitURIPattern($uri)) { + // Handle Git/SCP URIs in the form "user@domain:relative/path". + + $user = '(?:(?P[^/@]+)@)?'; + $host = '(?P[^/:]+)'; + $path = ':(?P.*)'; + + $ok = preg_match('(^'.$user.$host.$path.'\z)', $uri, $matches); + if (!$ok) { + throw new Exception( + pht( + 'Failed to parse URI "%s" as a Git URI.', + $uri)); + } + + $parts = $matches; + $parts['scheme'] = 'ssh'; + + $type = self::TYPE_GIT; + } else { + $parts = parse_url($uri); + } + + // The parse_url() call will accept URIs with leading whitespace, but many + // other tools (like git) will not. See T4913 for a specific example. If + // the input string has leading whitespace, fail the parse. + if ($parts) { + if (ltrim($uri) != $uri) { + $parts = false; + } + } + + // NOTE: `parse_url()` is very liberal about host names; fail the parse if + // the host looks like garbage. In particular, we do not allow hosts which + // begin with "." or "-". See T12961 for a specific attack which relied on + // hosts beginning with "-". + if ($parts) { + $host = idx($parts, 'host', ''); + if (strlen($host)) { + if (!preg_match('/^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-]*\z/', $host)) { + $parts = false; + } + } + } + + if (!$parts) { + $parts = array(); + } + + // stringyness is to preserve API compatibility and + // allow the tests to continue passing + $this->protocol = idx($parts, 'scheme', ''); + $this->user = rawurldecode(idx($parts, 'user', '')); + $this->pass = rawurldecode(idx($parts, 'pass', '')); + $this->domain = idx($parts, 'host', ''); + $this->port = (string)idx($parts, 'port', ''); + $this->path = idx($parts, 'path', ''); + $query = idx($parts, 'query'); + if ($query) { + $pairs = id(new PhutilQueryStringParser()) + ->parseQueryStringToPairList($query); + + foreach ($pairs as $pair) { + list($key, $value) = $pair; + $this->appendQueryParam($key, $value); + } + } + $this->fragment = idx($parts, 'fragment', ''); + + $this->type = $type; + + $this->initializeQueryParams($uri, $params); + } + + public function __toString() { + $prefix = null; + + if ($this->isGitURI()) { + $port = null; + } else { + $port = $this->port; + } + + $domain = $this->domain; + + $user = $this->user; + $pass = $this->pass; + if (strlen($user) && strlen($pass)) { + $auth = rawurlencode($user).':'.rawurlencode($pass).'@'; + } else if (strlen($user)) { + $auth = rawurlencode($user).'@'; + } else { + $auth = null; + } + + $protocol = $this->protocol; + if ($this->isGitURI()) { + $protocol = null; + } else { + if (strlen($auth)) { + $protocol = nonempty($this->protocol, 'http'); + } + } + + if (strlen($protocol) || strlen($auth) || strlen($domain)) { + if ($this->isGitURI()) { + $prefix = "{$auth}{$domain}"; + } else { + $prefix = "{$protocol}://{$auth}{$domain}"; + } + + if (strlen($port)) { + $prefix .= ':'.$port; + } + } + + if ($this->query) { + $query = '?'.phutil_build_http_querystring_from_pairs($this->query); + } else { + $query = null; + } + + if (strlen($this->getFragment())) { + $fragment = '#'.$this->getFragment(); + } else { + $fragment = null; + } + + $path = $this->getPath(); + if ($this->isGitURI()) { + if (strlen($path)) { + $path = ':'.$path; + } + } + + return $prefix.$path.$query.$fragment; + } + + /** + * @deprecated + */ + public function setQueryParam($key, $value) { + // To set, we replace the first matching key with the new value, then + // remove all other matching keys. This replaces the old value and retains + // the parameter order. + + $is_null = ($value === null); + + // Typecheck and cast the key before we compare it to existing keys. This + // raises an early exception if the key has a bad type. + list($key) = phutil_http_parameter_pair($key, ''); + + $found = false; + foreach ($this->query as $list_key => $pair) { + list($k, $v) = $pair; + + if ($k !== $key) { + continue; + } + + if ($found) { + unset($this->query[$list_key]); + continue; + } + + $found = true; + + if ($is_null) { + unset($this->query[$list_key]); + } else { + $this->insertQueryParam($key, $value, $list_key); + } + } + + $this->query = array_values($this->query); + + // If we didn't find an existing place to put it, add it to the end. + if (!$found) { + if (!$is_null) { + $this->appendQueryParam($key, $value); + } + } + + return $this; + } + + /** + * @deprecated + */ + public function setQueryParams(array $params) { + $this->query = array(); + + foreach ($params as $k => $v) { + $this->appendQueryParam($k, $v); + } + + return $this; + } + + /** + * @deprecated + */ + public function getQueryParams() { + $map = array(); + + foreach ($this->query as $pair) { + list($k, $v) = $pair; + $map[$k] = $v; + } + + return $map; + } + + public function getQueryParamsAsMap() { + $map = array(); + + foreach ($this->query as $pair) { + list($k, $v) = $pair; + + if (isset($map[$k])) { + throw new Exception( + pht( + 'Query parameters include a duplicate key ("%s") and can not be '. + 'nondestructively represented as a map.', + $k)); + } + + $map[$k] = $v; + } + + return $map; + } + + public function getQueryParamsAsPairList() { + return $this->query; + } + + public function appendQueryParam($key, $value) { + return $this->insertQueryParam($key, $value); + } + + public function removeAllQueryParams() { + $this->query = array(); + return $this; + } + + public function removeQueryParam($remove_key) { + list($remove_key) = phutil_http_parameter_pair($remove_key, ''); + + foreach ($this->query as $idx => $pair) { + list($key, $value) = $pair; + + if ($key !== $remove_key) { + continue; + } + + unset($this->query[$idx]); + } + + $this->query = array_values($this->query); + + return $this; + } + + public function replaceQueryParam($replace_key, $replace_value) { + if ($replace_value === null) { + throw new InvalidArgumentException( + pht( + 'Value provided to "replaceQueryParam()" for key "%s" is NULL. '. + 'Use "removeQueryParam()" to remove a query parameter.', + $replace_key)); + } + + $this->removeQueryParam($replace_key); + $this->appendQueryParam($replace_key, $replace_value); + return $this; + } + + private function insertQueryParam($key, $value, $idx = null) { + list($key, $value) = phutil_http_parameter_pair($key, $value); + + if ($idx === null) { + $this->query[] = array($key, $value); + } else { + $this->query[$idx] = array($key, $value); + } + + return $this; + } + + private function initializeQueryParams($uri, array $params) { + $have_params = array(); + foreach ($this->query as $pair) { + list($key) = $pair; + $have_params[$key] = true; + } + + foreach ($params as $key => $value) { + if (isset($have_params[$key])) { + throw new InvalidArgumentException( + pht( + 'You are trying to construct an ambiguous URI: query parameter '. + '"%s" is present in both the string argument ("%s") and the map '. + 'argument.', + $key, + $uri)); + } + + if ($value === null) { + continue; + } + + $this->appendQueryParam($key, $value); + } + + return $this; + } + + public function setProtocol($protocol) { + $this->protocol = $protocol; + return $this; + } + + public function getProtocol() { + return $this->protocol; + } + + public function setDomain($domain) { + $this->domain = $domain; + return $this; + } + + public function getDomain() { + return $this->domain; + } + + public function setPort($port) { + $this->port = $port; + return $this; + } + public function getPort() { + return $this->port; + } + + public function getPortWithProtocolDefault() { + static $default_ports = array( + 'http' => '80', + 'https' => '443', + 'ssh' => '22', + ); + + return nonempty( + $this->getPort(), + idx($default_ports, $this->getProtocol()), + ''); + } + + public function setPath($path) { + if ($this->isGitURI()) { + // Git URIs use relative paths which do not need to begin with "/". + } else { + if ($this->domain && strlen($path) && $path[0] !== '/') { + $path = '/'.$path; + } + } + + $this->path = $path; + return $this; + } + + public function appendPath($path) { + $first = strlen($path) ? $path[0] : null; + $last = strlen($this->path) ? $this->path[strlen($this->path) - 1] : null; + + if (!$this->path) { + return $this->setPath($path); + } else if ($first === '/' && $last === '/') { + $path = substr($path, 1); + } else if ($first !== '/' && $last !== '/') { + $path = '/'.$path; + } + + $this->path .= $path; + return $this; + } + + public function getPath() { + return $this->path; + } + + public function setFragment($fragment) { + $this->fragment = $fragment; + return $this; + } + + public function getFragment() { + return $this->fragment; + } + + public function setUser($user) { + $this->user = $user; + return $this; + } + + public function getUser() { + return $this->user; + } + + public function setPass($pass) { + $this->pass = $pass; + return $this; + } + + public function getPass() { + return $this->pass; + } + + public function alter($key, $value) { + $altered = clone $this; + $altered->replaceQueryParam($key, $value); + return $altered; + } + + public function isGitURI() { + return ($this->type == self::TYPE_GIT); + } + + public function setType($type) { + + if ($type == self::TYPE_URI) { + $path = $this->getPath(); + if (strlen($path) && ($path[0] !== '/')) { + // Try to catch this here because we are not allowed to throw from + // inside __toString() so we don't have a reasonable opportunity to + // react properly if we catch it later. + throw new Exception( + pht( + 'Unable to convert URI "%s" into a standard URI because the '. + 'path is relative. Standard URIs can not represent relative '. + 'paths.', + $this)); + } + } + + $this->type = $type; + return $this; + } + + public function getType() { + return $this->type; + } + + private function isGitURIPattern($uri) { + $matches = null; + + $ok = preg_match('(^(?P[^/]+):(?P(?!//).*)\z)', $uri, $matches); + if (!$ok) { + return false; + } + + $head = $matches['head']; + $last = $matches['last']; + + // If any part of this has spaces in it, it's not a Git URI. We fail here + // so we fall back and don't fail more abruptly later. + if (preg_match('(\s)', $head.$last)) { + return false; + } + + // If the second part only contains digits, assume we're looking at + // casually specified "domain.com:123" URI, not a Git URI pointed at an + // entirely numeric relative path. + if (preg_match('(^\d+\z)', $last)) { + return false; + } + + // If the first part has a "." or an "@" in it, interpret it as a domain + // or a "user@host" string. + if (preg_match('([.@])', $head)) { + return true; + } + + // Otherwise, interpret the URI conservatively as a "javascript:"-style + // URI. This means that "localhost:path" is parsed as a normal URI instead + // of a Git URI, but we can't tell which the user intends and it's safer + // to treat it as a normal URI. + return false; + } + +} diff --git a/src/parser/__tests__/PhutilBugtraqParserTestCase.php b/src/parser/__tests__/PhutilBugtraqParserTestCase.php new file mode 100644 index 00000000..984289ac --- /dev/null +++ b/src/parser/__tests__/PhutilBugtraqParserTestCase.php @@ -0,0 +1,61 @@ +setBugtraqPattern('http://bugs.com/%BUGID%') + ->setBugtraqCaptureExpression('/[Ii]ssues?:?(\s*,?\s*\d+)+/') + ->setBugtraqSelectExpression('/(\d+)/') + ->processCorpus('Issues: 123, 345'); + $this->assertEqual( + 'Issues: http://bugs.com/123, http://bugs.com/345', + $actual); + + $actual = id(new PhutilBugtraqParser()) + ->setBugtraqPattern('<%BUGID%>') + ->setBugtraqCaptureExpression('/([A-Z]{2,}-\d+)/') + ->processCorpus('AB-1 BC-2 CD-3'); + $this->assertEqual( + ' ', + $actual); + + $actual = id(new PhutilBugtraqParser()) + ->setBugtraqPattern('<%BUGID%>') + ->setBugtraqCaptureExpression('/\d+/') + ->processCorpus('This text has no bugs in it.'); + $this->assertEqual( + 'This text has no bugs in it.', + $actual); + + $actual = id(new PhutilBugtraqParser()) + ->setBugtraqPattern('<%BUGID%>') + ->setBugtraqCaptureExpression('/.*/') + ->setBugtraqSelectExpression('/(\d+)/') + ->processCorpus('This text captures but does not select.'); + $this->assertEqual( + 'This text captures but does not select.', + $actual); + + $caught = null; + try { + id(new PhutilBugtraqParser()) + ->setBugtraqCaptureExpression('!'); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof PhutilTypeCheckException); + + + $caught = null; + try { + id(new PhutilBugtraqParser()) + ->setBugtraqSelectExpression('!'); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof PhutilTypeCheckException); + } + + +} diff --git a/src/parser/__tests__/PhutilDocblockParserTestCase.php b/src/parser/__tests__/PhutilDocblockParserTestCase.php new file mode 100644 index 00000000..c0fefc07 --- /dev/null +++ b/src/parser/__tests__/PhutilDocblockParserTestCase.php @@ -0,0 +1,127 @@ +parseDocblock($root.$file); + } + } + + private function parseDocblock($doc_file) { + $contents = Filesystem::readFile($doc_file); + $file = basename($doc_file); + + $parser = new PhutilDocblockParser(); + list($docblock, $specials) = $parser->parse($contents); + + switch ($file) { + case 'embedded-specials.docblock': + $this->assertEqual(array(), $specials); + $this->assertEqual( + "So long as a @special does not appear at the beginning of a line,\n". + "it is parsed as normal text.", + $docblock); + break; + case 'indented-block.docblock': + $this->assertEqual(array(), $specials); + $this->assertEqual( + 'Cozy lummox gives smart squid who asks for job pen.', + $docblock); + break; + case 'indented-text.docblock': + $this->assertEqual(array(), $specials); + $this->assertEqual( + 'Cozy lummox gives smart squid who asks for job pen.', + $docblock); + break; + case 'multiline-special.docblock': + $this->assertEqual( + array( + 'special' => 'x y z', + ), + $specials); + $this->assertEqual( + '', + $docblock); + break; + case 'multi-specials.docblock': + $this->assertEqual( + array( + 'special' => array('north', 'south'), + 'stable' => true, + ), + $specials); + $this->assertEqual( + '', + $docblock); + break; + case 'specials.docblock': + $this->assertEqual( + array( + 'type' => 'type', + 'task' => 'task', + 'special' => array('dot', 'dot', 'dash'), + ), + $specials); + $this->assertEqual( + '', + $docblock); + break; + case 'linebreak-breaks-specials.docblock': + $this->assertEqual( + array( + 'title' => 'title', + ), + $specials); + $this->assertEqual( + 'This is normal text, not part of the @title.', + $docblock); + break; + case 'specials-with-hyphen.docblock': + $this->assertEqual( + array( + 'repeat-hyphen' => array('a', 'b'), + 'multiline-hyphen' => 'mmm nnn', + 'normal-hyphen' => 'x', + ), + $specials); + break; + case 'indented-specials.docblock': + $this->assertEqual( + array( + 'title' => 'sendmail', + 'special' => 'only a little bit indented', + ), + $specials); + break; + case 'flag-specials.docblock': + $this->assertEqual( + "stuff above\n\nstuff in the middle\n\nstuff below", + $docblock); + $this->assertEqual( + array( + 'flag' => true, + 'stuff' => true, + 'zebra' => true, + 'apple' => true, + ), + $specials); + break; + case 'mixed-types.docblock': + $this->assertEqual( + array( + 'special' => array('squirrels', true), + ), + $specials); + break; + default: + throw new Exception(pht("No test case to handle file '%s'!", $file)); + } + } + +} diff --git a/src/parser/__tests__/PhutilEditorConfigTestCase.php b/src/parser/__tests__/PhutilEditorConfigTestCase.php new file mode 100644 index 00000000..38557fa3 --- /dev/null +++ b/src/parser/__tests__/PhutilEditorConfigTestCase.php @@ -0,0 +1,106 @@ +getTestFile()); + + $tests = array( + 'default' => array( + array( + 'indent_style' => 'space', + 'indent_size' => 2, + 'charset' => 'utf-8', + 'trim_trailing_whitespace' => true, + 'insert_final_newline' => true, + ), + array(), + ), + 'file' => array( + array( + 'indent_style' => 'space', + 'indent_size' => 3, + 'charset' => 'utf-8', + 'trim_trailing_whitespace' => true, + 'insert_final_newline' => true, + ), + array(), + ), + 'file.txt' => array( + array( + 'indent_style' => 'space', + 'indent_size' => 3, + 'charset' => 'latin1', + 'trim_trailing_whitespace' => true, + 'insert_final_newline' => true, + ), + array(), + ), + 'externals/README' => array( + array( + 'indent_style' => null, + 'indent_size' => null, + 'charset' => 'utf-8', + 'trim_trailing_whitespace' => false, + 'insert_final_newline' => false, + ), + array(), + ), + 'subdir/file' => array( + array( + 'indent_style' => 'tab', + 'indent_size' => 3, + 'charset' => 'utf-8-bom', + 'trim_trailing_whitespace' => true, + 'insert_final_newline' => true, + ), + array(), + ), + 'empty/file' => array( + array(), + array( + 'indent_style' => null, + 'indent_size' => null, + 'charset' => null, + 'trim_trailing_whitespace' => null, + 'insert_final_newline' => null, + ), + ), + ); + + foreach ($tests as $path => $expected) { + list($properties, $property) = $expected; + $property = array_merge($properties, $property); + + $this->assertEqual( + $properties, + $parser->getProperties($this->getTestFile($path))); + + foreach ($property as $key => $value) { + $this->assertEqual( + $value, + $parser->getProperty($this->getTestFile($path), $key)); + } + } + + $invalid_properties = array( + 'invalid', + ); + + foreach ($invalid_properties as $invalid_property) { + $caught = null; + try { + $parser->getProperty('', $invalid_property); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof InvalidArgumentException); + } + } + + private function getTestFile($path = null) { + return dirname(__FILE__).'/editorconfig/'.$path; + } + +} diff --git a/src/parser/__tests__/PhutilEmailAddressTestCase.php b/src/parser/__tests__/PhutilEmailAddressTestCase.php new file mode 100644 index 00000000..f2c4158b --- /dev/null +++ b/src/parser/__tests__/PhutilEmailAddressTestCase.php @@ -0,0 +1,130 @@ +'); + $this->assertEqual( + 'Abraham Lincoln', + $email->getDisplayName()); + $this->assertEqual( + 'alincoln', + $email->getLocalPart()); + $this->assertEqual( + 'logcabin.com', + $email->getDomainName()); + $this->assertEqual( + 'alincoln@logcabin.com', + $email->getAddress()); + + $email = new PhutilEmailAddress('alincoln@logcabin.com'); + $this->assertEqual( + null, + $email->getDisplayName()); + $this->assertEqual( + 'alincoln', + $email->getLocalPart()); + $this->assertEqual( + 'logcabin.com', + $email->getDomainName()); + $this->assertEqual( + 'alincoln@logcabin.com', + $email->getAddress()); + + $email = new PhutilEmailAddress('"Abraham" '); + $this->assertEqual( + 'Abraham', + $email->getDisplayName()); + $this->assertEqual( + 'alincoln', + $email->getLocalPart()); + $this->assertEqual( + 'logcabin.com', + $email->getDomainName()); + $this->assertEqual( + 'alincoln@logcabin.com', + $email->getAddress()); + + $email = new PhutilEmailAddress(' alincoln@logcabin.com '); + $this->assertEqual( + null, + $email->getDisplayName()); + $this->assertEqual( + 'alincoln', + $email->getLocalPart()); + $this->assertEqual( + 'logcabin.com', + $email->getDomainName()); + $this->assertEqual( + 'alincoln@logcabin.com', + $email->getAddress()); + + $email = new PhutilEmailAddress('alincoln'); + $this->assertEqual( + null, + $email->getDisplayName()); + $this->assertEqual( + 'alincoln', + $email->getLocalPart()); + $this->assertEqual( + null, + $email->getDomainName()); + $this->assertEqual( + 'alincoln', + $email->getAddress()); + + $email = new PhutilEmailAddress('alincoln '); + $this->assertEqual( + 'alincoln', + $email->getDisplayName()); + $this->assertEqual( + 'alincoln at logcabin dot com', + $email->getLocalPart()); + $this->assertEqual( + null, + $email->getDomainName()); + $this->assertEqual( + 'alincoln at logcabin dot com', + $email->getAddress()); + } + + public function testEmailEncoding() { + $cases = array( + array( + 'Tangerine Q. Hawthorne', + 'thawthorne@blackspire.bunker', + '"Tangerine Q. Hawthorne" ', + ), + array( + 'Hector "\\" Backslash', + 'hector@backslash', + '"Hector \\"\\\\\\" Backslash" ', + ), + array( + 'My Middle Name "" Is My Email', + 'name@domain', + '"My Middle Name \\"\\" Is My Email" ', + ), + array( + "My Legal Name\nContains A Newline", + 'newline@example', + '"My Legal Name Contains A Newline" ', + ), + ); + + foreach ($cases as $case) { + list($name, $address, $expect) = $case; + $actual = (string)id(new PhutilEmailAddress()) + ->setDisplayName($name) + ->setAddress($address); + $this->assertEqual( + $expect, + $actual, + pht('Email: %s + %s -> %s', $name, $address, $expect)); + } + } + +} diff --git a/src/parser/__tests__/PhutilGitURITestCase.php b/src/parser/__tests__/PhutilGitURITestCase.php new file mode 100644 index 00000000..91f05115 --- /dev/null +++ b/src/parser/__tests__/PhutilGitURITestCase.php @@ -0,0 +1,28 @@ +assertEqual('git', $uri->getUser()); + $this->assertEqual('host.com', $uri->getDomain()); + $this->assertEqual('path/to/something', $uri->getPath()); + $this->assertEqual('git@host.com:path/to/something', (string)$uri); + + $uri = new PhutilGitURI('host.com:path/to/something'); + $this->assertEqual('', $uri->getUser()); + $this->assertEqual('host.com', $uri->getDomain()); + $this->assertEqual('path/to/something', $uri->getPath()); + $this->assertEqual('host.com:path/to/something', (string)$uri); + } + + public function testStrictGitURIParsingOfLeadingWhitespace() { + $uri = new PhutilURI(' user@example.com'); + $this->assertEqual('', $uri->getDomain()); + } + + +} diff --git a/src/parser/__tests__/PhutilJSONParserTestCase.php b/src/parser/__tests__/PhutilJSONParserTestCase.php new file mode 100644 index 00000000..e24a75cb --- /dev/null +++ b/src/parser/__tests__/PhutilJSONParserTestCase.php @@ -0,0 +1,139 @@ + array(), + '[]' => array(), + '{"foo": "bar"}' => array('foo' => 'bar'), + '[1, "foo", true, null]' => array(1, 'foo', true, null), + '{"foo": {"bar": "baz"}}' => array('foo' => array('bar' => 'baz')), + '{"foo": "bar", "bar": ["baz"]}' + => array('foo' => 'bar', 'bar' => array('baz')), + '{"foo": "bar", "bar": {"baz": "foo"}}' + => array('foo' => 'bar', 'bar' => array('baz' => 'foo')), + '{"": ""}' => array('' => ''), + '{"test":"\u00c9v\u00e9nement"}' + => array('test' => "\xC3\x89v\xC3\xA9nement"), + '["\u00c9v\u00e9nement"]' => array("\xC3\x89v\xC3\xA9nement"), + '{"test":"http:\/\/foo\\\\zomg"}' + => array('test' => 'http://foo\\zomg'), + '["http:\/\/foo\\\\zomg"]' => array('http://foo\\zomg'), + Filesystem::readFile(dirname(__FILE__).'/json/base64.json') => array( + 'action' => 'candidate.create', + 'actionId' => '80653a26cc46357ff79ff83b47e27c3cb7a668bd', + 'params' => array( + 'attachments' => array( + Filesystem::readFile(dirname(__FILE__).'/json/base64.data'), + ), + ), + ), + ); + + foreach ($tests as $input => $expect) { + $this->assertEqual( + $expect, + $parser->parse($input), + pht('Parsing JSON: %s', $input)); + } + } + + public function testInvalidJSON() { + $parser = new PhutilJSONParser(); + + $tests = array( + '{' => array( + 'line' => 1, + 'char' => 1, + 'token' => 'EOF', + ), + '[' => array( + 'line' => 1, + 'char' => 1, + 'token' => 'EOF', + ), + '{"foo":' => array( + 'line' => 1, + 'char' => 7, + 'token' => 'EOF', + ), + '{"foo":"bar",}' => array( + 'line' => 1, + 'char' => 13, + 'token' => '}', + ), + '{{}' => array( + 'line' => 1, + 'char' => 1, + 'token' => '{', + ), + '{}}' => array( + 'line' => 1, + 'char' => 2, + 'token' => '}', + ), + "{\"foo\":\"bar\",\n\"bar\":\"baz\",}" => array( + 'line' => 2, + 'char' => 12, + 'token' => '}', + ), + "{'foo': 'bar'}" => array( + 'line' => 1, + 'char' => 1, + 'token' => 'INVALID', + ), + "{\"foo\": \"bar\nbaz\"}" => array( + 'line' => 1, + 'char' => 7, + 'token' => 'INVALID', + ), + '{"foo": "bar\z"}' => array( + 'line' => 1, + 'char' => 7, + 'token' => 'INVALID', + ), + ); + + foreach ($tests as $input => $expected) { + $caught = null; + try { + $parser->parse($input); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof PhutilJSONParserException); + $this->assertEqual($expected['line'], $caught->getSourceLine()); + $this->assertEqual($expected['char'], $caught->getSourceChar()); + $this->assertEqual($expected['token'], $caught->getSourceToken()); + } + } + + public function testDuplicateKeys() { + $parser = new PhutilJSONParser(); + + $tests = array( + '{"foo": "bar", "foo": "baz"}' => array('foo' => 'baz'), + ); + + foreach ($tests as $input => $expect) { + $parser->setAllowDuplicateKeys(true); + $this->assertEqual( + $expect, + $parser->parse($input), + pht('Parsing JSON: %s', $input)); + + $parser->setAllowDuplicateKeys(false); + $caught = null; + try { + $parser->parse($input); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof PhutilJSONParserException); + } + } + +} diff --git a/src/parser/__tests__/PhutilJSONTestCase.php b/src/parser/__tests__/PhutilJSONTestCase.php new file mode 100644 index 00000000..295d7b55 --- /dev/null +++ b/src/parser/__tests__/PhutilJSONTestCase.php @@ -0,0 +1,21 @@ +assertEqual( + $expect, + $serializer->encodeFormatted(array('x' => array())), + pht('Empty arrays should serialize as `%s`, not `%s`.', '[]', '{}')); + } + +} diff --git a/src/parser/__tests__/PhutilLanguageGuesserTestCase.php b/src/parser/__tests__/PhutilLanguageGuesserTestCase.php new file mode 100644 index 00000000..9eaa402a --- /dev/null +++ b/src/parser/__tests__/PhutilLanguageGuesserTestCase.php @@ -0,0 +1,23 @@ +assertEqual( + $expect, + PhutilLanguageGuesser::guessLanguage($source), + pht("Guessed language for '%s'.", $test)); + } + } + +} diff --git a/src/parser/__tests__/PhutilParserGeneratorTestCase.php b/src/parser/__tests__/PhutilParserGeneratorTestCase.php new file mode 100644 index 00000000..d82ef6ec --- /dev/null +++ b/src/parser/__tests__/PhutilParserGeneratorTestCase.php @@ -0,0 +1,330 @@ +setTerminals(array('a')) + ->setStartRule('S') + ->setRules( + array( + 'S' => 'a b', + )); + + $caught = null; + try { + // Expect "b is not a rule or terminal". + $generator->processGrammar(); + } catch (PhutilUnknownSymbolParserGeneratorException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testBadStartRule() { + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('a')) + ->setStartRule('Q') + ->setRules( + array( + 'S' => 'a', + )); + + $caught = null; + try { + // Expect "no start rule Q". + $generator->processGrammar(); + } catch (PhutilUnknownSymbolParserGeneratorException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testMessySymbols() { + // This is testing that internal defaults are correctly changed when they + // would conflict with the provided grammar. This is a messy test which + // relies on a lot of implementation details. + + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('(init)', 'x', 'y', 'start', '(end)')) + ->setStartRule('(epsilon)') + ->setRules( + array( + '(epsilon)' => array( + array('s p a c e s'), + ), + 's p a c e s' => '(init) x start (end-of-file) y', + '(end-of-file)' => array( + '(end)', + null, + ), + )) + ->processGrammar(); + + $rules = $generator->inspectRules(); + + $init = $generator->getInitSymbol(); + $eof = $generator->getEOFSymbol(); + $epsilon = $generator->getEpsilonSymbol(); + $end = $generator->getEndSymbol(); + + $this->assertFalse($init == '(init)'); + $this->assertFalse($eof == '(end-of-file)'); + $this->assertFalse($epsilon == '(epsilon)'); + $this->assertFalse($end == '(end)'); + + $keys = array_keys($rules); + $expect = array('(end-of-file)', '(epsilon)', 's p a c e s', $init); + sort($keys); + sort($expect); + $this->assertEqual($keys, $expect); + + $this->assertEqual( + array( + array('s p a c e s', $end), + ), + $rules['(epsilon)']); + + $this->assertEqual( + array( + array('(end)', $end), + array($epsilon, $end), + ), + $rules['(end-of-file)']); + } + + public function testUnreachableTerminal() { + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('x', 'y')) + ->setStartRule('S') + ->setRules( + array( + 'S' => 'x', + )); + + $caught = null; + try { + $generator->processGrammar(); + } catch (PhutilUnreachableTerminalParserGeneratorException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testUnreachableRule() { + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('x')) + ->setStartRule('S') + ->setRules( + array( + 'S' => 'x', + 'A' => 'B', + 'B' => 'x', + )); + + $caught = null; + try { + $generator->processGrammar(); + } catch (PhutilUnreachableRuleParserGeneratorException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testIrreducibleGrammars() { + $tests = array( + 'trivially irreducible' => array( + true, + array( + 'S' => array('E', 'x'), + 'E' => 'E', + ), + ), + 'nontrivially irreducible' => array( + true, + array( + 'S' => array('X', 'x'), + 'X' => 'Y', + 'Y' => 'Z', + 'Z' => 'X', + ), + ), + 'left-recursive reducible' => array( + false, + array( + 'S' => 'E', + 'E' => array('E x', 'x'), + ), + ), + 'right-recursive reducible' => array( + false, + array( + 'S' => 'E', + 'E' => array('x', 'x E'), + ), + ), + ); + + foreach ($tests as $test) { + list($expect, $rules) = $test; + + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('x')) + ->setStartRule('S') + ->setRules($rules); + + $caught = null; + try { + $generator->processGrammar(); + } catch (PhutilIrreducibleRuleParserGeneratorException $ex) { + $caught = $ex; + } + + $this->assertEqual($expect, ($caught instanceof Exception)); + } + } + + public function testFirst() { + $generator = $this->buildABCGenerator()->processGrammar(); + + $first = $generator->inspectFirstTable(); + ksort($first); + + foreach ($first as $key => $table) { + ksort($table); + $first[$key] = $table; + } + + $this->assertEqual( + array( + 'A' => array( + '(epsilon)' => true, + 'a' => true, + 'b' => true, + ), + 'B' => array( + 'c' => true, + ), + 'C' => array( + '(epsilon)' => true, + 'b' => true, + ), + 'S' => array( + 'a' => true, + 'b' => true, + 'c' => true, + ), + ), + $first); + } + + public function testStates() { + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('a', 'b')) + ->setStartRule('S') + ->setRules( + array( + 'S' => 'X X', + 'X' => array( + 'a X', + 'b', + ), + )) + ->processGrammar(); + + $this->assertTrue(true); + } + + public function testETParser() { + $generator = $this->buildETGenerator()->processGrammar(); + + $result = $generator->parseTokens( + array( + array('n', 3), + array('+', '+'), + array('n', 5), + ), + array($this, 'didReduceET')); + + $this->assertEqual(8, $result); + } + + public function didReduceET($rule, $production, array $tokens) { + switch ($rule) { + case 'S': + return $tokens[0]; + case 'E': + switch ($production) { + case 0: + return $tokens[0] + $tokens[2]; + case 1: + return $tokens[0]; + } + break; + case 'T': + switch ($production) { + case 0: + return $tokens[1]; + case 1: + return $tokens[0][1]; + } + break; + } + + throw new Exception(pht('Unexpected rule in ET grammar.')); + } + + private function buildABCGenerator() { + $terminals = array( + 'a', + 'b', + 'c', + ); + + $rules = array( + 'S' => 'A B', + 'A' => array('C a', null), + 'B' => array('B a A C', 'c'), + 'C' => array('b', null), + ); + + $generator = id(new PhutilParserGenerator()) + ->setTerminals($terminals) + ->setStartRule('S') + ->setRules($rules); + + return $generator; + } + + private function buildETGenerator() { + // This grammar and the corresponding tests are based on: + // http://dragonbook.stanford.edu/lecture-notes/Stanford-CS143/08-Bottom-Up-Parsing.pdf + // http://dragonbook.stanford.edu/lecture-notes/Stanford-CS143/09-SLR-Parsing.pdf + + $terminals = array( + '(', + 'n', + ')', + '+', + ); + + $rules = array( + 'S' => 'E', + 'E' => array('E + T', 'T'), + 'T' => array('( E )', 'n'), + ); + + $generator = id(new PhutilParserGenerator()) + ->setTerminals($terminals) + ->setStartRule('S') + ->setRules($rules); + + return $generator; + } + + +} diff --git a/src/parser/__tests__/PhutilQueryStringParserTestCase.php b/src/parser/__tests__/PhutilQueryStringParserTestCase.php new file mode 100644 index 00000000..fff19f61 --- /dev/null +++ b/src/parser/__tests__/PhutilQueryStringParserTestCase.php @@ -0,0 +1,140 @@ + array(), + 'foo=bar&foobar=barfoo' => array( + 'foo' => 'bar', + 'foobar' => 'barfoo', + ), + 'a]b[]=1&a]=2&a[[]=3&a[b]b=4&[][a]=5' => array( + 'a]b[]' => '1', + 'a]' => '2', + 'a[[]' => '3', + 'a[b]b' => '4', + '[][a]' => '5', + ), + 'foo[][]=bar&bar[1][3]=foo' => array( + 'foo' => array( + 0 => array( + 0 => 'bar', + ), + ), + 'bar' => array( + 1 => array( + 3 => 'foo', + ), + ), + ), + 'foo[][]=bar&a]b[]=1' => array( + 'foo' => array( + 0 => array( + 0 => 'bar', + ), + ), + 'a]b[]' => '1', + ), + 'a&&b' => array( + 'a' => '', + 'b' => '', + ), + 'a[b][]=foo&a[b][]=bar' => array( + 'a' => array( + 'b' => array( + 0 => 'foo', + 1 => 'bar', + ), + ), + ), + 'a=1&a=2' => array( + 'a' => '2', + ), + 'a=1&a[]=2' => array( + 'a' => array( + 0 => '2', + ), + ), + 'a=1&a[b]=2&a[]=3' => array( + 'a' => array( + 'b' => '2', + 0 => '3', + ), + ), + 'a%20b=%20' => array( + 'a b' => ' ', + ), + 'a.b=c' => array( + 'a.b' => 'c', + ), + 'a=b=c' => array( + 'a' => 'b=c', + ), + ); + + $parser = new PhutilQueryStringParser(); + + foreach ($map as $query_string => $expected) { + $this->assertEqual( + $expected, + $parser->parseQueryString($query_string)); + } + } + + public function testQueryStringListParsing() { + $map = array( + '' => array(), + '&' => array(), + '=' => array( + array('', ''), + ), + '=&' => array( + array('', ''), + ), + 'a=b' => array( + array('a', 'b'), + ), + 'a[]=b' => array( + array('a[]', 'b'), + ), + 'a=' => array( + array('a', ''), + ), + '. [=1' => array( + array('. [', '1'), + ), + 'a=b&c=d' => array( + array('a', 'b'), + array('c', 'd'), + ), + 'a=b&a=c' => array( + array('a', 'b'), + array('a', 'c'), + ), + '&a=b&' => array( + array('a', 'b'), + ), + '=a' => array( + array('', 'a'), + ), + '&&&' => array( + ), + 'a%20b=c%20d' => array( + array('a b', 'c d'), + ), + ); + + $parser = new PhutilQueryStringParser(); + + foreach ($map as $query_string => $expected) { + $this->assertEqual( + $expected, + $parser->parseQueryStringToPairList($query_string)); + } + } + +} diff --git a/src/parser/__tests__/PhutilSimpleOptionsTestCase.php b/src/parser/__tests__/PhutilSimpleOptionsTestCase.php new file mode 100644 index 00000000..5e751a65 --- /dev/null +++ b/src/parser/__tests__/PhutilSimpleOptionsTestCase.php @@ -0,0 +1,143 @@ + array(), + + // Basic parsing. + 'legs=4' => array('legs' => '4'), + 'legs=4,eyes=2' => array('legs' => '4', 'eyes' => '2'), + + // Repeated keys mean last specification wins. + 'legs=4,legs=3' => array('legs' => '3'), + + // Keys with no value should map to true. + 'flag' => array('flag' => true), + 'legs=4,flag' => array('legs' => '4', 'flag' => true), + + // Leading and trailing spaces should be ignored. + ' flag ' => array('flag' => true), + ' legs = 4 , eyes = 2' => array('legs' => '4', 'eyes' => '2'), + + // Unescaped spaces inside values are OK. + 'legs=a b c d' => array('legs' => 'a b c d'), + + // Case should be ignored. + 'LEGS=4' => array('legs' => '4'), + 'legs=4, LEGS=4' => array('legs' => '4'), + + // Empty values should be absent. + 'legs=' => array(), + 'legs=4,legs=,eyes=2' => array('eyes' => '2'), + + // Quoted values should allow parsing comma, equals, etc. + 'punctuation=",="' => array('punctuation' => ',='), + + // Quoted keys can also have that stuff. + '"backslash\\\\quote\\""=1' => array('backslash\\quote"' => '1'), + ' "," = "," , "=" = "=" ' => array(',' => ',', '=' => '='), + + // Strings like this should not parse as simpleoptions. + 'SELECT id, name, size FROM table' => array(), + '"a""b"' => array(), + '=a' => array(), + ',a' => array(), + 'a==' => array(), + 'a=b=' => array(), + ); + + foreach ($map as $string => $expect) { + $parser = new PhutilSimpleOptions(); + $this->assertEqual( + $expect, + $parser->parse($string), + pht("Correct parse of '%s'", $string)); + } + } + + public function testSimpleOptionsCaseParse() { + $map = array( + 'legs=4, LEGS=8, LeGs' => array( + 'legs' => '4', + 'LEGS' => '8', + 'LeGs' => true, + ), + ); + + foreach ($map as $string => $expect) { + $parser = new PhutilSimpleOptions(); + $parser->setCaseSensitive(true); + $this->assertEqual( + $expect, + $parser->parse($string), + pht("Correct case-sensitive parse of '%s'", $string)); + } + } + + public function testSimpleOptionsUnterminatedStrings() { + $list = array( + '"', + "'", + 'a="', + "a='", + 'a="\\', + "a='\\", + ); + + foreach ($list as $input) { + $parser = new PhutilSimpleOptions(); + $this->assertEqual( + array(), + $parser->parse($input), + pht('Correct failing parse of invalid input: %s', $input)); + } + } + + public function testSimpleOptionsUnparse() { + $map = array( + '' => array(), + 'legs=4' => array('legs' => '4'), + 'legs=4, eyes=2' => array('legs' => '4', 'eyes' => '2'), + 'eyes=2, legs=4' => array('eyes' => '2', 'legs' => '4'), + 'legs=4, head' => array('legs' => '4', 'head' => true), + 'eyes=2' => array('legs' => '', 'eyes' => '2'), + '"thousands separator"=","' => array('thousands separator' => ','), + ); + + foreach ($map as $expect => $dict) { + $parser = new PhutilSimpleOptions(); + $this->assertEqual( + $expect, + $parser->unparse($dict), + pht('Correct unparse of %s', print_r($dict, true))); + } + + $bogus = array( + array('' => ''), + array('' => 'x'), + ); + + foreach ($bogus as $bad_input) { + $caught = null; + try { + $parser = new PhutilSimpleOptions(); + $parser->unparse($bad_input); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue( + $caught instanceof Exception, + pht('Correct throw on unparse of bad input.')); + } + + $parser = new PhutilSimpleOptions(); + $this->assertEqual( + 'a="\\}"', + $parser->unparse(array('a' => '}'), '}'), + pht('Unparse with extra escape.')); + } + +} diff --git a/src/parser/__tests__/PhutilTypeSpecTestCase.php b/src/parser/__tests__/PhutilTypeSpecTestCase.php new file mode 100644 index 00000000..c294c5b6 --- /dev/null +++ b/src/parser/__tests__/PhutilTypeSpecTestCase.php @@ -0,0 +1,320 @@ +', + 'int | null', + 'list < string >', + 'int (must be even)', + 'optional int', + 'int?', + 'int|null?', + 'optional int? (minimum 300)', + 'list', + 'list>>> (easy)', + '\\SomeClass', + '\\Namespace\\SomeClass', + '\\NamespaceA\\NamespaceB\\NamespaceC', + 'NamespaceA\\NamespaceB\\NamespaceC', + ); + + $bad = array( + '', + 'list<>', + 'list', + 'map|map', + 'int optional', + '(derp)', + 'list', + 'int?|string', + '\\', + '\\\\', + '\\SomeClass\\', + 'SomeClass\\', + ); + + $good = array_fill_keys($good, true); + $bad = array_fill_keys($bad, false); + + foreach ($good + $bad as $input => $expect) { + $caught = null; + try { + PhutilTypeSpec::newFromString($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + ($caught === null), + $input); + } + } + + public function testTypeSpecStringify() { + $types = array( + 'int', + 'list', + 'map', + 'list>', + 'map>', + 'int|null', + 'int|string|null', + 'list', + 'list', + 'optional int', + 'int (even)', + ); + + foreach ($types as $type) { + $this->assertEqual( + $type, + PhutilTypeSpec::newFromString($type)->toString()); + } + } + + public function testCanonicalize() { + $tests = array( + 'int?' => 'optional int', + 'int | null' => 'int|null', + 'list < map < int , string > > ?' => 'optional list>', + 'int ( x )' => 'int ( x )', + ); + + foreach ($tests as $input => $expect) { + $this->assertEqual( + $expect, + PhutilTypeSpec::newFromString($input)->toString(), + $input); + } + } + + public function testGetCommonParentClass() { + $map = array( + 'stdClass' => array( + array('stdClass', 'stdClass'), + ), + false => array( + array('Exception', 'stdClass'), + ), + 'Exception' => array( + array('Exception', 'RuntimeException'), + array('LogicException', 'RuntimeException'), + array('BadMethodCallException', 'OutOfBoundsException'), + ), + ); + + foreach ($map as $expect => $tests) { + if (is_int($expect)) { + $expect = (bool)$expect; + } + + foreach ($tests as $input) { + list($class_a, $class_b) = $input; + + $this->assertEqual( + $expect, + PhutilTypeSpec::getCommonParentClass($class_a, $class_b), + print_r($input, true)); + } + } + } + + public function testGetTypeOf() { + $map = array( + 'int' => 1, + 'string' => 'asdf', + 'float' => 1.5, + 'bool' => true, + 'null' => null, + 'map' => array(), + 'list' => array('a', 'b'), + 'list' => array(1, 2, 3), + 'map' => array('x' => 3), + 'map>' => array(1 => array('x', 'y')), + 'stdClass' => new stdClass(), + 'list' => array( + new Exception(), + new LogicException(), + new RuntimeException(), + ), + 'map' => array('x' => new stdClass()), + ); + + foreach ($map as $expect => $input) { + $this->assertEqual( + $expect, + PhutilTypeSpec::getTypeOf($input), + print_r($input, true)); + + PhutilTypeSpec::newFromString($expect)->check($input); + } + } + + public function testTypeCheckFailures() { + $map = array( + 'int' => 'string', + 'string' => 32, + 'null' => true, + 'bool' => null, + 'map' => 16, + 'list' => array('y' => 'z'), + 'int|null' => 'ducks', + 'stdClass' => new Exception(), + 'list' => array(new Exception()), + ); + + foreach ($map as $type => $value) { + $caught = null; + try { + PhutilTypeSpec::newFromString($type)->check($value); + } catch (PhutilTypeCheckException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilTypeCheckException); + } + } + + public function testCheckMap() { + $spec = array( + 'count' => 'int', + 'color' => 'optional string', + ); + + // Valid + + PhutilTypeSpec::checkMap( + array( + 'count' => 1, + ), + $spec); + + // Valid, with optional parameter. + + PhutilTypeSpec::checkMap( + array( + 'count' => 3, + 'color' => 'red', + ), + $spec); + + // Parameter "count" is required but missing. + + $caught = null; + try { + PhutilTypeSpec::checkMap( + array(), + $spec); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilTypeMissingParametersException); + + // Parameter "size" is specified but does not exist. + + $caught = null; + try { + PhutilTypeSpec::checkMap( + array( + 'count' => 4, + 'size' => 'large', + ), + $spec); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilTypeExtraParametersException); + } + + public function testRegexValidation() { + PhutilTypeSpec::checkMap( + array( + 'regex' => '/.*/', + ), + array( + 'regex' => 'regex', + )); + + $caught = null; + try { + PhutilTypeSpec::checkMap( + array( + 'regex' => '.*', + ), + array( + 'regex' => 'regex', + )); + } catch (PhutilTypeCheckException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilTypeCheckException); + } + + public function testScalarOrListRegexp() { + PhutilTypeSpec::checkMap( + array( + 'regex' => '/.*/', + ), + array( + 'regex' => 'regex | list', + )); + + PhutilTypeSpec::checkMap( + array( + 'regex' => array('/.*/'), + ), + array( + 'regex' => 'regex | list', + )); + + PhutilTypeSpec::checkMap( + array( + 'regex' => '/.*/', + ), + array( + 'regex' => 'list | regex', + )); + + PhutilTypeSpec::checkMap( + array( + 'regex' => array('/.*/'), + ), + array( + 'regex' => 'list | regex', + )); + + $this->assertTrue(true); + } + + public function testMixedVector() { + // This is a test case for an issue where we would not infer the type + // of a vector containing a mixture of scalar and nonscalar elements + // correctly. + + $caught = null; + try { + PhutilTypeSpec::checkMap( + array( + 'key' => array('!', (object)array()), + ), + array( + 'key' => 'list', + )); + } catch (PhutilTypeCheckException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilTypeCheckException); + } + +} diff --git a/src/parser/__tests__/PhutilURITestCase.php b/src/parser/__tests__/PhutilURITestCase.php new file mode 100644 index 00000000..c9c881ce --- /dev/null +++ b/src/parser/__tests__/PhutilURITestCase.php @@ -0,0 +1,417 @@ +assertEqual('http', $uri->getProtocol(), pht('protocol')); + $this->assertEqual('user', $uri->getUser(), pht('user')); + $this->assertEqual('pass', $uri->getPass(), pht('password')); + $this->assertEqual('host', $uri->getDomain(), pht('domain')); + $this->assertEqual('99', $uri->getPort(), pht('port')); + + $this->assertEqual('/path/', $uri->getPath(), pht('path')); + $this->assertEqual( + array( + array( + 'query', + 'value', + ), + ), + $uri->getQueryParamsAsPairList(), + 'query params'); + $this->assertEqual('fragment', $uri->getFragment(), pht('fragment')); + $this->assertEqual( + 'http://user:pass@host:99/path/?query=value#fragment', + (string)$uri, + 'uri'); + + + $uri = new PhutilURI('ssh://git@example.com/example/example.git'); + $this->assertEqual('ssh', $uri->getProtocol(), pht('protocol')); + $this->assertEqual('git', $uri->getUser(), pht('user')); + $this->assertEqual('', $uri->getPass(), pht('password')); + $this->assertEqual('example.com', $uri->getDomain(), pht('domain')); + $this->assertEqual('', $uri->getPort(), 'port'); + + $this->assertEqual('/example/example.git', $uri->getPath(), pht('path')); + $this->assertEqual( + array(), + $uri->getQueryParamsAsPairList(), + pht('query parameters')); + $this->assertEqual('', $uri->getFragment(), pht('fragment')); + $this->assertEqual( + 'ssh://git@example.com/example/example.git', + (string)$uri, + 'uri'); + + + $uri = new PhutilURI('http://0@domain.com/'); + $this->assertEqual('0', $uri->getUser()); + $this->assertEqual('http://0@domain.com/', (string)$uri); + + $uri = new PhutilURI('http://0:0@domain.com/'); + $this->assertEqual('0', $uri->getUser()); + $this->assertEqual('0', $uri->getPass()); + $this->assertEqual('http://0:0@domain.com/', (string)$uri); + + $uri = new PhutilURI('http://%20:%20@domain.com/'); + $this->assertEqual(' ', $uri->getUser()); + $this->assertEqual(' ', $uri->getPass()); + $this->assertEqual('http://%20:%20@domain.com/', (string)$uri); + + $uri = new PhutilURI('http://%40:%40@domain.com/'); + $this->assertEqual('@', $uri->getUser()); + $this->assertEqual('@', $uri->getPass()); + $this->assertEqual('http://%40:%40@domain.com/', (string)$uri); + + $uri = new PhutilURI('http://%2F:%2F@domain.com/'); + $this->assertEqual('/', $uri->getUser()); + $this->assertEqual('/', $uri->getPass()); + $this->assertEqual('http://%2F:%2F@domain.com/', (string)$uri); + + // These tests are covering cases where cURL and parse_url() behavior + // may differ in potentially dangerous ways. See T6755 for discussion. + + // In general, we defuse these attacks by emitting URIs which escape + // special characters so that they are interpreted unambiguously by + // cURL in the same way that parse_url() interpreted them. + + $uri = new PhutilURI('http://u:p@evil.com?@good.com'); + $this->assertEqual('u', $uri->getUser()); + $this->assertEqual('p', $uri->getPass()); + $this->assertEqual('evil.com', $uri->getDomain()); + $this->assertEqual('http://u:p@evil.com?%40good.com=', (string)$uri); + + // The behavior of URLs in these forms differs for different versions + // of cURL, PHP, and other software. Because safe parsing is a tricky + // proposition and these URIs are almost certainly malicious, we just + // reject them. See T12526 for discussion. + + $dangerous = array( + // Ambiguous encoding. + 'http://good.com#u:p@evil.com/' => true, + 'http://good.com?u:p@evil.com/' => true, + + // Unambiguous encoding: with a trailing slash. + 'http://good.com/#u:p@evil.com/' => false, + 'http://good.com/?u:p@evil.com/' => false, + + // Unambiguous encoding: with escaping. + 'http://good.com%23u:p@evil.com/' => false, + 'http://good.com%40u:p@evil.com/' => false, + ); + + foreach ($dangerous as $input => $expect) { + $caught = null; + try { + new PhutilURI($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + ($caught instanceof $ex), + pht('Unexpected parse result for dangerous URI "%s".', $input)); + } + + $uri = new PhutilURI('www.example.com'); + $this->assertEqual('', $uri->getProtocol()); + $this->assertEqual('www.example.com', (string)$uri); + } + + public function testURIGeneration() { + $uri = new PhutilURI('http://example.com'); + $uri->setPath('bar'); + $this->assertEqual('http://example.com/bar', $uri->__toString()); + } + + public function testStrictURIParsingOfHosts() { + $uri = new PhutilURI('http://&/'); + $this->assertEqual('', $uri->getDomain()); + + // See T12961 for more discussion of these hosts which begin with "-". + $uri = new PhutilURI('ssh://-oProxyCommand/'); + $this->assertEqual('', $uri->getDomain()); + $uri = new PhutilURI('ssh://-oProxyCommand=curl/'); + $this->assertEqual('', $uri->getDomain()); + $uri = new PhutilURI('ssh://.com/'); + $this->assertEqual('', $uri->getDomain()); + + // Make sure newlines are rejected. + $uri = new PhutilURI("ssh://example.com\n.domain.us/"); + $this->assertEqual('', $uri->getDomain()); + $uri = new PhutilURI("ssh://example.com\n"); + $this->assertEqual('', $uri->getDomain()); + } + + public function testStrictURIParsingOfLeadingWhitespace() { + $uri = new PhutilURI(' http://example.com/'); + $this->assertEqual('', $uri->getDomain()); + } + + public function testAppendPath() { + $uri = new PhutilURI('http://example.com'); + $uri->appendPath('foo'); + $this->assertEqual('http://example.com/foo', $uri->__toString()); + $uri->appendPath('bar'); + $this->assertEqual('http://example.com/foo/bar', $uri->__toString()); + + $uri = new PhutilURI('http://example.com'); + $uri->appendPath('/foo/'); + $this->assertEqual('http://example.com/foo/', $uri->__toString()); + $uri->appendPath('/bar/'); + $this->assertEqual('http://example.com/foo/bar/', $uri->__toString()); + + $uri = new PhutilURI('http://example.com'); + $uri->appendPath('foo'); + $this->assertEqual('http://example.com/foo', $uri->__toString()); + $uri->appendPath('/bar/'); + $this->assertEqual('http://example.com/foo/bar/', $uri->__toString()); + } + + public function testUnusualURIs() { + $uri = new PhutilURI('file:///path/to/file'); + $this->assertEqual('file', $uri->getProtocol(), pht('protocol')); + $this->assertEqual('', $uri->getDomain(), pht('domain')); + $this->assertEqual('/path/to/file', $uri->getPath(), pht('path')); + + $uri = new PhutilURI('idea://open?x=/'); + $this->assertEqual('idea', $uri->getProtocol(), pht('protocol')); + $this->assertEqual('open', $uri->getDomain(), pht('domain')); + $this->assertEqual('', $uri->getPath(), pht('path')); + $this->assertEqual( + array( + array( + 'x', + '/', + ), + ), + $uri->getQueryParamsAsPairList()); + + // This is not a legitimate URI and should not parse as one. + $uri = new PhutilURI('fruit.list: apple banana cherry'); + $this->assertEqual('', $uri->getDomain()); + } + + public function testAmbiguousURIs() { + // It's important that this be detected as a Javascript URI, because that + // is how browsers will treat it. + $uri = new PhutilURI('javascript:evil'); + $this->assertEqual('javascript', $uri->getProtocol()); + + + // This is "wrong", in that the user probably intends for this to be a + // Git-style URI, but we can not easily parse it as one without making the + // "javascript" case above unsafe. + $uri = new PhutilURI('localhost:todo.txt'); + $this->assertEqual('localhost', $uri->getProtocol()); + + + // These variants are unambiguous and safe. + $uri = new PhutilURI('localhost.com:todo.txt'); + $this->assertEqual('localhost.com', $uri->getDomain()); + + $uri = new PhutilURI('user@localhost:todo.txt'); + $this->assertEqual('localhost', $uri->getDomain()); + + // This could either be a Git URI with relative path "22", or a normal URI + // with port "22". We should assume it is a port number because this is + // relatively common, while relative Git URIs pointing at numeric filenames + // are bizarre. + $uri = new PhutilURI('domain.com:22'); + $this->assertEqual('domain.com', $uri->getDomain()); + $this->assertEqual('22', $uri->getPort()); + } + + public function testDefaultPorts() { + $uri = new PhutilURI('http://www.example.com'); + $this->assertEqual('80', $uri->getPortWithProtocolDefault()); + + $uri = new PhutilURI('https://www.example.com'); + $this->assertEqual('443', $uri->getPortWithProtocolDefault()); + + $uri = new PhutilURI('ssh://git@example.com/example/example.git'); + $this->assertEqual('22', $uri->getPortWithProtocolDefault()); + + $uri = new PhutilURI('unknown://www.example.com'); + $this->assertEqual('', $uri->getPortWithProtocolDefault()); + } + + public function testGitURIParsing() { + $uri = new PhutilURI('git@host.com:path/to/something'); + $this->assertEqual('ssh', $uri->getProtocol()); + $this->assertEqual('git', $uri->getUser()); + $this->assertEqual('host.com', $uri->getDomain()); + $this->assertEqual('path/to/something', $uri->getPath()); + $this->assertEqual('git@host.com:path/to/something', (string)$uri); + + $uri = new PhutilURI('host.com:path/to/something'); + $this->assertEqual('ssh', $uri->getProtocol()); + $this->assertEqual('', $uri->getUser()); + $this->assertEqual('host.com', $uri->getDomain()); + $this->assertEqual('path/to/something', $uri->getPath()); + $this->assertEqual('host.com:path/to/something', (string)$uri); + + $uri_1 = new PhutilURI('host.com:path/to/something'); + $uri_2 = new PhutilURI($uri_1); + + $this->assertEqual((string)$uri_1, (string)$uri_2); + } + + public function testStrictGitURIParsingOfLeadingWhitespace() { + $uri = new PhutilURI(' user@example.com:path'); + $this->assertEqual('', $uri->getDomain()); + } + + public function testNoRelativeURIPaths() { + $uri = new PhutilURI('user@example.com:relative_path'); + + $caught = null; + try { + $uri->setType(PhutilURI::TYPE_URI); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicateKeys() { + $uri = new PhutilURI('http://www.example.com/?x=1&x=2'); + $this->assertEqual( + 'http://www.example.com/?x=1&x=2', + (string)$uri); + + $uri->appendQueryParam('x', '3'); + $this->assertEqual( + 'http://www.example.com/?x=1&x=2&x=3', + (string)$uri); + + $uri->replaceQueryParam('x', '4'); + $this->assertEqual( + 'http://www.example.com/?x=4', + (string)$uri); + + $uri->removeQueryParam('x'); + $this->assertEqual( + 'http://www.example.com/', + (string)$uri); + + $uri->appendQueryParam('a', 'a'); + $uri->appendQueryParam('b', 'b'); + $uri->appendQueryParam('c', 'c'); + $uri->appendQueryParam('b', 'd'); + + $this->assertEqual( + 'http://www.example.com/?a=a&b=b&c=c&b=d', + (string)$uri); + + $uri->replaceQueryParam('b', 'e'); + $this->assertEqual( + 'http://www.example.com/?a=a&c=c&b=e', + (string)$uri, + pht( + 'Replacing a parameter should overwrite other instances of the key.')); + } + + public function testBadHTTPParameters() { + $uri = new PhutilURI('http://www.example.com/'); + + $caught = null; + try { + $uri->replaceQueryParam(array(), 'x'); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue( + (bool)$caught, + pht('Nonscalar HTTP keys should throw.')); + + $caught = null; + try { + $uri->replaceQueryParam('x', array()); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue( + (bool)$caught, + pht('Nonscalar HTTP values should throw.')); + } + + public function testHTTPParameterTypes() { + // Whether you pass an integer or string, "0" should always be the same + // query parameter. + + $uri = new PhutilURI('http://www.example.com/'); + + $uri->appendQueryParam(0, 'a'); + $uri->appendQueryParam('0', 'b'); + $this->assertEqual( + 'http://www.example.com/?0=a&0=b', + (string)$uri); + + $uri->replaceQueryParam(0, 'c'); + $this->assertEqual( + 'http://www.example.com/?0=c', + (string)$uri); + + $uri->replaceQueryParam(0, 'a'); + $uri->appendQueryParam('0', 'b'); + $this->assertEqual( + 'http://www.example.com/?0=a&0=b', + (string)$uri); + + $uri->replaceQueryParam('0', 'c'); + $this->assertEqual( + 'http://www.example.com/?0=c', + (string)$uri); + } + + public function testGetQueryParamsAsMap() { + $uri = new PhutilURI('http://www.example.com/?x=1&x=2'); + + $caught = null; + try { + $map = $uri->getQueryParamsAsMap(); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue((bool)$caught); + } + + public function testQueryURIConstruction() { + $uri = new PhutilURI('http://example.com/', array('y' => '1')); + $this->assertEqual( + 'http://example.com/?y=1', + (string)$uri); + + $uri = new PhutilURI('http://example.com/?x=2', array('y' => '1')); + $this->assertEqual( + 'http://example.com/?x=2&y=1', + (string)$uri); + + $caught = null; + try { + $uri = new PhutilURI('http://example.com/?y=3', array('y' => '1')); + } catch (InvalidArgumentException $ex) { + $caught = $ex; + } + $this->assertTrue((bool)$caught); + + $uri = new PhutilURI('http://example.com/?a=1', array('b' => '2')); + $uri = new PhutilURI($uri, array('c' => '3')); + + $this->assertEqual( + 'http://example.com/?a=1&b=2&c=3', + (string)$uri); + } + +} diff --git a/src/parser/__tests__/docblock/embedded-specials.docblock b/src/parser/__tests__/docblock/embedded-specials.docblock new file mode 100644 index 00000000..e2e1b60c --- /dev/null +++ b/src/parser/__tests__/docblock/embedded-specials.docblock @@ -0,0 +1,4 @@ +/** + * So long as a @special does not appear at the beginning of a line, + * it is parsed as normal text. + */ diff --git a/src/parser/__tests__/docblock/flag-specials.docblock b/src/parser/__tests__/docblock/flag-specials.docblock new file mode 100644 index 00000000..6dc8cca1 --- /dev/null +++ b/src/parser/__tests__/docblock/flag-specials.docblock @@ -0,0 +1,15 @@ +/** + * stuff above + * + * @flag + * @stuff + * @stuff + * + * @zebra + * + * stuff in the middle + * + * @apple + * + * stuff below + */ diff --git a/src/parser/__tests__/docblock/indented-block.docblock b/src/parser/__tests__/docblock/indented-block.docblock new file mode 100644 index 00000000..766dc49c --- /dev/null +++ b/src/parser/__tests__/docblock/indented-block.docblock @@ -0,0 +1,3 @@ + /** + * Cozy lummox gives smart squid who asks for job pen. + */ diff --git a/src/parser/__tests__/docblock/indented-specials.docblock b/src/parser/__tests__/docblock/indented-specials.docblock new file mode 100644 index 00000000..dc683fce --- /dev/null +++ b/src/parser/__tests__/docblock/indented-specials.docblock @@ -0,0 +1,11 @@ +/** + * @title sendmail + * + * Blah blah add this configuration: + * + * @notspecial.com =~+> do sendmail magic + * + * @special only a + * little bit + * indented + */ diff --git a/src/parser/__tests__/docblock/indented-text.docblock b/src/parser/__tests__/docblock/indented-text.docblock new file mode 100644 index 00000000..e3f36df3 --- /dev/null +++ b/src/parser/__tests__/docblock/indented-text.docblock @@ -0,0 +1,3 @@ +/** + * Cozy lummox gives smart squid who asks for job pen. + */ diff --git a/src/parser/__tests__/docblock/linebreak-breaks-specials.docblock b/src/parser/__tests__/docblock/linebreak-breaks-specials.docblock new file mode 100644 index 00000000..2e31a7fc --- /dev/null +++ b/src/parser/__tests__/docblock/linebreak-breaks-specials.docblock @@ -0,0 +1,5 @@ +/** + * @title title + * + * This is normal text, not part of the @title. + */ diff --git a/src/parser/__tests__/docblock/mixed-types.docblock b/src/parser/__tests__/docblock/mixed-types.docblock new file mode 100644 index 00000000..c70caa16 --- /dev/null +++ b/src/parser/__tests__/docblock/mixed-types.docblock @@ -0,0 +1,4 @@ +/** + * @special squirrels + * @special + */ diff --git a/src/parser/__tests__/docblock/multi-specials.docblock b/src/parser/__tests__/docblock/multi-specials.docblock new file mode 100644 index 00000000..a57547c6 --- /dev/null +++ b/src/parser/__tests__/docblock/multi-specials.docblock @@ -0,0 +1,8 @@ +/** + * @special north + * @special south + * + * @stable + * @stable + * @stable + */ diff --git a/src/parser/__tests__/docblock/multiline-special.docblock b/src/parser/__tests__/docblock/multiline-special.docblock new file mode 100644 index 00000000..d3791892 --- /dev/null +++ b/src/parser/__tests__/docblock/multiline-special.docblock @@ -0,0 +1,5 @@ +/** + * @special x + * y + * z + */ diff --git a/src/parser/__tests__/docblock/specials-with-hyphen.docblock b/src/parser/__tests__/docblock/specials-with-hyphen.docblock new file mode 100644 index 00000000..1eaa1c62 --- /dev/null +++ b/src/parser/__tests__/docblock/specials-with-hyphen.docblock @@ -0,0 +1,7 @@ +/** + * @repeat-hyphen a + * @repeat-hyphen b + * @multiline-hyphen mmm + * nnn + * @normal-hyphen x + */ diff --git a/src/parser/__tests__/docblock/specials.docblock b/src/parser/__tests__/docblock/specials.docblock new file mode 100644 index 00000000..45b39039 --- /dev/null +++ b/src/parser/__tests__/docblock/specials.docblock @@ -0,0 +1,8 @@ +/** + * @type type + * @task task + * + * @special dot + * @special dot + * @special dash + */ diff --git a/src/parser/__tests__/editorconfig/.editorconfig b/src/parser/__tests__/editorconfig/.editorconfig new file mode 100644 index 00000000..7f37bdc4 --- /dev/null +++ b/src/parser/__tests__/editorconfig/.editorconfig @@ -0,0 +1,23 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[file*] +indent_size = 3 + +[*.txt] +charset = latin1 + +[{invalid_glob] +indent_size = 1 + +[externals/**] +indent_style = +indent_size = +trim_trailing_whitespace = false +insert_final_newline = false diff --git a/src/parser/__tests__/editorconfig/empty/.editorconfig b/src/parser/__tests__/editorconfig/empty/.editorconfig new file mode 100644 index 00000000..78b36ca0 --- /dev/null +++ b/src/parser/__tests__/editorconfig/empty/.editorconfig @@ -0,0 +1 @@ +root = true diff --git a/src/parser/__tests__/editorconfig/externals/.editorconfig b/src/parser/__tests__/editorconfig/externals/.editorconfig new file mode 100644 index 00000000..e69de29b diff --git a/src/parser/__tests__/editorconfig/subdir/.editorconfig b/src/parser/__tests__/editorconfig/subdir/.editorconfig new file mode 100644 index 00000000..c949bed7 --- /dev/null +++ b/src/parser/__tests__/editorconfig/subdir/.editorconfig @@ -0,0 +1,3 @@ +[*] +indent_style = tab +charset = utf-8-bom diff --git a/src/parser/__tests__/json/base64.data b/src/parser/__tests__/json/base64.data new file mode 100644 index 00000000..5b3330c2 --- /dev/null +++ b/src/parser/__tests__/json/base64.data @@ -0,0 +1 @@ +fileName:Resume.doc;base64stream:0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAALgAAAAAAAAAAEAAAAgAAAAEAAAD+////AAAAAAAAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9//////////7///8tAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAAP7///8WAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAP7////+////LwAAAP7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAQAAAP7////+////BAAAAAUAAAAGAAAA/v///wgAAAD+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8BAP7/AwoAAP////8GCQIAAAAAAMAAAAAAAABGGAAAAE1pY3Jvc29mdCBXb3JkLURva3VtZW50AAoAAABNU1dvcmREb2MAEAAAAFdvcmQuRG9jdW1lbnQuOAD0ObJxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAAAQACAAAAAAAAAAAAAAAAAAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAAC8AAAACAAAAAEAAABIAAAABAAAAFAAAAAIAAAAaAAAAAkAAACAAAAACgAAAIwAAAALAAAAmAAAAAwAAACkAAAADQAAALAAAAACAAAA6f0AAB4AAAAOAAAAQXByaWwgVmlzbmljawAAAB4AAAAOAAAAQXByaWwgVmlzbmljawAAAB4AAAACAAAAMQAAAEAAAAAAgRssAAAAAEAAAAAAAAAAAAAAAEAAAAAA1pEh62jLAUAAAAAAhXEJ8mjLAQAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAEAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAALVzdWcLhsQk5cIACss+a5EAAAABdXN1ZwuGxCTlwgAKyz5rhIANQAKAAEAWwAPAAIAAAAAAAAAbgAAEPH/AgBuAAAABwBEAGUAZgBhAHUAbAB0AAAAGgAAAAMkAGEkADEkACokATckATUkATMkAUEkADMAQioAT0oAAFFKAABDShgAbUgJBHNICQRLSAEAUEoEAG5I/wBeSgUAYUoYAF9I/wB0SP8AAAAAAAAAAAAA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DBAAAF6EQAtghJj+FcYFAAFACwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAgAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADspQEBTSAJBAAAABK/AAAAAAAAMAAAAAAACAAAYiEAAA4AQ2FvbGFuODAAAAAAAAAAAAAAAAAAAAAAAAAJBBYAMi4AAAAAAAAAAAAAsQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AEQAAAAIAAAD//w8AEwAAAAQAAAD//w8AAAAAAAAAAAAAAAAAAAAAAIgAAAAAAKoKAAAAAAAAqgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqgoAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL4KAAA0AAAA8goAABQAAAAGCwAAJAAAAAAAAAAAAAAAlxsAABwDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdhsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACzHgAAYgIAAAAAAAAAAAAAghsAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqCwAAxgAAAH4aAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOGwAAaAAAAAAAAAAAAAAAdhsAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgDZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAcAByAGkAbAAgAFYAaQBzAG4AaQBjAGsADQAxADQAMAAgAEwAbwBuAGcAIABEAHIAaQB2AGUADQBJAHIAdwBpAG4ALAAgAFAAQQAgADEANQA2ADQAMgANACgANwAyADQAKQAgADYAMQAwAC0AMQA0ADgAMAANAA0ADQBDAG8AbQBwAHUAdABlAHIAIABTAGsAaQBsAGwAcwANAA0ACQAJAEkAIABhAG0AIABlAHgAcABlAHIAaQBlAG4AYwBlAGQAIAB3AGkAdABoACAATQBpAGMAcgBvAHMAbwBmAHQAIABXAG8AcgBkACAAYQBuAGQAIABFAHgAYwBlAGwALgANAA0ACQAJAEkAIABjAGEAbgAgAHUAcwBlACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByACAAdABvACAAZABvAHcAbgBsAG8AYQBkACAAdQBwAGQAYQB0AGUAcwAgAGYAbwByACAATQBpAGMAcgBvAHMAbwBmAHQAIABXAG8AcgBkACAAYQBuAGQAIABFAHgAYwBlAGwALAAgAHMAZQBhAHIAYwBoAA0ACQAJAGQAaQByAGUAYwB0AGkAbwBuAHMAIAB0AG8AIABhAG4AZAAgAGYAcgBvAG0AIABkAGkAZgBmAGUAcgBlAG4AdAAgAGwAbwBjAGEAdABpAG8AbgBzACwAIABjAGEAbgAgAHMAZQBhAHIAYwBoACAAZgBvAHIAIABwAGgAeQBzAGkAYwBhAGwAIABhAGQAZAByAGUAcwBzAGUAcwAgAGYAbwByAA0ACQAJAGMAbwBtAHAAYQBuAGkAZQBzACAAbwByACAAaQBuAGQAaQB2AGkAZAB1AGEAbABzACwAIABhAG4AZAAgAGUAbQBhAGkAbAAuAA0ADQBFAGQAdQBjAGEAdABpAG8AbgANAA0ACQAJAEIAcgBhAGQAZgBvAHIAZAAgAEIAdQBzAGkAbgBlAHMAcwAsACAAUABpAHQAdABzAGIAdQByAGcAaAAsACAAUABBAAkACQAJAAkACQAJACgAOQAvADAAMAAtADEAMAAvADAAMQApAA0ACQAJAEEAUwBCACwAIABPAGYAZgBpAGMAZQAgAEEAZABtAGkAbgBpAHMAdAByAGEAdABpAG8AbgANAEMAbwB1AHIAcwBlACAAdwBvAHIAawAgAGkAbgBjAGwAdQBkAGUAZAA6ACAARQBzAHMAZQBuAHQAaQBhAGwAcwAgAG8AZgAgAE0AYQBuAGEAZwBlAG0AZQBuAHQALAAgAEQAYQB0AGEAIABBAG4AYQBsAHkAcwBpAHMALAAgAEMAbwBuAGMAZQBwAHQAcwAgAG8AZgAgAEQAZQBzAGsAdABvAHAAIABQAHUAYgBsAGkAcwBoAGkAbgBnACwAIABBAGQAdgBhAG4AYwBlAGQAIABFAGwAZQBjAHQAcgBvAG4AaQBjACAAUwBwAHIAZQBhAGQAcwBoAGUAZQB0AHMALgANAA0ACQAJAFAAZQBuAG4AIABUAHIAYQBmAGYAbwByAGQAIABIAGkAZwBoACAAUwBjAGgAbwBvAGwALAAgAEgAYQByAHIAaQBzAG8AbgAgAEMAaQB0AHkALAAgAFAAQQAJAAkACQAJAAkAKAAxADkAOQA2AC0AMgAwADAAMAApAA0ACQAJAEQAaQBwAGwAbwBtAGEALQAgAEcAZQBuAGUAcgBhAGwAIABTAHQAdQBkAGkAZQBzAA0ARwBlAG4AZQByAGEAbAAgAEMAbwB1AHIAcwBlAHMAIABvAGYAIABzAHQAdQBkAHkAIAB3AGUAcgBlACAATQBhAHQAaAAsACAARQBuAGcAbABpAHMAaAAgAGEAbgBkACAAUwBjAGkAZQBuAGMAZQAuAA0AVABvAG8AawAgAFMAcABlAGUAZAB3AHIAaQB0AGkAbgBnACwAIABTAHAAZQBlAGQAdwByAGkAdABpAG4AZwAgAEkASQAsACAAUABvAHQAdABlAHIAeQAgAGEAbgBkACAASgBlAHcAZQBsAHIAeQAgAGEAcwAgAGEAZABkAGUAZAAgAGMAbwB1AHIAcwBlAHMALgANAFAAZQByAGYAbwByAG0AZQBkACAAaQBuACAAdABoAGUAIABtAGEAcgBjAGgAaQBuAGcAIABiAGEAbgBkACAAYQBuAGQAIABjAG8AbgBjAGUAcgB0ACAAYgBhAG4AZAAgAGEAbABsACAAZgBvAHUAcgAgAHkAZQBhAHIAcwAuAA0AVwBhAHMAIABhACAAbQBlAG0AYgBlAHIAIABvAGYAIABDAG8AbQBtAHUAbgBpAHQAeQAgAEEAYwB0AGkAbwBuACAAUAByAG8AZwByAGEAbQAgACgAQwBBAFAAKQANAEgAZQBsAHAAZQBkACAAbwB1AHQAIABiAGEAYwBrAHMAdABhAGcAZQAgAHcAaQB0AGgAIAB0AGgAZQAgAHMAcAByAGkAbgBnACAAbQB1AHMAaQBjAGEAbAAgAHQAdwBvACAAeQBlAGEAcgBzACAAaQBuACAAYQAgAHIAbwB3AC4ADQANAA0ARQBtAHAAbABvAHkAbQBlAG4AdAAgAEgAaQBzAHQAbwByAHkADQANAAkASwBlAHkAcwB0AG8AbgBlACAAQwBvAGwAbABlAGMAdABpAG8AbgBzACwAIABJAHIAdwBpAG4ALAAgAFAAQQAJAAkACQAJAAkACQAJACgANgAvADEANAAtAFAAcgBlAHMAZQBuAHQAKQANAAkARABhAHQAYQAgAEUAbgB0AHIAeQANAE8AbgAgAGEAIABkAGEAaQBsAHkAIABiAGEAcwBpAHMAIABJACAAdgBlAHIAaQBmAHkAIABmAGkAbgBhAGwAIABsAG8AYwBhAGwAIAByAGUAdAB1AHIAbgBzACAAYQBuAGQAIAB2AGUAcgBpAGYAeQAgAHQAaABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAdABoAGEAdAAgAGkAcwAgAGkAbgANAHQAaABlACAAcwB5AHMAdABlAG0ALgANAAkADQAJAEMAYQB0AGMAaAAtAFUAcAAgAEwAbwBnAGkAcwB0AGkAYwBzACwAIABHAHIAZQBlAG4AcwBiAHUAcgBnACwAIABQAEEACQAJAAkACQAJAAkAKAA0AC8AMQA0AC0ANQAvADEANAApAA0ACQBTAGgAaQBwAHAAaQBuAGcALwBSAGUAYwBlAGkAdgBpAG4AZwAgAEMAbABlAHIAawANAE8AbgAgAGEAIABkAGEAaQBsAHkAIABiAGEAcwBpAHMAIABJACAAcABlAHIAZgBvAHIAbQAgAHQAaABlACAASQBuACAAJgAgAE8AdQB0ACAAYwBvAHUAbgB0ACAAZgBvAHIAIAB0AGgAZQAgAHAAcgBlAHYAaQBvAHUAcwAgAGQAYQB5AC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAHAAcgBvAGMAZQBzAHMAIABCAGkAbABsAHMAIABvAGYAIABMAGEAZABpAG4AZwAgAGYAbwByACAAUwBoAGkAcABtAGUAbgB0AHMAIAB1AHMAaQBuAGcAIAAzAFAATAAuAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAHIAbwBjAGUAcwBzACAAcgBlAGMAZQBpAHAAdABzACAAZgBvAHIAIABpAHQAZQBtAHMAIABkAGUAbABpAHYAZQByAGUAZAAgAHUAcwBpAG4AZwAgADMAUABMAC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAGMAYQBsAGwAIABjAGEAcgByAGkAZQByAHMAIAB0AG8AIABhAHIAcgBhAG4AZwBlACAAcABpAGMAawAgAHUAcABzACAAZgBvAHIAIABzAGgAaQBwAG0AZQBuAHQAcwAuAA0ADQANAAkATABvAGQAbwB2AGkAYwBvACAAJgAgAEEAcwBzAG8AYwBpAGEAdABlAHMALAAgAEYAbwByAGUAcwB0ACAASABpAGwAbABzACwAIABQAEEACQAJAAkACQAJAAkAKAAxAC8AMQAzAC0AMgAvADEANAApAA0ACQBQAHIAbwBjAGUAcwBzAG8AcgANAEQAdQByAGkAbgBnACAAdABhAHgAIABzAGUAYQBzAG8AbgAgAEkAIABwAHIAbwBjAGUAcwBzACAAYwBsAGkAZQBuAHQAcwAgAHQAYQB4ACAAcgBlAHQAdQByAG4AcwAgAGIAeQAgAG0AYQBrAGkAbgBnACAAYwBvAHAAaQBlAHMAIABvAGYAIAB0AGgAZQAgAGMAbABpAGUAbgB0AHMAIAB0AGEAeAAgAHIAZQB0AHUAcgBuACAAZgBvAHIAIAB0AGgAZQAgAGMAbABpAGUAbgB0ACAAdABvACAAawBlAGUAcAAgAGYAbwByACAAdABoAGUAaQByACAAcgBlAGMAbwByAGQAcwAuAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAGUAcgBmAG8AcgBtACAAZwBlAG4AZQByAGEAbAAgAG8AZgBmAGkAYwBlACAAZAB1AHQAaQBlAHMALgANAA0ADQAJAA0ACQBBAG0AZQByAGkAcwBvAHUAcgBjAGUAYgBlAHIAZwBlAG4ALQAgAFQAaABlAHIAYQBjAG8AbQAsACAATQBvAG4AcgBvAGUAdgBpAGwAbABlACwAIABQAEEACQAJAAkACQAoADEAMgAvADEAMQAtADEAMAAvADEAMgApAA0ACQBTAGUAbgBpAG8AcgAgAEQAYQB0AGEAIABFAG4AdAByAHkALQBYAGEAcgBlAGwAdABvAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAGUAcgBmAG8AcgBtACAAZABhAHQAYQAgAGUAbgB0AHIAeQAgAGYAbwByACAAYgBlAG4AZQBmAGkAdAAgAGkAbgB2AGUAcwB0AGkAZwBhAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABkAHIAdQBnACAAYwBhAGwAbABlAGQAIABYAGEAcgBlAGwAdABvAC4ADQBFAG4AdABlAHIAIABCAHUAcwBpAG4AZQBzAHMAIABBAHMAcwBvAGMAaQBhAHQAZQBzACAAQQBnAHIAZQBlAG0AZQBuAHQAcwAgAGYAbwByACAAcABoAHkAcwBpAGMAaQBhAG4AcwAgAG8AZgBmAGkAYwBlAHMAIABmAG8AcgAgAHQAaABlACAAZAByAHUAZwAgAGMAYQBsAGwAZQBkACAAWABhAHIAZQBsAHQAbwAuAA0AUwBlAGEAcgBjAGgAIABwAGgAeQBzAGkAYwBpAGEAbgBzACAATgBQAEkAIABuAHUAbQBiAGUAcgBzACAAdQBzAGkAbgBnACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByAC4ADQBMAGkAbgBrACAAaQBtAGEAZwBlAHMAIAB0AG8AIABjAGEAcwBlAHMAIAB1AHMAaQBuAGcAIABLAG8AZgBhAHgALgANAEYAYQB4ACAAaQBuACAAVgBlAHIAYgBhAGwAIABCAGUAbgBlAGYAaQB0ACAASQBuAHYAZQBzAHQAaQBnAGEAdABpAG8AbgAgAGYAbwByAG0AcwAgAHQAbwAgAEsAbwBmAGEAeAAgAHQAbwAgAGwAaQBuAGsAIAB0AG8AIABjAGEAcwBlAHMALgANAA0ADQAJAFQAaABlACAATgBlAHcAIABNAG8AbgByAG8AZQB2AGkAbABsAGUAIABEAG8AZABnAGUAIABDAG8AbABsAGkAcwBpAG8AbgAgAEMAZQBuAHQAZQByACwAIABNAG8AbgByAG8AZQB2AGkAbABsAGUALAAgAFAAQQAJAAkAKAAxAC8AMQAxAC0AMQAyAC8AMQAxACkAIAAJAFIAZQBjAGUAcAB0AGkAbwBuAGkAcwB0AA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABhAG4AcwB3AGUAcgAgAHAAaABvAG4AZQBzAC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAGMAYQBsAGwAIABjAHUAcwB0AG8AbQBlAHIAcwAgACAAdwBpAHQAaAAgAGkAbgBzAHUAcgBhAG4AYwBlACAAYQBzAHMAaQBnAG4AbQBlAG4AdABzACAASQAgAHIAZQBjAGUAaQB2AGUAZAAgAHYAaQBhACAAQwBDAEMAIABPAG4AZQAgAHQAbwAgAHMAYwBoAGUAZAB1AGwAZQAgAGYAbwByACAAZQBzAHQAaQBtAGEAdABlAHMALgANAEkAIABlAG4AdABlAHIAIABiAG8AZAB5ACAAcwBoAG8AcAAgAHQAZQBjAGgAbgBpAGMAaQBhAG4AJwBzACAAdABpAG0AZQAgAGMAYQByAGQAcwAgAHUAcwBpAG4AZwAgAEEARABQAC4ADQBJACAAbwByAGQAZQByACAAJgAgAGMAaABlAGMAawAgAGkAbgAgAHAAYQByAHQAcwAuAA0ASQAgAHcAcgBpAHQAZQAgAHIAZQBwAGEAaQByACAAbwByAGQAZQByAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAGMAbABvAHMAZQAgAHIAZQBwAGEAaQByACAAbwByAGQAZQByAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ATwBuACAAbwBjAGMAYQBzAGkAbwBuACAASQAgAGgAYQB2AGUAIABmAGkAbABsAGUAZAAgAGkAbgAgAGYAbwByACAAdABoAGUAIABjAGEAcwBoAGkAZQByACAAYQB0ACAASwBpAGEALwBNAGEAegBkAGEALgANAA0ACQANAAkARABhAHkAIABGAG8AcgBkACwAIABNAG8AbgByAG8AZQB2AGkAbABsAGUALAAgAFAAQQAJAAkACQAJAAkACQAJACgAMQAxAC8AMAA1AC0ANgAvADEAMAApAA0ACQBSAGUAYwBlAHAAdABpAG8AbgBpAHMAdAAvAEMAYQBzAGgAaQBlAHIALwBDAHUAcwB0AG8AbQBlAHIAIABTAGUAcgB2AGkAYwBlAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABhAG4AcwB3AGUAcgBlAGQAIABwAGgAbwBuAGUAcwAsACAAdABhAGsAZQAgAGMAYQByAGUAIABvAGYAIABzAGUAcgB2AGkAYwBlACAAYwB1AHMAdABvAG0AZQByAHMALAAgAGIAYQBsAGEAbgBjAGUAIABiAG8AdABoACAAYwBhAHMAaAAgAGQAcgBhAHcAZQByAHMALAAgAGEAbgBkACAAZABvACAAYQAgAGQAZQBwAG8AcwBpAHQALgANAEkAIABzAHQAbwBjAGsAZQBkACAAaQBuACAAbgBlAHcAIABhAG4AZAAgAHUAcwBlAGQAIAB2AGUAaABpAGMAbABlAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAHcAYQBzACAAcwBvAGwAZQBsAHkAIAByAGUAcwBwAG8AbgBzAGkAYgBsAGUAIABmAG8AcgAgAGUAbgB0AGUAcgBpAG4AZwAgAGkAbgB2AG8AaQBjAGUAcwAgAGYAbwByACAAYQBjAGMAbwB1AG4AdABzACAAcABhAHkAYQBiAGwAZQAgAGEAbgBkACAAcAByAGkAbgB0AGkAbgBnACAAYwBoAGUAYwBrAHMAIABmAG8AcgAgAGEAYwBjAG8AdQBuAHQAcwAgAHAAYQB5AGEAYgBsAGUAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAGUAbgB0AGUAcgBlAGQAIABzAHQAbwBjAGsAIABuAHUAbQBiAGUAcgBzACAAZgBvAHIAIABuAGUAdwAgAHYAZQBoAGkAYwBsAGUAcwAgAG8AbgBsAGkAbgBlACAAdQBzAGkAbgBnACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByACAAbwBuACAARABlAGEAbABlAHIAIABBAGMAYwBlAHMAcwAgAFMAeQBzAHQAZQBtACAAZgBvAHIAIABQAE4AQwAuAA0ASQAgAFMAdQBiAG0AaQB0AHQAZQBkACAAdwBhAHIAcgBhAG4AdAB5ACAAYwBsAGEAaQBtAHMAIABmAG8AcgAgAEoATQAmAEEAIABvAG4AbABpAG4AZQAgAHUAcwBpAG4AZwAgAEkAbgB0AGUAcgBuAGUAdAAgAEUAeABwAGwAbwByAGUAcgAuAA0ASQAgAFMAdQBiAG0AaQB0AHQAZQBkACAAdAByAGEAbgBzAGYAZQByACAAcABhAHAAZQByAHcAbwByAGsAIABmAG8AcgAgAGQAZQBhAGwAZQByACAAdAByAGEAZABlAHMAIAB1AHMAaQBuAGcAIABDAG8AbgBjAGUAcABzACAAbwBuACAARgBNAEMAIABEAGUAYQBsAGUA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAGAAAAAEAAAABAAAAEAAAAAIAAADp/QAAGAAAAAEAAAABAAAAEAAAAAIAAADp/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA//////////8BAAAABgkCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAEACAAAAAAAAAQBDAG8AbQBwAE8AYgBqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAgACAAAABAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAagAAAAAAAAABAE8AbABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgACAP////8DAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAUAAAAAAAAADEAVABhAGIAbABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABUhAAAAAAAABQBTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgAFAAAABgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAA7AAAAAAAAABXAG8AcgBkAEQAbwBjAHUAbQBlAG4AdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAAyLgAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAA=;type:2 \ No newline at end of file diff --git a/src/parser/__tests__/json/base64.json b/src/parser/__tests__/json/base64.json new file mode 100644 index 00000000..4e1afee5 --- /dev/null +++ b/src/parser/__tests__/json/base64.json @@ -0,0 +1 @@ +{"action":"candidate.create","actionId":"80653a26cc46357ff79ff83b47e27c3cb7a668bd","params":{"attachments":["fileName:Resume.doc;base64stream:0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAALgAAAAAAAAAAEAAAAgAAAAEAAAD+////AAAAAAAAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9//////////7///8tAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAAP7///8WAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAP7////+////LwAAAP7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAQAAAP7////+////BAAAAAUAAAAGAAAA/v///wgAAAD+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8BAP7/AwoAAP////8GCQIAAAAAAMAAAAAAAABGGAAAAE1pY3Jvc29mdCBXb3JkLURva3VtZW50AAoAAABNU1dvcmREb2MAEAAAAFdvcmQuRG9jdW1lbnQuOAD0ObJxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAAAQACAAAAAAAAAAAAAAAAAAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAAC8AAAACAAAAAEAAABIAAAABAAAAFAAAAAIAAAAaAAAAAkAAACAAAAACgAAAIwAAAALAAAAmAAAAAwAAACkAAAADQAAALAAAAACAAAA6f0AAB4AAAAOAAAAQXByaWwgVmlzbmljawAAAB4AAAAOAAAAQXByaWwgVmlzbmljawAAAB4AAAACAAAAMQAAAEAAAAAAgRssAAAAAEAAAAAAAAAAAAAAAEAAAAAA1pEh62jLAUAAAAAAhXEJ8mjLAQAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAEAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAALVzdWcLhsQk5cIACss+a5EAAAABdXN1ZwuGxCTlwgAKyz5rhIANQAKAAEAWwAPAAIAAAAAAAAAbgAAEPH/AgBuAAAABwBEAGUAZgBhAHUAbAB0AAAAGgAAAAMkAGEkADEkACokATckATUkATMkAUEkADMAQioAT0oAAFFKAABDShgAbUgJBHNICQRLSAEAUEoEAG5I/wBeSgUAYUoYAF9I/wB0SP8AAAAAAAAAAAAA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DBAAAF6EQAtghJj+FcYFAAFACwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAENKHABeSgcAYUocAAEAt/ABAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAXoTYCWCEmP4VxgUAAdgJBk9KCABRSggAQ0ocAF5KBwBhShwAAQDmJQEAAAAXAAAAAAAAAAAAAAAAAAAAAAAAABQQAABehEALYISY/hXGBQABQAsGT0oIAFFKCABDShwAXkoHAGFKHAABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAENKHABeSgcAYUocAAEAt/ABAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAXoQQDmCEmP4VxgUAARAOBk9KCABRSggAQ0ocAF5KBwBhShwAAQDmJQEAAAAXAAAAAAAAAAAAAAAAAAAAAAAAABQQAABehHgPYISY/hXGBQABeA8GT0oIAFFKCABDShwAXkoHAGFKHAABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAENKHABeSgcAYUocAAEAt/ABAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAXoRIEmCEmP4VxgUAAUgSBk9KCABRSggAQ0ocAF5KBwBhShwAAQDmJQEAAAAXAAAAAAAAAAAAAAAAAAAAAAAAABQQAABehLATYISY/hXGBQABsBMGT0oIAFFKCABDShwAXkoHAGFKHAABAKolAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAABAAAF6EsAFghFD+FcYFAAGwAQYAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAQAABehEACYITA/RXGBQABQAIGAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAXoTQAmCEMP0VxgUAAdACBgAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAABAAAF6EYANghKD8FcYFAAFgAwYAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAQAABehPADYIQQ/BXGBQAB8AMGAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAXoSABGCEgPsVxgUAAYAEBgAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAABAAAF6EEAVghPD6FcYFAAEQBQYAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAQAABehKAFYIRg+hXGBQABoAUGAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAXoQwBmCE0PkVxgUAATAGBgAABwAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////8HAAAABwBXAFcAOABOAHUAbQAxAAcAVwBXADgATgB1AG0AMwAHAFcAVwA4AE4AdQBtADQABwBXAFcAOABOAHUAbQA1AAcAVwBXADgATgB1AG0ANgAHAFcAVwA4AE4AdQBtADcAAAAAAAAAsQwAAAAAAAACEAAAAAAAAACxDAAAUAAACAAAAAAMAAAARxaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAaQBtAGUAcwAgAE4AZQB3ACAAUgBvAG0AYQBuAAAANRaQAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFMAeQBtAGIAbwBsAAAAMyaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAcgBpAGEAbAAAAEEmkAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAHIAZQBiAHUAYwBoAGUAdAAgAE0AUwAAAEkmkAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAHIAaQBhAGwAIABVAG4AaQBjAG8AZABlACAATQBTAAAANQaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAYQBoAG8AbQBhAAAANQSQAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFMAeQBtAGIAbwBsAAAAXwSQAQALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AcABlAG4AUwB5AG0AYgBvAGwAAABBAHIAaQBhAGwAIABVAG4AaQBjAG8AZABlACAATQBTAAAAXwSQAYALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AcABlAG4AUwB5AG0AYgBvAGwAAABBAHIAaQBhAGwAIABVAG4AaQBjAG8AZABlACAATQBTAAAAOwSQAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAaQBuAGcAZABpAG4AZwBzAAAAOwaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE0AUwAgAE0AaQBuAGMAaABvAAAANQSQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAYQBoAG8AbQBhAAAAQgAEAAEIjRgAAMUCAABoAQAAAACWVeoGy1XqBgAAAAABAAAAAAAMAgAAgQwAAAIAPQAAAAQAg5A9AAAADAIAAIEMAAACAD0AAAA9AAAAAAAAACcDACAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAgAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADspQEBTSAJBAAAABK/AAAAAAAAMAAAAAAACAAAYiEAAA4AQ2FvbGFuODAAAAAAAAAAAAAAAAAAAAAAAAAJBBYAMi4AAAAAAAAAAAAAsQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AEQAAAAIAAAD//w8AEwAAAAQAAAD//w8AAAAAAAAAAAAAAAAAAAAAAIgAAAAAAKoKAAAAAAAAqgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqgoAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL4KAAA0AAAA8goAABQAAAAGCwAAJAAAAAAAAAAAAAAAlxsAABwDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdhsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACzHgAAYgIAAAAAAAAAAAAAghsAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqCwAAxgAAAH4aAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOGwAAaAAAAAAAAAAAAAAAdhsAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgDZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAcAByAGkAbAAgAFYAaQBzAG4AaQBjAGsADQAxADQAMAAgAEwAbwBuAGcAIABEAHIAaQB2AGUADQBJAHIAdwBpAG4ALAAgAFAAQQAgADEANQA2ADQAMgANACgANwAyADQAKQAgADYAMQAwAC0AMQA0ADgAMAANAA0ADQBDAG8AbQBwAHUAdABlAHIAIABTAGsAaQBsAGwAcwANAA0ACQAJAEkAIABhAG0AIABlAHgAcABlAHIAaQBlAG4AYwBlAGQAIAB3AGkAdABoACAATQBpAGMAcgBvAHMAbwBmAHQAIABXAG8AcgBkACAAYQBuAGQAIABFAHgAYwBlAGwALgANAA0ACQAJAEkAIABjAGEAbgAgAHUAcwBlACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByACAAdABvACAAZABvAHcAbgBsAG8AYQBkACAAdQBwAGQAYQB0AGUAcwAgAGYAbwByACAATQBpAGMAcgBvAHMAbwBmAHQAIABXAG8AcgBkACAAYQBuAGQAIABFAHgAYwBlAGwALAAgAHMAZQBhAHIAYwBoAA0ACQAJAGQAaQByAGUAYwB0AGkAbwBuAHMAIAB0AG8AIABhAG4AZAAgAGYAcgBvAG0AIABkAGkAZgBmAGUAcgBlAG4AdAAgAGwAbwBjAGEAdABpAG8AbgBzACwAIABjAGEAbgAgAHMAZQBhAHIAYwBoACAAZgBvAHIAIABwAGgAeQBzAGkAYwBhAGwAIABhAGQAZAByAGUAcwBzAGUAcwAgAGYAbwByAA0ACQAJAGMAbwBtAHAAYQBuAGkAZQBzACAAbwByACAAaQBuAGQAaQB2AGkAZAB1AGEAbABzACwAIABhAG4AZAAgAGUAbQBhAGkAbAAuAA0ADQBFAGQAdQBjAGEAdABpAG8AbgANAA0ACQAJAEIAcgBhAGQAZgBvAHIAZAAgAEIAdQBzAGkAbgBlAHMAcwAsACAAUABpAHQAdABzAGIAdQByAGcAaAAsACAAUABBAAkACQAJAAkACQAJACgAOQAvADAAMAAtADEAMAAvADAAMQApAA0ACQAJAEEAUwBCACwAIABPAGYAZgBpAGMAZQAgAEEAZABtAGkAbgBpAHMAdAByAGEAdABpAG8AbgANAEMAbwB1AHIAcwBlACAAdwBvAHIAawAgAGkAbgBjAGwAdQBkAGUAZAA6ACAARQBzAHMAZQBuAHQAaQBhAGwAcwAgAG8AZgAgAE0AYQBuAGEAZwBlAG0AZQBuAHQALAAgAEQAYQB0AGEAIABBAG4AYQBsAHkAcwBpAHMALAAgAEMAbwBuAGMAZQBwAHQAcwAgAG8AZgAgAEQAZQBzAGsAdABvAHAAIABQAHUAYgBsAGkAcwBoAGkAbgBnACwAIABBAGQAdgBhAG4AYwBlAGQAIABFAGwAZQBjAHQAcgBvAG4AaQBjACAAUwBwAHIAZQBhAGQAcwBoAGUAZQB0AHMALgANAA0ACQAJAFAAZQBuAG4AIABUAHIAYQBmAGYAbwByAGQAIABIAGkAZwBoACAAUwBjAGgAbwBvAGwALAAgAEgAYQByAHIAaQBzAG8AbgAgAEMAaQB0AHkALAAgAFAAQQAJAAkACQAJAAkAKAAxADkAOQA2AC0AMgAwADAAMAApAA0ACQAJAEQAaQBwAGwAbwBtAGEALQAgAEcAZQBuAGUAcgBhAGwAIABTAHQAdQBkAGkAZQBzAA0ARwBlAG4AZQByAGEAbAAgAEMAbwB1AHIAcwBlAHMAIABvAGYAIABzAHQAdQBkAHkAIAB3AGUAcgBlACAATQBhAHQAaAAsACAARQBuAGcAbABpAHMAaAAgAGEAbgBkACAAUwBjAGkAZQBuAGMAZQAuAA0AVABvAG8AawAgAFMAcABlAGUAZAB3AHIAaQB0AGkAbgBnACwAIABTAHAAZQBlAGQAdwByAGkAdABpAG4AZwAgAEkASQAsACAAUABvAHQAdABlAHIAeQAgAGEAbgBkACAASgBlAHcAZQBsAHIAeQAgAGEAcwAgAGEAZABkAGUAZAAgAGMAbwB1AHIAcwBlAHMALgANAFAAZQByAGYAbwByAG0AZQBkACAAaQBuACAAdABoAGUAIABtAGEAcgBjAGgAaQBuAGcAIABiAGEAbgBkACAAYQBuAGQAIABjAG8AbgBjAGUAcgB0ACAAYgBhAG4AZAAgAGEAbABsACAAZgBvAHUAcgAgAHkAZQBhAHIAcwAuAA0AVwBhAHMAIABhACAAbQBlAG0AYgBlAHIAIABvAGYAIABDAG8AbQBtAHUAbgBpAHQAeQAgAEEAYwB0AGkAbwBuACAAUAByAG8AZwByAGEAbQAgACgAQwBBAFAAKQANAEgAZQBsAHAAZQBkACAAbwB1AHQAIABiAGEAYwBrAHMAdABhAGcAZQAgAHcAaQB0AGgAIAB0AGgAZQAgAHMAcAByAGkAbgBnACAAbQB1AHMAaQBjAGEAbAAgAHQAdwBvACAAeQBlAGEAcgBzACAAaQBuACAAYQAgAHIAbwB3AC4ADQANAA0ARQBtAHAAbABvAHkAbQBlAG4AdAAgAEgAaQBzAHQAbwByAHkADQANAAkASwBlAHkAcwB0AG8AbgBlACAAQwBvAGwAbABlAGMAdABpAG8AbgBzACwAIABJAHIAdwBpAG4ALAAgAFAAQQAJAAkACQAJAAkACQAJACgANgAvADEANAAtAFAAcgBlAHMAZQBuAHQAKQANAAkARABhAHQAYQAgAEUAbgB0AHIAeQANAE8AbgAgAGEAIABkAGEAaQBsAHkAIABiAGEAcwBpAHMAIABJACAAdgBlAHIAaQBmAHkAIABmAGkAbgBhAGwAIABsAG8AYwBhAGwAIAByAGUAdAB1AHIAbgBzACAAYQBuAGQAIAB2AGUAcgBpAGYAeQAgAHQAaABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAdABoAGEAdAAgAGkAcwAgAGkAbgANAHQAaABlACAAcwB5AHMAdABlAG0ALgANAAkADQAJAEMAYQB0AGMAaAAtAFUAcAAgAEwAbwBnAGkAcwB0AGkAYwBzACwAIABHAHIAZQBlAG4AcwBiAHUAcgBnACwAIABQAEEACQAJAAkACQAJAAkAKAA0AC8AMQA0AC0ANQAvADEANAApAA0ACQBTAGgAaQBwAHAAaQBuAGcALwBSAGUAYwBlAGkAdgBpAG4AZwAgAEMAbABlAHIAawANAE8AbgAgAGEAIABkAGEAaQBsAHkAIABiAGEAcwBpAHMAIABJACAAcABlAHIAZgBvAHIAbQAgAHQAaABlACAASQBuACAAJgAgAE8AdQB0ACAAYwBvAHUAbgB0ACAAZgBvAHIAIAB0AGgAZQAgAHAAcgBlAHYAaQBvAHUAcwAgAGQAYQB5AC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAHAAcgBvAGMAZQBzAHMAIABCAGkAbABsAHMAIABvAGYAIABMAGEAZABpAG4AZwAgAGYAbwByACAAUwBoAGkAcABtAGUAbgB0AHMAIAB1AHMAaQBuAGcAIAAzAFAATAAuAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAHIAbwBjAGUAcwBzACAAcgBlAGMAZQBpAHAAdABzACAAZgBvAHIAIABpAHQAZQBtAHMAIABkAGUAbABpAHYAZQByAGUAZAAgAHUAcwBpAG4AZwAgADMAUABMAC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAGMAYQBsAGwAIABjAGEAcgByAGkAZQByAHMAIAB0AG8AIABhAHIAcgBhAG4AZwBlACAAcABpAGMAawAgAHUAcABzACAAZgBvAHIAIABzAGgAaQBwAG0AZQBuAHQAcwAuAA0ADQANAAkATABvAGQAbwB2AGkAYwBvACAAJgAgAEEAcwBzAG8AYwBpAGEAdABlAHMALAAgAEYAbwByAGUAcwB0ACAASABpAGwAbABzACwAIABQAEEACQAJAAkACQAJAAkAKAAxAC8AMQAzAC0AMgAvADEANAApAA0ACQBQAHIAbwBjAGUAcwBzAG8AcgANAEQAdQByAGkAbgBnACAAdABhAHgAIABzAGUAYQBzAG8AbgAgAEkAIABwAHIAbwBjAGUAcwBzACAAYwBsAGkAZQBuAHQAcwAgAHQAYQB4ACAAcgBlAHQAdQByAG4AcwAgAGIAeQAgAG0AYQBrAGkAbgBnACAAYwBvAHAAaQBlAHMAIABvAGYAIAB0AGgAZQAgAGMAbABpAGUAbgB0AHMAIAB0AGEAeAAgAHIAZQB0AHUAcgBuACAAZgBvAHIAIAB0AGgAZQAgAGMAbABpAGUAbgB0ACAAdABvACAAawBlAGUAcAAgAGYAbwByACAAdABoAGUAaQByACAAcgBlAGMAbwByAGQAcwAuAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAGUAcgBmAG8AcgBtACAAZwBlAG4AZQByAGEAbAAgAG8AZgBmAGkAYwBlACAAZAB1AHQAaQBlAHMALgANAA0ADQAJAA0ACQBBAG0AZQByAGkAcwBvAHUAcgBjAGUAYgBlAHIAZwBlAG4ALQAgAFQAaABlAHIAYQBjAG8AbQAsACAATQBvAG4AcgBvAGUAdgBpAGwAbABlACwAIABQAEEACQAJAAkACQAoADEAMgAvADEAMQAtADEAMAAvADEAMgApAA0ACQBTAGUAbgBpAG8AcgAgAEQAYQB0AGEAIABFAG4AdAByAHkALQBYAGEAcgBlAGwAdABvAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAGUAcgBmAG8AcgBtACAAZABhAHQAYQAgAGUAbgB0AHIAeQAgAGYAbwByACAAYgBlAG4AZQBmAGkAdAAgAGkAbgB2AGUAcwB0AGkAZwBhAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABkAHIAdQBnACAAYwBhAGwAbABlAGQAIABYAGEAcgBlAGwAdABvAC4ADQBFAG4AdABlAHIAIABCAHUAcwBpAG4AZQBzAHMAIABBAHMAcwBvAGMAaQBhAHQAZQBzACAAQQBnAHIAZQBlAG0AZQBuAHQAcwAgAGYAbwByACAAcABoAHkAcwBpAGMAaQBhAG4AcwAgAG8AZgBmAGkAYwBlAHMAIABmAG8AcgAgAHQAaABlACAAZAByAHUAZwAgAGMAYQBsAGwAZQBkACAAWABhAHIAZQBsAHQAbwAuAA0AUwBlAGEAcgBjAGgAIABwAGgAeQBzAGkAYwBpAGEAbgBzACAATgBQAEkAIABuAHUAbQBiAGUAcgBzACAAdQBzAGkAbgBnACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByAC4ADQBMAGkAbgBrACAAaQBtAGEAZwBlAHMAIAB0AG8AIABjAGEAcwBlAHMAIAB1AHMAaQBuAGcAIABLAG8AZgBhAHgALgANAEYAYQB4ACAAaQBuACAAVgBlAHIAYgBhAGwAIABCAGUAbgBlAGYAaQB0ACAASQBuAHYAZQBzAHQAaQBnAGEAdABpAG8AbgAgAGYAbwByAG0AcwAgAHQAbwAgAEsAbwBmAGEAeAAgAHQAbwAgAGwAaQBuAGsAIAB0AG8AIABjAGEAcwBlAHMALgANAA0ADQAJAFQAaABlACAATgBlAHcAIABNAG8AbgByAG8AZQB2AGkAbABsAGUAIABEAG8AZABnAGUAIABDAG8AbABsAGkAcwBpAG8AbgAgAEMAZQBuAHQAZQByACwAIABNAG8AbgByAG8AZQB2AGkAbABsAGUALAAgAFAAQQAJAAkAKAAxAC8AMQAxAC0AMQAyAC8AMQAxACkAIAAJAFIAZQBjAGUAcAB0AGkAbwBuAGkAcwB0AA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABhAG4AcwB3AGUAcgAgAHAAaABvAG4AZQBzAC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAGMAYQBsAGwAIABjAHUAcwB0AG8AbQBlAHIAcwAgACAAdwBpAHQAaAAgAGkAbgBzAHUAcgBhAG4AYwBlACAAYQBzAHMAaQBnAG4AbQBlAG4AdABzACAASQAgAHIAZQBjAGUAaQB2AGUAZAAgAHYAaQBhACAAQwBDAEMAIABPAG4AZQAgAHQAbwAgAHMAYwBoAGUAZAB1AGwAZQAgAGYAbwByACAAZQBzAHQAaQBtAGEAdABlAHMALgANAEkAIABlAG4AdABlAHIAIABiAG8AZAB5ACAAcwBoAG8AcAAgAHQAZQBjAGgAbgBpAGMAaQBhAG4AJwBzACAAdABpAG0AZQAgAGMAYQByAGQAcwAgAHUAcwBpAG4AZwAgAEEARABQAC4ADQBJACAAbwByAGQAZQByACAAJgAgAGMAaABlAGMAawAgAGkAbgAgAHAAYQByAHQAcwAuAA0ASQAgAHcAcgBpAHQAZQAgAHIAZQBwAGEAaQByACAAbwByAGQAZQByAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAGMAbABvAHMAZQAgAHIAZQBwAGEAaQByACAAbwByAGQAZQByAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ATwBuACAAbwBjAGMAYQBzAGkAbwBuACAASQAgAGgAYQB2AGUAIABmAGkAbABsAGUAZAAgAGkAbgAgAGYAbwByACAAdABoAGUAIABjAGEAcwBoAGkAZQByACAAYQB0ACAASwBpAGEALwBNAGEAegBkAGEALgANAA0ACQANAAkARABhAHkAIABGAG8AcgBkACwAIABNAG8AbgByAG8AZQB2AGkAbABsAGUALAAgAFAAQQAJAAkACQAJAAkACQAJACgAMQAxAC8AMAA1AC0ANgAvADEAMAApAA0ACQBSAGUAYwBlAHAAdABpAG8AbgBpAHMAdAAvAEMAYQBzAGgAaQBlAHIALwBDAHUAcwB0AG8AbQBlAHIAIABTAGUAcgB2AGkAYwBlAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABhAG4AcwB3AGUAcgBlAGQAIABwAGgAbwBuAGUAcwAsACAAdABhAGsAZQAgAGMAYQByAGUAIABvAGYAIABzAGUAcgB2AGkAYwBlACAAYwB1AHMAdABvAG0AZQByAHMALAAgAGIAYQBsAGEAbgBjAGUAIABiAG8AdABoACAAYwBhAHMAaAAgAGQAcgBhAHcAZQByAHMALAAgAGEAbgBkACAAZABvACAAYQAgAGQAZQBwAG8AcwBpAHQALgANAEkAIABzAHQAbwBjAGsAZQBkACAAaQBuACAAbgBlAHcAIABhAG4AZAAgAHUAcwBlAGQAIAB2AGUAaABpAGMAbABlAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAHcAYQBzACAAcwBvAGwAZQBsAHkAIAByAGUAcwBwAG8AbgBzAGkAYgBsAGUAIABmAG8AcgAgAGUAbgB0AGUAcgBpAG4AZwAgAGkAbgB2AG8AaQBjAGUAcwAgAGYAbwByACAAYQBjAGMAbwB1AG4AdABzACAAcABhAHkAYQBiAGwAZQAgAGEAbgBkACAAcAByAGkAbgB0AGkAbgBnACAAYwBoAGUAYwBrAHMAIABmAG8AcgAgAGEAYwBjAG8AdQBuAHQAcwAgAHAAYQB5AGEAYgBsAGUAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAGUAbgB0AGUAcgBlAGQAIABzAHQAbwBjAGsAIABuAHUAbQBiAGUAcgBzACAAZgBvAHIAIABuAGUAdwAgAHYAZQBoAGkAYwBsAGUAcwAgAG8AbgBsAGkAbgBlACAAdQBzAGkAbgBnACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByACAAbwBuACAARABlAGEAbABlAHIAIABBAGMAYwBlAHMAcwAgAFMAeQBzAHQAZQBtACAAZgBvAHIAIABQAE4AQwAuAA0ASQAgAFMAdQBiAG0AaQB0AHQAZQBkACAAdwBhAHIAcgBhAG4AdAB5ACAAYwBsAGEAaQBtAHMAIABmAG8AcgAgAEoATQAmAEEAIABvAG4AbABpAG4AZQAgAHUAcwBpAG4AZwAgAEkAbgB0AGUAcgBuAGUAdAAgAEUAeABwAGwAbwByAGUAcgAuAA0ASQAgAFMAdQBiAG0AaQB0AHQAZQBkACAAdAByAGEAbgBzAGYAZQByACAAcABhAHAAZQByAHcAbwByAGsAIABmAG8AcgAgAGQAZQBhAGwAZQByACAAdAByAGEAZABlAHMAIAB1AHMAaQBuAGcAIABDAG8AbgBjAGUAcABzACAAbwBuACAARgBNAEMAIABEAGUAYQBsAGUA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAGAAAAAEAAAABAAAAEAAAAAIAAADp/QAAGAAAAAEAAAABAAAAEAAAAAIAAADp/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA//////////8BAAAABgkCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAEACAAAAAAAAAQBDAG8AbQBwAE8AYgBqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAgACAAAABAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAagAAAAAAAAABAE8AbABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgACAP////8DAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAUAAAAAAAAADEAVABhAGIAbABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABUhAAAAAAAABQBTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgAFAAAABgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAA7AAAAAAAAABXAG8AcgBkAEQAbwBjAHUAbQBlAG4AdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAAyLgAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAA=;type:2"]}} diff --git a/src/parser/__tests__/languageguesser/bash.shebang b/src/parser/__tests__/languageguesser/bash.shebang new file mode 100644 index 00000000..ef8dfc11 --- /dev/null +++ b/src/parser/__tests__/languageguesser/bash.shebang @@ -0,0 +1,3 @@ +#!/bin/bash + +exit 1; diff --git a/src/parser/__tests__/languageguesser/console.path b/src/parser/__tests__/languageguesser/console.path new file mode 100644 index 00000000..ac42ce92 --- /dev/null +++ b/src/parser/__tests__/languageguesser/console.path @@ -0,0 +1,8 @@ +path/to/somewhere/ $ ls +[ dd kill mv sh wait4path +bash df ksh pax sleep zsh +cat domainname launchctl ps stty +chmod echo link pwd sync +cp ed ln rcp tcsh +csh expr ls rm test +date hostname mkdir rmdir unlink diff --git a/src/parser/__tests__/languageguesser/console.prompt b/src/parser/__tests__/languageguesser/console.prompt new file mode 100644 index 00000000..775eaf8f --- /dev/null +++ b/src/parser/__tests__/languageguesser/console.prompt @@ -0,0 +1,8 @@ +$ ls +[ dd kill mv sh wait4path +bash df ksh pax sleep zsh +cat domainname launchctl ps stty +chmod echo link pwd sync +cp ed ln rcp tcsh +csh expr ls rm test +date hostname mkdir rmdir unlink diff --git a/src/parser/__tests__/languageguesser/diff.git b/src/parser/__tests__/languageguesser/diff.git new file mode 100644 index 00000000..eb4e3ce1 --- /dev/null +++ b/src/parser/__tests__/languageguesser/diff.git @@ -0,0 +1,7 @@ +diff --git a/some_file b/some_file +index 4c479de..637a09b 100644 +--- a/some_file ++++ b/some_file +@@ -1 +1 @@ +-apple ++banana diff --git a/src/parser/__tests__/languageguesser/diff.udiff b/src/parser/__tests__/languageguesser/diff.udiff new file mode 100644 index 00000000..faf3bfd2 --- /dev/null +++ b/src/parser/__tests__/languageguesser/diff.udiff @@ -0,0 +1,5 @@ +--- some_file 2012-05-20 19:35:28.000000000 -0700 ++++ other_file 2012-05-20 19:35:23.000000000 -0700 +@@ -1 +1 @@ +-apple ++banana diff --git a/src/parser/__tests__/languageguesser/nothing-useful b/src/parser/__tests__/languageguesser/nothing-useful new file mode 100644 index 00000000..c0f8198a --- /dev/null +++ b/src/parser/__tests__/languageguesser/nothing-useful @@ -0,0 +1,2 @@ +derp derp derp derp derp derp derp derp derp derp derp derp derp derp +herp derp herp derp herp derp herp derp herp derp herp derp herp derp diff --git a/src/parser/__tests__/languageguesser/php.shell b/src/parser/__tests__/languageguesser/php.shell new file mode 100644 index 00000000..90017edb --- /dev/null +++ b/src/parser/__tests__/languageguesser/php.shell @@ -0,0 +1,3 @@ +#!/usr/bin/php + +exit(1); diff --git a/src/parser/__tests__/languageguesser/php.shell-env b/src/parser/__tests__/languageguesser/php.shell-env new file mode 100644 index 00000000..56ca75a9 --- /dev/null +++ b/src/parser/__tests__/languageguesser/php.shell-env @@ -0,0 +1,3 @@ +#!/usr/bin/env php + +exit(1); diff --git a/src/parser/__tests__/languageguesser/php.test b/src/parser/__tests__/languageguesser/php.test new file mode 100644 index 00000000..ab2b32bb --- /dev/null +++ b/src/parser/__tests__/languageguesser/php.test @@ -0,0 +1,3 @@ +id = $id; + $this->typeID = $data[0]; + if (isset($data[1])) { + $this->l = $data[1]; + } else { + $this->l = -1; + } + if (isset($data[2])) { + $this->r = $data[2]; + } else { + $this->r = -1; + } + $this->tree = $tree; + } + + final public function getParentNode() { + return $this->parentNode; + } + + final public function setParentNode(AASTNode $node = null) { + $this->parentNode = $node; + return $this; + } + + final public function getPreviousSibling() { + return $this->previousSibling; + } + + final public function setPreviousSibling(AASTNode $node = null) { + $this->previousSibling = $node; + return $this; + } + + final public function getNextSibling() { + return $this->nextSibling; + } + + final public function setNextSibling(AASTNode $node = null) { + $this->nextSibling = $node; + return $this; + } + + final public function getID() { + return $this->id; + } + + final public function getTypeID() { + return $this->typeID; + } + + final public function getTree() { + return $this->tree; + } + + final public function getTypeName() { + if (empty($this->typeName)) { + $this->typeName = + $this->tree->getNodeTypeNameFromTypeID($this->getTypeID()); + } + return $this->typeName; + } + + final public function getChildren() { + return $this->children; + } + + final public function setChildren(array $children) { + // We don't call `assert_instances_of($children, 'AASTNode')` because doing + // so would incur a significant performance penalty. + $this->children = $children; + return $this; + } + + public function getChildrenOfType($type) { + $nodes = array(); + + foreach ($this->children as $child) { + if ($child->getTypeName() == $type) { + $nodes[] = $child; + } + } + + return $nodes; + } + + public function getChildOfType($index, $type) { + $child = $this->getChildByIndex($index); + if ($child->getTypeName() != $type) { + throw new Exception( + pht( + "Child in position '%d' is not of type '%s': %s", + $index, + $type, + $this->getDescription())); + } + + return $child; + } + + public function getChildByIndex($index) { + // NOTE: Microoptimization to avoid calls like array_values() or idx(). + + $idx = 0; + foreach ($this->children as $child) { + if ($idx == $index) { + return $child; + } + ++$idx; + } + + throw new Exception(pht("No child with index '%d'.", $index)); + } + + /** + * Build a cache to improve the performance of + * @{method:selectDescendantsOfType}. This cache makes a time/memory tradeoff + * by aggressively caching node descendants. It may improve the tree's query + * performance substantially if you make a large number of queries, but also + * requires a significant amount of memory. + * + * This builds a cache for the entire tree and improves performance of all + * @{method:selectDescendantsOfType} calls. + */ + public function buildSelectCache() { + $cache = array(); + foreach ($this->getChildren() as $id => $child) { + $type_id = $child->getTypeID(); + if (empty($cache[$type_id])) { + $cache[$type_id] = array(); + } + $cache[$type_id][$id] = $child; + foreach ($child->buildSelectCache() as $type_id => $nodes) { + if (empty($cache[$type_id])) { + $cache[$type_id] = array(); + } + $cache[$type_id] += $nodes; + } + } + $this->selectCache = $cache; + return $this->selectCache; + } + + /** + * Build a cache to improve the performance of @{method:selectTokensOfType}. + * This cache makes a time/memory tradeoff by aggressively caching token + * types. It may improve the tree's query performance substantially if you + * make a large number of queries, but also requires a significant amount of + * memory. + * + * This builds a cache for this node only. + */ + public function buildTokenCache() { + $cache = array(); + foreach ($this->getTokens() as $id => $token) { + $cache[$token->getTypeName()][$id] = $token; + } + $this->tokenCache = $cache; + return $this->tokenCache; + } + + public function selectTokensOfType($type_name) { + return $this->selectTokensOfTypes(array($type_name)); + } + + /** + * Select all tokens of any given types. + */ + public function selectTokensOfTypes(array $type_names) { + $tokens = array(); + + foreach ($type_names as $type_name) { + if (isset($this->tokenCache)) { + $cached_tokens = idx($this->tokenCache, $type_name, array()); + foreach ($cached_tokens as $id => $cached_token) { + $tokens[$id] = $cached_token; + } + } else { + foreach ($this->getTokens() as $id => $token) { + if ($token->getTypeName() == $type_name) { + $tokens[$id] = $token; + } + } + } + } + + return $tokens; + } + + final public function isDescendantOf(AASTNode $node) { + for ($it = $this; $it !== null; $it = $it->getParentNode()) { + if ($it === $node) { + return true; + } + } + + return false; + } + + public function selectDescendantsOfType($type_name) { + return $this->selectDescendantsOfTypes(array($type_name)); + } + + public function selectDescendantsOfTypes(array $type_names) { + $nodes = array(); + foreach ($type_names as $type_name) { + $type = $this->getTypeIDFromTypeName($type_name); + + if (isset($this->selectCache)) { + if (isset($this->selectCache[$type])) { + $nodes = $nodes + $this->selectCache[$type]; + } + } else { + $nodes = $nodes + $this->executeSelectDescendantsOfType($this, $type); + } + } + + return AASTNodeList::newFromTreeAndNodes($this->tree, $nodes); + } + + protected function executeSelectDescendantsOfType($node, $type) { + $results = array(); + foreach ($node->getChildren() as $id => $child) { + if ($child->getTypeID() == $type) { + $results[$id] = $child; + } + $results += $this->executeSelectDescendantsOfType($child, $type); + } + return $results; + } + + public function getTokens() { + if ($this->l == -1 || $this->r == -1) { + return array(); + } + $tokens = $this->tree->getRawTokenStream(); + $result = array(); + foreach (range($this->l, $this->r) as $token_id) { + $result[$token_id] = $tokens[$token_id]; + } + return $result; + } + + public function getConcreteString() { + $values = array(); + foreach ($this->getTokens() as $token) { + $values[] = $token->getValue(); + } + return implode('', $values); + } + + public function getSemanticString() { + $tokens = $this->getTokens(); + foreach ($tokens as $id => $token) { + if ($token->isComment()) { + unset($tokens[$id]); + } + } + return implode('', mpull($tokens, 'getValue')); + } + + public function getIndentation() { + $tokens = $this->getTokens(); + $left = head($tokens); + + while ($left && + (!$left->isAnyWhitespace() || + strpos($left->getValue(), "\n") === false)) { + $left = $left->getPrevToken(); + } + + if (!$left) { + return null; + } + + return preg_replace("/^.*\n/s", '', $left->getValue()); + } + + public function getDescription() { + $concrete = $this->getConcreteString(); + if (strlen($concrete) > 75) { + $concrete = substr($concrete, 0, 36).'...'.substr($concrete, -36); + } + + $concrete = addcslashes($concrete, "\\\n\""); + + return pht('a node of type %s: "%s"', $this->getTypeName(), $concrete); + } + + final protected function getTypeIDFromTypeName($type_name) { + return $this->tree->getNodeTypeIDFromTypeName($type_name); + } + + final public function getOffset() { + $stream = $this->tree->getRawTokenStream(); + if (empty($stream[$this->l])) { + return null; + } + return $stream[$this->l]->getOffset(); + } + + final public function getLength() { + $stream = $this->tree->getRawTokenStream(); + if (empty($stream[$this->r])) { + return null; + } + return $stream[$this->r]->getOffset() - $this->getOffset(); + } + + + public function getSurroundingNonsemanticTokens() { + $before = array(); + $after = array(); + + $tokens = $this->tree->getRawTokenStream(); + + if ($this->l != -1) { + $before = $tokens[$this->l]->getNonsemanticTokensBefore(); + } + + if ($this->r != -1) { + $after = $tokens[$this->r]->getNonsemanticTokensAfter(); + } + + return array($before, $after); + } + + final public function getLineNumber() { + return idx($this->tree->getOffsetToLineNumberMap(), $this->getOffset()); + } + + final public function getEndLineNumber() { + return idx( + $this->tree->getOffsetToLineNumberMap(), + $this->getOffset() + $this->getLength()); + } + + /** + * Determines whether the current node appears //after// a specified node in + * the tree. + * + * @param AASTNode + * @return bool + */ + final public function isAfter(AASTNode $node) { + return head($this->getTokens())->getOffset() > + last($node->getTokens())->getOffset(); + } + + /** + * Determines whether the current node appears //before// a specified node in + * the tree. + * + * @param AASTNode + * @return bool + */ + final public function isBefore(AASTNode $node) { + return last($this->getTokens())->getOffset() < + head($node->getTokens())->getOffset(); + } + + /** + * Determines whether a specified node is a descendant of the current node. + * + * @param AASTNode + * @return bool + */ + final public function containsDescendant(AASTNode $node) { + return !$this->isAfter($node) && !$this->isBefore($node); + } + + public function dispose() { + foreach ($this->getChildren() as $child) { + $child->dispose(); + } + + unset($this->selectCache); + } + +} diff --git a/src/parser/aast/api/AASTNodeList.php b/src/parser/aast/api/AASTNodeList.php new file mode 100644 index 00000000..92f76f2a --- /dev/null +++ b/src/parser/aast/api/AASTNodeList.php @@ -0,0 +1,110 @@ +tree, $nodes); + } + + public function selectDescendantsOfType($type_name) { + return $this->selectDescendantsOfTypes(array($type_name)); + } + + public function selectDescendantsOfTypes(array $type_names) { + $results = array(); + foreach ($type_names as $type_name) { + foreach ($this->list as $id => $node) { + $results += $node->selectDescendantsOfType($type_name)->getRawNodes(); + } + } + return $this->newList($results); + } + + public function getChildrenByIndex($index) { + $results = array(); + foreach ($this->list as $id => $node) { + $child = $node->getChildByIndex($index); + $results[$child->getID()] = $child; + } + return $this->newList($results); + } + + public function add(AASTNodeList $list) { + foreach ($list->list as $id => $node) { + $this->list[$id] = $node; + } + $this->ids = array_keys($this->list); + return $this; + } + + public function getTokens() { + $tokens = array(); + foreach ($this->list as $node) { + $tokens += $node->getTokens(); + } + return $tokens; + } + + public function getRawNodes() { + return $this->list; + } + + public static function newFromTreeAndNodes(AASTTree $tree, array $nodes) { + // We could do `assert_instances_of($nodes, 'AASTNode')` here, but doing + // so imposes an observable performance penalty for linting. + + $obj = new AASTNodeList(); + $obj->tree = $tree; + $obj->list = $nodes; + $obj->ids = array_keys($nodes); + return $obj; + } + + public static function newFromTree(AASTTree $tree) { + $obj = new AASTNodeList(); + $obj->tree = $tree; + $obj->list = array(0 => $tree->getRootNode()); + $obj->ids = array(0 => 0); + return $obj; + } + + +/* -( Countable )---------------------------------------------------------- */ + + public function count() { + return count($this->ids); + } + + +/* -( Iterator )----------------------------------------------------------- */ + + public function current() { + return $this->list[$this->key()]; + } + + public function key() { + return $this->ids[$this->pos]; + } + + public function next() { + $this->pos++; + } + + public function rewind() { + $this->pos = 0; + } + + public function valid() { + return $this->pos < count($this->ids); + } + +} diff --git a/src/parser/aast/api/AASTToken.php b/src/parser/aast/api/AASTToken.php new file mode 100644 index 00000000..aebe9ced --- /dev/null +++ b/src/parser/aast/api/AASTToken.php @@ -0,0 +1,91 @@ +id = $id; + $this->typeID = $type; + $this->value = $value; + $this->offset = $offset; + $this->tree = $tree; + } + + final public function getTokenID() { + return $this->id; + } + + final public function getTypeID() { + return $this->typeID; + } + + public function getTypeName() { + if (empty($this->typeName)) { + $this->typeName = $this->tree->getTokenTypeNameFromTypeID($this->typeID); + } + return $this->typeName; + } + + final public function getValue() { + return $this->value; + } + + final public function overwriteValue($value) { + $this->value = $value; + return $this; + } + + final public function getOffset() { + return $this->offset; + } + + abstract public function isComment(); + abstract public function isAnyWhitespace(); + + public function isSemantic() { + return !($this->isComment() || $this->isAnyWhitespace()); + } + + public function getPrevToken() { + $tokens = $this->tree->getRawTokenStream(); + return idx($tokens, $this->id - 1); + } + + public function getNextToken() { + $tokens = $this->tree->getRawTokenStream(); + return idx($tokens, $this->id + 1); + } + + public function getNonsemanticTokensBefore() { + $tokens = $this->tree->getRawTokenStream(); + $result = array(); + $ii = $this->id - 1; + while ($ii >= 0 && !$tokens[$ii]->isSemantic()) { + $result[$ii] = $tokens[$ii]; + --$ii; + } + return array_reverse($result); + } + + public function getNonsemanticTokensAfter() { + $tokens = $this->tree->getRawTokenStream(); + $result = array(); + $ii = $this->id + 1; + while ($ii < count($tokens) && !$tokens[$ii]->isSemantic()) { + $result[$ii] = $tokens[$ii]; + ++$ii; + } + return $result; + } + + final public function getLineNumber() { + return idx($this->tree->getOffsetToLineNumberMap(), $this->getOffset()); + } + +} diff --git a/src/parser/aast/api/AASTTree.php b/src/parser/aast/api/AASTTree.php new file mode 100644 index 00000000..2f1e1319 --- /dev/null +++ b/src/parser/aast/api/AASTTree.php @@ -0,0 +1,194 @@ +stream[$ii] = $this->newToken( + $ii, + $token[0], + substr($source, $offset, $token[1]), + $offset, + $this); + $offset += $token[1]; + ++$ii; + } + + $this->rawSource = $source; + $this->buildTree(array($tree)); + } + + final public function setTreeType($description) { + $this->treeType = $description; + return $this; + } + + final public function getTreeType() { + return $this->treeType; + } + + final public function setTokenConstants(array $token_map) { + $this->tokenConstants = $token_map; + $this->tokenReverseMap = array_flip($token_map); + return $this; + } + + final public function setNodeConstants(array $node_map) { + $this->nodeConstants = $node_map; + $this->nodeReverseMap = array_flip($node_map); + return $this; + } + + final public function getNodeTypeNameFromTypeID($type_id) { + if (empty($this->nodeConstants[$type_id])) { + $tree_type = $this->getTreeType(); + throw new Exception( + pht( + "No type name for node type ID '%s' in '%s' AAST.", + $type_id, + $tree_type)); + } + + return $this->nodeConstants[$type_id]; + } + + final public function getNodeTypeIDFromTypeName($type_name) { + if (empty($this->nodeReverseMap[$type_name])) { + $tree_type = $this->getTreeType(); + throw new Exception( + pht( + "No type ID for node type name '%s' in '%s' AAST.", + $type_name, + $tree_type)); + } + return $this->nodeReverseMap[$type_name]; + } + + final public function getTokenTypeNameFromTypeID($type_id) { + if (empty($this->tokenConstants[$type_id])) { + $tree_type = $this->getTreeType(); + throw new Exception( + pht( + "No type name for token type ID '%s' in '%s' AAST.", + $type_id, + $tree_type)); + } + return $this->tokenConstants[$type_id]; + } + + final public function getTokenTypeIDFromTypeName($type_name) { + if (empty($this->tokenReverseMap[$type_name])) { + $tree_type = $this->getTreeType(); + throw new Exception( + pht( + "No type ID for token type name '%s' in '%s' AAST.", + $type_name, + $tree_type)); + } + return $this->tokenReverseMap[$type_name]; + } + + /** + * Unlink internal datastructures so that PHP will garbage collect the tree. + * + * This renders the object useless. + * + * @return void + */ + public function dispose() { + $this->getRootNode()->dispose(); + unset($this->tree); + unset($this->stream); + } + + final public function getRootNode() { + return $this->tree[0]; + } + + protected function buildTree(array $tree) { + $ii = count($this->tree); + $nodes = array(); + foreach ($tree as $node) { + $this->tree[$ii] = $this->newNode($ii, $node, $this); + $nodes[$ii] = $node; + ++$ii; + } + foreach ($nodes as $node_id => $node) { + if (isset($node[3])) { + $children = $this->buildTree($node[3]); + $previous_child = null; + + foreach ($children as $ii => $child) { + $child->setParentNode($this->tree[$node_id]); + $child->setPreviousSibling($previous_child); + + if ($previous_child) { + $previous_child->setNextSibling($child); + } + + $previous_child = $child; + } + + if ($previous_child) { + $previous_child->setNextSibling($child); + } + + $this->tree[$node_id]->setChildren($children); + } + } + + $result = array(); + foreach ($nodes as $key => $node) { + $result[$key] = $this->tree[$key]; + } + + return $result; + } + + final public function getRawTokenStream() { + return $this->stream; + } + + public function getOffsetToLineNumberMap() { + if ($this->lineMap === null) { + $src = $this->rawSource; + $len = strlen($src); + $lno = 1; + $map = array(); + for ($ii = 0; $ii < $len; ++$ii) { + $map[$ii] = $lno; + if ($src[$ii] == "\n") { + ++$lno; + } + } + $this->lineMap = $map; + } + return $this->lineMap; + } + +} diff --git a/src/parser/argument/PhutilArgumentParser.php b/src/parser/argument/PhutilArgumentParser.php new file mode 100644 index 00000000..c6c34615 --- /dev/null +++ b/src/parser/argument/PhutilArgumentParser.php @@ -0,0 +1,935 @@ +setTagline('make an new dog') + * $args->setSynopsis(<<parse( + * array( + * array( + * 'name' => 'name', + * 'param' => 'dogname', + * 'default' => 'Rover', + * 'help' => 'Set the dog\'s name. By default, the dog will be '. + * 'named "Rover".', + * ), + * array( + * 'name' => 'big', + * 'short' => 'b', + * 'help' => 'If set, create a large dog.', + * ), + * )); + * + * $dog_name = $args->getArg('name'); + * $dog_size = $args->getArg('big') ? 'big' : 'small'; + * + * // ... etc ... + * + * (For detailed documentation on supported keys in argument specifications, + * see @{class:PhutilArgumentSpecification}.) + * + * This will handle argument parsing, and generate appropriate usage help if + * the user provides an unsupported flag. @{class:PhutilArgumentParser} also + * supports some builtin "standard" arguments: + * + * $args->parseStandardArguments(); + * + * See @{method:parseStandardArguments} for details. Notably, this includes + * a "--help" flag, and an "--xprofile" flag for profiling command-line scripts. + * + * Normally, when the parser encounters an unknown flag, it will exit with + * an error. However, you can use @{method:parsePartial} to consume only a + * set of flags: + * + * $args->parsePartial($spec_list); + * + * This allows you to parse some flags before making decisions about other + * parsing, or share some flags across scripts. The builtin standard arguments + * are implemented in this way. + * + * There is also builtin support for "workflows", which allow you to build a + * script that operates in several modes (e.g., by accepting commands like + * `install`, `upgrade`, etc), like `arc` does. For detailed documentation on + * workflows, see @{class:PhutilArgumentWorkflow}. + * + * @task parse Parsing Arguments + * @task read Reading Arguments + * @task help Command Help + * @task internal Internals + */ +final class PhutilArgumentParser extends Phobject { + + private $bin; + private $argv; + private $specs = array(); + private $results = array(); + private $parsed; + + private $tagline; + private $synopsis; + private $workflows; + private $showHelp; + + const PARSE_ERROR_CODE = 77; + + private static $traceModeEnabled = false; + + +/* -( Parsing Arguments )-------------------------------------------------- */ + + + /** + * Build a new parser. Generally, you start a script with: + * + * $args = new PhutilArgumentParser($argv); + * + * @param list Argument vector to parse, generally the $argv global. + * @task parse + */ + public function __construct(array $argv) { + $this->bin = $argv[0]; + $this->argv = array_slice($argv, 1); + } + + + /** + * Parse and consume a list of arguments, removing them from the argument + * vector but leaving unparsed arguments for later consumption. You can + * retrieve unconsumed arguments directly with + * @{method:getUnconsumedArgumentVector}. Doing a partial parse can make it + * easier to share common flags across scripts or workflows. + * + * @param list List of argument specs, see + * @{class:PhutilArgumentSpecification}. + * @param bool Require flags appear before any non-flag arguments. + * @return this + * @task parse + */ + public function parsePartial(array $specs, $initial_only = false) { + return $this->parseInternal($specs, false, $initial_only); + } + + /** + * @return this + */ + private function parseInternal( + array $specs, + $correct_spelling, + $initial_only) { + + $specs = PhutilArgumentSpecification::newSpecsFromList($specs); + $this->mergeSpecs($specs); + + $specs_by_name = mpull($specs, null, 'getName'); + $specs_by_short = mpull($specs, null, 'getShortAlias'); + unset($specs_by_short[null]); + + $argv = $this->argv; + $len = count($argv); + $is_initial = true; + for ($ii = 0; $ii < $len; $ii++) { + $arg = $argv[$ii]; + $map = null; + $options = null; + if (!is_string($arg)) { + // Non-string argument; pass it through as-is. + } else if ($arg == '--') { + // This indicates "end of flags". + break; + } else if ($arg == '-') { + // This is a normal argument (e.g., stdin). + continue; + } else if (!strncmp('--', $arg, 2)) { + $pre = '--'; + $arg = substr($arg, 2); + $map = $specs_by_name; + $options = array_keys($specs_by_name); + } else if (!strncmp('-', $arg, 1) && strlen($arg) > 1) { + $pre = '-'; + $arg = substr($arg, 1); + $map = $specs_by_short; + } else { + $is_initial = false; + } + + if ($map) { + $val = null; + $parts = explode('=', $arg, 2); + if (count($parts) == 2) { + list($arg, $val) = $parts; + } + + // Try to correct flag spelling for full flags, to allow users to make + // minor mistakes. + if ($correct_spelling && $options && !isset($map[$arg])) { + $corrections = PhutilArgumentSpellingCorrector::newFlagCorrector() + ->correctSpelling($arg, $options); + + if (count($corrections) == 1) { + $corrected = head($corrections); + + $this->logMessage( + tsprintf( + "%s\n", + pht( + '(Assuming "%s" is the British spelling of "%s".)', + $pre.$arg, + $pre.$corrected))); + + $arg = $corrected; + } + } + + if (isset($map[$arg])) { + if ($initial_only && !$is_initial) { + throw new PhutilArgumentUsageException( + pht( + 'Argument "%s" appears after the first non-flag argument. '. + 'This special argument must appear before other arguments.', + "{$pre}{$arg}")); + } + + $spec = $map[$arg]; + unset($argv[$ii]); + + $param_name = $spec->getParamName(); + if ($val !== null) { + if ($param_name === null) { + throw new PhutilArgumentUsageException( + pht( + "Argument '%s' does not take a parameter.", + "{$pre}{$arg}")); + } + } else { + if ($param_name !== null) { + if ($ii + 1 < $len) { + $val = $argv[$ii + 1]; + unset($argv[$ii + 1]); + $ii++; + } else { + throw new PhutilArgumentUsageException( + pht( + "Argument '%s' requires a parameter.", + "{$pre}{$arg}")); + } + } else { + $val = true; + } + } + + if (!$spec->getRepeatable()) { + if (array_key_exists($spec->getName(), $this->results)) { + throw new PhutilArgumentUsageException( + pht( + "Argument '%s' was provided twice.", + "{$pre}{$arg}")); + } + } + + $conflicts = $spec->getConflicts(); + foreach ($conflicts as $conflict => $reason) { + if (array_key_exists($conflict, $this->results)) { + + if (!is_string($reason) || !strlen($reason)) { + $reason = '.'; + } else { + $reason = ': '.$reason.'.'; + } + + throw new PhutilArgumentUsageException( + pht( + "Argument '%s' conflicts with argument '%s'%s", + "{$pre}{$arg}", + "--{$conflict}", + $reason)); + } + } + + if ($spec->getRepeatable()) { + if ($spec->getParamName() === null) { + if (empty($this->results[$spec->getName()])) { + $this->results[$spec->getName()] = 0; + } + $this->results[$spec->getName()]++; + } else { + $this->results[$spec->getName()][] = $val; + } + } else { + $this->results[$spec->getName()] = $val; + } + } + } + } + + foreach ($specs as $spec) { + if ($spec->getWildcard()) { + $this->results[$spec->getName()] = $this->filterWildcardArgv($argv); + $argv = array(); + break; + } + } + + $this->argv = array_values($argv); + return $this; + } + + + /** + * Parse and consume a list of arguments, throwing an exception if there is + * anything left unconsumed. This is like @{method:parsePartial}, but raises + * a {class:PhutilArgumentUsageException} if there are leftovers. + * + * Normally, you would call @{method:parse} instead, which emits a + * user-friendly error. You can also use @{method:printUsageException} to + * render the exception in a user-friendly way. + * + * @param list List of argument specs, see + * @{class:PhutilArgumentSpecification}. + * @return this + * @task parse + */ + public function parseFull(array $specs) { + $this->parseInternal($specs, true, false); + + if (count($this->argv)) { + $arg = head($this->argv); + throw new PhutilArgumentUsageException( + pht("Unrecognized argument '%s'.", $arg)); + } + + if ($this->showHelp) { + $this->printHelpAndExit(); + } + + return $this; + } + + + /** + * Parse and consume a list of arguments, raising a user-friendly error if + * anything remains. See also @{method:parseFull} and @{method:parsePartial}. + * + * @param list List of argument specs, see + * @{class:PhutilArgumentSpecification}. + * @return this + * @task parse + */ + public function parse(array $specs) { + try { + return $this->parseFull($specs); + } catch (PhutilArgumentUsageException $ex) { + $this->printUsageException($ex); + exit(self::PARSE_ERROR_CODE); + } + } + + + /** + * Parse and execute workflows, raising a user-friendly error if anything + * remains. See also @{method:parseWorkflowsFull}. + * + * See @{class:PhutilArgumentWorkflow} for details on using workflows. + * + * @param list List of argument specs, see + * @{class:PhutilArgumentSpecification}. + * @return this + * @task parse + */ + public function parseWorkflows(array $workflows) { + try { + return $this->parseWorkflowsFull($workflows); + } catch (PhutilArgumentUsageException $ex) { + $this->printUsageException($ex); + exit(self::PARSE_ERROR_CODE); + } + } + + + /** + * Select a workflow. For commands that may operate in several modes, like + * `arc`, the modes can be split into "workflows". Each workflow specifies + * the arguments it accepts. This method takes a list of workflows, selects + * the chosen workflow, parses its arguments, and either executes it (if it + * is executable) or returns it for handling. + * + * See @{class:PhutilArgumentWorkflow} for details on using workflows. + * + * @param list List of @{class:PhutilArgumentWorkflow}s. + * @return PhutilArgumentWorkflow|no Returns the chosen workflow if it is + * not executable, or executes it and + * exits with a return code if it is. + * @task parse + */ + public function parseWorkflowsFull(array $workflows) { + assert_instances_of($workflows, 'PhutilArgumentWorkflow'); + + // Clear out existing workflows. We need to do this to permit the + // construction of sub-workflows. + $this->workflows = array(); + + foreach ($workflows as $workflow) { + $name = $workflow->getName(); + + if ($name === null) { + throw new PhutilArgumentSpecificationException( + pht('Workflow has no name!')); + } + + if (isset($this->workflows[$name])) { + throw new PhutilArgumentSpecificationException( + pht("Two workflows with name '%s!", $name)); + } + + $this->workflows[$name] = $workflow; + } + + $argv = $this->argv; + if (empty($argv)) { + // TODO: this is kind of hacky / magical. + if (isset($this->workflows['help'])) { + $argv = array('help'); + } else { + throw new PhutilArgumentUsageException(pht('No workflow selected.')); + } + } + + $flow = array_shift($argv); + + if (empty($this->workflows[$flow])) { + $corrected = PhutilArgumentSpellingCorrector::newCommandCorrector() + ->correctSpelling($flow, array_keys($this->workflows)); + + if (count($corrected) == 1) { + $corrected = head($corrected); + + $this->logMessage( + tsprintf( + "%s\n", + pht( + '(Assuming "%s" is the British spelling of "%s".)', + $flow, + $corrected))); + + $flow = $corrected; + } else { + $this->raiseUnknownWorkflow($flow, $corrected); + } + } + + $workflow = $this->workflows[$flow]; + + if ($this->showHelp) { + // Make "cmd flow --help" behave like "cmd help flow", not "cmd help". + $help_flow = idx($this->workflows, 'help'); + if ($help_flow) { + if ($help_flow !== $workflow) { + $workflow = $help_flow; + $argv = array($flow); + + // Prevent parse() from dumping us back out to standard help. + $this->showHelp = false; + } + } else { + $this->printHelpAndExit(); + } + } + + $this->argv = array_values($argv); + + if ($workflow->shouldParsePartial()) { + $this->parsePartial($workflow->getArguments()); + } else { + $this->parse($workflow->getArguments()); + } + + + if ($workflow->isExecutable()) { + $workflow->setArgv($this); + $err = $workflow->execute($this); + exit($err); + } else { + return $workflow; + } + } + + + /** + * Parse "standard" arguments and apply their effects: + * + * --trace Enable service call tracing. + * --no-ansi Disable ANSI color/style sequences. + * --xprofile Write out an XHProf profile. + * --help Show help. + * + * @return this + * + * @phutil-external-symbol function xhprof_enable + */ + public function parseStandardArguments() { + try { + $this->parsePartial( + array( + array( + 'name' => 'trace', + 'help' => pht('Trace command execution and show service calls.'), + 'standard' => true, + ), + array( + 'name' => 'no-ansi', + 'help' => pht( + 'Disable ANSI terminal codes, printing plain text with '. + 'no color or style.'), + 'conflicts' => array( + 'ansi' => null, + ), + 'standard' => true, + ), + array( + 'name' => 'ansi', + 'help' => pht( + "Use formatting even in environments which probably ". + "don't support it."), + 'standard' => true, + ), + array( + 'name' => 'xprofile', + 'param' => 'profile', + 'help' => pht( + 'Profile script execution and write results to a file.'), + 'standard' => true, + ), + array( + 'name' => 'help', + 'short' => 'h', + 'help' => pht('Show this help.'), + 'standard' => true, + ), + array( + 'name' => 'show-standard-options', + 'help' => pht( + 'Show every option, including standard options like this one.'), + 'standard' => true, + ), + array( + 'name' => 'recon', + 'help' => pht('Start in remote console mode.'), + 'standard' => true, + ), + )); + } catch (PhutilArgumentUsageException $ex) { + $this->printUsageException($ex); + exit(self::PARSE_ERROR_CODE); + } + + if ($this->getArg('trace')) { + PhutilServiceProfiler::installEchoListener(); + self::$traceModeEnabled = true; + } + + if ($this->getArg('no-ansi')) { + PhutilConsoleFormatter::disableANSI(true); + } + + if ($this->getArg('ansi')) { + PhutilConsoleFormatter::disableANSI(false); + } + + if ($this->getArg('help')) { + $this->showHelp = true; + } + + $xprofile = $this->getArg('xprofile'); + if ($xprofile) { + if (!function_exists('xhprof_enable')) { + throw new Exception( + pht("To use '%s', you must install XHProf.", '--xprofile')); + } + + xhprof_enable(0); + register_shutdown_function(array($this, 'shutdownProfiler')); + } + + $recon = $this->getArg('recon'); + if ($recon) { + $remote_console = PhutilConsole::newRemoteConsole(); + $remote_console->beginRedirectOut(); + PhutilConsole::setConsole($remote_console); + } else if ($this->getArg('trace')) { + $server = new PhutilConsoleServer(); + $server->setEnableLog(true); + $console = PhutilConsole::newConsoleForServer($server); + PhutilConsole::setConsole($console); + } + + return $this; + } + + +/* -( Reading Arguments )-------------------------------------------------- */ + + + public function getArg($name) { + if (empty($this->specs[$name])) { + throw new PhutilArgumentSpecificationException( + pht("No specification exists for argument '%s'!", $name)); + } + + if (idx($this->results, $name) !== null) { + return $this->results[$name]; + } + + return $this->specs[$name]->getDefault(); + } + + public function getUnconsumedArgumentVector() { + return $this->argv; + } + + public function setUnconsumedArgumentVector(array $argv) { + $this->argv = $argv; + return $this; + } + + +/* -( Command Help )------------------------------------------------------- */ + + + public function setSynopsis($synopsis) { + $this->synopsis = $synopsis; + return $this; + } + + public function setTagline($tagline) { + $this->tagline = $tagline; + return $this; + } + + public function printHelpAndExit() { + echo $this->renderHelp(); + exit(self::PARSE_ERROR_CODE); + } + + public function renderHelp() { + $out = array(); + $more = array(); + + if ($this->bin) { + $out[] = $this->format('**%s**', pht('NAME')); + $name = $this->indent(6, '**%s**', basename($this->bin)); + if ($this->tagline) { + $name .= $this->format(' - '.$this->tagline); + } + $out[] = $name; + $out[] = null; + } + + if ($this->synopsis) { + $out[] = $this->format('**%s**', pht('SYNOPSIS')); + $out[] = $this->indent(6, $this->synopsis); + $out[] = null; + } + + if ($this->workflows) { + $has_help = false; + $out[] = $this->format('**%s**', pht('WORKFLOWS')); + $out[] = null; + $flows = $this->workflows; + ksort($flows); + foreach ($flows as $workflow) { + if ($workflow->getName() == 'help') { + $has_help = true; + } + $out[] = $this->renderWorkflowHelp( + $workflow->getName(), + $show_details = false); + } + if ($has_help) { + $more[] = pht( + 'Use **%s** __command__ for a detailed command reference.', 'help'); + } + } + + $specs = $this->renderArgumentSpecs($this->specs); + if ($specs) { + $out[] = $this->format('**%s**', pht('OPTION REFERENCE')); + $out[] = null; + $out[] = $specs; + } + + // If we have standard options but no --show-standard-options, print out + // a quick hint about it. + if (!empty($this->specs['show-standard-options']) && + !$this->getArg('show-standard-options')) { + $more[] = pht( + 'Use __%s__ to show additional options.', '--show-standard-options'); + } + + $out[] = null; + + if ($more) { + foreach ($more as $hint) { + $out[] = $this->indent(0, $hint); + } + $out[] = null; + } + + return implode("\n", $out); + } + + public function renderWorkflowHelp( + $workflow_name, + $show_details = false) { + + $out = array(); + + $indent = ($show_details ? 0 : 6); + + $workflow = idx($this->workflows, strtolower($workflow_name)); + if (!$workflow) { + $out[] = $this->indent( + $indent, + pht('There is no **%s** workflow.', $workflow_name)); + } else { + $out[] = $this->indent($indent, $workflow->getExamples()); + $out[] = $this->indent($indent, $workflow->getSynopsis()); + if ($show_details) { + $full_help = $workflow->getHelp(); + if ($full_help) { + $out[] = null; + $out[] = $this->indent($indent, $full_help); + } + $specs = $this->renderArgumentSpecs($workflow->getArguments()); + if ($specs) { + $out[] = null; + $out[] = $specs; + } + } + } + + $out[] = null; + + return implode("\n", $out); + } + + public function printUsageException(PhutilArgumentUsageException $ex) { + $message = tsprintf( + "**%s** %B\n", + pht('Usage Exception:'), + $ex->getMessage()); + + $this->logMessage($message); + } + + + private function logMessage($message) { + fwrite(STDERR, $message); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + private function filterWildcardArgv(array $argv) { + foreach ($argv as $key => $value) { + if ($value == '--') { + unset($argv[$key]); + break; + } else if ( + is_string($value) && + !strncmp($value, '-', 1) && + strlen($value) > 1) { + + throw new PhutilArgumentUsageException( + pht( + "Argument '%s' is unrecognized. Use '%s' to indicate ". + "the end of flags.", + $value, + '--')); + } + } + return array_values($argv); + } + + private function mergeSpecs(array $specs) { + + $short_map = mpull($this->specs, null, 'getShortAlias'); + unset($short_map[null]); + + $wildcard = null; + foreach ($this->specs as $spec) { + if ($spec->getWildcard()) { + $wildcard = $spec; + break; + } + } + + foreach ($specs as $spec) { + $spec->validate(); + $name = $spec->getName(); + + if (isset($this->specs[$name])) { + throw new PhutilArgumentSpecificationException( + pht("Two argument specifications have the same name ('%s').", $name)); + } + + $short = $spec->getShortAlias(); + if ($short) { + if (isset($short_map[$short])) { + throw new PhutilArgumentSpecificationException( + pht( + "Two argument specifications have the same short alias ('%s').", + $short)); + } + $short_map[$short] = $spec; + } + + if ($spec->getWildcard()) { + if ($wildcard) { + throw new PhutilArgumentSpecificationException( + pht( + 'Two argument specifications are marked as wildcard arguments. '. + 'You can have a maximum of one wildcard argument.')); + } else { + $wildcard = $spec; + } + } + + $this->specs[$name] = $spec; + } + + foreach ($this->specs as $name => $spec) { + foreach ($spec->getConflicts() as $conflict => $reason) { + if (empty($this->specs[$conflict])) { + throw new PhutilArgumentSpecificationException( + pht( + "Argument '%s' conflicts with unspecified argument '%s'.", + $name, + $conflict)); + } + if ($conflict == $name) { + throw new PhutilArgumentSpecificationException( + pht("Argument '%s' conflicts with itself!", $name)); + } + } + } + + } + + private function renderArgumentSpecs(array $specs) { + foreach ($specs as $key => $spec) { + if ($spec->getWildcard()) { + unset($specs[$key]); + } + } + + $out = array(); + + $no_standard_options = + !empty($this->specs['show-standard-options']) && + !$this->getArg('show-standard-options'); + + $specs = msort($specs, 'getName'); + foreach ($specs as $spec) { + if ($spec->getStandard() && $no_standard_options) { + // If this is a standard argument and the user didn't pass + // --show-standard-options, skip it. + continue; + } + $name = $this->indent(6, '__--%s__', $spec->getName()); + $short = null; + if ($spec->getShortAlias()) { + $short = $this->format(', __-%s__', $spec->getShortAlias()); + } + if ($spec->getParamName()) { + $param = $this->format(' __%s__', $spec->getParamName()); + $name .= $param; + if ($short) { + $short .= $param; + } + } + $out[] = $name.$short; + $out[] = $this->indent(10, $spec->getHelp()); + $out[] = null; + } + + return implode("\n", $out); + } + + private function format($str /* , ... */) { + $args = func_get_args(); + return call_user_func_array( + 'phutil_console_format', + $args); + } + + private function indent($level, $str /* , ... */) { + $args = func_get_args(); + $args = array_slice($args, 1); + $text = call_user_func_array(array($this, 'format'), $args); + return phutil_console_wrap($text, $level); + } + + /** + * @phutil-external-symbol function xhprof_disable + */ + public function shutdownProfiler() { + $data = xhprof_disable(); + $data = json_encode($data); + Filesystem::writeFile($this->getArg('xprofile'), $data); + } + + public static function isTraceModeEnabled() { + return self::$traceModeEnabled; + } + + private function raiseUnknownWorkflow($flow, array $maybe) { + if ($maybe) { + sort($maybe); + + $maybe_list = id(new PhutilConsoleList()) + ->setWrap(false) + ->setBullet(null) + ->addItems($maybe) + ->drawConsoleString(); + + $message = tsprintf( + "%B\n%B", + pht( + 'Invalid command "%s". Did you mean:', + $flow), + $maybe_list); + } else { + $names = mpull($this->workflows, 'getName'); + sort($names); + + $message = tsprintf( + '%B', + pht( + 'Invalid command "%s". Valid commands are: %s.', + $flow, + implode(', ', $names))); + } + + if (isset($this->workflows['help'])) { + $binary = basename($this->bin); + $message = tsprintf( + "%B\n%s", + $message, + pht( + 'For details on available commands, run `%s`.', + "{$binary} help")); + } + + throw new PhutilArgumentUsageException($message); + } + +} diff --git a/src/parser/argument/PhutilArgumentSpecification.php b/src/parser/argument/PhutilArgumentSpecification.php new file mode 100644 index 00000000..71e583b1 --- /dev/null +++ b/src/parser/argument/PhutilArgumentSpecification.php @@ -0,0 +1,268 @@ + 'verbose', + * 'short' => 'v', + * )); + * + * Recognized keys and equivalent verbose methods are: + * + * name setName() + * help setHelp() + * short setShortAlias() + * param setParamName() + * default setDefault() + * conflicts setConflicts() + * wildcard setWildcard() + * repeat setRepeatable() + * + * @param dict Dictionary of quick parameter definitions. + * @return PhutilArgumentSpecification Constructed argument specification. + */ + public static function newQuickSpec(array $spec) { + $recognized_keys = array( + 'name', + 'help', + 'short', + 'param', + 'default', + 'conflicts', + 'wildcard', + 'repeat', + 'standard', + ); + + $unrecognized = array_diff_key( + $spec, + array_fill_keys($recognized_keys, true)); + + foreach ($unrecognized as $key => $ignored) { + throw new PhutilArgumentSpecificationException( + pht( + "Unrecognized key '%s' in argument specification. Recognized keys ". + "are: %s.", + $key, + implode(', ', $recognized_keys))); + } + + $obj = new PhutilArgumentSpecification(); + + foreach ($spec as $key => $value) { + switch ($key) { + case 'name': + $obj->setName($value); + break; + case 'help': + $obj->setHelp($value); + break; + case 'short': + $obj->setShortAlias($value); + break; + case 'param': + $obj->setParamName($value); + break; + case 'default': + $obj->setDefault($value); + break; + case 'conflicts': + $obj->setConflicts($value); + break; + case 'wildcard': + $obj->setWildcard($value); + break; + case 'repeat': + $obj->setRepeatable($value); + break; + case 'standard': + $obj->setStandard($value); + break; + } + } + + $obj->validate(); + + return $obj; + } + + public static function newSpecsFromList(array $specs) { + foreach ($specs as $key => $spec) { + if (is_array($spec)) { + $specs[$key] = self::newQuickSpec( + $spec); + } + } + return $specs; + } + + public function setName($name) { + self::validateName($name); + $this->name = $name; + return $this; + } + + private static function validateName($name) { + if (!preg_match('/^[a-z0-9][a-z0-9-]*$/', $name)) { + throw new PhutilArgumentSpecificationException( + pht( + "Argument names may only contain a-z, 0-9 and -, and must be ". + "at least one character long. '%s' is invalid.", + $name)); + } + } + + public function getName() { + return $this->name; + } + + public function setHelp($help) { + $this->help = $help; + return $this; + } + + public function getHelp() { + return $this->help; + } + + public function setShortAlias($short_alias) { + self::validateShortAlias($short_alias); + $this->shortAlias = $short_alias; + return $this; + } + + private static function validateShortAlias($alias) { + if (strlen($alias) !== 1) { + throw new PhutilArgumentSpecificationException( + pht( + "Argument short aliases must be exactly one character long. ". + "'%s' is invalid.", + $alias)); + } + if (!preg_match('/^[a-zA-Z0-9]$/', $alias)) { + throw new PhutilArgumentSpecificationException( + pht( + "Argument short aliases may only be in a-z, A-Z and 0-9. ". + "'%s' is invalid.", + $alias)); + } + } + + public function getShortAlias() { + return $this->shortAlias; + } + + public function setParamName($param_name) { + $this->paramName = $param_name; + return $this; + } + + public function getParamName() { + return $this->paramName; + } + + public function setDefault($default) { + $this->default = $default; + return $this; + } + + public function getDefault() { + if ($this->getParamName() === null) { + if ($this->getRepeatable()) { + return 0; + } else { + return false; + } + } else { + if ($this->getRepeatable()) { + return array(); + } else { + return $this->default; + } + } + } + + public function setConflicts(array $conflicts) { + $this->conflicts = $conflicts; + return $this; + } + + public function getConflicts() { + return $this->conflicts; + } + + public function setWildcard($wildcard) { + $this->wildcard = $wildcard; + return $this; + } + + public function getWildcard() { + return $this->wildcard; + } + + public function setRepeatable($repeatable) { + $this->repeatable = $repeatable; + return $this; + } + + public function getRepeatable() { + return $this->repeatable; + } + + public function setStandard($standard) { + $this->standard = $standard; + return $this; + } + + public function getStandard() { + return $this->standard; + } + + public function validate() { + if ($this->name === null) { + throw new PhutilArgumentSpecificationException( + pht("Argument specification MUST have a 'name'.")); + } + + if ($this->getWildcard()) { + if ($this->getParamName()) { + throw new PhutilArgumentSpecificationException( + pht('Wildcard arguments may not specify a parameter.')); + } + if ($this->getRepeatable()) { + throw new PhutilArgumentSpecificationException( + pht('Wildcard arguments may not be repeatable.')); + } + } + + if ($this->default !== null) { + if ($this->getRepeatable()) { + throw new PhutilArgumentSpecificationException( + pht( + 'Repeatable arguments may not have a default (always array() for '. + 'arguments which accept a parameter, or 0 for arguments which do '. + 'not).')); + } else if ($this->getParamName() === null) { + throw new PhutilArgumentSpecificationException( + pht('Flag arguments may not have a default (always false).')); + } + } + } + +} diff --git a/src/parser/argument/PhutilArgumentSpellingCorrector.php b/src/parser/argument/PhutilArgumentSpellingCorrector.php new file mode 100644 index 00000000..dd999123 --- /dev/null +++ b/src/parser/argument/PhutilArgumentSpellingCorrector.php @@ -0,0 +1,155 @@ +setInsertCost(4) + ->setDeleteCost(4) + ->setReplaceCost(3) + ->setTransposeCost(2); + + return id(new self()) + ->setEditDistanceMatrix($matrix) + ->setMode(self::MODE_COMMANDS) + ->setMaximumDistance($max_distance); + } + + + /** + * Build a new corrector with parameters for correcting flags, like + * fixing "--nolint" into "--no-lint". + * + * @return PhutilArgumentSpellingCorrector Configured corrector. + */ + public static function newFlagCorrector() { + // When correcting flag spelling, we're stricter than we are when + // correcting command spelling: we allow only one inserted or deleted + // character. It is mainly to handle cases like "--no-lint" versus + // "--nolint" or "--reviewer" versus "--reviewers". + $max_distance = 1; + + $matrix = id(new PhutilEditDistanceMatrix()) + ->setInsertCost(1) + ->setDeleteCost(1) + ->setReplaceCost(10); + + return id(new self()) + ->setEditDistanceMatrix($matrix) + ->setMode(self::MODE_FLAGS) + ->setMaximumDistance($max_distance); + } + + public function setMode($mode) { + $this->mode = $mode; + return $this; + } + + public function getMode() { + return $this->mode; + } + + public function setEditDistanceMatrix(PhutilEditDistanceMatrix $matrix) { + $this->editDistanceMatrix = $matrix; + return $this; + } + + public function getEditDistanceMatrix() { + return $this->editDistanceMatrix; + } + + public function setMaximumDistance($maximum_distance) { + $this->maximumDistance = $maximum_distance; + return $this; + } + + public function getMaximumDistance() { + return $this->maximumDistance; + } + + public function correctSpelling($input, array $options) { + $matrix = $this->getEditDistanceMatrix(); + if (!$matrix) { + throw new PhutilInvalidStateException('setEditDistanceMatrix'); + } + + $max_distance = $this->getMaximumDistance(); + if (!$max_distance) { + throw new PhutilInvalidStateException('setMaximumDistance'); + } + + // If we're correcting commands, never correct an input which begins + // with "-", since this is almost certainly intended to be a flag. + if ($this->getMode() === self::MODE_COMMANDS) { + if (preg_match('/^-/', $input)) { + return array(); + } + } + + $input = $this->normalizeString($input); + foreach ($options as $key => $option) { + $options[$key] = $this->normalizeString($option); + } + + $distances = array(); + $inputv = phutil_utf8v($input); + foreach ($options as $option) { + $optionv = phutil_utf8v($option); + $matrix->setSequences($optionv, $inputv); + $distances[$option] = $matrix->getEditDistance(); + } + + asort($distances); + $best = min($max_distance, head($distances)); + foreach ($distances as $option => $distance) { + if ($distance > $best) { + unset($distances[$option]); + } + } + + // Before filtering, check if we have multiple equidistant matches and + // return them if we do. This prevents us from, e.g., matching "alnd" with + // both "land" and "amend", then dropping "land" for being too short, and + // incorrectly completing to "amend". + if (count($distances) > 1) { + return array_keys($distances); + } + + foreach ($distances as $option => $distance) { + if (phutil_utf8_strlen($option) < $distance) { + unset($distances[$option]); + } + } + + return array_keys($distances); + } + + private function normalizeString($string) { + return phutil_utf8_strtolower($string); + } + +} diff --git a/src/parser/argument/__tests__/PhutilArgumentParserTestCase.php b/src/parser/argument/__tests__/PhutilArgumentParserTestCase.php new file mode 100644 index 00000000..5d722f29 --- /dev/null +++ b/src/parser/argument/__tests__/PhutilArgumentParserTestCase.php @@ -0,0 +1,426 @@ + 'flag', + ), + ); + + $args = new PhutilArgumentParser(array('bin')); + $args->parseFull($specs); + $this->assertEqual(false, $args->getArg('flag')); + + $args = new PhutilArgumentParser(array('bin', '--flag')); + $args->parseFull($specs); + $this->assertEqual(true, $args->getArg('flag')); + } + + public function testWildcards() { + $specs = array( + array( + 'name' => 'flag', + ), + array( + 'name' => 'files', + 'wildcard' => true, + ), + ); + + $args = new PhutilArgumentParser(array('bin', '--flag', 'a', 'b')); + $args->parseFull($specs); + $this->assertEqual(true, $args->getArg('flag')); + $this->assertEqual( + array('a', 'b'), + $args->getArg('files')); + + $caught = null; + try { + $args = new PhutilArgumentParser(array('bin', '--derp', 'a', 'b')); + $args->parseFull($specs); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + + $args = new PhutilArgumentParser(array('bin', '--', '--derp', 'a', 'b')); + $args->parseFull($specs); + $this->assertEqual( + array('--derp', 'a', 'b'), + $args->getArg('files')); + } + + public function testPartialParse() { + $specs = array( + array( + 'name' => 'flag', + ), + ); + + $args = new PhutilArgumentParser(array('bin', 'a', '--flag', '--', 'b')); + $args->parsePartial($specs); + + $this->assertEqual( + array('a', '--', 'b'), + $args->getUnconsumedArgumentVector()); + } + + public function testBadArg() { + $args = new PhutilArgumentParser(array('bin')); + $args->parseFull(array()); + + $caught = null; + try { + $args->getArg('flag'); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicateNames() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'x', + ), + array( + 'name' => 'x', + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicateNamesWithParsePartial() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parsePartial( + array( + array( + 'name' => 'x', + ), + )); + $args->parsePartial( + array( + array( + 'name' => 'x', + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicateShortAliases() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'x', + 'short' => 'x', + ), + array( + 'name' => 'y', + 'short' => 'x', + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicateWildcards() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'x', + 'wildcard' => true, + ), + array( + 'name' => 'y', + 'wildcard' => true, + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicatePartialWildcards() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parsePartial( + array( + array( + 'name' => 'x', + 'wildcard' => true, + ), + )); + $args->parsePartial( + array( + array( + 'name' => 'y', + 'wildcard' => true, + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testConflictSpecificationWithUnrecognizedArg() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'x', + 'conflicts' => array( + 'y' => true, + ), + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testConflictSpecificationWithSelf() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'x', + 'conflicts' => array( + 'x' => true, + ), + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testUnrecognizedFlag() { + $args = new PhutilArgumentParser(array('bin', '--flag')); + $caught = null; + try { + $args->parseFull(array()); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicateFlag() { + $args = new PhutilArgumentParser(array('bin', '--flag', '--flag')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'flag', + ), + )); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testMissingParameterValue() { + $args = new PhutilArgumentParser(array('bin', '--with')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'with', + 'param' => 'stuff', + ), + )); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testExtraParameterValue() { + $args = new PhutilArgumentParser(array('bin', '--true=apple')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'true', + ), + )); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testConflictParameterValue() { + $args = new PhutilArgumentParser(array('bin', '--true', '--false')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'true', + 'conflicts' => array( + 'false' => true, + ), + ), + array( + 'name' => 'false', + 'conflicts' => array( + 'true' => true, + ), + ), + )); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testParameterValues() { + $specs = array( + array( + 'name' => 'a', + 'param' => 'value', + ), + array( + 'name' => 'b', + 'param' => 'value', + ), + array( + 'name' => 'cee', + 'short' => 'c', + 'param' => 'value', + ), + array( + 'name' => 'dee', + 'short' => 'd', + 'param' => 'value', + ), + ); + + $args = new PhutilArgumentParser( + array( + 'bin', + '--a', + 'a', + '--b=b', + '-c', + 'c', + '-d=d', + )); + $args->parseFull($specs); + + $this->assertEqual('a', $args->getArg('a')); + $this->assertEqual('b', $args->getArg('b')); + $this->assertEqual('c', $args->getArg('cee')); + $this->assertEqual('d', $args->getArg('dee')); + } + + public function testStdinValidParameter() { + $specs = array( + array( + 'name' => 'file', + 'param' => 'file', + ), + ); + + $args = new PhutilArgumentParser( + array( + 'bin', + '-', + '--file', + '-', + )); + $args->parsePartial($specs); + + $this->assertEqual('-', $args->getArg('file')); + } + + public function testRepeatableFlag() { + $specs = array( + array( + 'name' => 'verbose', + 'short' => 'v', + 'repeat' => true, + ), + ); + + $args = new PhutilArgumentParser(array('bin', '-v', '-v', '-v')); + $args->parseFull($specs); + + $this->assertEqual(3, $args->getArg('verbose')); + } + + public function testRepeatableParam() { + $specs = array( + array( + 'name' => 'eat', + 'param' => 'fruit', + 'repeat' => true, + ), + ); + + $args = new PhutilArgumentParser(array( + 'bin', + '--eat', + 'apple', + '--eat', + 'pear', + '--eat=orange', + )); + $args->parseFull($specs); + + $this->assertEqual( + array('apple', 'pear', 'orange'), + $args->getArg('eat')); + } + +} diff --git a/src/parser/argument/__tests__/PhutilArgumentSpecificationTestCase.php b/src/parser/argument/__tests__/PhutilArgumentSpecificationTestCase.php new file mode 100644 index 00000000..f49ad365 --- /dev/null +++ b/src/parser/argument/__tests__/PhutilArgumentSpecificationTestCase.php @@ -0,0 +1,142 @@ + true, + 'xx' => true, + '!' => false, + 'XX' => false, + '1=' => false, + '--' => false, + + 'no-stuff' => true, + '-stuff' => false, + ); + + foreach ($names as $name => $valid) { + $caught = null; + try { + PhutilArgumentSpecification::newQuickSpec( + array( + 'name' => $name, + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + $this->assertEqual( + !$valid, + $caught instanceof Exception, + pht("Argument name '%s'.", $name)); + } + } + + public function testAliases() { + $aliases = array( + 'a' => true, + '1' => true, + + 'no' => false, + '-' => false, + '_' => false, + ' ' => false, + '' => false, + ); + + foreach ($aliases as $alias => $valid) { + $caught = null; + try { + PhutilArgumentSpecification::newQuickSpec( + array( + 'name' => 'example', + 'short' => $alias, + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + $this->assertEqual( + !$valid, + $caught instanceof Exception, + pht("Arg alias '%s'.", $alias)); + } + } + + public function testSpecs() { + $good_specs = array( + array( + 'name' => 'verbose', + ), + array( + 'name' => 'verbose', + 'short' => 'v', + 'help' => 'Derp.', + 'param' => 'level', + 'default' => 'y', + 'conflicts' => array( + 'quiet' => true, + ), + 'wildcard' => false, + ), + array( + 'name' => 'files', + 'wildcard' => true, + ), + ); + + $bad_specs = array( + array( + ), + array( + 'alias' => 'v', + ), + array( + 'name' => 'derp', + 'fruit' => 'apple', + ), + array( + 'name' => 'x', + 'default' => 'y', + ), + array( + 'name' => 'x', + 'param' => 'y', + 'default' => 'z', + 'repeat' => true, + ), + array( + 'name' => 'x', + 'wildcard' => true, + 'repeat' => true, + ), + array( + 'name' => 'x', + 'param' => 'y', + 'wildcard' => true, + ), + + ); + + $cases = array( + array(true, $good_specs), + array(false, $bad_specs), + ); + + foreach ($cases as $case) { + list($expect, $specs) = $case; + foreach ($specs as $spec) { + $caught = null; + try { + PhutilArgumentSpecification::newQuickSpec($spec); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + $this->assertEqual( + !$expect, + $caught instanceof Exception, + pht('Spec validity for: %s', print_r($spec, true))); + } + } + } + +} diff --git a/src/parser/argument/__tests__/PhutilArgumentSpellingCorrectorTestCase.php b/src/parser/argument/__tests__/PhutilArgumentSpellingCorrectorTestCase.php new file mode 100644 index 00000000..ce0e23ec --- /dev/null +++ b/src/parser/argument/__tests__/PhutilArgumentSpellingCorrectorTestCase.php @@ -0,0 +1,94 @@ +assertCommandCorrection( + array('land'), + 'alnd', + array('land', 'amend')); + + $this->assertCommandCorrection( + array('branch'), + 'brnach', + array('branch', 'browse')); + + $this->assertCommandCorrection( + array(), + 'test', + array('list', 'unit')); + + $this->assertCommandCorrection( + array('list'), + 'lists', + array('list')); + + $this->assertCommandCorrection( + array('diff'), + 'dfif', + array('diff')); + + $this->assertCommandCorrection( + array('unit'), + 'uint', + array('unit', 'lint', 'list')); + + $this->assertCommandCorrection( + array('list', 'lint'), + 'nilt', + array('unit', 'lint', 'list')); + } + + private function assertCommandCorrection($expect, $input, $commands) { + $result = PhutilArgumentSpellingCorrector::newCommandCorrector() + ->correctSpelling($input, $commands); + + sort($result); + sort($expect); + + $commands = implode(', ', $commands); + + $this->assertEqual( + $expect, + $result, + pht('Correction of %s against: %s', $input, $commands)); + } + + public function testFlagCorrection() { + $this->assertFlagCorrection( + array('nolint'), + 'no-lint', + array('nolint', 'nounit')); + + $this->assertFlagCorrection( + array('reviewers'), + 'reviewer', + array('reviewers', 'cc')); + + $this->assertFlagCorrection( + array(), + 'onlint', + array('nolint')); + + $this->assertFlagCorrection( + array(), + 'nolind', + array('nolint')); + } + + private function assertFlagCorrection($expect, $input, $flags) { + $result = PhutilArgumentSpellingCorrector::newFlagCorrector() + ->correctSpelling($input, $flags); + + sort($result); + sort($expect); + + $flags = implode(', ', $flags); + + $this->assertEqual( + $expect, + $result, + pht('Correction of %s against: %s', $input, $flags)); + } + +} diff --git a/src/parser/argument/exception/PhutilArgumentParserException.php b/src/parser/argument/exception/PhutilArgumentParserException.php new file mode 100644 index 00000000..9927a577 --- /dev/null +++ b/src/parser/argument/exception/PhutilArgumentParserException.php @@ -0,0 +1,3 @@ +setTagline('simple calculator example'); + * $args->setSynopsis(<<setName('add') + * ->setExamples('**add** __n__ ...') + * ->setSynopsis('Compute the sum of a list of numbers.') + * ->setArguments( + * array( + * array( + * 'name' => 'numbers', + * 'wildcard' => true, + * ), + * )); + * + * $mul_workflow = id(new PhutilArgumentWorkflow()) + * ->setName('mul') + * ->setExamples('**mul** __n__ ...') + * ->setSynopsis('Compute the product of a list of numbers.') + * ->setArguments( + * array( + * array( + * 'name' => 'numbers', + * 'wildcard' => true, + * ), + * )); + * + * $flow = $args->parseWorkflows( + * array( + * $add_workflow, + * $mul_workflow, + * new PhutilHelpArgumentWorkflow(), + * )); + * + * $nums = $args->getArg('numbers'); + * if (empty($nums)) { + * echo "You must provide one or more numbers!\n"; + * exit(1); + * } + * + * foreach ($nums as $num) { + * if (!is_numeric($num)) { + * echo "Number '{$num}' is not numeric!\n"; + * exit(1); + * } + * } + * + * switch ($flow->getName()) { + * case 'add': + * echo array_sum($nums)."\n"; + * break; + * case 'mul': + * echo array_product($nums)."\n"; + * break; + * } + * + * You can also subclass this class and return `true` from + * @{method:isExecutable}. In this case, the parser will automatically select + * your workflow when the user invokes it. + * + * @concrete-extensible + */ +class PhutilArgumentWorkflow extends Phobject { + + private $name; + private $synopsis; + private $specs = array(); + private $examples; + private $help; + private $argv; + + final public function __construct() { + $this->didConstruct(); + } + + public function setName($name) { + $this->name = $name; + return $this; + } + + public function getName() { + return $this->name; + } + + /** + * Provide brief usage examples of common calling conventions, like: + * + * $workflow->setExamples("**delete** __file__ [__options__]"); + * + * This text is shown in both brief and detailed help, and should give the + * user a quick reference for common uses. You can separate several common + * uses with newlines, but usually should not provide more than 2-3 examples. + */ + final public function setExamples($examples) { + $this->examples = $examples; + return $this; + } + + final public function getExamples() { + if (!$this->examples) { + return '**'.$this->name.'**'; + } + return $this->examples; + } + + /** + * Provide a brief description of the command, like "Delete a file.". + * + * This text is shown in both brief and detailed help, and should give the + * user a general idea of what the workflow does. + */ + final public function setSynopsis($synopsis) { + $this->synopsis = $synopsis; + return $this; + } + + final public function getSynopsis() { + return $this->synopsis; + } + + + /** + * Provide a full explanation of the command. This text is shown only in + * detailed help. + */ + final public function getHelp() { + return $this->help; + } + + final public function setHelp($help) { + $this->help = $help; + return $this; + } + + final public function setArguments(array $specs) { + $specs = PhutilArgumentSpecification::newSpecsFromList($specs); + $this->specs = $specs; + return $this; + } + + final public function getArguments() { + return $this->specs; + } + + final public function setArgv(PhutilArgumentParser $argv) { + $this->argv = $argv; + return $this; + } + + final public function getArgv() { + return $this->argv; + } + + protected function didConstruct() { + return null; + } + + public function isExecutable() { + return false; + } + + public function execute(PhutilArgumentParser $args) { + throw new Exception(pht("This workflow isn't executable!")); + } + + /** + * Normally, workflow arguments are parsed fully, so unexpected arguments will + * raise an error. You can return `true` from this method to parse workflow + * arguments only partially. This will allow you to manually parse remaining + * arguments or delegate to a second level of workflows. + * + * @return bool True to partially parse workflow arguments (default false). + */ + public function shouldParsePartial() { + return false; + } + +} diff --git a/src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php b/src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php new file mode 100644 index 00000000..d464e1cf --- /dev/null +++ b/src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php @@ -0,0 +1,45 @@ +setName('help'); + $this->setExamples(<<setSynopsis(<<setArguments( + array( + array( + 'name' => 'help-with-what', + 'wildcard' => true, + ), + )); + } + + public function isExecutable() { + return true; + } + + public function execute(PhutilArgumentParser $args) { + $with = $args->getArg('help-with-what'); + + if (!$with) { + $args->printHelpAndExit(); + } else { + foreach ($with as $thing) { + echo phutil_console_format( + "**%s**\n\n", + pht('%s WORKFLOW', strtoupper($thing))); + echo $args->renderWorkflowHelp($thing, $show_flags = true); + echo "\n"; + } + exit(PhutilArgumentParser::PARSE_ERROR_CODE); + } + } + +} diff --git a/src/parser/exception/PhutilINIParserException.php b/src/parser/exception/PhutilINIParserException.php new file mode 100644 index 00000000..22a4c8ac --- /dev/null +++ b/src/parser/exception/PhutilINIParserException.php @@ -0,0 +1,3 @@ +sourceLine = $line; + $this->sourceChar = $char; + $this->sourceToken = $token; + $this->expected = $expected; + + parent::__construct( + pht('Parse error on line %d at column %d: %s', $line, $char, $message)); + } + + public function getSourceLine() { + return $this->sourceLine; + } + + public function getSourceChar() { + return $this->sourceChar; + } + + public function getSourceToken() { + return $this->sourceToken; + } + + public function getExpectedTokens() { + return $this->expected; + } + +} diff --git a/src/parser/exception/PhutilTypeCheckException.php b/src/parser/exception/PhutilTypeCheckException.php new file mode 100644 index 00000000..b23494b7 --- /dev/null +++ b/src/parser/exception/PhutilTypeCheckException.php @@ -0,0 +1,40 @@ +getType() == 'regex') { + if (is_string($value)) { + $message = pht( + "Expected a regular expression, but '%s' is not valid: %s", + $value, + $err); + } else { + $message = pht( + 'Expected a regular expression, but value is not valid: %s', + $err); + } + } else { + $message = pht( + "Expected type '%s', got type '%s'.", + $type->toString(), + PhutilTypeSpec::getTypeOf($value)); + } + + parent::__construct($invalid.' '.$message); + } + +} diff --git a/src/parser/exception/PhutilTypeExtraParametersException.php b/src/parser/exception/PhutilTypeExtraParametersException.php new file mode 100644 index 00000000..c37b1da0 --- /dev/null +++ b/src/parser/exception/PhutilTypeExtraParametersException.php @@ -0,0 +1,21 @@ +parameters; + } + + public function __construct(array $extra) { + $message = pht( + 'Got unexpected parameters: %s', + implode(', ', array_keys($extra))); + + parent::__construct($message); + + $this->parameters = $extra; + } + +} diff --git a/src/parser/exception/PhutilTypeMissingParametersException.php b/src/parser/exception/PhutilTypeMissingParametersException.php new file mode 100644 index 00000000..c37a9a71 --- /dev/null +++ b/src/parser/exception/PhutilTypeMissingParametersException.php @@ -0,0 +1,21 @@ +parameters; + } + + public function __construct(array $missing) { + $message = pht( + 'Missing required parameters: %s', + implode(', ', $missing)); + + parent::__construct($message); + + $this->parameters = $missing; + } + +} diff --git a/src/parser/generator/exception/PhutilInvalidRuleParserGeneratorException.php b/src/parser/generator/exception/PhutilInvalidRuleParserGeneratorException.php new file mode 100644 index 00000000..74f86c24 --- /dev/null +++ b/src/parser/generator/exception/PhutilInvalidRuleParserGeneratorException.php @@ -0,0 +1,4 @@ +content = $content; + return $this; + } + + public function getContent() { + return $this->content; + } + + public function isContentNode() { + return ($this->content !== null); + } + + public function setTagName($tag_name) { + $this->tagName = $tag_name; + return $this; + } + + public function getTagName() { + return $this->tagName; + } + + public function appendChild(PhutilDOMNode $node) { + $node->parentNode = $this; + $this->children[] = $node; + return $this; + } + + public function getChildren() { + return $this->children; + } + + public function getParentNode() { + return $this->parentNode; + } + + public function setAttributes(array $attributes) { + $this->attributes = $attributes; + return $this; + } + + public function getAttributes() { + return $this->attributes; + } + + public function setRawHead($raw_string) { + $this->rawHead = $raw_string; + return $this; + } + + public function setRawTail($raw_tail) { + $this->rawTail = $raw_tail; + return $this; + } + + public function newRawString() { + $raw = array(); + $raw[] = $this->rawHead; + + foreach ($this->getChildren() as $child) { + $raw[] = $child->newRawString(); + } + + $raw[] = $this->rawTail; + + return implode('', $raw); + } + + public function toDictionary() { + if ($this->isContentNode()) { + return array( + 'content' => $this->content, + ); + } else { + $children = array(); + + foreach ($this->getChildren() as $child) { + $children[] = $child->toDictionary(); + } + + return array( + 'tag' => $this->getTagName(), + 'attributes' => $this->getAttributes(), + 'children' => $children, + ); + } + } + + /** + * Get a list of the children of a given DOM node, treating unexpected + * tags as if they were raw content. + */ + public function selectChildrenWithTags(array $tag_list) { + $tag_map = array_fuse($tag_list); + + $nodes = array(); + foreach ($this->getChildren() as $child) { + // If this is already a content node, just keep it as-is. + if ($child->isContentNode()) { + $nodes[] = $child; + continue; + } + + $tag_name = $child->getTagName(); + + // If this is a tag that we're allowing, keep it as-is. + if (isset($tag_map[$tag_name])) { + $nodes[] = $child; + continue; + } + + // Otherwise, this is some other tag. Convert it into a content + // node. + + $raw_string = $child->newRawString(); + + $nodes[] = id(new self()) + ->setContent($raw_string) + ->setRawHead($raw_string); + } + + return $this->mergeContentNodes($nodes); + } + + public function newRawContentString() { + $content_node = $this->selectChildrenWithTags(array()); + + if (!$content_node) { + return ''; + } + + return head($content_node)->newRawString(); + } + + public function mergeContent() { + $this->children = $this->mergeContentNodes($this->children); + + foreach ($this->getChildren() as $child) { + $child->parentNode = $this; + $child->mergeContent(); + } + + return $this; + } + + /** + * Given a list of nodes, combine sequences of multiple adjacent content + * nodes into single nodes. + */ + private function mergeContentNodes(array $nodes) { + $list = array(); + $content_block = array(); + foreach ($nodes as $node) { + if ($node->isContentNode()) { + $content_block[] = $node; + continue; + } + + $list[] = $content_block; + $content_block = array(); + + $list[] = $node; + } + + $list[] = $content_block; + + $results = array(); + foreach ($list as $item) { + if (!is_array($item)) { + $results[] = $item; + continue; + } + + if (!$item) { + continue; + } + + $parts = array(); + foreach ($item as $content_node) { + $parts[] = $content_node->newRawString(); + } + $parts = implode('', $parts); + + if (!strlen($parts)) { + continue; + } + + $results[] = id(new self()) + ->setContent($parts) + ->setRawHead($parts); + } + + return $results; + } + +} diff --git a/src/parser/html/PhutilHTMLParser.php b/src/parser/html/PhutilHTMLParser.php new file mode 100644 index 00000000..66e82a55 --- /dev/null +++ b/src/parser/html/PhutilHTMLParser.php @@ -0,0 +1,434 @@ +"). Non-tag + // content is anything else. + + $segment_pos = 0; + $segments = array(); + $in_tag = false; + + for ($ii = 0; $ii < strlen($corpus); $ii++) { + $c = $corpus[$ii]; + + if ($in_tag && ($c === '>')) { + if ($segment_pos !== null) { + $segments[] = array( + 'tag' => $in_tag, + 'pos' => $segment_pos, + 'end' => $ii + 1, + ); + } + + $segment_pos = $ii + 1; + $in_tag = false; + continue; + } + + // When we encounter a "<", we start a new tag whether we're already in + // a tag or not. We want to parse "1 < 2" as a single tag with + // the content "1 < 2". + + if ($c === '<') { + $segments[] = array( + 'tag' => false, + 'pos' => $segment_pos, + 'end' => $ii, + ); + + $segment_pos = $ii; + $in_tag = true; + continue; + } + } + + // Add whatever content was left at the end of the string. If we were in + // a tag but did not find a closing ">", we treat this as normal content. + $segments[] = array( + 'tag' => false, + 'pos' => $segment_pos, + 'end' => $ii, + ); + + // Slice the marked segments out of the raw corpus so we get a list of + // "tag" strings and a list of "non-tag" strings. + + $parts = array(); + $corpus_length = strlen($corpus); + foreach ($segments as $segment) { + $tag = $segment['tag']; + $pos = $segment['pos']; + $len = $segment['end'] - $pos; + + // If this is a tag, we'll drop the "<" at the beginning and the ">" + // at the end here. + if ($tag) { + $slice_pos = $pos + 1; + $slice_len = $len - 2; + } else { + $slice_pos = $pos; + $slice_len = $len; + } + + if (($slice_pos < $corpus_length) && ($slice_len > 0)) { + $content = substr($corpus, $slice_pos, $slice_len); + } else { + $content = ''; + } + + $parts[] = array( + 'tag' => $tag, + 'pos' => $pos, + 'len' => $len, + 'content' => $content, + ); + } + + $root = new PhutilDOMNode(); + $this->setCursor($root); + + foreach ($parts as $part) { + $tag = $this->newTagDOMNode($part); + + if ($tag !== null) { + continue; + } + + $content = $part['content']; + + // If this part is a tag, restore the angle brackets. + if ($part['tag']) { + $content = '<'.$content.'>'; + } + + $node = id(new PhutilDOMNode()) + ->setContent($content) + ->setRawHead($content); + + $this->getCursor()->appendChild($node); + } + + $root->mergeContent(); + + return $root; + } + + private function newTagDOMNode(array $part) { + if (!$part['tag']) { + return null; + } + + $raw_content = $part['content']; + $content = $raw_content; + + $content = trim($content); + $content_len = strlen($content); + + // If the tag content begins with "/", like "", strip the slash + // off and mark this as a closing tag. + $is_close = false; + if ($content_len > 0 && $content[0] === '/') { + $is_close = true; + $content = substr($content, 1); + $content = trim($content); + $content_len = strlen($content); + } + + // If the tag content ends with "/", like "", strip the slash off + // and mark this as self-closing. + $self_close = false; + if ($content_len > 0 && $content[$content_len - 1] === '/') { + $self_close = true; + $content = substr($content, 0, $content_len - 1); + $content = trim($content); + $content_len = strlen($content); + } + + // If this tag is both a closing tag and a self-closing tag, it is + // not formatted correctly. Treat it as content. + if ($self_close && $is_close) { + return null; + } + + // Now, split the rest of the tag into the tag name and tag attributes. + $pieces = preg_split('/\s+/', $content, 2); + $tag_name = $pieces[0]; + + if (count($pieces) > 1) { + $attributes = $pieces[1]; + } else { + $attributes = ''; + } + + // If there's no tag name, this tag is not valid. Treat it as content. + if (!strlen($tag_name)) { + return null; + } + + // If this is a closing tag with attributes, it's not valid. Treat it + // as content. + if ($is_close && strlen($attributes)) { + return null; + } + + $tag_name = phutil_utf8_strtolower($tag_name); + + // If we find a valid closing tag, try to find a matching tag on the stack. + // If we find a matching tag, close it. + // If we do not find a matching tag, treat the closing tag as content. + if ($is_close) { + $cursor = $this->getCursor(); + + while ($cursor) { + if ($cursor->getTagName() === $tag_name) { + // Add this raw content to the raw content of the tag we're closing. + $cursor->setRawTail('<'.$raw_content.'>'); + + $parent = $cursor->getParentNode(); + $this->setCursor($parent); + + return true; + } + $cursor = $cursor->getParentNode(); + } + + return null; + } + + if (strlen($attributes)) { + $attribute_map = $this->parseAttributes($attributes); + // If the attributes can't be parsed, treat the tag as content. + if ($attribute_map === null) { + return null; + } + } else { + $attribute_map = array(); + } + + $node = id(new PhutilDOMNode()) + ->setTagName($tag_name) + ->setAttributes($attribute_map) + ->setRawHead('<'.$raw_content.'>'); + + $cursor = $this->getCursor(); + $cursor->appendChild($node); + + if (!$self_close) { + $this->setCursor($node); + } + + return $node; + } + + private function setCursor(PhutilDOMNode $cursor) { + $this->cursor = $cursor; + return $this; + } + + private function getCursor() { + return $this->cursor; + } + + private function parseAttributes($attributes) { + $state = 'key'; + + $whitespace = array( + ' ' => true, + "\n" => true, + "\t" => true, + "\r" => true, + ); + + $map = array(); + $len = strlen($attributes); + $key_pos = null; + for ($ii = 0; $ii < $len; $ii++) { + $c = $attributes[$ii]; + $is_space = isset($whitespace[$c]); + + switch ($state) { + case 'key': + // We're looking for the start of an attribute name. + + // Skip over any whitespace. + if ($is_space) { + break; + } + + // If we see "". + if (isset($map[$name_value])) { + return null; + } + } + + // If we find an "=", that's the end of the name. Next, we're going + // to parse a value. + if ($c === '=') { + $state = 'value'; + break; + } + + // If we find whitespace, that's the end of the name. We're going + // to look for an "=". + if ($is_space) { + $state = 'equals'; + break; + } + + break; + case 'equals': + // We've parsed the name of an attribute and are looking for an + // "=" character. + + // Skip over any whitespace. + if ($is_space) { + break; + } + + // This is the "=" we're looking for, so we're good to go. + if ($c === '=') { + $state = 'value'; + break; + } + + // If this is anything else, this is an attribute name with no + // value. Treat it as "true" and move on. This corresponds to an + // input like "". + $map[$name_value] = true; + $name_pos = $ii; + $state = 'name'; + break; + case 'value': + // We've parsed an "=" and are looking for the start of a value. + + // Skip over any whitespace. + if ($is_space) { + break; + } + + // Don't accept "parseDocument($input); + + // We're just testing the child list of the root node since this + // reduces the amount of boilerplate in the test cases. + $list = array(); + foreach ($document->getChildren() as $child) { + $list[] = $child->toDictionary(); + } + + $this->assertEqual( + $expect, + $list, + pht('DOM tree for "%s".', $test)); + } + } + + public function testSelectChildrenWithTags() { + $input = 'x'; + $document = id(new PhutilHTMLParser()) + ->parseDocument($input); + + $children = $document->selectChildrenWithTags(array('a')); + + $list = array(); + foreach ($children as $child) { + $list[] = $child->toDictionary(); + } + + $this->assertEqual( + array( + array( + 'tag' => 'a', + 'attributes' => array(), + 'children' => array(), + ), + array( + 'content' => '', + ), + array( + 'tag' => 'a', + 'attributes' => array(), + 'children' => array(), + ), + array( + 'content' => '', + ), + array( + 'tag' => 'a', + 'attributes' => array(), + 'children' => array(), + ), + array( + 'content' => '', + ), + array( + 'tag' => 'a', + 'attributes' => array(), + 'children' => array(), + ), + array( + 'content' => 'x', + ), + array( + 'tag' => 'a', + 'attributes' => array(), + 'children' => array(), + ), + array( + 'content' => '', + ), + ), + $list, + pht('Child selection of: %s.', $input)); + } + +} diff --git a/src/parser/html/__tests__/data/attributes-basic.txt b/src/parser/html/__tests__/data/attributes-basic.txt new file mode 100644 index 00000000..040647da --- /dev/null +++ b/src/parser/html/__tests__/data/attributes-basic.txt @@ -0,0 +1,13 @@ + +~~~~~~~~~~ +[ + { + "tag": "a", + "attributes": { + "b": "1", + "c": true, + "d": "e" + }, + "children": [] + } +] diff --git a/src/parser/html/__tests__/data/content-angle.txt b/src/parser/html/__tests__/data/content-angle.txt new file mode 100644 index 00000000..d2573320 --- /dev/null +++ b/src/parser/html/__tests__/data/content-angle.txt @@ -0,0 +1,7 @@ +o< quack +~~~~~~~~~~ +[ + { + "content": "o< quack" + } +] diff --git a/src/parser/html/__tests__/data/content-simple.txt b/src/parser/html/__tests__/data/content-simple.txt new file mode 100644 index 00000000..6ecf430b --- /dev/null +++ b/src/parser/html/__tests__/data/content-simple.txt @@ -0,0 +1,7 @@ +quack +~~~~~~~~~~ +[ + { + "content": "quack" + } +] diff --git a/src/parser/html/__tests__/data/tag-angle.txt b/src/parser/html/__tests__/data/tag-angle.txt new file mode 100644 index 00000000..00ad9a2b --- /dev/null +++ b/src/parser/html/__tests__/data/tag-angle.txt @@ -0,0 +1,13 @@ +1 < 2 +~~~~~~~~~~ +[ + { + "tag": "math", + "attributes": {}, + "children": [ + { + "content": "1 < 2" + } + ] + } +] diff --git a/src/parser/html/__tests__/data/tag-mismatch.txt b/src/parser/html/__tests__/data/tag-mismatch.txt new file mode 100644 index 00000000..e04b40e6 --- /dev/null +++ b/src/parser/html/__tests__/data/tag-mismatch.txt @@ -0,0 +1,21 @@ + +~~~~~~~~~~ +[ + { + "tag": "a", + "attributes": {}, + "children": [ + { + "tag": "b", + "attributes": {}, + "children": [ + { + "tag": "c", + "attributes": {}, + "children": [] + } + ] + } + ] + } +] diff --git a/src/parser/html/__tests__/data/tag-simple.txt b/src/parser/html/__tests__/data/tag-simple.txt new file mode 100644 index 00000000..fcf07d40 --- /dev/null +++ b/src/parser/html/__tests__/data/tag-simple.txt @@ -0,0 +1,135 @@ + + +< a/> + + +< a /> +< a / > + + +< a>< /a> +< a >< /a > + + +< a>< / a> +< a >< / a > +~~~~~~~~~~ +[ + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + } +] diff --git a/src/parser/html/__tests__/data/tag-table.txt b/src/parser/html/__tests__/data/tag-table.txt new file mode 100644 index 00000000..ec6106ed --- /dev/null +++ b/src/parser/html/__tests__/data/tag-table.txt @@ -0,0 +1,39 @@ +
ab
+~~~~~~~~~~ +[ + { + "tag": "table", + "attributes": {}, + "children": [ + { + "tag": "tr", + "attributes": {}, + "children": [ + { + "tag": "td", + "attributes": {}, + "children": [ + { + "content": "a" + } + ] + }, + { + "tag": "td", + "attributes": {}, + "children": [ + { + "content": "b" + } + ] + }, + { + "tag": "td", + "attributes": {}, + "children": [] + } + ] + } + ] + } +] diff --git a/src/parser/http/PhutilHTTPResponse.php b/src/parser/http/PhutilHTTPResponse.php new file mode 100644 index 00000000..756847a7 --- /dev/null +++ b/src/parser/http/PhutilHTTPResponse.php @@ -0,0 +1,62 @@ +body = new PhutilRope(); + } + + public function setHeaders(array $headers) { + $this->headers = $headers; + return $this; + } + + public function getHeaders() { + return $this->headers; + } + + public function setStatus(HTTPFutureResponseStatus $status) { + $this->status = $status; + return $this; + } + + public function getStatus() { + return $this->status; + } + + public function appendBody($bytes) { + if ($this->writeHandle !== null) { + $result = @fwrite($this->writeHandle, $bytes); + if ($result !== strlen($bytes)) { + throw new Exception( + pht('Failed to write response to disk. (Maybe the disk is full?)')); + } + } else { + $this->body->append($bytes); + } + } + + public function getBody() { + if ($this->writeHandle !== null) { + return null; + } + + return $this->body->getAsString(); + } + + public function setWriteHandle($write_handle) { + $this->writeHandle = $write_handle; + return $this; + } + + public function getWriteHandle() { + return $this->writeHandle; + } + +} diff --git a/src/parser/http/PhutilHTTPResponseParser.php b/src/parser/http/PhutilHTTPResponseParser.php new file mode 100644 index 00000000..0197d006 --- /dev/null +++ b/src/parser/http/PhutilHTTPResponseParser.php @@ -0,0 +1,207 @@ +followLocationHeaders = $follow_location_headers; + return $this; + } + + public function getFollowLocationHeaders() { + return $this->followLocationHeaders; + } + + public function setWriteHandle($write_handle) { + $this->writeHandle = $write_handle; + return $this; + } + + public function getWriteHandle() { + return $this->writeHandle; + } + + public function setProgressSink(PhutilProgressSink $progress_sink) { + $this->progressSink = $progress_sink; + return $this; + } + + public function getProgressSink() { + return $this->progressSink; + } + + public function readBytes($bytes) { + if ($this->state == 'discard') { + return $this; + } + + $this->buffer .= $bytes; + + while (true) { + if ($this->state == 'headers') { + $matches = null; + + $ok = preg_match( + "/(\r?\n\r?\n)/", + $this->buffer, + $matches, + PREG_OFFSET_CAPTURE); + if (!$ok) { + break; + } + + $headers_len = $matches[1][1]; + $boundary_len = strlen($matches[1][0]); + $raw_headers = substr($this->buffer, 0, $headers_len); + $this->buffer = substr($this->buffer, $headers_len + $boundary_len); + + $header_lines = phutil_split_lines($raw_headers); + $first_line = array_shift($header_lines); + $response_valid = true; + + $matches = null; + $ok = preg_match( + '(^HTTP/\S+\s+(\d+)(?:\s+(.*))?$)i', + $first_line, + $matches); + + if ($ok) { + $http_code = (int)$matches[1]; + $http_status = phutil_utf8_strtolower($matches[2]); + } else { + $response_valid = false; + } + + $header_list = array(); + $saw_location = false; + foreach ($header_lines as $header_line) { + $pos = strpos($header_line, ':'); + if ($pos === false) { + $response_valid = false; + break; + } + + $name = substr($header_line, 0, $pos); + $value = ltrim(substr($header_line, $pos + 1), ' '); + + if (phutil_utf8_strtolower($name) == 'location') { + $saw_location = true; + } + + $header_list[] = array( + $name, + $value, + ); + } + + // If the response didn't start with a properly formatted "HTTP/..." + // line, or any of the header lines were not formatted correctly, add + // a malformed response to the response list and discard anything else + // we're given. + if (!$response_valid) { + $malformed = new HTTPFutureParseResponseStatus( + HTTPFutureParseResponseStatus::ERROR_MALFORMED_RESPONSE, + $raw_headers); + + $this->newHTTPResponse() + ->setStatus($malformed); + + $this->buffer = ''; + $this->state = 'discard'; + break; + } + + // Otherwise, we have a valid set of response headers. + $response_status = new HTTPFutureHTTPResponseStatus( + $http_code, + null, + $header_list); + + $this->newHTTPResponse() + ->setStatus($response_status) + ->setHeaders($header_list); + + $is_https_proxy = + ($http_code === 200) && + ($http_status === 'connection established'); + + if ($http_code === 100) { + // If this is "HTTP/1.1 100 Continue", this is just the server + // telling us that everything is okay. This response won't have + // a body associated with it. + $more_headers = true; + } else if ($is_https_proxy) { + // If this is "HTTP/1.1 200 Connection Established", this is a + // response to a CONNECT request made automatically by cURL to + // an HTTPS proxy. This response won't have a body associated + // with it, and the real body will follow later. + $more_headers = true; + } else if ($saw_location && $this->followLocationHeaders) { + // If we're following location headers and this response had + // a location header, cURL will automatically follow it. This + // response shouldn't have a body. + $more_headers = true; + } else { + $more_headers = false; + } + + // If we're expecting more headers, we're going to stay in the + // "headers" state and parse another set of headers. Otherwise, + // we transition to the "body" state and look for a body. + if (!$more_headers) { + $this->state = 'body'; + } + + continue; + } + + if ($this->state == 'body') { + if (strlen($this->buffer)) { + $bytes = $this->buffer; + $this->buffer = ''; + + $this->response->appendBody($bytes); + + $sink = $this->getProgressSink(); + if ($sink) { + $sink->didMakeProgress(strlen($bytes)); + } + } + break; + } + } + + return $this; + } + + public function getResponses() { + if ($this->state !== 'body') { + throw new HTTPFutureParseResponseStatus( + HTTPFutureParseResponseStatus::ERROR_MALFORMED_RESPONSE, + $this->buffer); + } + + return $this->responses; + } + + private function newHTTPResponse() { + $response = new PhutilHTTPResponse(); + + $write_handle = $this->getWriteHandle(); + if ($write_handle) { + $response->setWriteHandle($write_handle); + } + + $this->responses[] = $response; + $this->response = $response; + return $response; + } + +} diff --git a/src/parser/http/__tests__/PhutilHTTPResponseParserTestCase.php b/src/parser/http/__tests__/PhutilHTTPResponseParserTestCase.php new file mode 100644 index 00000000..7b5e373a --- /dev/null +++ b/src/parser/http/__tests__/PhutilHTTPResponseParserTestCase.php @@ -0,0 +1,145 @@ +assertParse( + array( + array( + 'headers' => array( + array('Duck', 'Quack'), + ), + 'body' => 'I am the very model of a modern major general.', + ), + ), + $input); + + $input = <<assertParse( + array( + array( + 'code' => 200, + 'headers' => array( + array('X-I-Am-A-Proxy-Server', 'Hello'), + ), + 'body' => '', + ), + array( + 'code' => 100, + 'headers' => array( + array('X-Everything-Is-Fine', 'true'), + ), + 'body' => '', + ), + array( + 'code' => 302, + 'headers' => array( + array('Location', 'Over-There'), + ), + 'body' => '', + ), + array( + 'code' => 404, + 'headers' => array(), + 'body' => 'Not all who wander are lost.', + ), + ), + $input, + id(new PhutilHTTPResponseParser()) + ->setFollowLocationHeaders(true)); + + $input = <<assertParse( + array( + array( + 'code' => 200, + 'headers' => array( + array('Reason', 'none'), + ), + 'body' => + 'This response has no "reason-phrase", which is unusual but valid.', + ), + ), + $input, + id(new PhutilHTTPResponseParser())); + } + + private function assertParse(array $expect, $input, $parser = null) { + if ($parser === null) { + $parser = new PhutilHTTPResponseParser(); + } + + // Submit the input in little bits to try to catch any weird parser bugs. + $length = strlen($input); + $pos = 0; + while ($pos < $length) { + $next_len = mt_rand(1, 32); + $piece = substr($input, $pos, $next_len); + $pos = $pos + $next_len; + + $parser->readBytes($piece); + } + + $responses = $parser->getResponses(); + + $this->assertEqual(count($expect), count($responses)); + + $expect = array_values($expect); + $responses = array_values($responses); + + for ($ii = 0; $ii < count($expect); $ii++) { + $expect_map = $expect[$ii]; + $actual = $responses[$ii]; + + foreach ($expect_map as $key => $spec) { + switch ($key) { + case 'headers': + $this->assertEqual($spec, $actual->getHeaders()); + break; + case 'body': + $this->assertEqual($spec, $actual->getBody()); + break; + case 'code': + $status = $actual->getStatus(); + $this->assertTrue($status instanceof HTTPFutureHTTPResponseStatus); + $this->assertEqual($spec, $status->getStatusCode()); + break; + default: + throw new Exception( + pht( + 'Unknown HTTPResponseParser test ("%s").', + $key)); + } + } + } + } + +} diff --git a/src/parser/xhpast/__tests__/PHPASTParserTestCase.php b/src/parser/xhpast/__tests__/PHPASTParserTestCase.php new file mode 100644 index 00000000..73dcbc69 --- /dev/null +++ b/src/parser/xhpast/__tests__/PHPASTParserTestCase.php @@ -0,0 +1,136 @@ +assertSkipped( + pht('%s is not built or not up to date.', 'xhpast')); + } + } + + $dir = dirname(__FILE__).'/data/'; + foreach (Filesystem::listDirectory($dir) as $file) { + if (preg_match('/\.test$/', $file)) { + $this->executeParserTest($file, $dir.$file); + } + } + } + + private function executeParserTest($name, $file) { + $contents = Filesystem::readFile($file); + $contents = preg_split('/^~{4,}\n/m', $contents); + + if (count($contents) < 2) { + throw new Exception( + pht( + "Expected '%s' separating test case and results.", + '~~~~~~~~~~')); + } + + list($data, $options, $expect) = array_merge($contents, array(null)); + + $options = id(new PhutilSimpleOptions())->parse($options); + + $type = null; + foreach ($options as $key => $value) { + switch ($key) { + case 'pass': + case 'fail-syntax': + case 'fail-parse': + if ($type !== null) { + throw new Exception( + pht( + 'Test file "%s" unexpectedly specifies multiple expected '. + 'test outcomes.', + $name)); + } + $type = $key; + break; + case 'comment': + // Human readable comment providing test case information. + break; + case 'rtrim': + // Allows construction of tests which rely on EOF without newlines. + $data = rtrim($data); + break; + default: + throw new Exception( + pht( + 'Test file "%s" has unknown option "%s" in its options '. + 'string.', + $name, + $key)); + } + } + + if ($type === null) { + throw new Exception( + pht( + 'Test file "%s" does not specify a test result (like "pass") in '. + 'its options string.', + $name)); + } + + $future = PhutilXHPASTBinary::getParserFuture($data); + list($err, $stdout, $stderr) = $future->resolve(); + + switch ($type) { + case 'pass': + case 'fail-parse': + $this->assertEqual(0, $err, pht('Exit code for "%s".', $name)); + + if (!strlen($expect)) { + // If there's no "expect" data in the test case, that's OK. + break; + } + + try { + $expect = phutil_json_decode($expect); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht( + 'Expect data for test "%s" is not valid JSON.', + $name), + $ex); + } + + try { + $stdout = phutil_json_decode($stdout); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht( + 'Output for test file "%s" is not valid JSON.', + $name), + $ex); + } + + $json = new PhutilJSON(); + + $expect_nice = $json->encodeFormatted($expect); + $stdout_nice = $json->encodeFormatted($stdout); + + if ($type == 'pass') { + $this->assertEqual( + $expect_nice, + $stdout_nice, + pht('Parser output for "%s".', $name)); + } else { + $this->assertFalse( + ($expect_nice == $stdout_nice), + pht('Expected parser to parse "%s" incorrectly.', $name)); + } + break; + case 'fail-syntax': + $this->assertEqual(1, $err, pht('Exit code for "%s".', $name)); + $this->assertTrue( + (bool)preg_match('/syntax error/', $stderr), + pht('Expect "syntax error" in stderr or "%s".', $name)); + break; + } + } + +} diff --git a/src/parser/xhpast/__tests__/data/anonymous_class.php.test b/src/parser/xhpast/__tests__/data/anonymous_class.php.test new file mode 100644 index 00000000..7b0b4a3e --- /dev/null +++ b/src/parser/xhpast/__tests__/data/anonymous_class.php.test @@ -0,0 +1,595 @@ +num = $num; + } +}; +~~~~~~~~~~ +pass +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 64, + [ + [ + 9006, + 0, + 63, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 12, + [ + [ + 9077, + 2, + 11, + [ + [ + 9047, + 2, + 2 + ], + [ + 9081, + 4, + 4 + ], + [ + 9074, + 6, + 11, + [ + [ + 9051, + 10, + 11, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 10, + 11 + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 14, + 63, + [ + [ + 9077, + 14, + 62, + [ + [ + 9047, + 14, + 14 + ], + [ + 9081, + 16, + 16 + ], + [ + 9074, + 18, + 62, + [ + [ + 9051, + 25, + 62, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9054, + 25, + 27, + [ + [ + 9090, + 27, + 27 + ] + ] + ], + [ + 9055, + 29, + 31, + [ + [ + 9090, + 31, + 31 + ] + ] + ], + [ + 9006, + 33, + 62, + [ + [ + 9004, + 35, + 38, + [ + [ + 9063, + 35, + 37, + [ + [ + 9070, + 35, + 35, + [ + [ + 9013, + 35, + 35 + ] + ] + ], + [ + 9064, + 37, + 37, + [ + [ + 9047, + 37, + 37 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 40, + 60, + [ + [ + 9067, + 40, + 60, + [ + [ + 9068, + 40, + 40, + [ + [ + 9013, + 40, + 40 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 44, + 44 + ], + [ + 9059, + 45, + 47, + [ + [ + 9060, + 46, + 46, + [ + [ + 9005 + ], + [ + 9047, + 46, + 46 + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 49, + 60, + [ + [ + 9004, + 51, + 58, + [ + [ + 9077, + 51, + 57, + [ + [ + 9092, + 51, + 53, + [ + [ + 9047, + 51, + 51 + ], + [ + 9013, + 53, + 53 + ] + ] + ], + [ + 9081, + 55, + 55 + ], + [ + 9047, + 57, + 57 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9095, + 21, + 23, + [ + [ + 9086, + 22, + 22 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 2 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 302, + 3 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 302, + 3 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 40, + 1 + ], + [ + 309, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 360, + 7 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 361, + 10 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 3 + ], + [ + 350, + 7 + ], + [ + 377, + 1 + ], + [ + 313, + 4 + ], + [ + 59, + 1 + ], + [ + 377, + 4 + ], + [ + 352, + 6 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 11 + ], + [ + 40, + 1 + ], + [ + 313, + 4 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 5 + ], + [ + 313, + 5 + ], + [ + 362, + 2 + ], + [ + 311, + 3 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 4 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/base-fail-parse.php.test b/src/parser/xhpast/__tests__/data/base-fail-parse.php.test new file mode 100644 index 00000000..0bcf228d --- /dev/null +++ b/src/parser/xhpast/__tests__/data/base-fail-parse.php.test @@ -0,0 +1,8 @@ + 2 <=> 3; +~~~~~~~~~~ +fail-syntax, comment=Spaceship operator is non-associative diff --git a/src/parser/xhpast/__tests__/data/operator-spaceship.php.test b/src/parser/xhpast/__tests__/data/operator-spaceship.php.test new file mode 100644 index 00000000..7ba45bc5 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/operator-spaceship.php.test @@ -0,0 +1,93 @@ + 2; +~~~~~~~~~~ +pass +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 8, + [ + [ + 9006, + 0, + 7, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 7, + [ + [ + 9077, + 2, + 6, + [ + [ + 9086, + 2, + 2 + ], + [ + 9081, + 4, + 4 + ], + [ + 9086, + 6, + 6 + ] + ] + ] + ] + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 377, + 1 + ], + [ + 285, + 3 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/optional-parameter.php.test b/src/parser/xhpast/__tests__/data/optional-parameter.php.test new file mode 100644 index 00000000..5d032b7f --- /dev/null +++ b/src/parser/xhpast/__tests__/data/optional-parameter.php.test @@ -0,0 +1,282 @@ +b; + +new a->c(); +~~~~~~~~~~ +fail-syntax diff --git a/src/parser/xhpast/__tests__/data/php-access-on-instanciation.test b/src/parser/xhpast/__tests__/data/php-access-on-instanciation.test new file mode 100644 index 00000000..d123e7f3 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-access-on-instanciation.test @@ -0,0 +1,663 @@ +b; + +$e = (new a)->c(); + +(new a)->b; + +(new a)->c(); +~~~~~~~~~~ +pass +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 74, + [ + [ + 9006, + 0, + 73, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 25, + [ + [ + 9051, + 2, + 25, + [ + [ + 9052, + 2, + 2 + ], + [ + 9090, + 4, + 4 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 6, + 25, + [ + [ + 9004, + 8, + 11, + [ + [ + 9063, + 8, + 10, + [ + [ + 9070, + 8, + 8, + [ + [ + 9013, + 8, + 8 + ] + ] + ], + [ + 9064, + 10, + 10, + [ + [ + 9047, + 10, + 10 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 13, + 23, + [ + [ + 9067, + 13, + 23, + [ + [ + 9068, + 13, + 13, + [ + [ + 9013, + 13, + 13 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 17, + 17 + ], + [ + 9059, + 18, + 19 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 21, + 23 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 27, + 38, + [ + [ + 9077, + 27, + 37, + [ + [ + 9047, + 27, + 27 + ], + [ + 9081, + 29, + 29 + ], + [ + 9092, + 31, + 37, + [ + [ + 9074, + 31, + 35, + [ + [ + 9090, + 34, + 34 + ], + [ + 9005 + ] + ] + ], + [ + 9013, + 37, + 37 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 40, + 53, + [ + [ + 9077, + 40, + 52, + [ + [ + 9047, + 40, + 40 + ], + [ + 9081, + 42, + 42 + ], + [ + 9102, + 44, + 52, + [ + [ + 9092, + 44, + 50, + [ + [ + 9074, + 44, + 48, + [ + [ + 9090, + 47, + 47 + ], + [ + 9005 + ] + ] + ], + [ + 9013, + 50, + 50 + ] + ] + ], + [ + 9095, + 51, + 52 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 55, + 62, + [ + [ + 9092, + 55, + 61, + [ + [ + 9074, + 55, + 59, + [ + [ + 9090, + 58, + 58 + ], + [ + 9005 + ] + ] + ], + [ + 9013, + 61, + 61 + ] + ] + ] + ] + ], + [ + 9004, + 64, + 73, + [ + [ + 9102, + 64, + 72, + [ + [ + 9092, + 64, + 70, + [ + [ + 9074, + 64, + 68, + [ + [ + 9090, + 67, + 67 + ], + [ + 9005 + ] + ] + ], + [ + 9013, + 70, + 70 + ] + ] + ], + [ + 9095, + 71, + 72 + ] + ] + ] + ] + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 2 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 2 + ], + [ + 352, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 352, + 6 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 302, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 41, + 1 + ], + [ + 362, + 2 + ], + [ + 311, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 302, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 41, + 1 + ], + [ + 362, + 2 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 40, + 1 + ], + [ + 302, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 41, + 1 + ], + [ + 362, + 2 + ], + [ + 311, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 40, + 1 + ], + [ + 302, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 41, + 1 + ], + [ + 362, + 2 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/php-array-dereference-2.test b/src/parser/xhpast/__tests__/data/php-array-dereference-2.test new file mode 100644 index 00000000..ac288ed7 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-array-dereference-2.test @@ -0,0 +1,185 @@ +getStatus()['running']) { + // do something +} +~~~~~~~~~~ +pass +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 19, + [ + [ + 9006, + 0, + 18, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 18, + [ + [ + 9015, + 2, + 18, + [ + [ + 9017, + 2, + 18, + [ + [ + 9016, + 4, + 13, + [ + [ + 9102, + 5, + 12, + [ + [ + 9092, + 5, + 7, + [ + [ + 9047, + 5, + 5 + ], + [ + 9013, + 7, + 7 + ] + ] + ], + [ + 9100, + 8, + 12, + [ + [ + 9095, + 8, + 9 + ], + [ + 9087, + 11, + 11 + ] + ] + ] + ] + ] + ] + ], + [ + 9006, + 15, + 18 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 362, + 2 + ], + [ + 311, + 9 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 91, + 1 + ], + [ + 319, + 9 + ], + [ + 93, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 3 + ], + [ + 371, + 16 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/php-array-dereference-3.test b/src/parser/xhpast/__tests__/data/php-array-dereference-3.test new file mode 100644 index 00000000..08e06908 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-array-dereference-3.test @@ -0,0 +1,209 @@ + $y) {} +foreach ($x as $k => &$y) {} + +foreach (array() as $x) {} +foreach (array() as $k => $y) {} + +foreach ($x as $y): +endforeach; + +declare(x=1); + +declare(y=1) { +} + +declare(z=1): +enddeclare; + +try {} catch (C $x) {} +try {} catch (C $x) {} catch (D $x) {} + +throw 1; + +clone $q; +$x + $x; +$x - $x; +$x * $x; +$x / $x; +$x . $x; +$x % $x; +$x & $x; +$x | $x; +$x ^ $x; +$x << $x; +$x >> $x; +$x++; +++$x; +$x--; +--$x; ++$x; +-$x; +!$x; +~$x; +$x == $x; +$x === $x; +$x != $x; +$x !== $x; +$x = $x; +$x < $x; +$x <= $x; +$x > $x; +$x >= $x; +$x instanceof $x; +($x); +($x ? $x : $x); +($x ?: $x); +$x || $x; +$x && $x; +$x and $x; +$x or $x; +$x xor $x; +$x += $x; +$x -= $x; +$x *= $x; +$x /= $x; +$x .= $x; +$x %= $x; +$x &= $x; +$x |= $x; +$x ^= $x; +$x <<= $x; +$x >>= $x; +(int)$x; +(double)$x; +(string)$x; +(binary)$x; +(array)$x; +(object)$x; +(bool)$x; +(unset)$x; +$x[] = $x; + +@$x; + +__LINE__; +__FILE__; +__DIR__; +__CLASS__; +__METHOD__; +__FUNCTION__; +__NAMESPACE__; + +goto lbl; +~~~~~~~~~~ +pass +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 1376, + [ + [ + 9006, + 0, + 1375, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 3, + [ + [ + 9086, + 2, + 2 + ] + ] + ], + [ + 9004, + 5, + 9, + [ + [ + 9082, + 5, + 8, + [ + [ + 9093, + 6, + 8, + [ + [ + 9094, + 7, + 7, + [ + [ + 9005 + ], + [ + 9086, + 7, + 7 + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 11, + 18, + [ + [ + 9050, + 11, + 18, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 13, + 13 + ], + [ + 9059, + 14, + 15 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 17, + 18 + ] + ] + ] + ] + ], + [ + 9004, + 20, + 28, + [ + [ + 9050, + 20, + 28, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 22, + 22 + ], + [ + 9059, + 23, + 25, + [ + [ + 9060, + 24, + 24, + [ + [ + 9005 + ], + [ + 9047, + 24, + 24 + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 27, + 28 + ] + ] + ] + ] + ], + [ + 9004, + 30, + 39, + [ + [ + 9050, + 30, + 39, + [ + [ + 9005 + ], + [ + 9048, + 32, + 32 + ], + [ + 9013, + 33, + 33 + ], + [ + 9059, + 34, + 36, + [ + [ + 9060, + 35, + 35, + [ + [ + 9005 + ], + [ + 9047, + 35, + 35 + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 38, + 39 + ] + ] + ] + ] + ], + [ + 9004, + 41, + 50, + [ + [ + 9050, + 41, + 50, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 43, + 43 + ], + [ + 9059, + 44, + 47, + [ + [ + 9060, + 45, + 45, + [ + [ + 9005 + ], + [ + 9049, + 45, + 46, + [ + [ + 9047, + 46, + 46 + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 49, + 50 + ] + ] + ] + ] + ], + [ + 9004, + 52, + 62, + [ + [ + 9050, + 52, + 62, + [ + [ + 9005 + ], + [ + 9048, + 54, + 54 + ], + [ + 9013, + 55, + 55 + ], + [ + 9059, + 56, + 59, + [ + [ + 9060, + 57, + 57, + [ + [ + 9005 + ], + [ + 9049, + 57, + 58, + [ + [ + 9047, + 58, + 58 + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 61, + 62 + ] + ] + ] + ] + ], + [ + 9004, + 64, + 74, + [ + [ + 9050, + 64, + 74, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 66, + 66 + ], + [ + 9059, + 67, + 71, + [ + [ + 9060, + 68, + 70, + [ + [ + 9090, + 68, + 68 + ], + [ + 9047, + 70, + 70 + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 73, + 74 + ] + ] + ] + ] + ], + [ + 9004, + 76, + 86, + [ + [ + 9050, + 76, + 86, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 78, + 78 + ], + [ + 9059, + 79, + 83, + [ + [ + 9060, + 80, + 82, + [ + [ + 9061, + 80, + 80 + ], + [ + 9047, + 82, + 82 + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 85, + 86 + ] + ] + ] + ] + ], + [ + 9004, + 88, + 104, + [ + [ + 9050, + 88, + 104, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 90, + 90 + ], + [ + 9059, + 91, + 101, + [ + [ + 9060, + 92, + 100, + [ + [ + 9061, + 92, + 92 + ], + [ + 9047, + 94, + 94 + ], + [ + 9082, + 98, + 100, + [ + [ + 9093, + 99, + 100 + ] + ] + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 103, + 104 + ] + ] + ] + ] + ], + [ + 9004, + 106, + 118, + [ + [ + 9050, + 106, + 118, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 108, + 108 + ], + [ + 9059, + 109, + 115, + [ + [ + 9060, + 110, + 114, + [ + [ + 9005 + ], + [ + 9047, + 110, + 110 + ], + [ + 9001, + 114, + 114 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 117, + 118 + ] + ] + ] + ] + ], + [ + 9004, + 120, + 134, + [ + [ + 9050, + 120, + 134, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 122, + 122 + ], + [ + 9059, + 123, + 131, + [ + [ + 9060, + 124, + 130, + [ + [ + 9090, + 124, + 124 + ], + [ + 9047, + 126, + 126 + ], + [ + 9001, + 130, + 130 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 133, + 134 + ] + ] + ] + ] + ], + [ + 9004, + 136, + 141, + [ + [ + 9051, + 136, + 141, + [ + [ + 9052, + 136, + 136 + ], + [ + 9090, + 138, + 138 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 140, + 141 + ] + ] + ] + ] + ], + [ + 9004, + 143, + 152, + [ + [ + 9051, + 143, + 152, + [ + [ + 9052, + 143, + 143 + ], + [ + 9090, + 145, + 145 + ], + [ + 9054, + 147, + 149, + [ + [ + 9090, + 149, + 149 + ] + ] + ], + [ + 9005 + ], + [ + 9006, + 151, + 152 + ] + ] + ] + ] + ], + [ + 9004, + 154, + 167, + [ + [ + 9051, + 154, + 167, + [ + [ + 9052, + 154, + 154 + ], + [ + 9090, + 156, + 156 + ], + [ + 9054, + 158, + 160, + [ + [ + 9090, + 160, + 160 + ] + ] + ], + [ + 9055, + 162, + 164, + [ + [ + 9090, + 164, + 164 + ] + ] + ], + [ + 9006, + 166, + 167 + ] + ] + ] + ] + ], + [ + 9004, + 169, + 185, + [ + [ + 9051, + 169, + 185, + [ + [ + 9052, + 169, + 169 + ], + [ + 9090, + 171, + 171 + ], + [ + 9054, + 173, + 175, + [ + [ + 9090, + 175, + 175 + ] + ] + ], + [ + 9055, + 177, + 182, + [ + [ + 9090, + 179, + 179 + ], + [ + 9090, + 182, + 182 + ] + ] + ], + [ + 9006, + 184, + 185 + ] + ] + ] + ] + ], + [ + 9004, + 187, + 194, + [ + [ + 9051, + 187, + 194, + [ + [ + 9052, + 187, + 189, + [ + [ + 9013, + 187, + 187 + ] + ] + ], + [ + 9090, + 191, + 191 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 193, + 194 + ] + ] + ] + ] + ], + [ + 9004, + 196, + 203, + [ + [ + 9051, + 196, + 203, + [ + [ + 9052, + 196, + 198, + [ + [ + 9013, + 196, + 196 + ] + ] + ], + [ + 9090, + 200, + 200 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 202, + 203 + ] + ] + ] + ] + ], + [ + 9004, + 205, + 354, + [ + [ + 9051, + 205, + 354, + [ + [ + 9052, + 205, + 207, + [ + [ + 9013, + 205, + 205 + ] + ] + ], + [ + 9090, + 209, + 209 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 211, + 354, + [ + [ + 9004, + 213, + 220, + [ + [ + 9065, + 213, + 219, + [ + [ + 9066, + 215, + 219, + [ + [ + 9013, + 215, + 215 + ], + [ + 9086, + 219, + 219 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 222, + 236, + [ + [ + 9065, + 222, + 235, + [ + [ + 9066, + 224, + 228, + [ + [ + 9013, + 224, + 224 + ], + [ + 9086, + 228, + 228 + ] + ] + ], + [ + 9066, + 231, + 235, + [ + [ + 9013, + 231, + 231 + ], + [ + 9086, + 235, + 235 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 238, + 241, + [ + [ + 9063, + 238, + 240, + [ + [ + 9070, + 238, + 238, + [ + [ + 9013, + 238, + 238 + ] + ] + ], + [ + 9064, + 240, + 240, + [ + [ + 9047, + 240, + 240 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 243, + 249, + [ + [ + 9063, + 243, + 248, + [ + [ + 9070, + 243, + 243, + [ + [ + 9013, + 243, + 243 + ] + ] + ], + [ + 9064, + 245, + 245, + [ + [ + 9047, + 245, + 245 + ], + [ + 9005 + ] + ] + ], + [ + 9064, + 248, + 248, + [ + [ + 9047, + 248, + 248 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 251, + 254, + [ + [ + 9063, + 251, + 253, + [ + [ + 9070, + 251, + 251, + [ + [ + 9013, + 251, + 251 + ] + ] + ], + [ + 9064, + 253, + 253, + [ + [ + 9047, + 253, + 253 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 256, + 262, + [ + [ + 9063, + 256, + 261, + [ + [ + 9070, + 256, + 256, + [ + [ + 9013, + 256, + 256 + ] + ] + ], + [ + 9064, + 258, + 258, + [ + [ + 9047, + 258, + 258 + ], + [ + 9005 + ] + ] + ], + [ + 9064, + 261, + 261, + [ + [ + 9047, + 261, + 261 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 264, + 271, + [ + [ + 9063, + 264, + 270, + [ + [ + 9070, + 264, + 264, + [ + [ + 9013, + 264, + 264 + ] + ] + ], + [ + 9064, + 266, + 270, + [ + [ + 9047, + 266, + 266 + ], + [ + 9086, + 270, + 270 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 273, + 289, + [ + [ + 9063, + 273, + 288, + [ + [ + 9070, + 273, + 275, + [ + [ + 9013, + 273, + 273 + ], + [ + 9013, + 275, + 275 + ] + ] + ], + [ + 9064, + 277, + 281, + [ + [ + 9047, + 277, + 277 + ], + [ + 9086, + 281, + 281 + ] + ] + ], + [ + 9064, + 284, + 288, + [ + [ + 9047, + 284, + 284 + ], + [ + 9086, + 288, + 288 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 291, + 298, + [ + [ + 9067, + 291, + 298, + [ + [ + 9068 + ], + [ + 9005 + ], + [ + 9013, + 293, + 293 + ], + [ + 9059, + 294, + 295 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 297, + 298 + ] + ] + ] + ] + ], + [ + 9004, + 300, + 309, + [ + [ + 9067, + 300, + 309, + [ + [ + 9068, + 300, + 300, + [ + [ + 9013, + 300, + 300 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 304, + 304 + ], + [ + 9059, + 305, + 306 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 308, + 309 + ] + ] + ] + ] + ], + [ + 9004, + 311, + 320, + [ + [ + 9067, + 311, + 320, + [ + [ + 9068, + 311, + 311, + [ + [ + 9013, + 311, + 311 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 315, + 315 + ], + [ + 9059, + 316, + 317 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 319, + 320 + ] + ] + ] + ] + ], + [ + 9004, + 322, + 331, + [ + [ + 9067, + 322, + 331, + [ + [ + 9068, + 322, + 322, + [ + [ + 9013, + 322, + 322 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 326, + 326 + ], + [ + 9059, + 327, + 328 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 330, + 331 + ] + ] + ] + ] + ], + [ + 9004, + 333, + 341, + [ + [ + 9067, + 333, + 341, + [ + [ + 9068 + ], + [ + 9048, + 335, + 335 + ], + [ + 9013, + 336, + 336 + ], + [ + 9059, + 337, + 338 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 340, + 341 + ] + ] + ] + ] + ], + [ + 9004, + 343, + 352, + [ + [ + 9067, + 343, + 352, + [ + [ + 9068, + 343, + 343, + [ + [ + 9013, + 343, + 343 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 347, + 347 + ], + [ + 9059, + 348, + 349 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 351, + 352 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 356, + 373, + [ + [ + 9051, + 356, + 373, + [ + [ + 9052, + 356, + 358, + [ + [ + 9013, + 356, + 356 + ] + ] + ], + [ + 9090, + 360, + 360 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 362, + 373, + [ + [ + 9004, + 364, + 370, + [ + [ + 9067, + 364, + 370, + [ + [ + 9068, + 364, + 364, + [ + [ + 9013, + 364, + 364 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 368, + 368 + ], + [ + 9059, + 369, + 370 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 375, + 380, + [ + [ + 9056, + 375, + 380, + [ + [ + 9052 + ], + [ + 9090, + 377, + 377 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 379, + 380 + ] + ] + ] + ] + ], + [ + 9004, + 382, + 391, + [ + [ + 9056, + 382, + 391, + [ + [ + 9052 + ], + [ + 9090, + 384, + 384 + ], + [ + 9054, + 386, + 388, + [ + [ + 9090, + 388, + 388 + ] + ] + ], + [ + 9005 + ], + [ + 9006, + 390, + 391 + ] + ] + ] + ] + ], + [ + 9004, + 393, + 405, + [ + [ + 9056, + 393, + 405, + [ + [ + 9052 + ], + [ + 9090, + 395, + 395 + ], + [ + 9054, + 397, + 402, + [ + [ + 9090, + 399, + 399 + ], + [ + 9090, + 402, + 402 + ] + ] + ], + [ + 9005 + ], + [ + 9006, + 404, + 405 + ] + ] + ] + ] + ], + [ + 9004, + 407, + 410, + [ + [ + 9009, + 407, + 409, + [ + [ + 9010, + 409, + 409, + [ + [ + 9001, + 409, + 409 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 412, + 418, + [ + [ + 9009, + 412, + 417, + [ + [ + 9010, + 414, + 414, + [ + [ + 9001, + 414, + 414 + ], + [ + 9005 + ] + ] + ], + [ + 9010, + 417, + 417, + [ + [ + 9001, + 417, + 417 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 420, + 446, + [ + [ + 9009, + 420, + 445, + [ + [ + 9010, + 422, + 426, + [ + [ + 9001, + 422, + 422 + ], + [ + 9013, + 426, + 426 + ] + ] + ], + [ + 9010, + 429, + 433, + [ + [ + 9001, + 429, + 429 + ], + [ + 9013, + 433, + 433 + ] + ] + ], + [ + 9010, + 436, + 437, + [ + [ + 9001, + 436, + 437 + ], + [ + 9005 + ] + ] + ], + [ + 9010, + 440, + 445, + [ + [ + 9001, + 440, + 441 + ], + [ + 9013, + 445, + 445 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 448, + 455, + [ + [ + 9011, + 448, + 454, + [ + [ + 9012, + 450, + 454, + [ + [ + 9013, + 450, + 450 + ], + [ + 9086, + 454, + 454 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 457, + 471, + [ + [ + 9011, + 457, + 470, + [ + [ + 9012, + 459, + 463, + [ + [ + 9013, + 459, + 459 + ], + [ + 9086, + 463, + 463 + ] + ] + ], + [ + 9012, + 466, + 470, + [ + [ + 9013, + 466, + 466 + ], + [ + 9086, + 470, + 470 + ] + ] + ] + ] + ] + ] + ], + [ + 9014, + 473, + 474, + [ + [ + 9013, + 473, + 473 + ] + ] + ], + [ + 9004, + 476, + 483, + [ + [ + 9015, + 476, + 483, + [ + [ + 9017, + 476, + 483, + [ + [ + 9016, + 478, + 480, + [ + [ + 9086, + 479, + 479 + ] + ] + ], + [ + 9006, + 482, + 483 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 485, + 497, + [ + [ + 9015, + 485, + 497, + [ + [ + 9017, + 485, + 492, + [ + [ + 9016, + 487, + 489, + [ + [ + 9086, + 488, + 488 + ] + ] + ], + [ + 9006, + 491, + 492 + ] + ] + ], + [ + 9019, + 494, + 497, + [ + [ + 9006, + 496, + 497 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 499, + 520, + [ + [ + 9015, + 499, + 520, + [ + [ + 9017, + 499, + 506, + [ + [ + 9016, + 501, + 503, + [ + [ + 9086, + 502, + 502 + ] + ] + ], + [ + 9006, + 505, + 506 + ] + ] + ], + [ + 9018, + 508, + 515, + [ + [ + 9016, + 510, + 512, + [ + [ + 9086, + 511, + 511 + ] + ] + ], + [ + 9006, + 514, + 515 + ] + ] + ], + [ + 9019, + 517, + 520, + [ + [ + 9006, + 519, + 520 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 522, + 547, + [ + [ + 9015, + 522, + 547, + [ + [ + 9017, + 522, + 529, + [ + [ + 9016, + 524, + 526, + [ + [ + 9086, + 525, + 525 + ] + ] + ], + [ + 9006, + 528, + 529 + ] + ] + ], + [ + 9018, + 531, + 538, + [ + [ + 9016, + 533, + 535, + [ + [ + 9086, + 534, + 534 + ] + ] + ], + [ + 9006, + 537, + 538 + ] + ] + ], + [ + 9018, + 540, + 547, + [ + [ + 9016, + 542, + 544, + [ + [ + 9086, + 543, + 543 + ] + ] + ], + [ + 9006, + 546, + 547 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 549, + 557, + [ + [ + 9015, + 549, + 556, + [ + [ + 9017, + 549, + 553, + [ + [ + 9016, + 551, + 553, + [ + [ + 9086, + 552, + 552 + ] + ] + ], + [ + 9006 + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 559, + 570, + [ + [ + 9015, + 559, + 569, + [ + [ + 9017, + 559, + 563, + [ + [ + 9016, + 561, + 563, + [ + [ + 9086, + 562, + 562 + ] + ] + ], + [ + 9006 + ] + ] + ], + [ + 9019, + 566, + 566, + [ + [ + 9006 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 572, + 587, + [ + [ + 9015, + 572, + 586, + [ + [ + 9017, + 572, + 576, + [ + [ + 9016, + 574, + 576, + [ + [ + 9086, + 575, + 575 + ] + ] + ], + [ + 9006 + ] + ] + ], + [ + 9018, + 579, + 582, + [ + [ + 9086, + 582, + 582 + ], + [ + 9006 + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 589, + 611, + [ + [ + 9015, + 589, + 610, + [ + [ + 9017, + 589, + 593, + [ + [ + 9016, + 591, + 593, + [ + [ + 9086, + 592, + 592 + ] + ] + ], + [ + 9006 + ] + ] + ], + [ + 9018, + 596, + 599, + [ + [ + 9086, + 599, + 599 + ], + [ + 9006 + ] + ] + ], + [ + 9018, + 603, + 606, + [ + [ + 9086, + 606, + 606 + ], + [ + 9006 + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 613, + 620, + [ + [ + 9020, + 613, + 620, + [ + [ + 9016, + 615, + 617, + [ + [ + 9086, + 616, + 616 + ] + ] + ], + [ + 9006, + 619, + 620 + ] + ] + ] + ] + ], + [ + 9004, + 622, + 630, + [ + [ + 9020, + 622, + 630, + [ + [ + 9016, + 624, + 626, + [ + [ + 9086, + 625, + 625 + ] + ] + ], + [ + 9006, + 627, + 630 + ] + ] + ] + ] + ], + [ + 9004, + 632, + 642, + [ + [ + 9021, + 632, + 641, + [ + [ + 9006, + 634, + 635 + ], + [ + 9016, + 639, + 641, + [ + [ + 9086, + 640, + 640 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 644, + 652, + [ + [ + 9022, + 644, + 652, + [ + [ + 9023, + 646, + 649, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9005 + ] + ] + ], + [ + 9006, + 651, + 652 + ] + ] + ] + ] + ], + [ + 9004, + 654, + 663, + [ + [ + 9022, + 654, + 663, + [ + [ + 9023, + 656, + 659, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9005 + ] + ] + ], + [ + 9006, + 660, + 663 + ] + ] + ] + ] + ], + [ + 9004, + 665, + 695, + [ + [ + 9024, + 665, + 695, + [ + [ + 9016, + 667, + 669, + [ + [ + 9086, + 668, + 668 + ] + ] + ], + [ + 9006, + 671, + 695, + [ + [ + 9057, + 673, + 679, + [ + [ + 9086, + 675, + 675 + ], + [ + 9006, + 678, + 679, + [ + [ + 9004, + 678, + 679, + [ + [ + 9025, + 678, + 678, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9057, + 681, + 687, + [ + [ + 9086, + 683, + 683 + ], + [ + 9006, + 686, + 687, + [ + [ + 9004, + 686, + 687, + [ + [ + 9025, + 686, + 686, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9058, + 689, + 693, + [ + [ + 9006, + 692, + 693, + [ + [ + 9004, + 692, + 693, + [ + [ + 9026, + 692, + 692, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 697, + 704, + [ + [ + 9024, + 697, + 704, + [ + [ + 9016, + 698, + 700, + [ + [ + 9086, + 699, + 699 + ] + ] + ], + [ + 9006, + 702, + 704, + [ + [ + 9004, + 703, + 703 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 706, + 713, + [ + [ + 9024, + 706, + 713, + [ + [ + 9016, + 707, + 709, + [ + [ + 9086, + 708, + 708 + ] + ] + ], + [ + 9006, + 710, + 713 + ] + ] + ] + ] + ], + [ + 9004, + 715, + 716, + [ + [ + 9025, + 715, + 715, + [ + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 718, + 721, + [ + [ + 9025, + 718, + 720, + [ + [ + 9086, + 720, + 720 + ] + ] + ] + ] + ], + [ + 9004, + 723, + 724, + [ + [ + 9026, + 723, + 723, + [ + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 726, + 729, + [ + [ + 9026, + 726, + 728, + [ + [ + 9086, + 728, + 728 + ] + ] + ] + ] + ], + [ + 9004, + 731, + 732, + [ + [ + 9027, + 731, + 731, + [ + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 734, + 737, + [ + [ + 9027, + 734, + 736, + [ + [ + 9086, + 736, + 736 + ] + ] + ] + ] + ], + [ + 9004, + 739, + 742, + [ + [ + 9027, + 739, + 741, + [ + [ + 9047, + 741, + 741 + ] + ] + ] + ] + ], + [ + 9004, + 744, + 747, + [ + [ + 9028, + 744, + 746, + [ + [ + 9047, + 746, + 746 + ] + ] + ] + ] + ], + [ + 9004, + 749, + 755, + [ + [ + 9028, + 749, + 754, + [ + [ + 9047, + 751, + 751 + ], + [ + 9047, + 754, + 754 + ] + ] + ] + ] + ], + [ + 9004, + 757, + 761, + [ + [ + 9028, + 757, + 760, + [ + [ + 9062, + 759, + 760, + [ + [ + 9047, + 760, + 760 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 763, + 771, + [ + [ + 9028, + 763, + 769, + [ + [ + 9062, + 765, + 769, + [ + [ + 9103, + 767, + 769, + [ + [ + 9047, + 767, + 767 + ], + [ + 9081, + 768, + 768 + ], + [ + 9047, + 769, + 769 + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 773, + 776, + [ + [ + 9030, + 773, + 775, + [ + [ + 9031, + 775, + 775, + [ + [ + 9047, + 775, + 775 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 778, + 784, + [ + [ + 9030, + 778, + 783, + [ + [ + 9031, + 780, + 780, + [ + [ + 9047, + 780, + 780 + ], + [ + 9005 + ] + ] + ], + [ + 9031, + 783, + 783, + [ + [ + 9047, + 783, + 783 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 786, + 789, + [ + [ + 9032, + 786, + 788, + [ + [ + 9086, + 788, + 788 + ] + ] + ] + ] + ], + [ + 9004, + 791, + 797, + [ + [ + 9032, + 791, + 796, + [ + [ + 9086, + 793, + 793 + ], + [ + 9086, + 796, + 796 + ] + ] + ] + ] + ], + [ + 9004, + 799, + 806, + [ + [ + 9035, + 799, + 805, + [ + [ + 9047, + 801, + 801 + ], + [ + 9047, + 804, + 804 + ] + ] + ] + ] + ], + [ + 9004, + 808, + 819, + [ + [ + 9037, + 808, + 819, + [ + [ + 9038, + 810, + 816, + [ + [ + 9047, + 811, + 811 + ], + [ + 9005 + ], + [ + 9047, + 815, + 815 + ] + ] + ], + [ + 9006, + 818, + 819 + ] + ] + ] + ] + ], + [ + 9004, + 821, + 836, + [ + [ + 9037, + 821, + 836, + [ + [ + 9038, + 823, + 833, + [ + [ + 9047, + 824, + 824 + ], + [ + 9047, + 828, + 828 + ], + [ + 9047, + 832, + 832 + ] + ] + ], + [ + 9006, + 835, + 836 + ] + ] + ] + ] + ], + [ + 9004, + 838, + 854, + [ + [ + 9037, + 838, + 854, + [ + [ + 9038, + 840, + 851, + [ + [ + 9047, + 841, + 841 + ], + [ + 9047, + 845, + 845 + ], + [ + 9049, + 849, + 850, + [ + [ + 9047, + 850, + 850 + ] + ] + ] + ] + ], + [ + 9006, + 853, + 854 + ] + ] + ] + ] + ], + [ + 9004, + 856, + 869, + [ + [ + 9037, + 856, + 869, + [ + [ + 9038, + 858, + 866, + [ + [ + 9082, + 859, + 861, + [ + [ + 9093, + 860, + 861 + ] + ] + ], + [ + 9005 + ], + [ + 9047, + 865, + 865 + ] + ] + ], + [ + 9006, + 868, + 869 + ] + ] + ] + ] + ], + [ + 9004, + 871, + 888, + [ + [ + 9037, + 871, + 888, + [ + [ + 9038, + 873, + 885, + [ + [ + 9082, + 874, + 876, + [ + [ + 9093, + 875, + 876 + ] + ] + ], + [ + 9047, + 880, + 880 + ], + [ + 9047, + 884, + 884 + ] + ] + ], + [ + 9006, + 887, + 888 + ] + ] + ] + ] + ], + [ + 9004, + 890, + 902, + [ + [ + 9037, + 890, + 902, + [ + [ + 9038, + 892, + 898, + [ + [ + 9047, + 893, + 893 + ], + [ + 9005 + ], + [ + 9047, + 897, + 897 + ] + ] + ], + [ + 9006, + 899, + 902 + ] + ] + ] + ] + ], + [ + 9004, + 904, + 910, + [ + [ + 9044, + 904, + 910, + [ + [ + 9045, + 906, + 908, + [ + [ + 9046, + 906, + 908, + [ + [ + 9013, + 906, + 906 + ], + [ + 9086, + 908, + 908 + ] + ] + ] + ] + ], + [ + 9004, + 910, + 910, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 912, + 921, + [ + [ + 9044, + 912, + 921, + [ + [ + 9045, + 914, + 916, + [ + [ + 9046, + 914, + 916, + [ + [ + 9013, + 914, + 914 + ], + [ + 9086, + 916, + 916 + ] + ] + ] + ] + ], + [ + 9006, + 919, + 921 + ] + ] + ] + ] + ], + [ + 9004, + 923, + 932, + [ + [ + 9044, + 923, + 932, + [ + [ + 9045, + 925, + 927, + [ + [ + 9046, + 925, + 927, + [ + [ + 9013, + 925, + 925 + ], + [ + 9086, + 927, + 927 + ] + ] + ] + ] + ], + [ + 9006, + 929, + 932 + ] + ] + ] + ] + ], + [ + 9004, + 934, + 948, + [ + [ + 9041, + 934, + 948, + [ + [ + 9006, + 936, + 937 + ], + [ + 9042, + 939, + 948, + [ + [ + 9043, + 939, + 948, + [ + [ + 9090, + 942, + 942 + ], + [ + 9047, + 944, + 944 + ], + [ + 9006, + 947, + 948 + ] + ] + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 950, + 975, + [ + [ + 9041, + 950, + 975, + [ + [ + 9006, + 952, + 953 + ], + [ + 9042, + 955, + 975, + [ + [ + 9043, + 955, + 964, + [ + [ + 9090, + 958, + 958 + ], + [ + 9047, + 960, + 960 + ], + [ + 9006, + 963, + 964 + ] + ] + ], + [ + 9043, + 966, + 975, + [ + [ + 9090, + 969, + 969 + ], + [ + 9047, + 971, + 971 + ], + [ + 9006, + 974, + 975 + ] + ] + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 977, + 980, + [ + [ + 9039, + 977, + 979, + [ + [ + 9086, + 979, + 979 + ] + ] + ] + ] + ], + [ + 9004, + 982, + 985, + [ + [ + 9075, + 982, + 984, + [ + [ + 9081, + 982, + 982 + ], + [ + 9047, + 984, + 984 + ] + ] + ] + ] + ], + [ + 9004, + 987, + 992, + [ + [ + 9077, + 987, + 991, + [ + [ + 9047, + 987, + 987 + ], + [ + 9081, + 989, + 989 + ], + [ + 9047, + 991, + 991 + ] + ] + ] + ] + ], + [ + 9004, + 994, + 999, + [ + [ + 9077, + 994, + 998, + [ + [ + 9047, + 994, + 994 + ], + [ + 9081, + 996, + 996 + ], + [ + 9047, + 998, + 998 + ] + ] + ] + ] + ], + [ + 9004, + 1001, + 1006, + [ + [ + 9077, + 1001, + 1005, + [ + [ + 9047, + 1001, + 1001 + ], + [ + 9081, + 1003, + 1003 + ], + [ + 9047, + 1005, + 1005 + ] + ] + ] + ] + ], + [ + 9004, + 1008, + 1013, + [ + [ + 9077, + 1008, + 1012, + [ + [ + 9047, + 1008, + 1008 + ], + [ + 9081, + 1010, + 1010 + ], + [ + 9047, + 1012, + 1012 + ] + ] + ] + ] + ], + [ + 9004, + 1015, + 1020, + [ + [ + 9103, + 1015, + 1019, + [ + [ + 9047, + 1015, + 1015 + ], + [ + 9081, + 1017, + 1017 + ], + [ + 9047, + 1019, + 1019 + ] + ] + ] + ] + ], + [ + 9004, + 1022, + 1027, + [ + [ + 9077, + 1022, + 1026, + [ + [ + 9047, + 1022, + 1022 + ], + [ + 9081, + 1024, + 1024 + ], + [ + 9047, + 1026, + 1026 + ] + ] + ] + ] + ], + [ + 9004, + 1029, + 1034, + [ + [ + 9077, + 1029, + 1033, + [ + [ + 9047, + 1029, + 1029 + ], + [ + 9081, + 1031, + 1031 + ], + [ + 9047, + 1033, + 1033 + ] + ] + ] + ] + ], + [ + 9004, + 1036, + 1041, + [ + [ + 9077, + 1036, + 1040, + [ + [ + 9047, + 1036, + 1036 + ], + [ + 9081, + 1038, + 1038 + ], + [ + 9047, + 1040, + 1040 + ] + ] + ] + ] + ], + [ + 9004, + 1043, + 1048, + [ + [ + 9077, + 1043, + 1047, + [ + [ + 9047, + 1043, + 1043 + ], + [ + 9081, + 1045, + 1045 + ], + [ + 9047, + 1047, + 1047 + ] + ] + ] + ] + ], + [ + 9004, + 1050, + 1055, + [ + [ + 9077, + 1050, + 1054, + [ + [ + 9047, + 1050, + 1050 + ], + [ + 9081, + 1052, + 1052 + ], + [ + 9047, + 1054, + 1054 + ] + ] + ] + ] + ], + [ + 9004, + 1057, + 1062, + [ + [ + 9077, + 1057, + 1061, + [ + [ + 9047, + 1057, + 1057 + ], + [ + 9081, + 1059, + 1059 + ], + [ + 9047, + 1061, + 1061 + ] + ] + ] + ] + ], + [ + 9004, + 1064, + 1066, + [ + [ + 9076, + 1064, + 1065, + [ + [ + 9047, + 1064, + 1064 + ], + [ + 9081, + 1065, + 1065 + ] + ] + ] + ] + ], + [ + 9004, + 1068, + 1070, + [ + [ + 9075, + 1068, + 1069, + [ + [ + 9081, + 1068, + 1068 + ], + [ + 9047, + 1069, + 1069 + ] + ] + ] + ] + ], + [ + 9004, + 1072, + 1074, + [ + [ + 9076, + 1072, + 1073, + [ + [ + 9047, + 1072, + 1072 + ], + [ + 9081, + 1073, + 1073 + ] + ] + ] + ] + ], + [ + 9004, + 1076, + 1078, + [ + [ + 9075, + 1076, + 1077, + [ + [ + 9081, + 1076, + 1076 + ], + [ + 9047, + 1077, + 1077 + ] + ] + ] + ] + ], + [ + 9004, + 1080, + 1082, + [ + [ + 9075, + 1080, + 1081, + [ + [ + 9081, + 1080, + 1080 + ], + [ + 9047, + 1081, + 1081 + ] + ] + ] + ] + ], + [ + 9004, + 1084, + 1086, + [ + [ + 9075, + 1084, + 1085, + [ + [ + 9081, + 1084, + 1084 + ], + [ + 9047, + 1085, + 1085 + ] + ] + ] + ] + ], + [ + 9004, + 1088, + 1090, + [ + [ + 9075, + 1088, + 1089, + [ + [ + 9081, + 1088, + 1088 + ], + [ + 9047, + 1089, + 1089 + ] + ] + ] + ] + ], + [ + 9004, + 1092, + 1094, + [ + [ + 9075, + 1092, + 1093, + [ + [ + 9081, + 1092, + 1092 + ], + [ + 9047, + 1093, + 1093 + ] + ] + ] + ] + ], + [ + 9004, + 1096, + 1101, + [ + [ + 9077, + 1096, + 1100, + [ + [ + 9047, + 1096, + 1096 + ], + [ + 9081, + 1098, + 1098 + ], + [ + 9047, + 1100, + 1100 + ] + ] + ] + ] + ], + [ + 9004, + 1103, + 1108, + [ + [ + 9077, + 1103, + 1107, + [ + [ + 9047, + 1103, + 1103 + ], + [ + 9081, + 1105, + 1105 + ], + [ + 9047, + 1107, + 1107 + ] + ] + ] + ] + ], + [ + 9004, + 1110, + 1115, + [ + [ + 9077, + 1110, + 1114, + [ + [ + 9047, + 1110, + 1110 + ], + [ + 9081, + 1112, + 1112 + ], + [ + 9047, + 1114, + 1114 + ] + ] + ] + ] + ], + [ + 9004, + 1117, + 1122, + [ + [ + 9077, + 1117, + 1121, + [ + [ + 9047, + 1117, + 1117 + ], + [ + 9081, + 1119, + 1119 + ], + [ + 9047, + 1121, + 1121 + ] + ] + ] + ] + ], + [ + 9004, + 1124, + 1129, + [ + [ + 9077, + 1124, + 1128, + [ + [ + 9047, + 1124, + 1124 + ], + [ + 9081, + 1126, + 1126 + ], + [ + 9047, + 1128, + 1128 + ] + ] + ] + ] + ], + [ + 9004, + 1131, + 1136, + [ + [ + 9077, + 1131, + 1135, + [ + [ + 9047, + 1131, + 1131 + ], + [ + 9081, + 1133, + 1133 + ], + [ + 9047, + 1135, + 1135 + ] + ] + ] + ] + ], + [ + 9004, + 1138, + 1143, + [ + [ + 9077, + 1138, + 1142, + [ + [ + 9047, + 1138, + 1138 + ], + [ + 9081, + 1140, + 1140 + ], + [ + 9047, + 1142, + 1142 + ] + ] + ] + ] + ], + [ + 9004, + 1145, + 1150, + [ + [ + 9077, + 1145, + 1149, + [ + [ + 9047, + 1145, + 1145 + ], + [ + 9081, + 1147, + 1147 + ], + [ + 9047, + 1149, + 1149 + ] + ] + ] + ] + ], + [ + 9004, + 1152, + 1157, + [ + [ + 9077, + 1152, + 1156, + [ + [ + 9047, + 1152, + 1152 + ], + [ + 9081, + 1154, + 1154 + ], + [ + 9047, + 1156, + 1156 + ] + ] + ] + ] + ], + [ + 9004, + 1159, + 1164, + [ + [ + 9077, + 1159, + 1163, + [ + [ + 9047, + 1159, + 1159 + ], + [ + 9081, + 1161, + 1161 + ], + [ + 9047, + 1163, + 1163 + ] + ] + ] + ] + ], + [ + 9004, + 1166, + 1169, + [ + [ + 9104, + 1166, + 1168, + [ + [ + 9047, + 1167, + 1167 + ] + ] + ] + ] + ], + [ + 9004, + 1171, + 1182, + [ + [ + 9104, + 1171, + 1181, + [ + [ + 9078, + 1172, + 1180, + [ + [ + 9047, + 1172, + 1172 + ], + [ + 9081, + 1174, + 1174 + ], + [ + 9047, + 1176, + 1176 + ], + [ + 9081, + 1178, + 1178 + ], + [ + 9047, + 1180, + 1180 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 1184, + 1192, + [ + [ + 9104, + 1184, + 1191, + [ + [ + 9078, + 1185, + 1190, + [ + [ + 9047, + 1185, + 1185 + ], + [ + 9081, + 1187, + 1187 + ], + [ + 9005 + ], + [ + 9081, + 1188, + 1188 + ], + [ + 9047, + 1190, + 1190 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 1194, + 1199, + [ + [ + 9077, + 1194, + 1198, + [ + [ + 9047, + 1194, + 1194 + ], + [ + 9081, + 1196, + 1196 + ], + [ + 9047, + 1198, + 1198 + ] + ] + ] + ] + ], + [ + 9004, + 1201, + 1206, + [ + [ + 9077, + 1201, + 1205, + [ + [ + 9047, + 1201, + 1201 + ], + [ + 9081, + 1203, + 1203 + ], + [ + 9047, + 1205, + 1205 + ] + ] + ] + ] + ], + [ + 9004, + 1208, + 1213, + [ + [ + 9077, + 1208, + 1212, + [ + [ + 9047, + 1208, + 1208 + ], + [ + 9081, + 1210, + 1210 + ], + [ + 9047, + 1212, + 1212 + ] + ] + ] + ] + ], + [ + 9004, + 1215, + 1220, + [ + [ + 9077, + 1215, + 1219, + [ + [ + 9047, + 1215, + 1215 + ], + [ + 9081, + 1217, + 1217 + ], + [ + 9047, + 1219, + 1219 + ] + ] + ] + ] + ], + [ + 9004, + 1222, + 1227, + [ + [ + 9077, + 1222, + 1226, + [ + [ + 9047, + 1222, + 1222 + ], + [ + 9081, + 1224, + 1224 + ], + [ + 9047, + 1226, + 1226 + ] + ] + ] + ] + ], + [ + 9004, + 1229, + 1234, + [ + [ + 9077, + 1229, + 1233, + [ + [ + 9047, + 1229, + 1229 + ], + [ + 9081, + 1231, + 1231 + ], + [ + 9047, + 1233, + 1233 + ] + ] + ] + ] + ], + [ + 9004, + 1236, + 1241, + [ + [ + 9077, + 1236, + 1240, + [ + [ + 9047, + 1236, + 1236 + ], + [ + 9081, + 1238, + 1238 + ], + [ + 9047, + 1240, + 1240 + ] + ] + ] + ] + ], + [ + 9004, + 1243, + 1248, + [ + [ + 9077, + 1243, + 1247, + [ + [ + 9047, + 1243, + 1243 + ], + [ + 9081, + 1245, + 1245 + ], + [ + 9047, + 1247, + 1247 + ] + ] + ] + ] + ], + [ + 9004, + 1250, + 1255, + [ + [ + 9077, + 1250, + 1254, + [ + [ + 9047, + 1250, + 1250 + ], + [ + 9081, + 1252, + 1252 + ], + [ + 9047, + 1254, + 1254 + ] + ] + ] + ] + ], + [ + 9004, + 1257, + 1262, + [ + [ + 9077, + 1257, + 1261, + [ + [ + 9047, + 1257, + 1257 + ], + [ + 9081, + 1259, + 1259 + ], + [ + 9047, + 1261, + 1261 + ] + ] + ] + ] + ], + [ + 9004, + 1264, + 1269, + [ + [ + 9077, + 1264, + 1268, + [ + [ + 9047, + 1264, + 1264 + ], + [ + 9081, + 1266, + 1266 + ], + [ + 9047, + 1268, + 1268 + ] + ] + ] + ] + ], + [ + 9004, + 1271, + 1276, + [ + [ + 9077, + 1271, + 1275, + [ + [ + 9047, + 1271, + 1271 + ], + [ + 9081, + 1273, + 1273 + ], + [ + 9047, + 1275, + 1275 + ] + ] + ] + ] + ], + [ + 9004, + 1278, + 1283, + [ + [ + 9077, + 1278, + 1282, + [ + [ + 9047, + 1278, + 1278 + ], + [ + 9081, + 1280, + 1280 + ], + [ + 9047, + 1282, + 1282 + ] + ] + ] + ] + ], + [ + 9004, + 1285, + 1290, + [ + [ + 9077, + 1285, + 1289, + [ + [ + 9047, + 1285, + 1285 + ], + [ + 9081, + 1287, + 1287 + ], + [ + 9047, + 1289, + 1289 + ] + ] + ] + ] + ], + [ + 9004, + 1292, + 1297, + [ + [ + 9077, + 1292, + 1296, + [ + [ + 9047, + 1292, + 1292 + ], + [ + 9081, + 1294, + 1294 + ], + [ + 9047, + 1296, + 1296 + ] + ] + ] + ] + ], + [ + 9004, + 1299, + 1304, + [ + [ + 9077, + 1299, + 1303, + [ + [ + 9047, + 1299, + 1299 + ], + [ + 9081, + 1301, + 1301 + ], + [ + 9047, + 1303, + 1303 + ] + ] + ] + ] + ], + [ + 9004, + 1306, + 1308, + [ + [ + 9079, + 1306, + 1307, + [ + [ + 9080, + 1306, + 1306 + ], + [ + 9047, + 1307, + 1307 + ] + ] + ] + ] + ], + [ + 9004, + 1310, + 1312, + [ + [ + 9079, + 1310, + 1311, + [ + [ + 9080, + 1310, + 1310 + ], + [ + 9047, + 1311, + 1311 + ] + ] + ] + ] + ], + [ + 9004, + 1314, + 1316, + [ + [ + 9079, + 1314, + 1315, + [ + [ + 9080, + 1314, + 1314 + ], + [ + 9047, + 1315, + 1315 + ] + ] + ] + ] + ], + [ + 9004, + 1318, + 1320, + [ + [ + 9079, + 1318, + 1319, + [ + [ + 9080, + 1318, + 1318 + ], + [ + 9047, + 1319, + 1319 + ] + ] + ] + ] + ], + [ + 9004, + 1322, + 1324, + [ + [ + 9079, + 1322, + 1323, + [ + [ + 9080, + 1322, + 1322 + ], + [ + 9047, + 1323, + 1323 + ] + ] + ] + ] + ], + [ + 9004, + 1326, + 1328, + [ + [ + 9079, + 1326, + 1327, + [ + [ + 9080, + 1326, + 1326 + ], + [ + 9047, + 1327, + 1327 + ] + ] + ] + ] + ], + [ + 9004, + 1330, + 1332, + [ + [ + 9079, + 1330, + 1331, + [ + [ + 9080, + 1330, + 1330 + ], + [ + 9047, + 1331, + 1331 + ] + ] + ] + ] + ], + [ + 9004, + 1334, + 1336, + [ + [ + 9079, + 1334, + 1335, + [ + [ + 9080, + 1334, + 1334 + ], + [ + 9047, + 1335, + 1335 + ] + ] + ] + ] + ], + [ + 9004, + 1338, + 1345, + [ + [ + 9077, + 1338, + 1344, + [ + [ + 9100, + 1338, + 1340, + [ + [ + 9047, + 1338, + 1338 + ], + [ + 9005 + ] + ] + ], + [ + 9081, + 1342, + 1342 + ], + [ + 9047, + 1344, + 1344 + ] + ] + ] + ] + ], + [ + 9004, + 1347, + 1349, + [ + [ + 9075, + 1347, + 1348, + [ + [ + 9081, + 1347, + 1347 + ], + [ + 9047, + 1348, + 1348 + ] + ] + ] + ] + ], + [ + 9004, + 1351, + 1352, + [ + [ + 9088, + 1351, + 1351 + ] + ] + ], + [ + 9004, + 1354, + 1355, + [ + [ + 9088, + 1354, + 1354 + ] + ] + ], + [ + 9004, + 1357, + 1358, + [ + [ + 9088, + 1357, + 1357 + ] + ] + ], + [ + 9004, + 1360, + 1361, + [ + [ + 9088, + 1360, + 1360 + ] + ] + ], + [ + 9004, + 1363, + 1364, + [ + [ + 9088, + 1363, + 1363 + ] + ] + ], + [ + 9004, + 1366, + 1367, + [ + [ + 9088, + 1366, + 1366 + ] + ] + ], + [ + 9004, + 1369, + 1370, + [ + [ + 9088, + 1369, + 1369 + ] + ] + ], + [ + 9004, + 1372, + 1375, + [ + [ + 9040, + 1372, + 1374, + [ + [ + 9013, + 1374, + 1374 + ] + ] + ] + ] + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 2 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 365, + 5 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 38, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 38, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 38, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 38, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 365, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 365, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 365, + 5 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 4 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 4 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 360, + 7 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 360, + 7 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 361, + 10 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 360, + 7 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 361, + 10 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 349, + 5 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 348, + 8 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 349, + 5 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 3 + ], + [ + 340, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 340, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 4 + ], + [ + 353, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 353, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 352, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 351, + 9 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 350, + 7 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 352, + 6 + ], + [ + 377, + 1 + ], + [ + 347, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 5 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 3 + ], + [ + 352, + 6 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 3 + ], + [ + 351, + 9 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 3 + ], + [ + 350, + 7 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 3 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 38, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 3 + ], + [ + 347, + 6 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 348, + 8 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 3 + ], + [ + 348, + 8 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 359, + 9 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 359, + 9 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 360, + 7 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 359, + 9 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 360, + 7 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 345, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 345, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 345, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 389, + 1 + ], + [ + 311, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 389, + 1 + ], + [ + 311, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 340, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 340, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 3 + ], + [ + 58, + 1 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 307, + 4 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 307, + 4 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 308, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 307, + 4 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 308, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 308, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 308, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 323, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 323, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 324, + 8 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 322, + 2 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 323, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 325, + 3 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 59, + 1 + ], + [ + 59, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 325, + 3 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 59, + 1 + ], + [ + 59, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 326, + 6 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 332, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 3 + ], + [ + 334, + 4 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 5 + ], + [ + 336, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 334, + 4 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 5 + ], + [ + 336, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 335, + 7 + ], + [ + 58, + 1 + ], + [ + 377, + 5 + ], + [ + 337, + 8 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 332, + 6 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 59, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 332, + 6 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 333, + 9 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 336, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 336, + 5 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 337, + 8 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 337, + 8 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 341, + 6 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 341, + 6 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 341, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 346, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 346, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 346, + 6 + ], + [ + 377, + 1 + ], + [ + 36, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 346, + 6 + ], + [ + 377, + 1 + ], + [ + 36, + 1 + ], + [ + 123, + 1 + ], + [ + 313, + 2 + ], + [ + 46, + 1 + ], + [ + 313, + 2 + ], + [ + 125, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 347, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 347, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 321, + 4 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 321, + 4 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 354, + 5 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 363, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 363, + 2 + ], + [ + 377, + 1 + ], + [ + 38, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 365, + 5 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 365, + 5 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 363, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 328, + 10 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 329, + 7 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 61, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 329, + 7 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 61, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 329, + 7 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 61, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 330, + 10 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 342, + 3 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 343, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 342, + 3 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 343, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 343, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 344, + 5 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 303, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 43, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 45, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 42, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 47, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 46, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 37, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 38, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 124, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 94, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 288, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 289, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 291, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 291, + 2 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 292, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 292, + 2 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 43, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 45, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 33, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 126, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 281, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 283, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 282, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 284, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 60, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 286, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 62, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 287, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 290, + 10 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 63, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 63, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 279, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 280, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 265, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 263, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 264, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 267, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 268, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 269, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 270, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 271, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 272, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 273, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 274, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 275, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 276, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 277, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 293, + 5 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 294, + 8 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 295, + 8 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 295, + 8 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 298, + 7 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 299, + 8 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 300, + 6 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 301, + 7 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 91, + 1 + ], + [ + 93, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 64, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 369, + 8 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 370, + 8 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 388, + 7 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 366, + 9 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 367, + 10 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 368, + 12 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 387, + 13 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 338, + 4 + ], + [ + 377, + 1 + ], + [ + 311, + 3 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/php-tags.php.test b/src/parser/xhpast/__tests__/data/php-tags.php.test new file mode 100644 index 00000000..d96ae106 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-tags.php.test @@ -0,0 +1,215 @@ + + + +
+ +~~~~~~~~~~ +pass, comment="Omits ASP tags since parser support is off as built." +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 21, + [ + [ + 9006, + 0, + 21, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 3, + [ + [ + 9086, + 2, + 2 + ] + ] + ], + [ + 9004, + 5, + 5, + [ + [ + 9005 + ] + ] + ], + [ + 9007, + 6, + 6 + ], + [ + 9004, + 8, + 9, + [ + [ + 9086, + 8, + 8 + ] + ] + ], + [ + 9004, + 11, + 11, + [ + [ + 9005 + ] + ] + ], + [ + 9007, + 12, + 12 + ], + [ + 9004, + 14, + 15, + [ + [ + 9086, + 14, + 14 + ] + ] + ], + [ + 9004, + 17, + 17, + [ + [ + 9005 + ] + ] + ], + [ + 9034, + 18, + 18 + ], + [ + 9034, + 19, + 19 + ], + [ + 9034, + 20, + 20 + ], + [ + 9034, + 21, + 21 + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 376, + 3 + ], + [ + 373, + 2 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 376, + 3 + ], + [ + 374, + 3 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 376, + 3 + ], + [ + 315, + 1 + ], + [ + 315, + 5 + ], + [ + 315, + 1 + ], + [ + 315, + 5 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/php-traits.php.test b/src/parser/xhpast/__tests__/data/php-traits.php.test new file mode 100644 index 00000000..060ea50c --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-traits.php.test @@ -0,0 +1,938 @@ + $z; + + $data = (yield $a); + $data = (yield $b => $c); +} +~~~~~~~~~~ +pass +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 54, + [ + [ + 9006, + 0, + 53, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 53, + [ + [ + 9050, + 2, + 53, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 4, + 4 + ], + [ + 9059, + 5, + 6 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 8, + 53, + [ + [ + 9004, + 10, + 11, + [ + [ + 9112, + 10, + 10, + [ + [ + 9005 + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 13, + 16, + [ + [ + 9112, + 13, + 15, + [ + [ + 9047, + 15, + 15, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 18, + 25, + [ + [ + 9112, + 18, + 24, + [ + [ + 9047, + 20, + 20 + ], + [ + 9047, + 24, + 24 + ] + ] + ] + ] + ], + [ + 9004, + 27, + 36, + [ + [ + 9077, + 27, + 35, + [ + [ + 9047, + 27, + 27 + ], + [ + 9081, + 29, + 29 + ], + [ + 9112, + 31, + 35, + [ + [ + 9047, + 34, + 34, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 38, + 51, + [ + [ + 9077, + 38, + 50, + [ + [ + 9047, + 38, + 38 + ], + [ + 9081, + 40, + 40 + ], + [ + 9112, + 42, + 50, + [ + [ + 9047, + 45, + 45 + ], + [ + 9047, + 49, + 49 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 2 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 3 + ], + [ + 394, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 394, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 394, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 363, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 4 + ], + [ + 313, + 5 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 394, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 313, + 5 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 394, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 363, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/return-type.php.test b/src/parser/xhpast/__tests__/data/return-type.php.test new file mode 100644 index 00000000..6b3c4737 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/return-type.php.test @@ -0,0 +1,2197 @@ + $right; +} else if ($node instanceof Node\Expr\BinaryOp\GreaterOrEqual) { + return $left >= $right; +} else if ($node instanceof Node\Expr\BinaryOp\Identical) { + return $left === $right; +} else if ($node instanceof Node\Expr\BinaryOp\LogicalAnd) { + return $left && $right; +} else if ($node instanceof Node\Expr\BinaryOp\LogicalOr) { + return $left || $right; +} else if ($node instanceof Node\Expr\BinaryOp\LogicalXor) { + return $left xor $right; +} else if ($node instanceof Node\Expr\BinaryOp\Minus) { + return $left - $right; +} else if ($node instanceof Node\Expr\BinaryOp\Mod) { + return $left % $right; +} else if ($node instanceof Node\Expr\BinaryOp\Mul) { + return $left * $right; +} else if ($node instanceof Node\Expr\BinaryOp\NotEqual) { + return $left != $right; +} else if ($node instanceof Node\Expr\BinaryOp\NotIdentical) { + return $left !== $right; +} else if ($node instanceof Node\Expr\BinaryOp\Plus) { + return $left + $right; +} else if ($node instanceof Node\Expr\BinaryOp\Pow) { + return pow($left, $right); +} else if ($node instanceof Node\Expr\BinaryOp\ShiftLeft) { + return $left << $right; +} else if ($node instanceof Node\Expr\BinaryOp\ShiftRight) { + return $left >> $right; +} else if ($node instanceof Node\Expr\BinaryOp\Smaller) { + return $left < $right; +} else if ($node instanceof Node\Expr\BinaryOp\SmallerOrEqual) { + return $left <= $right; +} else if ($node instanceof Node\Expr\BinaryOp\Spaceship) { + if ($left < $right) { + return -1; + } else if ($left == $right) { + return 0; + } else { + return 1; + } +} +~~~~~~~~~~ +pass diff --git a/src/parser/xhpast/api/XHPASTNode.php b/src/parser/xhpast/api/XHPASTNode.php new file mode 100644 index 00000000..0f0f9911 --- /dev/null +++ b/src/parser/xhpast/api/XHPASTNode.php @@ -0,0 +1,301 @@ +getTypeName(), array( + 'n_STRING_SCALAR', + 'n_NUMERIC_SCALAR', + )); + } + + public function getDocblockToken() { + if ($this->l == -1) { + return null; + } + $tokens = $this->tree->getRawTokenStream(); + + for ($ii = $this->l - 1; $ii >= 0; $ii--) { + if ($tokens[$ii]->getTypeName() == 'T_DOC_COMMENT') { + return $tokens[$ii]; + } + if (!$tokens[$ii]->isAnyWhitespace()) { + return null; + } + } + + return null; + } + + public function evalStatic() { + switch ($this->getTypeName()) { + case 'n_STATEMENT': + return $this->getChildByIndex(0)->evalStatic(); + break; + case 'n_STRING_SCALAR': + return (string)$this->getStringLiteralValue(); + case 'n_NUMERIC_SCALAR': + $value = $this->getSemanticString(); + if (preg_match('/^0x/i', $value)) { + // Hex + $value = base_convert(substr($value, 2), 16, 10); + } else if (preg_match('/^0\d+$/i', $value)) { + // Octal + $value = base_convert(substr($value, 1), 8, 10); + } + return +$value; + case 'n_SYMBOL_NAME': + $value = $this->getSemanticString(); + if ($value == 'INF') { + return INF; + } + switch (strtolower($value)) { + case 'true': + return true; + case 'false': + return false; + case 'null': + return null; + default: + throw new Exception(pht('Unrecognized symbol name.')); + } + break; + case 'n_UNARY_PREFIX_EXPRESSION': + $operator = $this->getChildOfType(0, 'n_OPERATOR'); + $operand = $this->getChildByIndex(1); + switch ($operator->getSemanticString()) { + case '-': + return -$operand->evalStatic(); + break; + case '+': + return $operand->evalStatic(); + break; + default: + throw new Exception( + pht('Unexpected operator in static expression.')); + } + break; + case 'n_ARRAY_LITERAL': + $result = array(); + $values = $this->getChildOfType(0, 'n_ARRAY_VALUE_LIST'); + foreach ($values->getChildren() as $child) { + $key = $child->getChildByIndex(0); + $val = $child->getChildByIndex(1); + if ($key->getTypeName() == 'n_EMPTY') { + $result[] = $val->evalStatic(); + } else { + $result[$key->evalStatic()] = $val->evalStatic(); + } + } + return $result; + case 'n_CONCATENATION_LIST': + $result = ''; + foreach ($this->getChildren() as $child) { + if ($child->getTypeName() == 'n_OPERATOR') { + continue; + } + $result .= $child->evalStatic(); + } + return $result; + default: + throw new Exception( + pht( + 'Unexpected node during static evaluation, of type: %s', + $this->getTypeName())); + } + } + + public function isConstantString() { + return $this->checkIsConstantString(); + } + + public function isConstantStringWithMagicConstants() { + return $this->checkIsConstantString(array('n_MAGIC_SCALAR')); + } + + private function checkIsConstantString(array $additional_types = array()) { + switch ($this->getTypeName()) { + case 'n_HEREDOC': + case 'n_STRING_SCALAR': + return !$this->getStringVariables(); + + case 'n_CONCATENATION_LIST': + foreach ($this->getChildren() as $child) { + if ($child->getTypeName() == 'n_OPERATOR') { + continue; + } + if (!$child->checkIsConstantString($additional_types)) { + return false; + } + } + return true; + + default: + if (in_array($this->getTypeName(), $additional_types)) { + return true; + } + + return false; + } + } + + public function getStringVariables() { + $value = $this->getConcreteString(); + + switch ($this->getTypeName()) { + case 'n_HEREDOC': + if (preg_match("/^<<<\s*'/", $value)) { // Nowdoc: <<<'EOT' + return array(); + } + break; + + case 'n_STRING_SCALAR': + if ($value[0] == "'") { + return array(); + } + break; + + default: + throw new Exception(pht('Unexpected type %s.', $this->getTypeName())); + } + + // We extract just the variable names and ignore properties and array keys. + $re = '/\\\\.|(\$|\{\$|\${)([a-z_\x7F-\xFF][a-z0-9_\x7F-\xFF]*)/i'; + $matches = null; + preg_match_all($re, $value, $matches, PREG_OFFSET_CAPTURE); + return ipull(array_filter($matches[2]), 0, 1); + } + + public function getStringLiteralValue() { + if ($this->getTypeName() != 'n_STRING_SCALAR') { + return null; + } + + $value = $this->getSemanticString(); + $type = $value[0]; + $value = preg_replace('/^b?[\'"]|[\'"]$/i', '', $value); + $esc = false; + $len = strlen($value); + $out = ''; + + if ($type == "'") { + // Single quoted strings treat everything as a literal except "\\" and + // "\'". + return str_replace( + array('\\\\', '\\\''), + array('\\', "'"), + $value); + } + + // Double quoted strings treat "\X" as a literal if X isn't specifically + // a character which needs to be escaped -- e.g., "\q" and "\'" are + // literally "\q" and "\'". stripcslashes() is too aggressive, so find + // all these under-escaped backslashes and escape them. + + for ($ii = 0; $ii < $len; $ii++) { + $c = $value[$ii]; + if ($esc) { + $esc = false; + switch ($c) { + case 'x': + $u = isset($value[$ii + 1]) ? $value[$ii + 1] : null; + if (!preg_match('/^[a-f0-9]/i', $u)) { + // PHP treats \x followed by anything which is not a hex digit + // as a literal \x. + $out .= '\\\\'.$c; + break; + } + /* fallthrough */ + case 'n': + case 'r': + case 'f': + case 'v': + case '"': + case '$': + case 't': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + $out .= '\\'.$c; + break; + case 'e': + // Since PHP 5.4.0, this means "esc". However, stripcslashes() does + // not perform this conversion. + $out .= chr(27); + break; + default: + $out .= '\\\\'.$c; + break; + } + } else if ($c == '\\') { + $esc = true; + } else { + $out .= $c; + } + } + + return stripcslashes($out); + } + + /** + * Determines the parent namespace for a node. + * + * Traverses the AST upwards from a given node in order to determine the + * namespace in which the node is declared. + * + * To prevent any possible ambiguity, the returned namespace will always be + * prefixed with the namespace separator. + * + * @param XHPASTNode The input node. + * @return string|null The namespace which contains the input node, or + * `null` if no such node exists. + */ + public function getNamespace() { + $namespaces = $this + ->getTree() + ->getRootNode() + ->selectDescendantsOfType('n_NAMESPACE') + ->getRawNodes(); + + foreach (array_reverse($namespaces) as $namespace) { + if ($namespace->isAfter($this)) { + continue; + } + + $body = $namespace->getChildByIndex(1); + if ($body->getTypeName() != 'n_EMPTY') { + if (!$body->containsDescendant($this)) { + continue; + } + } + + return $namespace->getNamespaceName(); + } + + return null; + } + + /** + * Returns the namespace name from a node of type `n_NAMESPACE`. + * + * @return string|null + */ + private function getNamespaceName() { + if ($this->getTypeName() != 'n_NAMESPACE') { + return null; + } + + $namespace_name = $this->getChildByIndex(0); + if ($namespace_name->getTypeName() == 'n_EMPTY') { + return null; + } + + return '\\'.$namespace_name->getConcreteString(); + } + +} diff --git a/src/parser/xhpast/api/XHPASTSyntaxErrorException.php b/src/parser/xhpast/api/XHPASTSyntaxErrorException.php new file mode 100644 index 00000000..395b07ff --- /dev/null +++ b/src/parser/xhpast/api/XHPASTSyntaxErrorException.php @@ -0,0 +1,16 @@ +errorLine = $line; + parent::__construct($message); + } + + public function getErrorLine() { + return $this->errorLine; + } + +} diff --git a/src/parser/xhpast/api/XHPASTToken.php b/src/parser/xhpast/api/XHPASTToken.php new file mode 100644 index 00000000..6013c8b1 --- /dev/null +++ b/src/parser/xhpast/api/XHPASTToken.php @@ -0,0 +1,39 @@ +typeName)) { + $type_id = $this->typeID; + if ($type_id <= 255) { + $this->typeName = chr($type_id); + } + $this->typeName = parent::getTypeName(); + } + return $this->typeName; + } + + public function isComment() { + static $type_ids = null; + if ($type_ids === null) { + $type_ids = array( + $this->tree->getTokenTypeIDFromTypeName('T_COMMENT') => true, + $this->tree->getTokenTypeIDFromTypeName('T_DOC_COMMENT') => true, + ); + } + + return isset($type_ids[$this->typeID]); + } + + public function isAnyWhitespace() { + static $type_ids = null; + if ($type_ids === null) { + $type_ids = array( + $this->tree->getTokenTypeIDFromTypeName('T_WHITESPACE') => true, + ); + } + + return isset($type_ids[$this->typeID]); + } + +} diff --git a/src/parser/xhpast/api/XHPASTTree.php b/src/parser/xhpast/api/XHPASTTree.php new file mode 100644 index 00000000..2fa08a89 --- /dev/null +++ b/src/parser/xhpast/api/XHPASTTree.php @@ -0,0 +1,78 @@ +setTreeType('XHP'); + $this->setNodeConstants(xhp_parser_node_constants()); + $this->setTokenConstants(xhpast_parser_token_constants()); + + parent::__construct($tree, $stream, $source); + } + + public function newNode($id, array $data, AASTTree $tree) { + return new XHPASTNode($id, $data, $tree); + } + + public function newToken($id, $type, $value, $offset, AASTTree $tree) { + return new XHPASTToken($id, $type, $value, $offset, $tree); + } + + public static function newFromData($php_source) { + $future = PhutilXHPASTBinary::getParserFuture($php_source); + return self::newFromDataAndResolvedExecFuture( + $php_source, + $future->resolve()); + } + + public static function newStatementFromString($string) { + $string = 'getRootNode()->selectDescendantsOfType('n_STATEMENT'); + if (count($statements) != 1) { + throw new Exception( + pht('String does not parse into exactly one statement!')); + } + // Return the first one, trying to use reset() with iterators ends in tears. + foreach ($statements as $statement) { + return $statement; + } + } + + public static function newFromDataAndResolvedExecFuture( + $php_source, + array $resolved) { + + list($err, $stdout, $stderr) = $resolved; + if ($err) { + if ($err == 1) { + $matches = null; + $is_syntax = preg_match( + '/^XHPAST Parse Error: (.*) on line (\d+)/s', + $stderr, + $matches); + if ($is_syntax) { + throw new XHPASTSyntaxErrorException($matches[2], trim($stderr)); + } + } + throw new Exception( + pht( + '%s failed to parse file data %d: %s', + 'XHPAST', + $err, + $stderr)); + } + + $data = null; + try { + $data = phutil_json_decode($stdout); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('%s: failed to decode tree.', 'XHPAST'), + $ex); + } + + return new XHPASTTree($data['tree'], $data['stream'], $php_source); + } + +} diff --git a/src/parser/xhpast/api/__tests__/XHPASTNodeTestCase.php b/src/parser/xhpast/api/__tests__/XHPASTNodeTestCase.php new file mode 100644 index 00000000..8e4ecbb1 --- /dev/null +++ b/src/parser/xhpast/api/__tests__/XHPASTNodeTestCase.php @@ -0,0 +1,101 @@ +assertStringVariables(array(), '""'); + $this->assertStringVariables(array(2 => 'abc'), '"$abc"'); + $this->assertStringVariables(array(), '"\$abc"'); + $this->assertStringVariables(array(2 => 'a'), '"$a[1]"'); + $this->assertStringVariables(array(3 => 'a'), '"{$a[1]}"'); + $this->assertStringVariables(array(2 => 'a', 5 => 'a'), '"$a $a"'); + + $this->assertStringVariables(array(), "''"); + $this->assertStringVariables(array(), "'\$a'"); + + $this->assertStringVariables(array(), "<<assertStringVariables(array(8 => 'a'), "<<assertStringVariables(array(), "<<<'EOT'\n\$a\nEOT"); + } + + private function assertStringVariables($expected, $string) { + $statement = XHPASTTree::newStatementFromString($string); + $this->assertEqual( + $expected, + $statement->getChildByIndex(0)->getStringVariables(), + $string); + } + + public function testGetNamespace() { + $dir = dirname(__FILE__).'/namespace/'; + $files = id(new FileFinder($dir)) + ->withType('f') + ->withSuffix('php.test') + ->find(); + + foreach ($files as $file) { + list($tree, $expect) = $this->readTestData($dir.'/'.$file); + + $root = $tree->getRootNode(); + $classes = $root->selectDescendantsOfType('n_CLASS_DECLARATION'); + + foreach ($classes as $class) { + $id = (string)$class->getID(); + + if (idx($expect, $id, false) === false) { + throw new Exception( + pht( + 'No expected value for node %d in file "%s".', + $class->getID(), + $file)); + } + + $this->assertEqual( + $expect[$id], + $class->getNamespace()); + } + } + } + + /** + * Reads and parses test data from a specified file. + * + * This method reads and parses test data from a file. The file is expected + * to have the following structure + * + * ``` + * The first element of the pair is the + * `XHPASTTree` contained within the test file. + * The second element of the pair is the + * "expect" data. + */ + private function readTestData($file) { + $contents = Filesystem::readFile($file); + $contents = preg_split('/^~{10}$/m', $contents); + + if (count($contents) < 2) { + throw new Exception( + pht( + "Expected '%s' separating test case and results.", + '~~~~~~~~~~')); + } + + list($data, $expect) = $contents; + + $tree = XHPASTTree::newFromData($data); + $expect = phutil_json_decode($expect); + + return array($tree, $expect); + } + +} diff --git a/src/parser/xhpast/api/__tests__/XHPASTTreeTestCase.php b/src/parser/xhpast/api/__tests__/XHPASTTreeTestCase.php new file mode 100644 index 00000000..dfea2c14 --- /dev/null +++ b/src/parser/xhpast/api/__tests__/XHPASTTreeTestCase.php @@ -0,0 +1,140 @@ +assertEval(1, '1'); + $this->assertEval('a', '"a"'); + $this->assertEval(-1.1, '-1.1'); + $this->assertEval( + array('foo', 'bar', -1, +2, -3.4, +4.3, 1e10, 1e-5, -2.3e7), + "array('foo', 'bar', -1, +2, -3.4, +4.3, 1e10, 1e-5, -2.3e7)"); + $this->assertEval( + array(), + 'array()'); + $this->assertEval( + array(42 => 7, 'a' => 5, 1, 2, 3, 4, 1 => 'goo'), + "array(42 => 7, 'a' => 5, 1, 2, 3, 4, 1 => 'goo')"); + $this->assertEval( + array('a' => 'a', 'b' => array(1, 2, array(3))), + "array('a' => 'a', 'b' => array(1, 2, array(3)))"); + $this->assertEval( + array(true, false, null), + 'array(true, false, null)'); + + // Duplicate keys + $this->assertEval( + array(0 => '1', 0 => '2'), + "array(0 => '1', 0 => '2')"); + + $this->assertEval('simple string', "'simple string'"); + $this->assertEval('42', "'42'"); + $this->assertEval('binary string', "b'binary string'"); + $this->assertEval(3.1415926, '3.1415926'); + $this->assertEval(42, '42'); + $this->assertEval( + array(2147483648, 2147483647, -2147483648, -2147483647), + 'array(2147483648, 2147483647, -2147483648, -2147483647)'); + + $this->assertEval(INF, 'INF'); + $this->assertEval(-INF, '-INF'); + + $this->assertEval(0x1b, '0x1b'); + $this->assertEval(0X0A, '0X0A'); + + // Octal + $this->assertEval(010, '010'); + // TODO: this passes on < PHP 7 for some reason but fails on PHP 7 correctly + //$this->assertEval(080, '080'); // Invalid! + + // Leading 0, but float, not octal. + $this->assertEval(0.11e1, '0.11e1'); + $this->assertEval(0e1, '0e1'); + + $this->assertEval(0, '0'); + + // Static evaluation treats '$' as a literal dollar glyph. + $this->assertEval('$asdf', '"$asdf"'); + + $this->assertEval( + '\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z'. + '\1\2\3\4\5\6\7\8\9\0'. + '\!\@\#\$\%\^\&\*\(\)'. + '\`\~\\\|\[\]\{\}\<\>\,\.\/\?\:\;\-\_\=\+', + + "'\\a\\b\\c\\d\\e\\f\\g\\h\\i\\j\\k\\l\\m\\n\\o\\p\\q". + "\\r\\s\\t\\u\\v\\w\\x\\y\\z". + "\\1\\2\\3\\4\\5\\6\\7\\8\\9\\0". + "\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)". + "\\`\\~\\\\\\|\\[\\]\\{\\}\\<\\>\\,\\.\\/\\?\\:\\;\\-\\_\\=\\+". + "'"); + + // After PHP 5.4.0, "\e" means "escape", not "backslash e". We implement the + // newer rules, but if we're running in an older version of PHP we can not + // express them with "\e". + $this->assertEval(chr(27), '"\\e"'); + + $this->assertEval( + "\a\b\c\d\x1B\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z". + "\1\2\3\4\5\6\7\8\9\0". + "\!\@\#\$\%\^\&\*\(\)". + "\`\~\\\|\[\]\{\}\<\>\,\.\/\?\:\;\-\_\=\+", + + '"\\a\\b\\c\\d\\e\\f\\g\\h\\i\\j\\k\\l\\m\\n\\o\\p\\q'. + '\\r\\s\\t\\u\\v\\w\\x\\y\\z'. + '\\1\\2\\3\\4\\5\\6\\7\\8\\9\\0'. + '\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)'. + '\\`\\~\\\\\\|\\[\\]\\{\\}\\<\\>\\,\\.\\/\\?\\:\\;\\-\\_\\=\\+"'); + + $this->assertEval( + '\' "', + "'\\' \"'"); + + $this->assertEval( + '\\ \\\\ ', + '\'\\\\ \\\\\\\\ \''); + + $this->assertEval( + '\ \\ ', + "'\\ \\\\ '"); + + $this->assertEval( + '\x92', + '\'\x92\''); + + $this->assertEval( + "\x92", + '"\x92"'); + + $this->assertEval( + "\x", + '"\x"'); + + $this->assertEval( + "\x1", + '"\x1"'); + + $this->assertEval( + "\x000 !", + '"\x000 !"'); + + $this->assertEval( + "\x0", + '"\x0"'); + + $this->assertEval( + "\xg", + '"\xg"'); + } + + private function assertEval($value, $string) { + $this->assertEqual( + $value, + XHPASTTree::newStatementFromString($string)->evalStatic(), + $string); + } + +} diff --git a/src/parser/xhpast/api/__tests__/namespace/braces.lint-test b/src/parser/xhpast/api/__tests__/namespace/braces.lint-test new file mode 100644 index 00000000..b9864a17 --- /dev/null +++ b/src/parser/xhpast/api/__tests__/namespace/braces.lint-test @@ -0,0 +1,18 @@ +write($data); + + return $future; + } + + /** + * Returns the path to the XHPAST binary. + * + * @return string + */ + public static function getPath() { + if (phutil_is_windows()) { + return dirname(__FILE__).'\\xhpast.exe'; + } + return dirname(__FILE__).'/xhpast'; + } + + /** + * Returns the XHPAST version. + * + * @return string + */ + public static function getVersion() { + if (self::$version === null) { + $bin = self::getPath(); + + if (Filesystem::pathExists($bin)) { + list($err, $stdout) = exec_manual('%s --version', $bin); + if (!$err) { + self::$version = trim($stdout); + } + } + } + + return self::$version; + } + + /** + * Checks if XHPAST is built and up-to-date. + * + * @return bool + */ + public static function isAvailable() { + return self::getVersion() == self::EXPECTED_VERSION; + } + +} diff --git a/src/parser/xhpast/bin/xhpast.exe b/src/parser/xhpast/bin/xhpast.exe new file mode 100644 index 0000000000000000000000000000000000000000..ab6918406c03471e2fb6a31ea974d4a626785d9d GIT binary patch literal 2397674 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

={Yt$#H*lUTDJk%$=me!Kz9rlpxwRrHQp-J3d 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

FH4A4*`917l84>{Vm6P`;{HgM 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 g>c&4zFrwSK& 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