PageRenderTime 125ms CodeModel.GetById 32ms RepoModel.GetById 5ms app.codeStats 1ms

/composer-setup.php

https://gitlab.com/BlokNotWebapp/StockFiches
PHP | 5030 lines | 871 code | 69 blank | 4090 comment | 84 complexity | e4fd28a313caec07596aae2143ed995e MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /*
  3. * This file is part of Composer.
  4. *
  5. * (c) Nils Adermann <naderman@naderman.de>
  6. * Jordi Boggiano <j.boggiano@seld.be>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. process(is_array($argv) ? $argv : array());
  12. /**
  13. * processes the installer
  14. */
  15. function process($argv)
  16. {
  17. // Determine ANSI output from --ansi and --no-ansi flags
  18. setUseAnsi($argv);
  19. if (in_array('--help', $argv)) {
  20. displayHelp();
  21. exit(0);
  22. }
  23. $check = in_array('--check', $argv);
  24. $help = in_array('--help', $argv);
  25. $force = in_array('--force', $argv);
  26. $quiet = in_array('--quiet', $argv);
  27. $channel = in_array('--snapshot', $argv) ? 'snapshot' : (in_array('--preview', $argv) ? 'preview' : 'stable');
  28. $disableTls = in_array('--disable-tls', $argv);
  29. $installDir = getOptValue('--install-dir', $argv, false);
  30. $version = getOptValue('--version', $argv, false);
  31. $filename = getOptValue('--filename', $argv, 'composer.phar');
  32. $cafile = getOptValue('--cafile', $argv, false);
  33. if (!checkParams($installDir, $version, $cafile)) {
  34. exit(1);
  35. }
  36. $ok = checkPlatform($warnings, $quiet, $disableTls);
  37. if ($check) {
  38. // Only show warnings if we haven't output any errors
  39. if ($ok) {
  40. showWarnings($warnings);
  41. showSecurityWarning($disableTls);
  42. }
  43. exit($ok ? 0 : 1);
  44. }
  45. if ($ok || $force) {
  46. installComposer($version, $installDir, $filename, $quiet, $disableTls, $cafile, $channel);
  47. showWarnings($warnings);
  48. showSecurityWarning($disableTls);
  49. exit(0);
  50. }
  51. exit(1);
  52. }
  53. /**
  54. * displays the help
  55. */
  56. function displayHelp()
  57. {
  58. echo <<<EOF
  59. Composer Installer
  60. ------------------
  61. Options
  62. --help this help
  63. --check for checking environment only
  64. --force forces the installation
  65. --ansi force ANSI color output
  66. --no-ansi disable ANSI color output
  67. --quiet do not output unimportant messages
  68. --install-dir="..." accepts a target installation directory
  69. --preview install the latest version from the preview (alpha/beta/rc) channel instead of stable
  70. --snapshot install the latest version from the snapshot (dev builds) channel instead of stable
  71. --version="..." accepts a specific version to install instead of the latest
  72. --filename="..." accepts a target filename (default: composer.phar)
  73. --disable-tls disable SSL/TLS security for file downloads
  74. --cafile="..." accepts a path to a Certificate Authority (CA) certificate file for SSL/TLS verification
  75. EOF;
  76. }
  77. /**
  78. * Sets the USE_ANSI define for colorizing output
  79. *
  80. * @param array $argv Command-line arguments
  81. */
  82. function setUseAnsi($argv)
  83. {
  84. // --no-ansi wins over --ansi
  85. if (in_array('--no-ansi', $argv)) {
  86. define('USE_ANSI', false);
  87. } elseif (in_array('--ansi', $argv)) {
  88. define('USE_ANSI', true);
  89. } else {
  90. // On Windows, default to no ANSI, except in ANSICON and ConEmu.
  91. // Everywhere else, default to ANSI if stdout is a terminal.
  92. define(
  93. 'USE_ANSI',
  94. (DIRECTORY_SEPARATOR == '\\')
  95. ? (false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI'))
  96. : (function_exists('posix_isatty') && posix_isatty(1))
  97. );
  98. }
  99. }
  100. /**
  101. * Returns the value of a command-line option
  102. *
  103. * @param string $opt The command-line option to check
  104. * @param array $argv Command-line arguments
  105. * @param mixed $default Default value to be returned
  106. *
  107. * @return mixed The command-line value or the default
  108. */
  109. function getOptValue($opt, $argv, $default)
  110. {
  111. $optLength = strlen($opt);
  112. foreach ($argv as $key => $value) {
  113. $next = $key + 1;
  114. if (0 === strpos($value, $opt)) {
  115. if ($optLength === strlen($value) && isset($argv[$next])) {
  116. return trim($argv[$next]);
  117. } else {
  118. return trim(substr($value, $optLength + 1));
  119. }
  120. }
  121. }
  122. return $default;
  123. }
  124. /**
  125. * Checks that user-supplied params are valid
  126. *
  127. * @param mixed $installDir The required istallation directory
  128. * @param mixed $version The required composer version to install
  129. * @param mixed $cafile Certificate Authority file
  130. *
  131. * @return bool True if the supplied params are okay
  132. */
  133. function checkParams($installDir, $version, $cafile)
  134. {
  135. $result = true;
  136. if (false !== $installDir && !is_dir($installDir)) {
  137. out("The defined install dir ({$installDir}) does not exist.", 'info');
  138. $result = false;
  139. }
  140. if (false !== $version && 1 !== preg_match('/^\d+\.\d+\.\d+(\-(alpha|beta)\d+)*$/', $version)) {
  141. out("The defined install version ({$version}) does not match release pattern.", 'info');
  142. $result = false;
  143. }
  144. if (false !== $cafile && (!file_exists($cafile) || !is_readable($cafile))) {
  145. out("The defined Certificate Authority (CA) cert file ({$cafile}) does not exist or is not readable.", 'info');
  146. $result = false;
  147. }
  148. return $result;
  149. }
  150. /**
  151. * Checks the platform for possible issues running Composer
  152. *
  153. * Errors are written to the output, warnings are saved for later display.
  154. *
  155. * @param array $warnings Populated by method, to be shown later
  156. * @param bool $quiet Quiet mode
  157. * @param bool $disableTls Bypass tls
  158. *
  159. * @return bool True if there are no errors
  160. */
  161. function checkPlatform(&$warnings, $quiet, $disableTls)
  162. {
  163. getPlatformIssues($errors, $warnings);
  164. // Make openssl warning an error if tls has not been specifically disabled
  165. if (isset($warnings['openssl']) && !$disableTls) {
  166. $errors['openssl'] = $warnings['openssl'];
  167. unset($warnings['openssl']);
  168. }
  169. if (!empty($errors)) {
  170. out('Some settings on your machine make Composer unable to work properly.', 'error');
  171. out('Make sure that you fix the issues listed below and run this script again:', 'error');
  172. outputIssues($errors);
  173. return false;
  174. }
  175. if (empty($warnings) && !$quiet) {
  176. out('All settings correct for using Composer', 'success');
  177. }
  178. return true;
  179. }
  180. /**
  181. * Checks platform configuration for common incompatibility issues
  182. *
  183. * @param array $errors Populated by method
  184. * @param array $warnings Populated by method
  185. *
  186. * @return bool If any errors or warnings have been found
  187. */
  188. function getPlatformIssues(&$errors, &$warnings)
  189. {
  190. $errors = array();
  191. $warnings = array();
  192. if ($iniPath = php_ini_loaded_file()) {
  193. $iniMessage = PHP_EOL . 'The php.ini used by your command-line PHP is: ' . $iniPath;
  194. } else {
  195. $iniMessage = PHP_EOL . 'A php.ini file does not exist. You will have to create one.';
  196. }
  197. $iniMessage .= PHP_EOL . 'If you can not modify the ini file, you can also run `php -d option=value` to modify ini values on the fly. You can use -d multiple times.';
  198. if (ini_get('detect_unicode')) {
  199. $errors['unicode'] = array(
  200. 'The detect_unicode setting must be disabled.',
  201. 'Add the following to the end of your `php.ini`:',
  202. ' detect_unicode = Off',
  203. $iniMessage
  204. );
  205. }
  206. if (extension_loaded('suhosin')) {
  207. $suhosin = ini_get('suhosin.executor.include.whitelist');
  208. $suhosinBlacklist = ini_get('suhosin.executor.include.blacklist');
  209. if (false === stripos($suhosin, 'phar') && (!$suhosinBlacklist || false !== stripos($suhosinBlacklist, 'phar'))) {
  210. $errors['suhosin'] = array(
  211. 'The suhosin.executor.include.whitelist setting is incorrect.',
  212. 'Add the following to the end of your `php.ini` or suhosin.ini (Example path [for Debian]: /etc/php5/cli/conf.d/suhosin.ini):',
  213. ' suhosin.executor.include.whitelist = phar ' . $suhosin,
  214. $iniMessage
  215. );
  216. }
  217. }
  218. if (!function_exists('json_decode')) {
  219. $errors['json'] = array(
  220. 'The json extension is missing.',
  221. 'Install it or recompile php without --disable-json'
  222. );
  223. }
  224. if (!extension_loaded('Phar')) {
  225. $errors['phar'] = array(
  226. 'The phar extension is missing.',
  227. 'Install it or recompile php without --disable-phar'
  228. );
  229. }
  230. if (!extension_loaded('filter')) {
  231. $errors['filter'] = array(
  232. 'The filter extension is missing.',
  233. 'Install it or recompile php without --disable-filter'
  234. );
  235. }
  236. if (!extension_loaded('hash')) {
  237. $errors['hash'] = array(
  238. 'The hash extension is missing.',
  239. 'Install it or recompile php without --disable-hash'
  240. );
  241. }
  242. if (!extension_loaded('iconv') && !extension_loaded('mbstring')) {
  243. $errors['iconv_mbstring'] = array(
  244. 'The iconv OR mbstring extension is required and both are missing.',
  245. 'Install either of them or recompile php without --disable-iconv'
  246. );
  247. }
  248. if (!ini_get('allow_url_fopen')) {
  249. $errors['allow_url_fopen'] = array(
  250. 'The allow_url_fopen setting is incorrect.',
  251. 'Add the following to the end of your `php.ini`:',
  252. ' allow_url_fopen = On',
  253. $iniMessage
  254. );
  255. }
  256. if (extension_loaded('ionCube Loader') && ioncube_loader_iversion() < 40009) {
  257. $ioncube = ioncube_loader_version();
  258. $errors['ioncube'] = array(
  259. 'Your ionCube Loader extension (' . $ioncube . ') is incompatible with Phar files.',
  260. 'Upgrade to ionCube 4.0.9 or higher or remove this line (path may be different) from your `php.ini` to disable it:',
  261. ' zend_extension = /usr/lib/php5/20090626+lfs/ioncube_loader_lin_5.3.so',
  262. $iniMessage
  263. );
  264. }
  265. if (version_compare(PHP_VERSION, '5.3.2', '<')) {
  266. $errors['php'] = array(
  267. 'Your PHP (' . PHP_VERSION . ') is too old, you must upgrade to PHP 5.3.2 or higher.'
  268. );
  269. }
  270. if (version_compare(PHP_VERSION, '5.3.4', '<')) {
  271. $warnings['php'] = array(
  272. 'Your PHP (' . PHP_VERSION . ') is quite old, upgrading to PHP 5.3.4 or higher is recommended.',
  273. 'Composer works with 5.3.2+ for most people, but there might be edge case issues.'
  274. );
  275. }
  276. if (!extension_loaded('openssl')) {
  277. $warnings['openssl'] = array(
  278. 'The openssl extension is missing, which means that secure HTTPS transfers are impossible.',
  279. 'If possible you should enable it or recompile php with --with-openssl'
  280. );
  281. }
  282. if (extension_loaded('openssl') && OPENSSL_VERSION_NUMBER < 0x1000100f) {
  283. // Attempt to parse version number out, fallback to whole string value.
  284. $opensslVersion = trim(strstr(OPENSSL_VERSION_TEXT, ' '));
  285. $opensslVersion = substr($opensslVersion, 0, strpos($opensslVersion, ' '));
  286. $opensslVersion = $opensslVersion ? $opensslVersion : OPENSSL_VERSION_TEXT;
  287. $warnings['openssl_version'] = array(
  288. 'The OpenSSL library (' . $opensslVersion . ') used by PHP does not support TLSv1.2 or TLSv1.1.',
  289. 'If possible you should upgrade OpenSSL to version 1.0.1 or above.'
  290. );
  291. }
  292. if (!defined('HHVM_VERSION') && !extension_loaded('apcu') && ini_get('apc.enable_cli')) {
  293. $warnings['apc_cli'] = array(
  294. 'The apc.enable_cli setting is incorrect.',
  295. 'Add the following to the end of your `php.ini`:',
  296. ' apc.enable_cli = Off',
  297. $iniMessage
  298. );
  299. }
  300. if (extension_loaded('xdebug')) {
  301. $warnings['xdebug_loaded'] = array(
  302. 'The xdebug extension is loaded, this can slow down Composer a little.',
  303. 'Disabling it when using Composer is recommended.'
  304. );
  305. if (ini_get('xdebug.profiler_enabled')) {
  306. $warnings['xdebug_profile'] = array(
  307. 'The xdebug.profiler_enabled setting is enabled, this can slow down Composer a lot.',
  308. 'Add the following to the end of your `php.ini` to disable it:',
  309. ' xdebug.profiler_enabled = 0',
  310. $iniMessage
  311. );
  312. }
  313. }
  314. if (!extension_loaded('zlib')) {
  315. $warnings['zlib'] = array(
  316. 'The zlib extension is not loaded, this can slow down Composer a lot.',
  317. 'If possible, install it or recompile php with --with-zlib',
  318. $iniMessage
  319. );
  320. }
  321. ob_start();
  322. phpinfo(INFO_GENERAL);
  323. $phpinfo = ob_get_clean();
  324. if (preg_match('{Configure Command(?: *</td><td class="v">| *=> *)(.*?)(?:</td>|$)}m', $phpinfo, $match)) {
  325. $configure = $match[1];
  326. if (false !== strpos($configure, '--enable-sigchild')) {
  327. $warnings['sigchild'] = array(
  328. 'PHP was compiled with --enable-sigchild which can cause issues on some platforms.',
  329. 'Recompile it without this flag if possible, see also:',
  330. ' https://bugs.php.net/bug.php?id=22999'
  331. );
  332. }
  333. if (false !== strpos($configure, '--with-curlwrappers')) {
  334. $warnings['curlwrappers'] = array(
  335. 'PHP was compiled with --with-curlwrappers which will cause issues with HTTP authentication and GitHub.',
  336. 'Recompile it without this flag if possible'
  337. );
  338. }
  339. }
  340. // Stringify the message arrays
  341. foreach ($errors as $key => $value) {
  342. $errors[$key] = PHP_EOL . implode(PHP_EOL, $value);
  343. }
  344. foreach ($warnings as $key => $value) {
  345. $warnings[$key] = PHP_EOL . implode(PHP_EOL, $value);
  346. }
  347. return !empty($errors) || !empty($warnings);
  348. }
  349. /**
  350. * Outputs an array of issues
  351. *
  352. * @param array $issues
  353. */
  354. function outputIssues($issues)
  355. {
  356. foreach ($issues as $issue) {
  357. out($issue, 'info');
  358. }
  359. out('');
  360. }
  361. /**
  362. * Outputs any warnings found
  363. *
  364. * @param array $warnings
  365. */
  366. function showWarnings($warnings)
  367. {
  368. if (!empty($warnings)) {
  369. out('Some settings on your machine may cause stability issues with Composer.', 'error');
  370. out('If you encounter issues, try to change the following:', 'error');
  371. outputIssues($warnings);
  372. }
  373. }
  374. /**
  375. * Outputs an end of process warning if tls has been bypassed
  376. *
  377. * @param bool $disableTls Bypass tls
  378. */
  379. function showSecurityWarning($disableTls)
  380. {
  381. if ($disableTls) {
  382. out('You have instructed the Installer not to enforce SSL/TLS security on remote HTTPS requests.', 'info');
  383. out('This will leave all downloads during installation vulnerable to Man-In-The-Middle (MITM) attacks', 'info');
  384. }
  385. }
  386. /**
  387. * installs composer to the current working directory
  388. */
  389. function installComposer($version, $installDir, $filename, $quiet, $disableTls, $cafile, $channel)
  390. {
  391. $installPath = (is_dir($installDir) ? rtrim($installDir, '/') . '/' : '') . $filename;
  392. $installDir = realpath($installDir) ? realpath($installDir) : getcwd();
  393. $file = $installDir . DIRECTORY_SEPARATOR . $filename;
  394. if (is_readable($file)) {
  395. @unlink($file);
  396. }
  397. $home = getHomeDir();
  398. if (!is_dir($home)) {
  399. @mkdir($home, 0777, true);
  400. }
  401. file_put_contents($home . '/keys.dev.pub', <<<DEVPUBKEY
  402. -----BEGIN PUBLIC KEY-----
  403. MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnBDHjZS6e0ZMoK3xTD7f
  404. FNCzlXjX/Aie2dit8QXA03pSrOTbaMnxON3hUL47Lz3g1SC6YJEMVHr0zYq4elWi
  405. i3ecFEgzLcj+pZM5X6qWu2Ozz4vWx3JYo1/a/HYdOuW9e3lwS8VtS0AVJA+U8X0A
  406. hZnBmGpltHhO8hPKHgkJtkTUxCheTcbqn4wGHl8Z2SediDcPTLwqezWKUfrYzu1f
  407. o/j3WFwFs6GtK4wdYtiXr+yspBZHO3y1udf8eFFGcb2V3EaLOrtfur6XQVizjOuk
  408. 8lw5zzse1Qp/klHqbDRsjSzJ6iL6F4aynBc6Euqt/8ccNAIz0rLjLhOraeyj4eNn
  409. 8iokwMKiXpcrQLTKH+RH1JCuOVxQ436bJwbSsp1VwiqftPQieN+tzqy+EiHJJmGf
  410. TBAbWcncicCk9q2md+AmhNbvHO4PWbbz9TzC7HJb460jyWeuMEvw3gNIpEo2jYa9
  411. pMV6cVqnSa+wOc0D7pC9a6bne0bvLcm3S+w6I5iDB3lZsb3A9UtRiSP7aGSo7D72
  412. 8tC8+cIgZcI7k9vjvOqH+d7sdOU2yPCnRY6wFh62/g8bDnUpr56nZN1G89GwM4d4
  413. r/TU7BQQIzsZgAiqOGXvVklIgAMiV0iucgf3rNBLjjeNEwNSTTG9F0CtQ+7JLwaE
  414. wSEuAuRm+pRqi8BRnQ/GKUcCAwEAAQ==
  415. -----END PUBLIC KEY-----
  416. DEVPUBKEY
  417. );
  418. file_put_contents($home . '/keys.tags.pub', <<<TAGSPUBKEY
  419. -----BEGIN PUBLIC KEY-----
  420. MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0Vi/2K6apCVj76nCnCl2
  421. MQUPdK+A9eqkYBacXo2wQBYmyVlXm2/n/ZsX6pCLYPQTHyr5jXbkQzBw8SKqPdlh
  422. vA7NpbMeNCz7wP/AobvUXM8xQuXKbMDTY2uZ4O7sM+PfGbptKPBGLe8Z8d2sUnTO
  423. bXtX6Lrj13wkRto7st/w/Yp33RHe9SlqkiiS4MsH1jBkcIkEHsRaveZzedUaxY0M
  424. mba0uPhGUInpPzEHwrYqBBEtWvP97t2vtfx8I5qv28kh0Y6t+jnjL1Urid2iuQZf
  425. noCMFIOu4vksK5HxJxxrN0GOmGmwVQjOOtxkwikNiotZGPR4KsVj8NnBrLX7oGuM
  426. nQvGciiu+KoC2r3HDBrpDeBVdOWxDzT5R4iI0KoLzFh2pKqwbY+obNPS2bj+2dgJ
  427. rV3V5Jjry42QOCBN3c88wU1PKftOLj2ECpewY6vnE478IipiEu7EAdK8Zwj2LmTr
  428. RKQUSa9k7ggBkYZWAeO/2Ag0ey3g2bg7eqk+sHEq5ynIXd5lhv6tC5PBdHlWipDK
  429. tl2IxiEnejnOmAzGVivE1YGduYBjN+mjxDVy8KGBrjnz1JPgAvgdwJ2dYw4Rsc/e
  430. TzCFWGk/HM6a4f0IzBWbJ5ot0PIi4amk07IotBXDWwqDiQTwyuGCym5EqWQ2BD95
  431. RGv89BPD+2DLnJysngsvVaUCAwEAAQ==
  432. -----END PUBLIC KEY-----
  433. TAGSPUBKEY
  434. );
  435. if (false === $disableTls && empty($cafile) && !HttpClient::getSystemCaRootBundlePath()) {
  436. $errorHandler = new ErrorHandler();
  437. set_error_handler(array($errorHandler, 'handleError'));
  438. $target = $home . '/cacert.pem';
  439. $write = file_put_contents($target, HttpClient::getPackagedCaFile(), LOCK_EX);
  440. @chmod($target, 0644);
  441. restore_error_handler();
  442. if (!$write) {
  443. throw new RuntimeException('Unable to write bundled cacert.pem to: ' . $target);
  444. }
  445. $cafile = $target;
  446. }
  447. $httpClient = new HttpClient($disableTls, $cafile);
  448. $uriScheme = false === $disableTls ? 'https' : 'http';
  449. if (!$version) {
  450. $versions = json_decode($httpClient->get($uriScheme . '://getcomposer.org/versions'), true);
  451. foreach ($versions[$channel] as $candidate) {
  452. if ($candidate['min-php'] <= PHP_VERSION_ID) {
  453. $version = $candidate['version'];
  454. $downloadUrl = $candidate['path'];
  455. break;
  456. }
  457. }
  458. if (!$version) {
  459. out('None of the ' . count($versions[$channel]) . ' ' . $channel . ' version(s) of Composer matches your PHP version (' . PHP_VERSION . ' / ID: ' . PHP_VERSION_ID . ')', 'error');
  460. exit(1);
  461. }
  462. } else {
  463. $downloadUrl = "/download/{$version}/composer.phar";
  464. }
  465. $retries = 3;
  466. while ($retries--) {
  467. if (!$quiet) {
  468. out("Downloading $version...", 'info');
  469. }
  470. $url = "{$uriScheme}://getcomposer.org{$downloadUrl}";
  471. $errorHandler = new ErrorHandler();
  472. set_error_handler(array($errorHandler, 'handleError'));
  473. // download signature file
  474. if (false === $disableTls) {
  475. $signature = $httpClient->get($url . '.sig');
  476. if (!$signature) {
  477. out('Download failed: ' . $errorHandler->message, 'error');
  478. } else {
  479. $signature = json_decode($signature, true);
  480. $signature = base64_decode($signature['sha384']);
  481. }
  482. }
  483. $fh = fopen($file, 'w');
  484. if (!$fh) {
  485. out('Could not create file ' . $file . ': ' . $errorHandler->message, 'error');
  486. }
  487. if (!fwrite($fh, $httpClient->get($url))) {
  488. out('Download failed: ' . $errorHandler->message, 'error');
  489. }
  490. fclose($fh);
  491. restore_error_handler();
  492. if ($errorHandler->message) {
  493. continue;
  494. }
  495. try {
  496. // create a temp file ending in .phar since the Phar class only accepts that
  497. if ('.phar' !== substr($file, -5)) {
  498. copy($file, $file . '.tmp.phar');
  499. $pharFile = $file . '.tmp.phar';
  500. } else {
  501. $pharFile = $file;
  502. }
  503. // verify signature
  504. if (false === $disableTls) {
  505. $pubkeyid = openssl_pkey_get_public('file://' . $home . '/' . (preg_match('{^[0-9a-f]{40}$}', $version) ? 'keys.dev.pub' : 'keys.tags.pub'));
  506. $algo = defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'SHA384';
  507. if (!in_array('SHA384', openssl_get_md_methods())) {
  508. out('SHA384 is not supported by your openssl extension, could not verify the phar file integrity', 'error');
  509. exit(1);
  510. }
  511. $verified = 1 === openssl_verify(file_get_contents($file), $signature, $pubkeyid, $algo);
  512. openssl_free_key($pubkeyid);
  513. if (!$verified) {
  514. out('Signature mismatch, could not verify the phar file integrity', 'error');
  515. exit(1);
  516. }
  517. }
  518. // test the phar validity
  519. if (!ini_get('phar.readonly')) {
  520. $phar = new Phar($pharFile);
  521. // free the variable to unlock the file
  522. unset($phar);
  523. }
  524. // clean up temp file if needed
  525. if ($file !== $pharFile) {
  526. unlink($pharFile);
  527. }
  528. break;
  529. } catch (Exception $e) {
  530. if (!$e instanceof UnexpectedValueException && !$e instanceof PharException) {
  531. throw $e;
  532. }
  533. // clean up temp file if needed
  534. if ($file !== $pharFile) {
  535. unlink($pharFile);
  536. }
  537. unlink($file);
  538. if ($retries) {
  539. if (!$quiet) {
  540. out('The download is corrupt, retrying...', 'error');
  541. }
  542. } else {
  543. out('The download is corrupt (' . $e->getMessage() . '), aborting.', 'error');
  544. exit(1);
  545. }
  546. }
  547. }
  548. if ($errorHandler->message) {
  549. out('The download failed repeatedly, aborting.', 'error');
  550. exit(1);
  551. }
  552. chmod($file, 0755);
  553. if (!$quiet) {
  554. out(PHP_EOL . "Composer successfully installed to: " . $file, 'success', false);
  555. out(PHP_EOL . "Use it: php $installPath", 'info');
  556. }
  557. }
  558. /**
  559. * colorize output
  560. */
  561. function out($text, $color = null, $newLine = true)
  562. {
  563. $styles = array(
  564. 'success' => "\033[0;32m%s\033[0m",
  565. 'error' => "\033[31;31m%s\033[0m",
  566. 'info' => "\033[33;33m%s\033[0m"
  567. );
  568. $format = '%s';
  569. if (isset($styles[$color]) && USE_ANSI) {
  570. $format = $styles[$color];
  571. }
  572. if ($newLine) {
  573. $format .= PHP_EOL;
  574. }
  575. printf($format, $text);
  576. }
  577. /**
  578. * Returns the system-dependent Composer home location, which may not exist
  579. *
  580. * @return string
  581. */
  582. function getHomeDir()
  583. {
  584. $home = getenv('COMPOSER_HOME');
  585. if (!$home) {
  586. $userDir = getUserDir();
  587. if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
  588. $home = $userDir . '/Composer';
  589. } else {
  590. $home = $userDir . '/.composer';
  591. if (!is_dir($home) && useXdg()) {
  592. // XDG Base Directory Specifications
  593. if (!($xdgConfig = getenv('XDG_CONFIG_HOME'))) {
  594. $xdgConfig = $userDir . '/.config';
  595. }
  596. $home = $xdgConfig . '/composer';
  597. }
  598. }
  599. }
  600. return $home;
  601. }
  602. /**
  603. * Returns the location of the user directory from the environment
  604. * @throws Runtime Exception If the environment value does not exists
  605. *
  606. * @return string
  607. */
  608. function getUserDir()
  609. {
  610. $userEnv = defined('PHP_WINDOWS_VERSION_MAJOR') ? 'APPDATA' : 'HOME';
  611. $userDir = getenv($userEnv);
  612. if (!$userDir) {
  613. throw new RuntimeException('The ' . $userEnv . ' or COMPOSER_HOME environment variable must be set for composer to run correctly');
  614. }
  615. return rtrim(strtr($userDir, '\\', '/'), '/');
  616. }
  617. /**
  618. * @return bool
  619. */
  620. function useXdg()
  621. {
  622. foreach (array_keys($_SERVER) as $key) {
  623. if (substr($key, 0, 4) === 'XDG_') {
  624. return true;
  625. }
  626. }
  627. return false;
  628. }
  629. function validateCaFile($contents)
  630. {
  631. // assume the CA is valid if php is vulnerable to
  632. // https://www.sektioneins.de/advisories/advisory-012013-php-openssl_x509_parse-memory-corruption-vulnerability.html
  633. if (
  634. PHP_VERSION_ID <= 50327
  635. || (PHP_VERSION_ID >= 50400 && PHP_VERSION_ID < 50422)
  636. || (PHP_VERSION_ID >= 50500 && PHP_VERSION_ID < 50506)
  637. ) {
  638. return !empty($contents);
  639. }
  640. return (bool)openssl_x509_parse($contents);
  641. }
  642. class ErrorHandler
  643. {
  644. public $message = '';
  645. public function handleError($code, $msg)
  646. {
  647. if ($this->message) {
  648. $this->message .= "\n";
  649. }
  650. $this->message .= preg_replace('{^copy\(.*?\): }', '', $msg);
  651. }
  652. }
  653. class HttpClient
  654. {
  655. private $options = array('http' => array());
  656. private $disableTls = false;
  657. public function __construct($disableTls = false, $cafile = false)
  658. {
  659. $this->disableTls = $disableTls;
  660. if ($this->disableTls === false) {
  661. if (!empty($cafile) && !is_dir($cafile)) {
  662. if (!is_readable($cafile) || !validateCaFile(file_get_contents($cafile))) {
  663. throw new RuntimeException('The configured cafile (' . $cafile . ') was not valid or could not be read.');
  664. }
  665. }
  666. $options = $this->getTlsStreamContextDefaults($cafile);
  667. $this->options = array_replace_recursive($this->options, $options);
  668. }
  669. }
  670. protected function getTlsStreamContextDefaults($cafile)
  671. {
  672. $ciphers = implode(':', array(
  673. 'ECDHE-RSA-AES128-GCM-SHA256',
  674. 'ECDHE-ECDSA-AES128-GCM-SHA256',
  675. 'ECDHE-RSA-AES256-GCM-SHA384',
  676. 'ECDHE-ECDSA-AES256-GCM-SHA384',
  677. 'DHE-RSA-AES128-GCM-SHA256',
  678. 'DHE-DSS-AES128-GCM-SHA256',
  679. 'kEDH+AESGCM',
  680. 'ECDHE-RSA-AES128-SHA256',
  681. 'ECDHE-ECDSA-AES128-SHA256',
  682. 'ECDHE-RSA-AES128-SHA',
  683. 'ECDHE-ECDSA-AES128-SHA',
  684. 'ECDHE-RSA-AES256-SHA384',
  685. 'ECDHE-ECDSA-AES256-SHA384',
  686. 'ECDHE-RSA-AES256-SHA',
  687. 'ECDHE-ECDSA-AES256-SHA',
  688. 'DHE-RSA-AES128-SHA256',
  689. 'DHE-RSA-AES128-SHA',
  690. 'DHE-DSS-AES128-SHA256',
  691. 'DHE-RSA-AES256-SHA256',
  692. 'DHE-DSS-AES256-SHA',
  693. 'DHE-RSA-AES256-SHA',
  694. 'AES128-GCM-SHA256',
  695. 'AES256-GCM-SHA384',
  696. 'ECDHE-RSA-RC4-SHA',
  697. 'ECDHE-ECDSA-RC4-SHA',
  698. 'AES128',
  699. 'AES256',
  700. 'RC4-SHA',
  701. 'HIGH',
  702. '!aNULL',
  703. '!eNULL',
  704. '!EXPORT',
  705. '!DES',
  706. '!3DES',
  707. '!MD5',
  708. '!PSK'
  709. ));
  710. /**
  711. * CN_match and SNI_server_name are only known once a URL is passed.
  712. * They will be set in the getOptionsForUrl() method which receives a URL.
  713. *
  714. * cafile or capath can be overridden by passing in those options to constructor.
  715. */
  716. $options = array(
  717. 'ssl' => array(
  718. 'ciphers' => $ciphers,
  719. 'verify_peer' => true,
  720. 'verify_depth' => 7,
  721. 'SNI_enabled' => true,
  722. )
  723. );
  724. /**
  725. * Attempt to find a local cafile or throw an exception.
  726. * The user may go download one if this occurs.
  727. */
  728. if (!$cafile) {
  729. $cafile = self::getSystemCaRootBundlePath();
  730. }
  731. if (is_dir($cafile)) {
  732. $options['ssl']['capath'] = $cafile;
  733. } elseif ($cafile) {
  734. $options['ssl']['cafile'] = $cafile;
  735. } else {
  736. throw new RuntimeException('A valid cafile could not be located automatically.');
  737. }
  738. /**
  739. * Disable TLS compression to prevent CRIME attacks where supported.
  740. */
  741. if (version_compare(PHP_VERSION, '5.4.13') >= 0) {
  742. $options['ssl']['disable_compression'] = true;
  743. }
  744. return $options;
  745. }
  746. /**
  747. * This method was adapted from Sslurp.
  748. * https://github.com/EvanDotPro/Sslurp
  749. *
  750. * (c) Evan Coury <me@evancoury.com>
  751. *
  752. * For the full copyright and license information, please see below:
  753. *
  754. * Copyright (c) 2013, Evan Coury
  755. * All rights reserved.
  756. *
  757. * Redistribution and use in source and binary forms, with or without modification,
  758. * are permitted provided that the following conditions are met:
  759. *
  760. * * Redistributions of source code must retain the above copyright notice,
  761. * this list of conditions and the following disclaimer.
  762. *
  763. * * Redistributions in binary form must reproduce the above copyright notice,
  764. * this list of conditions and the following disclaimer in the documentation
  765. * and/or other materials provided with the distribution.
  766. *
  767. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  768. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  769. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  770. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
  771. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  772. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  773. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  774. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  775. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  776. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  777. */
  778. public static function getSystemCaRootBundlePath()
  779. {
  780. static $caPath = null;
  781. if ($caPath !== null) {
  782. return $caPath;
  783. }
  784. // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that.
  785. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
  786. $envCertFile = getenv('SSL_CERT_FILE');
  787. if ($envCertFile && is_readable($envCertFile) && validateCaFile(file_get_contents($envCertFile))) {
  788. return $caPath = $envCertFile;
  789. }
  790. // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that.
  791. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
  792. $envCertDir = getenv('SSL_CERT_DIR');
  793. if ($envCertDir && is_dir($envCertDir) && is_readable($envCertDir)) {
  794. return $caPath = $envCertDir;
  795. }
  796. $configured = ini_get('openssl.cafile');
  797. if ($configured && strlen($configured) > 0 && is_readable($configured) && validateCaFile(file_get_contents($configured))) {
  798. return $caPath = $configured;
  799. }
  800. $configured = ini_get('openssl.capath');
  801. if ($configured && is_dir($configured) && is_readable($configured)) {
  802. return $caPath = $configured;
  803. }
  804. $caBundlePaths = array(
  805. '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package)
  806. '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package)
  807. '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package)
  808. '/usr/local/share/certs/ca-root-nss.crt', // FreeBSD (ca_root_nss_package)
  809. '/usr/ssl/certs/ca-bundle.crt', // Cygwin
  810. '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package
  811. '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option)
  812. '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat?
  813. '/etc/ssl/cert.pem', // OpenBSD
  814. '/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x
  815. );
  816. foreach ($caBundlePaths as $caBundle) {
  817. if (@is_readable($caBundle) && validateCaFile(file_get_contents($caBundle))) {
  818. return $caPath = $caBundle;
  819. }
  820. }
  821. foreach ($caBundlePaths as $caBundle) {
  822. $caBundle = dirname($caBundle);
  823. if (is_dir($caBundle) && glob($caBundle . '/*')) {
  824. return $caPath = $caBundle;
  825. }
  826. }
  827. return $caPath = false;
  828. }
  829. public static function getPackagedCaFile()
  830. {
  831. return <<<CACERT
  832. ##
  833. ## Bundle of CA Root Certificates
  834. ##
  835. ## Certificate data from Mozilla as of: Wed Oct 28 22:42:42 2015
  836. ##
  837. ## This is a bundle of X.509 certificates of public Certificate Authorities
  838. ## (CA). These were automatically extracted from Mozilla's root certificates
  839. ## file (certdata.txt). This file can be found at
  840. ## https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt
  841. ##
  842. ## It contains the certificates in PEM format and therefore
  843. ## can be directly used with curl / libcurl / php_curl, or with
  844. ## an Apache+mod_ssl webserver for SSL client authentication.
  845. ## Just configure this file as the SSLCACertificateFile.
  846. ##
  847. ## Conversion done with mk-ca-bundle.pl version 1.25.
  848. ## SHA1: 6d7d2f0a4fae587e7431be191a081ac1257d300a
  849. ##
  850. Equifax Secure CA
  851. =================
  852. -----BEGIN CERTIFICATE-----
  853. MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
  854. ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
  855. MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
  856. B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
  857. nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
  858. fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
  859. 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
  860. A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
  861. CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
  862. A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
  863. spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
  864. Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
  865. zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
  866. BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
  867. 70+sB3c4
  868. -----END CERTIFICATE-----
  869. GlobalSign Root CA
  870. ==================
  871. -----BEGIN CERTIFICATE-----
  872. MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
  873. GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
  874. b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
  875. BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
  876. VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
  877. DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
  878. THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
  879. Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
  880. c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
  881. gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
  882. HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
  883. AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
  884. Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
  885. j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
  886. hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
  887. X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
  888. -----END CERTIFICATE-----
  889. GlobalSign Root CA - R2
  890. =======================
  891. -----BEGIN CERTIFICATE-----
  892. MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
  893. YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
  894. bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
  895. aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
  896. bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
  897. ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
  898. s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
  899. S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
  900. TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
  901. ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
  902. FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
  903. YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
  904. BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
  905. 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
  906. 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
  907. 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
  908. TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
  909. -----END CERTIFICATE-----
  910. Verisign Class 3 Public Primary Certification Authority - G3
  911. ============================================================
  912. -----BEGIN CERTIFICATE-----
  913. MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
  914. UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
  915. cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
  916. IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
  917. dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
  918. CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
  919. dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
  920. cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
  921. Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
  922. ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
  923. EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
  924. cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
  925. EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
  926. 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
  927. ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
  928. j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
  929. /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
  930. xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
  931. t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
  932. -----END CERTIFICATE-----
  933. Verisign Class 4 Public Primary Certification Authority - G3
  934. ============================================================
  935. -----BEGIN CERTIFICATE-----
  936. MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
  937. UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
  938. cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
  939. IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
  940. dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
  941. CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
  942. dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
  943. cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
  944. Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
  945. ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
  946. tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
  947. 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
  948. Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
  949. Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
  950. j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
  951. mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
  952. fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
  953. RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
  954. UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
  955. -----END CERTIFICATE-----
  956. Entrust.net Premium 2048 Secure Server CA
  957. =========================================
  958. -----BEGIN CERTIFICATE-----
  959. MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
  960. ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
  961. bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
  962. BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
  963. NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
  964. d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
  965. MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
  966. ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
  967. MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
  968. Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
  969. hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
  970. nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
  971. VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
  972. BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
  973. KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
  974. T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
  975. zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
  976. J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
  977. nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
  978. -----END CERTIFICATE-----
  979. Baltimore CyberTrust Root
  980. =========================
  981. -----BEGIN CERTIFICATE-----
  982. MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
  983. ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
  984. ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
  985. SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
  986. dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
  987. uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
  988. UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
  989. G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
  990. XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
  991. l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
  992. VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
  993. BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
  994. cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
  995. hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
  996. Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
  997. RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
  998. -----END CERTIFICATE-----
  999. AddTrust Low-Value Services Root
  1000. ================================
  1001. -----BEGIN CERTIFICATE-----
  1002. MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
  1003. QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
  1004. cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
  1005. CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
  1006. ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
  1007. AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
  1008. 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
  1009. oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
  1010. Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
  1011. GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
  1012. HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
  1013. AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
  1014. RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
  1015. HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
  1016. ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
  1017. iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
  1018. eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
  1019. mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
  1020. ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
  1021. -----END CERTIFICATE-----
  1022. AddTrust External Root
  1023. ======================
  1024. -----BEGIN CERTIFICATE-----
  1025. MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
  1026. QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
  1027. VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
  1028. NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
  1029. cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
  1030. Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
  1031. +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
  1032. Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
  1033. aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
  1034. 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
  1035. 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
  1036. BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
  1037. VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
  1038. VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
  1039. IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
  1040. j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
  1041. 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
  1042. e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
  1043. G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
  1044. -----END CERTIFICATE-----
  1045. AddTrust Public Services Root
  1046. =============================
  1047. -----BEGIN CERTIFICATE-----
  1048. MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
  1049. QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
  1050. cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
  1051. BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
  1052. dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
  1053. AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
  1054. nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
  1055. d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
  1056. Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
  1057. HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
  1058. A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
  1059. /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
  1060. FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
  1061. A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
  1062. JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
  1063. +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
  1064. GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
  1065. Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
  1066. EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
  1067. -----END CERTIFICATE-----
  1068. AddTrust Qualified Certificates Root
  1069. ====================================
  1070. -----BEGIN CERTIFICATE-----
  1071. MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
  1072. QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
  1073. cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
  1074. CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
  1075. IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
  1076. 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
  1077. 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
  1078. KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
  1079. L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
  1080. wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
  1081. MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
  1082. BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
  1083. BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
  1084. azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
  1085. ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
  1086. GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
  1087. dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
  1088. RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
  1089. iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
  1090. -----END CERTIFICATE-----
  1091. Entrust Root Certification Authority
  1092. ====================================
  1093. -----BEGIN CERTIFICATE-----
  1094. MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
  1095. BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
  1096. b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
  1097. A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
  1098. MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
  1099. MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
  1100. Y2UxHzAdBgNVBAsT

Large files files are truncated, but you can click here to view the full file